Initial commit 42/842/1
authorvlad shkapenyuk <vshkap@research.att.com>
Thu, 29 Aug 2019 16:50:14 +0000 (12:50 -0400)
committervlad shkapenyuk <vshkap@research.att.com>
Thu, 29 Aug 2019 16:58:11 +0000 (12:58 -0400)
Signed-off-by: vlad shkapenyuk <vshkap@research.att.com>
Change-Id: I24f531bb2b64e002b1ac05a7f5ede2ee83d82b00

211 files changed:
LICENSE [new file with mode: 0644]
README.md [new file with mode: 0644]
bin/accept_recommendations.bat [new file with mode: 0755]
bin/buildit [new file with mode: 0755]
bin/buildit_with-stats [new file with mode: 0755]
bin/get_last_trace.pl [new file with mode: 0755]
bin/gshub.py [new file with mode: 0755]
bin/gshub3.py [new file with mode: 0755]
bin/monitor_gs.pl [new file with mode: 0755]
bin/parse_cpuinfo.pl [new file with mode: 0755]
bin/pin_processes.pl [new file with mode: 0755]
bin/split_trace.pl [new file with mode: 0755]
bin/start_processing [new file with mode: 0755]
build_and_install.sh [new file with mode: 0755]
cfg/cpu_info.csv [new file with mode: 0644]
cfg/example.ifq [new file with mode: 0644]
cfg/external_fcns.def [new file with mode: 0644]
cfg/field_list.xml [new file with mode: 0644]
cfg/ifres.xml [new file with mode: 0644]
cfg/internal_fcn.def [new file with mode: 0644]
cfg/localhost.ifq [new file with mode: 0644]
cfg/packet_schema.txt [new file with mode: 0644]
include/README.md [new file with mode: 0644]
include/app.h [new file with mode: 0644]
include/byteswap.h [new file with mode: 0644]
include/clearinghouseregistries.h [new file with mode: 0644]
include/filter.h [new file with mode: 0644]
include/fta.h [new file with mode: 0644]
include/fta_stat.h [new file with mode: 0644]
include/gsconfig.h [new file with mode: 0644]
include/gshub.h [new file with mode: 0644]
include/gslog.h [new file with mode: 0644]
include/gstypes.h [new file with mode: 0644]
include/hfta/base_operator.h [new file with mode: 0644]
include/hfta/clean_operator.h [new file with mode: 0644]
include/hfta/file_output_operator.h [new file with mode: 0644]
include/hfta/groupby_operator.h [new file with mode: 0644]
include/hfta/groupby_operator_oop.h [new file with mode: 0644]
include/hfta/hash_table.h [new file with mode: 0644]
include/hfta/hfta.h [new file with mode: 0644]
include/hfta/hfta_runtime_library.h [new file with mode: 0644]
include/hfta/hfta_sfun.h [new file with mode: 0644]
include/hfta/hfta_udaf.h [new file with mode: 0644]
include/hfta/host_tuple.h [new file with mode: 0644]
include/hfta/join_eq_hash_operator.h [new file with mode: 0644]
include/hfta/merge_operator.h [new file with mode: 0644]
include/hfta/merge_operator_oop.h [new file with mode: 0644]
include/hfta/running_gb_operator.h [new file with mode: 0644]
include/hfta/selection_operator.h [new file with mode: 0644]
include/hfta/zfile_output_operator.h [new file with mode: 0644]
include/lapp.h [new file with mode: 0644]
include/lfta/csv2_macro.h [new file with mode: 0644]
include/lfta/csv_macro.h [new file with mode: 0644]
include/lfta/gdat_macro.h [new file with mode: 0644]
include/lfta/gencsvinclude.pl [new file with mode: 0644]
include/lfta/gengdatinclude.pl [new file with mode: 0644]
include/lfta/md_stdlib.h [new file with mode: 0644]
include/lfta/rts.h [new file with mode: 0644]
include/lfta/rts_external.h [new file with mode: 0644]
include/lfta/rts_udaf.h [new file with mode: 0644]
include/lfta/schema_prototypes.h [new file with mode: 0644]
include/packet.h [new file with mode: 0644]
include/rdtsc.h [new file with mode: 0644]
include/schemaparser.h [new file with mode: 0644]
include/simple_http.h [new file with mode: 0644]
include/stringhash.h [new file with mode: 0644]
include/systat.h [new file with mode: 0644]
include/type_indicators.h [new file with mode: 0644]
include/vstring.h [new file with mode: 0644]
lib/.keep [new file with mode: 0644]
qlib/CSVEXAMPLELIB/ex2_src.gsql [new file with mode: 0644]
qlib/CSVEXAMPLELIB/output_spec.cfg [new file with mode: 0644]
src/Makefile [new file with mode: 0644]
src/ftacmp/Makefile [new file with mode: 0644]
src/ftacmp/analyze_fta.cc [new file with mode: 0644]
src/ftacmp/analyze_fta.h [new file with mode: 0644]
src/ftacmp/ext_fcns.l [new file with mode: 0644]
src/ftacmp/ext_fcns.tab.cc [new file with mode: 0644]
src/ftacmp/ext_fcns.tab.cc.h [new file with mode: 0644]
src/ftacmp/ext_fcns.y [new file with mode: 0644]
src/ftacmp/ext_fcnslexer.cc [new file with mode: 0644]
src/ftacmp/field_list.cc [new file with mode: 0644]
src/ftacmp/field_list.h [new file with mode: 0644]
src/ftacmp/fta.l [new file with mode: 0644]
src/ftacmp/fta.tab.cc [new file with mode: 0644]
src/ftacmp/fta.tab.cc.h [new file with mode: 0644]
src/ftacmp/fta.y [new file with mode: 0644]
src/ftacmp/ftalexer.cc [new file with mode: 0644]
src/ftacmp/gen_tuple_access.cc [new file with mode: 0644]
src/ftacmp/generate_lfta_code.cc [new file with mode: 0644]
src/ftacmp/generate_lfta_code.h [new file with mode: 0644]
src/ftacmp/generate_nic_code.cc [new file with mode: 0644]
src/ftacmp/generate_nic_code.h [new file with mode: 0644]
src/ftacmp/generate_utils.cc [new file with mode: 0644]
src/ftacmp/generate_utils.h [new file with mode: 0644]
src/ftacmp/iface_q.cc [new file with mode: 0644]
src/ftacmp/iface_q.h [new file with mode: 0644]
src/ftacmp/ifq.l [new file with mode: 0644]
src/ftacmp/ifq.tab.cc [new file with mode: 0644]
src/ftacmp/ifq.tab.cc.h [new file with mode: 0644]
src/ftacmp/ifq.y [new file with mode: 0644]
src/ftacmp/ifqlexer.cc [new file with mode: 0644]
src/ftacmp/literal_types.h [new file with mode: 0644]
src/ftacmp/nic.l [new file with mode: 0644]
src/ftacmp/nic.tab.cc [new file with mode: 0644]
src/ftacmp/nic.tab.cc.h [new file with mode: 0644]
src/ftacmp/nic.y [new file with mode: 0644]
src/ftacmp/nic_def.cc [new file with mode: 0644]
src/ftacmp/nic_def.h [new file with mode: 0644]
src/ftacmp/niclexer.cc [new file with mode: 0644]
src/ftacmp/parse_ext_fcns.h [new file with mode: 0644]
src/ftacmp/parse_fta.h [new file with mode: 0644]
src/ftacmp/parse_partn.cc [new file with mode: 0644]
src/ftacmp/parse_partn.h [new file with mode: 0644]
src/ftacmp/parse_schema.cc [new file with mode: 0644]
src/ftacmp/parse_schema.h [new file with mode: 0644]
src/ftacmp/partn.l [new file with mode: 0644]
src/ftacmp/partn.tab.cc [new file with mode: 0644]
src/ftacmp/partn.tab.cc.h [new file with mode: 0644]
src/ftacmp/partn.y [new file with mode: 0644]
src/ftacmp/partnlexer.cc [new file with mode: 0644]
src/ftacmp/print_plan.h [new file with mode: 0644]
src/ftacmp/query_plan.cc [new file with mode: 0644]
src/ftacmp/query_plan.h [new file with mode: 0644]
src/ftacmp/res.l [new file with mode: 0644]
src/ftacmp/res.tab.cc [new file with mode: 0644]
src/ftacmp/res.tab.cc.h [new file with mode: 0644]
src/ftacmp/res.y [new file with mode: 0644]
src/ftacmp/reslexer.cc [new file with mode: 0644]
src/ftacmp/schema.tab.cc [new file with mode: 0644]
src/ftacmp/schema.tab.cc.h [new file with mode: 0644]
src/ftacmp/schemalexer.cc [new file with mode: 0644]
src/ftacmp/schemaparser.cc [new file with mode: 0644]
src/ftacmp/schemaparser_impl.h [new file with mode: 0644]
src/ftacmp/stream_query.cc [new file with mode: 0644]
src/ftacmp/stream_query.h [new file with mode: 0644]
src/ftacmp/test_interfacelib.cc [new file with mode: 0644]
src/ftacmp/translate_fta.cc [new file with mode: 0644]
src/ftacmp/type_indicators.h [new file with mode: 0644]
src/ftacmp/type_objects.cc [new file with mode: 0644]
src/ftacmp/type_objects.h [new file with mode: 0644]
src/ftacmp/xml.l [new file with mode: 0644]
src/ftacmp/xml.tab.cc [new file with mode: 0644]
src/ftacmp/xml.tab.hh [new file with mode: 0644]
src/ftacmp/xml.y [new file with mode: 0644]
src/ftacmp/xml_t.h [new file with mode: 0644]
src/ftacmp/xmllexer.cc [new file with mode: 0644]
src/lib/Makefile [new file with mode: 0644]
src/lib/gscpapp/Makefile [new file with mode: 0644]
src/lib/gscpapp/appinterface.c [new file with mode: 0644]
src/lib/gscpaux/Makefile [new file with mode: 0644]
src/lib/gscpaux/block_allocator.cpp [new file with mode: 0644]
src/lib/gscpaux/block_allocator.h [new file with mode: 0644]
src/lib/gscpaux/gshub.cpp [new file with mode: 0644]
src/lib/gscpaux/json.cpp [new file with mode: 0644]
src/lib/gscpaux/json.h [new file with mode: 0644]
src/lib/gscpaux/simple_http.cpp [new file with mode: 0644]
src/lib/gscphftaaux/Makefile [new file with mode: 0644]
src/lib/gscphftaaux/Manku_HH.cc [new file with mode: 0644]
src/lib/gscphftaaux/SSstateful_count_distinct.cc [new file with mode: 0644]
src/lib/gscphftaaux/hfta_runtime_library.cc [new file with mode: 0644]
src/lib/gscphftaaux/hfta_udaf.cc [new file with mode: 0644]
src/lib/gscphost/Makefile [new file with mode: 0644]
src/lib/gscphost/callbackinterface.c [new file with mode: 0644]
src/lib/gscphost/callbackregistries.c [new file with mode: 0644]
src/lib/gscphost/clearinghouseregistries.c [new file with mode: 0644]
src/lib/gscphost/gscpipc.c [new file with mode: 0644]
src/lib/gscphost/include/callbackregistries.h [new file with mode: 0644]
src/lib/gscphost/include/gscpipc.h [new file with mode: 0644]
src/lib/gscphost/include/gscpmsgq.h [new file with mode: 0644]
src/lib/gscphost/include/ipcencoding.h [new file with mode: 0644]
src/lib/gscphost/include/lappregistries.h [new file with mode: 0644]
src/lib/gscphost/lappinterface.c [new file with mode: 0644]
src/lib/gscphost/lappregistries.c [new file with mode: 0644]
src/lib/gscphost/lfta.c [new file with mode: 0644]
src/lib/gscphostaux/Makefile [new file with mode: 0644]
src/lib/gscphostaux/byteswap.c [new file with mode: 0644]
src/lib/gscplftaaux/Makefile [new file with mode: 0644]
src/lib/gscplftaaux/rts_byteswap.c [new file with mode: 0644]
src/lib/gscplftaaux/rts_options.c [new file with mode: 0644]
src/lib/gscplftaaux/rts_sample.c [new file with mode: 0644]
src/lib/gscplftaaux/rts_string.c [new file with mode: 0644]
src/lib/gscplftaaux/rts_udaf.c [new file with mode: 0644]
src/lib/gscprts/Makefile [new file with mode: 0644]
src/lib/gscprts/rts_csv.c [new file with mode: 0644]
src/lib/gscprts/rts_csv2.cc [new file with mode: 0644]
src/lib/gscprts/rts_env.c [new file with mode: 0644]
src/lib/gscprts/rts_gdat.c [new file with mode: 0644]
src/lib/gscprts/rts_main.c [new file with mode: 0644]
src/tools/Makefile [new file with mode: 0644]
src/tools/ascii2gdat.c [new file with mode: 0644]
src/tools/gdat2ascii.c [new file with mode: 0644]
src/tools/gdatcat.c [new file with mode: 0644]
src/tools/gsexit.c [new file with mode: 0644]
src/tools/gsgdatprint.c [new file with mode: 0644]
src/tools/gsprintconsole.c [new file with mode: 0644]
src/tools/gsprintconsole_ves.c [new file with mode: 0644]
src/tools/gssinksim.c [new file with mode: 0644]
src/tools/gssource.c [new file with mode: 0644]
src/tools/process_logs.cc [new file with mode: 0644]
src/tools/qnode.h [new file with mode: 0644]
src/tools/xml.l [new file with mode: 0644]
src/tools/xml.tab.cc [new file with mode: 0644]
src/tools/xml.tab.hh [new file with mode: 0644]
src/tools/xml.y [new file with mode: 0644]
src/tools/xml_t.cc [new file with mode: 0644]
src/tools/xml_t.h [new file with mode: 0644]
src/tools/xmllexer.cc [new file with mode: 0644]
src/views/README.md [new file with mode: 0644]
tigon.png [new file with mode: 0644]
views/README.md [new file with mode: 0644]

diff --git a/LICENSE b/LICENSE
new file mode 100644 (file)
index 0000000..d9a10c0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,176 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..4bb0795
--- /dev/null
+++ b/README.md
@@ -0,0 +1,48 @@
+# Tigon
+
+![Tigon Logo](tigon.png)
+
+**Introduction**
+
+**Tigon** is an open-source, real-time, low-latency, high-throughput stream processing framework.
+
+Tigon is a collaborative effort between Cask Data, Inc. and AT&T that combines 
+technologies from these companies to create a disruptive new framework to handle a diverse
+set of real-time streaming requirements.
+
+Cask Data has built technology that provides scalable, reliable, and persistent high-throughput
+event processing with high-level Java APIs using Hadoop and HBase.
+
+AT&T has built a streaming engine that provides massively scalable, flexible, and in-memory
+low-latency stream processing with a SQL-like query Language.
+
+Together, they have combined to create **Tigon**.
+
+
+
+## Getting Started
+
+### Prerequisites
+
+Tigon is supported on *NIX systems such as Linux and Macintosh OS X.
+It is not supported on Microsoft Windows.
+
+
+## License and Trademarks
+
+Copyright Â© 2014 Cask Data, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+in compliance with the License. You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software distributed under the 
+License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
+either express or implied. See the License for the specific language governing permissions 
+and limitations under the License.
+
+Cask is a trademark of Cask Data, Inc. All rights reserved.
+
+Apache, Apache HBase, and HBase are trademarks of The Apache Software Foundation. Used with
+permission. No endorsement by The Apache Software Foundation is implied by the use of these marks.
diff --git a/bin/accept_recommendations.bat b/bin/accept_recommendations.bat
new file mode 100755 (executable)
index 0000000..255313c
--- /dev/null
@@ -0,0 +1,18 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+cp hfta_parallelism.cfg.recommended hfta_parallelism.cfg
+cp lfta_htsize.cfg.recommended lfta_htsize.cfg
+cp rts_load.cfg.recommended rts_load.cfg
diff --git a/bin/buildit b/bin/buildit
new file mode 100755 (executable)
index 0000000..c762ffc
--- /dev/null
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+# GSLITE_ROOT environment variable need to be set
+
+if [ -z "$GSLITE_ROOT" ]
+then
+    echo "GSLITE_ROOT must be set to non-empty string"
+    exit -1
+fi
+
+$GSLITE_ROOT/bin/translate_fta -h localhost -c -M -R $GSLITE_ROOT -C $GSLITE_ROOT/cfg -l $GSLITE_ROOT/qlib packet_schema.txt *.gsql
+ret=$?
+if [ $ret -ne 0 ]
+then
+    echo "Query translation failed!"
+    exit $ret
+fi
+    
+make
+ret=$?
+if [ $ret -ne 0 ]
+then
+    echo "Query build failed!"
+    exit $ret
+fi    
+exit $ret
+
diff --git a/bin/buildit_with-stats b/bin/buildit_with-stats
new file mode 100755 (executable)
index 0000000..cbf2bee
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+# GSLITE_ROOT environment variable need to be set
+
+if [ -z "$GSLITE_ROOT" ]
+then
+    echo "GSLITE_ROOT must be set to non-empty string"
+    exit -1
+fi
+
+$GSLITE_ROOT/bin/translate_fta -h localhost -c -M -S -R $GSLITE_ROOT -C  $GSLITE_ROOT/cfg -l $GSLITE_ROOT/qlib packet_schema.txt *.gsql
+ret=$?
+if [ $ret -ne 0 ]
+then
+    echo "Query translation failed!"
+    exit $ret
+fi
+    
+make
+ret=$?
+if [ $ret -ne 0 ]
+then
+    echo "Query build failed!"
+    exit $ret
+fi    
+exit $ret
diff --git a/bin/get_last_trace.pl b/bin/get_last_trace.pl
new file mode 100755 (executable)
index 0000000..b18962f
--- /dev/null
@@ -0,0 +1,40 @@
+#! /usr/bin/perl
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+
+$outfile = "last_tracefile.txt";
+$infl = "/var/log/gstrace";
+
+if(scalar(@ARGV)>0){
+       $infl = $ARGV[0];
+}
+
+open I,$infl or die "Can't open input log file $infl\n";
+
+open O,">$outfile";
+
+while($line=<I>){
+       if($line =~ /rts:\[.*\]: Started Logging/){
+               close O;
+               open O,">$outfile";
+       }
+       print O $line;
+}
+close O;
+
+
+
diff --git a/bin/gshub.py b/bin/gshub.py
new file mode 100755 (executable)
index 0000000..e0cd082
--- /dev/null
@@ -0,0 +1,376 @@
+#!/usr/bin/python
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+# Implementation of GSHUB REST service
+# for announcement and discovery of gs instances, sources and sinks
+
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+import SocketServer
+import json
+import cgi
+import threading
+import getopt
+import sys
+import re
+import cgi
+import socket
+import json
+
+# lis of URLS for all the REST calls we will serve
+DISCOVER_INSTANCE_URL = '/v1/discover-instance'
+DISCOVER_INITINSTANCE_URL = '/v1/discover-initialized-instance'
+DISCOVER_SOURCE_URL =  '/v1/discover-source'
+DISCOVER_SINK_URL =  '/v1/discover-sink'
+DISCOVER_STARTPROCESSING_URL = '/v1/discover-start-processing'
+ANNOUNCE_INSTANCE_URL =  '/v1/announce-instance'
+ANNOUNCE_INITINSTANCE_URL =  '/v1/announce-initialized-instance'
+ANNOUNCE_SOURCE_URL =  '/v1/announce-source'
+ANNOUNCE_SINK_URL =  '/v1/announce-sink'
+ANNOUNCE_STARTPROCESSING_URL = '/v1/announce-start-processing'
+ANNOUNCE_STREAM_SUBSCRIPTION = '/v1/announce-stream-subscription'
+ANNOUNCE_FTA_INSTANCE = '/v1/announce-fta-instance'
+ANNOUNCE_METRICS = '/v1/log-metrics'
+
+# gs instance endpoints
+gs_instances = {}
+
+# initialized gs instances
+gs_init_instances = {}
+
+# instances for which processing started
+gs_startprocessing_instances = {}
+
+# source endpoints
+sources = {}
+
+# sink endpoints
+sinks = {}
+
+
+# exctract endpoint information from json data
+def extract_endpoint(data) :
+       name = ''
+       ip = ''
+       port = 0
+               
+       try :
+               doc = json.loads(str(data))     
+       except :
+               print ('Invalid json message ' + str(data))
+               return []
+       
+       for key in doc.keys() :
+               if key == 'name' :
+                       name = doc[key]
+               elif key == 'ip' :
+                       ip = doc[key]
+                       # validate ip address           
+                       try :
+                               socket.inet_pton(socket.AF_INET, ip)
+                       except :
+                               print ('Invalid IPV4 address ' + ip)
+                               ip = ''
+               elif key == 'port' :
+                       # validate port number
+                       try :
+                               port = int(doc[key])
+                       except :
+                               print ('Invalid port number ' + doc[key])
+                               port = 0
+       
+       if name == '' or ip == '' or port == 0 :
+               print ('Name, ip or port is missing from json message ' + str(doc))
+               return []
+       
+
+       return [name, ip, port]
+
+
+# extract instance name from json data
+def extract_instance_name(data) :
+       name = ''
+       
+       try :
+               doc = json.loads(str(data))     
+       except :
+               print ('Invalid json message ' + str(data))
+               return ''
+       
+       for key in doc.keys() :
+               if key == 'name' :
+                       name = doc[key]
+       
+       if name == '' :
+               print ('Name field is missing in json message ' + str(doc))
+       elif (name in gs_instances) == False:
+               print ('Attempt to announce the initialization or start of processing for unknown instance ' + name)
+               name = ''
+               
+       return name
+       
+# handler for HTTP requests. We will override do_POST and do_GET of BaseHTTPRequestHandler
+class Server(BaseHTTPRequestHandler) :
+
+       def do_POST(self):
+               if re.search(ANNOUNCE_INSTANCE_URL, self.path) != None:         
+                       print self.path
+                       print self.headers
+                       if self.headers.getheader('content-type') == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'content-length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :
+                                       # extract endpoint information
+                                       endpoint = extract_endpoint(self.rfile.read(content_len))
+                                       if endpoint == [] :
+                                               self.send_response(400)
+                                       else :
+                                               self.send_response(200)
+                                               gs_instances[endpoint[0]] = [endpoint[1], endpoint[2]]
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()              
+                       
+               elif re.search(ANNOUNCE_INITINSTANCE_URL, self.path) != None:
+                       if self.headers.getheader('content-type') == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'content-length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :
+                                       # extract name of initialized gs instance                               
+                                       name = extract_instance_name(self.rfile.read(content_len))
+                                       if name == '' :
+                                               self.send_response(400)
+                                       else :
+                                               self.send_response(200)
+                                               gs_init_instances[name] = 1
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()      
+                       
+               elif re.search(ANNOUNCE_SOURCE_URL, self.path) != None:
+                       if self.headers.getheader('content-type') == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'content-length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :
+                                       # extract endpoint information                          
+                                       endpoint = extract_endpoint(self.rfile.read(content_len))
+                                       if endpoint == [] :
+                                               self.send_response(400)
+                                       else :
+                                               self.send_response(200)
+                                               sources[endpoint[0]] = [endpoint[1], endpoint[2]]
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()
+                       
+               elif re.search(ANNOUNCE_SINK_URL, self.path) != None:
+                       if self.headers.getheader('content-type') == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'content-length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :
+                                       # extract endpoint information                          
+                                       endpoint = extract_endpoint(self.rfile.read(content_len))
+                                       if endpoint == [] :
+                                               self.send_response(400)
+                                       else :
+                                               self.send_response(200)
+                                               sinks[endpoint[0]] = [endpoint[1], endpoint[2]]
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()      
+                       
+               elif re.search(ANNOUNCE_STARTPROCESSING_URL, self.path) != None:
+                       if self.headers.getheader('content-type') == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'content-length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :
+                                       # extract name of initialized gs instance                               
+                                       name = extract_instance_name(self.rfile.read(content_len))
+                                       if name == '' :
+                                               self.send_response(400)
+                                       else :
+                                               self.send_response(200)
+                                               gs_startprocessing_instances[name] = 1
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()
+                       
+               # we do not do any processing for ANNOUNCE_STREAM_SUBSCRIPTION, ANNOUNCE_FTA_INSTANCE and ANNOUNCE_METRICS in gshub simulator           
+               elif (re.search(ANNOUNCE_STREAM_SUBSCRIPTION, self.path) != None) or (re.search(ANNOUNCE_FTA_INSTANCE, self.path) != None) or (re.search(ANNOUNCE_METRICS, self.path) != None):
+                       if self.headers.getheader('content-type') == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'content-length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :                           
+                                       self.send_response(200)
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()      
+                       
+               else:
+                       self.send_response(404)
+                       self.end_headers()
+               return
+               
+       def do_GET(self):
+               if re.search(DISCOVER_INSTANCE_URL + '/*', self.path) != None:
+                       instance = self.path.split('/')[-1]
+                       # check if this instance is registered
+                       if instance in gs_instances :
+                               self.send_response(200)
+                               self.send_header('Content-Type', 'application/json')
+                               self.end_headers()
+                               self.wfile.write(bytes("{\"ip\" : \"" + gs_instances[instance][0] + "\", \"port\": " + str(gs_instances[instance][1]) + "}"))
+                       else:
+                               self.send_response(400)
+                               self.end_headers()
+
+
+               elif re.search(DISCOVER_INITINSTANCE_URL + '/*', self.path) != None:
+                       instance = self.path.split('/')[-1]
+                       # check if this instance is initialized
+                       if instance in gs_init_instances :
+                               self.send_response(200)
+                               self.send_header('Content-Type', 'application/json')
+                               self.end_headers()
+                               self.wfile.write(bytes("{\"ip\" : \"" + gs_instances[instance][0] + "\", \"port\": " + str(gs_instances[instance][1]) + "}"))
+                       else:
+                               self.send_response(400)
+                               self.end_headers()
+
+               elif re.search(DISCOVER_SOURCE_URL + '/*', self.path) != None:
+                       source = self.path.split('/')[-1]
+                       # check if it is a registered source
+                       if source in sources :
+                               self.send_response(200)
+                               self.send_header('Content-Type', 'application/json')
+                               self.end_headers()
+                               self.wfile.write(bytes("{\"ip\" : \"" + sources[source][0] + "\", \"port\": " + str(sources[source][1]) + "}"))
+                       else:
+                               self.send_response(400)
+                               self.end_headers()
+                               
+               elif re.search(DISCOVER_SINK_URL + '/*', self.path) != None:
+                       sink = self.path.split('/')[-1]
+                       # check if it is a registered sink
+                       if sink in sinks :
+                               self.send_response(200)
+                               self.send_header('Content-Type', 'application/json')
+                               self.end_headers()
+                               self.wfile.write(bytes("{\"ip\" : \"" + sinks[sink][0] + "\", \"port\": " + str(sinks[sink][1]) + "}"))
+                       else:
+                               self.send_response(400)
+                               self.end_headers()
+                               
+               elif re.search(DISCOVER_STARTPROCESSING_URL + '/*', self.path) != None:
+                       instance = self.path.split('/')[-1]
+                       # check if this instance is initialized
+                       if instance in gs_startprocessing_instances :
+                               self.send_response(200)
+                               self.send_header('Content-Type', 'application/json')
+                               self.end_headers()
+                               self.wfile.write(bytes("{}"))
+                       else:
+                               self.send_response(400)
+                               self.end_headers()                              
+               else:
+                       self.send_response(404)
+                       self.end_headers()
+               return
+
+
+# print usage instructions
+def usage():
+       print ('./gshub.py [-p port]')
+       
+       
+
+def main():
+       # process command-line arguments
+       try:
+               opts, args = getopt.getopt(sys.argv[1:], "hp:v", ["help", "port="])
+       except getopt.GetoptError as err:
+               # print help information and exit:
+               print(str(err)) 
+               usage()
+               sys.exit(2)
+
+       port = 0
+       for o, a in opts:
+               if o in ("-h", "--help"):
+                       usage()
+                       sys.exit(0)
+               elif o in ("-p", "--port"):
+                       port = int(a)
+               else:
+                       print ('Unknown command-line option ' + o)
+
+       # start HTTP server to serve REST calls
+       server_address = ('127.0.0.1', port)
+       httpd = HTTPServer(server_address, Server)
+
+       # record HTTP server address in gshub.log
+       f = open('gshub.log', 'w')
+       f.write(str(httpd.server_address[0]) + ':' + str(httpd.server_address[1]) + '\n')
+       f.close()
+               
+       print ('GSHUB Running on port ' + str(httpd.server_address[1]) + ' ...')
+
+       httpd.serve_forever()
+
+       
+if __name__ == "__main__":
+       main()
diff --git a/bin/gshub3.py b/bin/gshub3.py
new file mode 100755 (executable)
index 0000000..a68a1d7
--- /dev/null
@@ -0,0 +1,398 @@
+#!/usr/bin/python3.6
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+# Implementation of GSHUB REST service
+# for announcement and discovery of gs instances, sources and sinks
+
+from http.server import BaseHTTPRequestHandler, HTTPServer
+from socketserver import ThreadingMixIn
+import threading
+import getopt
+import sys
+import re
+import cgi
+import socket
+import json
+
+# lis of URLS for all the REST calls we will serve
+DISCOVER_INSTANCE_URL = '/v1/discover-instance'
+DISCOVER_INITINSTANCE_URL = '/v1/discover-initialized-instance'
+DISCOVER_SOURCE_URL =  '/v1/discover-source'
+DISCOVER_SINK_URL =  '/v1/discover-sink'
+DISCOVER_STARTPROCESSING_URL = '/v1/discover-start-processing'
+ANNOUNCE_INSTANCE_URL =  '/v1/announce-instance'
+ANNOUNCE_INITINSTANCE_URL =  '/v1/announce-initialized-instance'
+ANNOUNCE_SOURCE_URL =  '/v1/announce-source'
+ANNOUNCE_SINK_URL =  '/v1/announce-sink'
+ANNOUNCE_STARTPROCESSING_URL = '/v1/announce-start-processing'
+ANNOUNCE_STREAM_SUBSCRIPTION = '/v1/announce-stream-subscription'
+ANNOUNCE_FTA_INSTANCE = '/v1/announce-fta-instance'
+ANNOUNCE_METRICS = '/v1/log-metrics'
+
+# gs instance endpoints
+gs_instances = {}
+
+# initialized gs instances
+gs_init_instances = {}
+
+# instances for which processing started
+gs_startprocessing_instances = {}
+
+# source endpoints
+sources = {}
+
+# sink endpoints
+sinks = {}
+
+
+# exctract endpoint information from json data
+def extract_endpoint(data) :
+       name = ''
+       ip = ''
+       port = 0
+               
+       try :
+               doc = json.loads(str(data, 'utf-8'))    
+       except :
+               print ('Invalid json message ' + str(data, 'utf-8'))
+               return []
+       
+       for key in doc.keys() :
+               if key == 'name' :
+                       name = doc[key]
+               elif key == 'ip' :
+                       ip = doc[key]
+                       # validate ip address           
+                       try :
+                               socket.inet_pton(socket.AF_INET, ip)
+                       except :
+                               print ('Invalid IPV4 address ' + ip)
+                               ip = ''
+               elif key == 'port' :
+                       # validate port number
+                       try :
+                               port = int(doc[key])
+                       except :
+                               print ('Invalid port number ' + doc[key])
+                               port = 0
+       
+       if name == '' or ip == '' or port == 0 :
+               print ('Name, ip or port is missing from json message ' + str(doc))
+               return []
+       
+
+       return [name, ip, port]
+
+
+# extract instance name from json data
+def extract_instance_name(data) :
+       name = ''
+       
+       try :
+               doc = json.loads(str(data, 'utf-8'))    
+       except :
+               print ('Invalid json message ' + str(data, "utf-8"))
+               return ''
+       
+       for key in doc.keys() :
+               if key == 'name' :
+                       name = doc[key]
+       
+       if name == '' :
+               print ('Name field is missing in json message ' + str(doc))
+       elif (name in gs_instances) == False:
+               print ('Attempt to announce the initialization or start of processing for unknown instance ' + name)
+               name = ''
+               
+       return name
+       
+# handler for HTTP requests. We will override do_PORT and do_GET of BaseHTTPRequestHandler
+class HTTPRequestHandler(BaseHTTPRequestHandler):
+
+       def do_POST(self):
+               if re.search(ANNOUNCE_INSTANCE_URL, self.path) != None:         
+                       if self.headers.get_content_type() == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'Content-Length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :
+                                       # extract endpoint information
+                                       endpoint = extract_endpoint(self.rfile.read(content_len))
+                                       if endpoint == [] :
+                                               self.send_response(400)
+                                       else :
+                                               self.send_response(200)
+                                               gs_instances[endpoint[0]] = [endpoint[1], endpoint[2]]
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()              
+                       
+               elif re.search(ANNOUNCE_INITINSTANCE_URL, self.path) != None:
+                       if self.headers.get_content_type() == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'Content-Length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :
+                                       # extract name of initialized gs instance                               
+                                       name = extract_instance_name(self.rfile.read(content_len))
+                                       if name == '' :
+                                               self.send_response(400)
+                                       else :
+                                               self.send_response(200)
+                                               gs_init_instances[name] = 1
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()      
+                       
+               elif re.search(ANNOUNCE_SOURCE_URL, self.path) != None:
+                       if self.headers.get_content_type() == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'Content-Length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :
+                                       # extract endpoint information                          
+                                       endpoint = extract_endpoint(self.rfile.read(content_len))
+                                       if endpoint == [] :
+                                               self.send_response(400)
+                                       else :
+                                               self.send_response(200)
+                                               sources[endpoint[0]] = [endpoint[1], endpoint[2]]
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()
+                       
+               elif re.search(ANNOUNCE_SINK_URL, self.path) != None:
+                       if self.headers.get_content_type() == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'Content-Length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :
+                                       # extract endpoint information                          
+                                       endpoint = extract_endpoint(self.rfile.read(content_len))
+                                       if endpoint == [] :
+                                               self.send_response(400)
+                                       else :
+                                               self.send_response(200)
+                                               sinks[endpoint[0]] = [endpoint[1], endpoint[2]]
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()      
+                       
+               elif re.search(ANNOUNCE_STARTPROCESSING_URL, self.path) != None:
+                       if self.headers.get_content_type() == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'Content-Length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :
+                                       # extract name of initialized gs instance                               
+                                       name = extract_instance_name(self.rfile.read(content_len))
+                                       if name == '' :
+                                               self.send_response(400)
+                                       else :
+                                               self.send_response(200)
+                                               gs_startprocessing_instances[name] = 1
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()
+                       
+               # we do not do any processing for ANNOUNCE_STREAM_SUBSCRIPTION, ANNOUNCE_FTA_INSTANCE and ANNOUNCE_METRICS in gshub simulator           
+               elif (re.search(ANNOUNCE_STREAM_SUBSCRIPTION, self.path) != None) or (re.search(ANNOUNCE_FTA_INSTANCE, self.path) != None) or (re.search(ANNOUNCE_METRICS, self.path) != None):
+                       if self.headers.get_content_type() == 'application/json' :
+                               # Find content length
+                               content_len = 0
+                               for i in range(len(self.headers.keys())):
+                                       if self.headers.keys()[i] == 'Content-Length' :
+                                               content_len = int (self.headers.values()[i])
+                                               break
+                               if content_len != 0 :                           
+                                       self.send_response(200)
+                               else :
+                                       self.send_response(400)
+
+                       else:
+                               self.send_response(400)
+                       self.end_headers()      
+                       
+               else:
+                       self.send_response(404)
+                       self.end_headers()
+               return
+
+       def do_GET(self):
+               if re.search(DISCOVER_INSTANCE_URL + '/*', self.path) != None:
+                       instance = self.path.split('/')[-1]
+                       # check if this instance is registered
+                       if instance in gs_instances :
+                               self.send_response(200)
+                               self.send_header('Content-Type', 'application/json')
+                               self.end_headers()
+                               self.wfile.write(bytes("{\"ip\" : \"" + gs_instances[instance][0] + "\", \"port\": " + str(gs_instances[instance][1]) + "}", "utf-8"))
+                       else:
+                               self.send_response(400)
+                               self.end_headers()
+
+
+               elif re.search(DISCOVER_INITINSTANCE_URL + '/*', self.path) != None:
+                       instance = self.path.split('/')[-1]
+                       # check if this instance is initialized
+                       if instance in gs_init_instances :
+                               self.send_response(200)
+                               self.send_header('Content-Type', 'application/json')
+                               self.end_headers()
+                               self.wfile.write(bytes("{\"ip\" : \"" + gs_instances[instance][0] + "\", \"port\": " + str(gs_instances[instance][1]) + "}", "utf-8"))
+                       else:
+                               self.send_response(400)
+                               self.end_headers()
+
+               elif re.search(DISCOVER_SOURCE_URL + '/*', self.path) != None:
+                       source = self.path.split('/')[-1]
+                       # check if it is a registered source
+                       if source in sources :
+                               self.send_response(200)
+                               self.send_header('Content-Type', 'application/json')
+                               self.end_headers()
+                               self.wfile.write(bytes("{\"ip\" : \"" + sources[source][0] + "\", \"port\": " + str(sources[source][1]) + "}", "utf-8"))
+                       else:
+                               self.send_response(400)
+                               self.end_headers()
+                               
+               elif re.search(DISCOVER_SINK_URL + '/*', self.path) != None:
+                       sink = self.path.split('/')[-1]
+                       # check if it is a registered sink
+                       if sink in sinks :
+                               self.send_response(200)
+                               self.send_header('Content-Type', 'application/json')
+                               self.end_headers()
+                               self.wfile.write(bytes("{\"ip\" : \"" + sinks[sink][0] + "\", \"port\": " + str(sinks[sink][1]) + "}", "utf-8"))
+                       else:
+                               self.send_response(400)
+                               self.end_headers()
+                               
+               elif re.search(DISCOVER_STARTPROCESSING_URL + '/*', self.path) != None:
+                       instance = self.path.split('/')[-1]
+                       # check if this instance is initialized
+                       if instance in gs_startprocessing_instances :
+                               self.send_response(200)
+                               self.send_header('Content-Type', 'application/json')
+                               self.end_headers()
+                               self.wfile.write(bytes("{}", "utf-8"))
+                       else:
+                               self.send_response(400)
+                               self.end_headers()                              
+               else:
+                       self.send_response(404)
+                       self.end_headers()
+               return
+
+
+# we will use standard python threaded HTTP server
+class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
+       allow_reuse_address = True
+
+       def shutdown(self):
+               self.socket.close()
+               HTTPServer.shutdown(self)
+
+class SimpleHttpServer:
+       def __init__(self, ip, port):
+               self.server = ThreadedHTTPServer((ip,port), HTTPRequestHandler)
+
+       def start(self):
+               self.server_thread = threading.Thread(target=self.server.serve_forever)
+               self.server_thread.daemon = True
+               self.server_thread.start()
+               
+       def waitForThread(self):
+               self.server_thread.join()
+
+       def stop(self):
+               self.server.shutdown()
+               self.waitForThread()
+
+
+# print usage instructions
+def usage():
+       print ('./gshub.py [-p port]')
+       
+       
+
+def main():
+       # process command-line arguments
+       try:
+               opts, args = getopt.getopt(sys.argv[1:], "hp:v", ["help", "port="])
+       except getopt.GetoptError as err:
+               # print help information and exit:
+               print(str(err)) 
+               usage()
+               sys.exit(2)
+
+       port = 0
+       for o, a in opts:
+               if o in ("-h", "--help"):
+                       usage()
+                       sys.exit(0)
+               elif o in ("-p", "--port"):
+                       port = int(a)
+               else:
+                       print ('Unknown command-line option ' + o)
+
+       # start HTTP server to serve REST calls
+       server = SimpleHttpServer('127.0.0.1', port)
+
+       # record HTTP server address in gshub.log
+       f = open('gshub.log', 'w')
+       f.write('127.0.0.1:' + str(server.server.server_port) + '\n')
+       f.close()
+               
+       print ('GSHUB Running on port ' + str(server.server.server_port) + ' ...')
+       server.start()
+       server.waitForThread()
+
+
+if __name__ == "__main__":
+       main()
+
diff --git a/bin/monitor_gs.pl b/bin/monitor_gs.pl
new file mode 100755 (executable)
index 0000000..e42eb85
--- /dev/null
@@ -0,0 +1,180 @@
+#! /usr/bin/perl
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+use English;
+
+$interval = 10;
+$to_tty = 0;
+if(scalar(@ARGV)>0){
+       if(int($ARGV[0])>0){
+               $interval = int($ARGV[0]);
+       }else{
+               if($ARGV[0] eq '-'){
+                       $to_tty = 1;
+               }else{
+                       print STDERR "Argument 1 ($ARGV[0]) ignored.\n";
+               }       
+       }
+}
+if(scalar(@ARGV)>1){
+       if(int($ARGV[1])>0){
+               $interval = int($ARGV[1]);
+       }else{
+               if($ARGV[1] eq '-'){
+                       $to_tty = 1;
+               }else{
+                       print STDERR "Argument 2 ($ARGV[1]) ignored.\n";
+               }       
+       }
+}
+if(scalar(@ARGV)>2){
+       print STDERR "Only 2 arguments accepted, additional args ignored.\n";
+}
+
+open O, ">resource_log.csv" or die "Can't open resource_log.csv\n";
+
+
+
+# get the page size
+open I,"getconf PAGESIZE |";
+$line=<I>;
+chomp($line);
+$pagesize = int($line);
+close(I);
+
+
+$effective_uid = $REAL_USER_ID;
+$ps_cmd = "ps -U $effective_uid |";
+
+%hfta_pid=();
+
+open P,$ps_cmd;
+while($line=<P>){
+       chomp($line);
+       $line =~ s/^\s+//;
+       @flds = split /\s+/,$line;
+       if($flds[3] =~ /rts/){
+               push @rts_pids,int($flds[0]);
+       }
+       if($flds[3] =~ /hfta_(\d+)/){
+               $hfta_pid{$1} = int($flds[0]);
+       }
+}
+
+$rts_pids = sort {$a<=>$b} @rts_pids;
+
+$now=time();
+print O "START monitoring at time $now\n";
+print O "ts,proc,pid,utime,stime,vm_size,rss,pagesize\n";
+if(to_tty){
+       print "START monitoring at time $now\n";
+       print "ts,proc,pid,utime,stime,vm_size,rss,pagesize\n";
+}
+#print "RTS PIDs:\n";
+#foreach $p (@rts_pids){
+#      print "$p ";
+#}
+#print "\nHFTA PIDs:\n";
+#  foreach $h (sort {$a<=>$b} keys(%hfta_pid)){
+#      print "($h,",$hfta_pid{$h},") ";
+#}
+#print "\n";
+
+while(1){
+       $now=time();
+       foreach $p (@rts_pids){
+               get_proc_stats($p);
+               print O "$now,rts,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";
+               if(to_tty){
+                       print "$now,rts,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";
+               }
+       }
+       foreach $h (sort {$a<=>$b} keys(%hfta_pid)){
+               $p=$hfta_pid{$h};
+               get_proc_stats($p);
+               print O "$now,hfta_$h,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";
+               if(to_tty){
+                       print "$now,hfta_$h,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";
+               }
+       }
+
+       sleep($interval);
+}
+
+
+
+sub get_proc_stats{
+my $pid = shift;
+my $line;
+my @flds;
+my $pos;
+
+
+open I_PROC_STATS,"/proc/$pid/stat";
+
+$line=<I_PROC_STATS>;
+close I_PROC_STATS;
+
+#print "getstats($pid): $line\n";
+
+chomp($line);
+@flds = split / +/,$line;
+
+$pos=0;
+$pid = $flds[$pos]; $pos++;
+$fname = $flds[$pos]; $pos++;
+$state = $flds[$pos]; $pos++;
+$pppid = $flds[$pos]; $pos++;
+$pgrp = $flds[$pos]; $pos++;
+$session = $flds[$pos]; $pos++;
+$tty_n = $flds[$pos]; $pos++;
+$tpgid = $flds[$pos]; $pos++;
+$flags = $flds[$pos]; $pos++;
+$minor_faults = $flds[$pos]; $pos++;
+$child_minor_faults = $flds[$pos]; $pos++;
+$major_faults = $flds[$pos0]; $pos++;
+$child_major_faults = $flds[$pos0]; $pos++;
+$user_time = $flds[$pos]; $pos++;
+$sys_time = $flds[$pos]; $pos++;
+$child_user_time = $flds[$pos]; $pos++;
+$child_sys_time = $flds[$pos]; $pos++;
+$priority = $flds[$pos]; $pos++;
+$nice = $flds[$pos]; $pos++;
+$num_threads = $flds[$pos]; $pos++;
+$interval_timer_realvalue = $flds[$pos]; $pos++;
+$start_time = $flds[$pos]; $pos++;
+$vm_size = $flds[$pos]; $pos++;
+$resident_set_size = $flds[$pos]; $pos++;
+$rss_limit = $flds[$pos]; $pos++;
+$startcode = $flds[$pos]; $pos++;
+$endcode = $flds[$pos]; $pos++;
+$startstack = $flds[$pos]; $pos++;
+$curr_kernel_stack_ptr = $flds[$pos]; $pos++;
+$curr_instruction_ptr = $flds[$pos]; $pos++;
+$signal = $flds[$pos]; $pos++;
+$sigblocked = $flds[$pos]; $pos++;
+$sigignore = $flds[$pos]; $pos++;
+$wchan = $flds[$pos]; $pos++;
+$nswap = $flds[$pos]; $pos++;
+$exit_signal = $flds[$pos]; $pos++;
+$processor = $flds[$pos]; $pos++;
+$rt_priority = $flds[$pos]; $pos++;
+$policy = $flds[$pos]; $pos++;
+$aggr_block_io_delays = $flds[$pos]; $pos++;
+$guest_time = $flds[$pos]; $pos++;
+$cguest_time = $flds[$pos]; $pos++;
+}
diff --git a/bin/parse_cpuinfo.pl b/bin/parse_cpuinfo.pl
new file mode 100755 (executable)
index 0000000..61c1bcc
--- /dev/null
@@ -0,0 +1,45 @@
+#! /usr/bin/perl
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+$infl = "/proc/cpuinfo";
+open I,$infl or die "Can't open $infl, exiting.\n";
+
+$curr_proc = -1;
+$curr_socket = -1;
+$curr_coreid = -1;
+
+while($line=<I>){
+       chomp($line);
+       @flds = split /:/,$line;
+       if(scalar(@flds)==2){
+               if($flds[0] =~ /processor/){
+                       if($curr_proc != -1){
+                               print "$curr_proc,$curr_socket,$curr_coreid\n";
+                       }
+                       $curr_proc = int($flds[1]);
+               }
+               if($flds[0] =~ /physical id/){
+                       $curr_socket = int($flds[1]);
+               }
+               if($flds[0] =~ /core id/){
+                       $curr_coreid = int($flds[1]);
+               }
+       }
+}
+if($curr_proc != -1){
+       print "$curr_proc,$curr_socket,$curr_coreid\n";
+}
diff --git a/bin/pin_processes.pl b/bin/pin_processes.pl
new file mode 100755 (executable)
index 0000000..4fdbec7
--- /dev/null
@@ -0,0 +1,65 @@
+#! /usr/bin/perl
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+
+$infl = "/var/log/gstrace";
+
+if(scalar(@ARGV)>0){
+       $infl = $ARGV[0];
+}
+
+open I,$infl or die "Can't open input log file $infl\n";
+
+%rts_pids= ();
+%hfta_pids = ();
+while($line=<I>){
+       if($line =~ /rts:\[.*\]: Started Logging/){
+               %rts_pids= ();
+               %hfta_pids = ();
+       }
+       if($line =~ /hfta_(\d+):\[(\d+)\]: Started Logging/){
+               $name = "hfta_" . $1;
+               $hfta_pids{$name} = $2;
+       }
+       if($line =~ /rts:\[(\d+)\]: Init LFTAs for (\w+)/){
+               $name = "rts " . $2;
+               $rts_pids{$name} = $1;
+       }
+}
+
+#foreach $k (keys(%rts_pids)){
+#      print "$k, ",$rts_pids{$k},"\n";
+#}
+#foreach $k (keys(%hfta_pids)){
+#      print "$k, ",$hfta_pids{$k},"\n";
+#}
+               
+open C,"pinning_info.csv" or die "Can't open pinning_info.csv\n";
+
+while($line=<C>){
+       chomp($line);
+       @flds = split /,/,$line;
+       if(exists($rts_pids{$flds[0]})){
+               $pinning_cmd = "taskset -pc $flds[1] ". $rts_pids{$flds[0]};
+       }
+       if(exists($hfta_pids{$flds[0]})){
+               $pinning_cmd = "taskset -pc $flds[1] ". $hfta_pids{$flds[0]};
+       }
+       print "Executing $pinning_cmd\n";
+       system($pinning_cmd);
+}
+
diff --git a/bin/split_trace.pl b/bin/split_trace.pl
new file mode 100755 (executable)
index 0000000..a9f000f
--- /dev/null
@@ -0,0 +1,36 @@
+#! /usr/bin/perl
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+$outfile_base = "tracefile_";
+$trace_cnt = 0;
+
+$outfile = $outfile_base . $trace_cnt . ".txt";
+open O,">$outfile";
+
+while($line=<>){
+       if($line =~ /rts:\[.*\]: Started Logging/){
+               close O;
+               $trace_cnt ++;
+               $outfile = $outfile_base . $trace_cnt . ".txt";
+               open O,">$outfile";
+       }
+       print O $line;
+}
+close O;
+
+
+
diff --git a/bin/start_processing b/bin/start_processing
new file mode 100755 (executable)
index 0000000..3b235cc
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/bash
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+if [ ! -f gshub.log ]
+then
+        echo "Unable to find gshub.log in current directory. Make sure bin/gshub.py is running"
+        exit -1
+fi
+ADDR=`cat gshub.log`
+curl -H 'Content-Type: application/json' -d '{"name": "default"}' $ADDR/v1/announce-start-processing
+
diff --git a/build_and_install.sh b/build_and_install.sh
new file mode 100755 (executable)
index 0000000..d117f41
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+cd src
+make clean; make; make install;
+cd ..
diff --git a/cfg/cpu_info.csv b/cfg/cpu_info.csv
new file mode 100644 (file)
index 0000000..d0ab47f
--- /dev/null
@@ -0,0 +1,88 @@
+0,0,0
+1,1,0
+2,0,5
+3,1,5
+4,0,1
+5,1,1
+6,0,4
+7,1,4
+8,0,2
+9,1,2
+10,0,3
+11,1,3
+12,0,8
+13,1,8
+14,0,12
+15,1,12
+16,0,9
+17,1,9
+18,0,11
+19,1,11
+20,0,10
+21,1,10
+22,0,21
+23,1,21
+24,0,16
+25,1,16
+26,0,20
+27,1,20
+28,0,17
+29,1,17
+30,0,19
+31,1,19
+32,0,18
+33,1,18
+34,0,28
+35,1,28
+36,0,24
+37,1,24
+38,0,27
+39,1,27
+40,0,25
+41,1,25
+42,0,26
+43,1,26
+44,0,0
+45,1,0
+46,0,5
+47,1,5
+48,0,1
+49,1,1
+50,0,4
+51,1,4
+52,0,2
+53,1,2
+54,0,3
+55,1,3
+56,0,8
+57,1,8
+58,0,12
+59,1,12
+60,0,9
+61,1,9
+62,0,11
+63,1,11
+64,0,10
+65,1,10
+66,0,21
+67,1,21
+68,0,16
+69,1,16
+70,0,20
+71,1,20
+72,0,17
+73,1,17
+74,0,19
+75,1,19
+76,0,18
+77,1,18
+78,0,28
+79,1,28
+80,0,24
+81,1,24
+82,0,27
+83,1,27
+84,0,25
+85,1,25
+86,0,26
+87,1,26
diff --git a/cfg/example.ifq b/cfg/example.ifq
new file mode 100644 (file)
index 0000000..f1d4061
--- /dev/null
@@ -0,0 +1,3 @@
+default : Contains[InterfaceType,GDAT] and Equals[Host,'example'];
+csv : Contains[InterfaceType,CSV] and Equals[Host,'example'];
+gdat: Contains[InterfaceType,GDAT] and Equals[Host,'example']
diff --git a/cfg/external_fcns.def b/cfg/external_fcns.def
new file mode 100644 (file)
index 0000000..0bb58f7
--- /dev/null
@@ -0,0 +1,183 @@
+ ///////////////////////////////////////////////////////////
+//          Matching predicates
+///////////////////////////////////////////////////////////
+        PRED [LFTA_LEGAL, COST HIGH]str_exists_substr[string, string];
+        PRED [LFTA_LEGAL, COST HIGH]str_compare[string,string];
+        PRED [LFTA_LEGAL, COST LOW] str_match_offset [uint,string,string];
+        PRED [LFTA_LEGAL, COST LOW] byte_match_offset [uint,uint,string];
+    
+///////////////////////////////////////////////////////////
+//          MIN/MAX functions
+///////////////////////////////////////////////////////////
+
+
+        ullong FUN [LFTA_LEGAL, COST FREE] LLMIN (ullong,ullong);
+        ullong FUN [LFTA_LEGAL, COST FREE] LLMAX (ullong,ullong); 
+        uint FUN [LFTA_LEGAL, COST FREE] UMIN (uint,uint);
+        uint FUN [LFTA_LEGAL, COST FREE] UMAX (uint,uint); 
+
+        IP FUN [LFTA_LEGAL, COST FREE] UMIN (IP,IP);
+        IP FUN [LFTA_LEGAL, COST FREE] UMAX (IP,IP);
+   
+///////////////////////////////////////////////////////////
+//          Function for regex matching
+///////////////////////////////////////////////////////////
+
+
+uint FUN [LFTA_LEGAL, COST EXPENSIVE]
+               str_regex_match( string, string HANDLE);
+       uint FUN [LFTA_LEGAL, COST EXPENSIVE] 
+               str_partial_regex_match( string, string HANDLE, uint);
+       string FUN [PARTIAL, COST EXPENSIVE] str_extract_regex( string, string HANDLE);
+  
+///////////////////////////////////////////////////////////
+//         Truncating strings        
+///////////////////////////////////////////////////////////
+       
+        string FUN [LFTA_LEGAL,PARTIAL,COST FREE] str_truncate (string, uint);
+///////////////////////////////////////////////////////////
+//          Function for casting
+///////////////////////////////////////////////////////////
+
+    int FUN [LFTA_LEGAL,COST FREE] non_temporal(int);
+       uint FUN [LFTA_LEGAL,COST FREE] non_temporal(uint);
+       llong FUN [LFTA_LEGAL,COST FREE] non_temporal(llong);
+       ullong FUN [LFTA_LEGAL,COST FREE] non_temporal(ullong);
+
+       int FUN [LFTA_LEGAL,COST FREE]INT(uint);
+        int FUN [LFTA_LEGAL,COST FREE]INT(ullong);
+        int FUN [LFTA_LEGAL,COST FREE]INT(llong);
+        uint FUN [LFTA_LEGAL,COST FREE]UINT(int);
+        uint FUN [LFTA_LEGAL,COST FREE]UINT(ullong);
+        uint FUN [LFTA_LEGAL,COST FREE]UINT(llong);
+       uint FUN [LFTA_LEGAL,COST FREE]UINT(IP);
+
+       float FUN [LFTA_LEGAL,COST FREE] FLOAT(llong);
+       float FUN [LFTA_LEGAL,COST FREE] FLOAT(ullong);
+       float FUN [LFTA_LEGAL,COST FREE] FLOAT(int);
+       float FUN [LFTA_LEGAL,COST FREE] FLOAT(uint);
+
+       ullong FUN [LFTA_LEGAL,COST FREE]ULLONG(uint);
+       ullong FUN [LFTA_LEGAL,COST FREE]ULLONG(int);
+
+
+///////////////////////////////////////////////////////////
+//          Convert an IPv4 address 
+///////////////////////////////////////////////////////////
+
+
+    uint FUN [PARTIAL,COST HIGH] strtoi(string);
+       IP FUN [PARTIAL,COST HIGH] strtoip(string); 
+
+//     for constant strings - faster at runtime
+       uint FUN [LFTA_LEGAL,COST LOW] strtoi_c(string HANDLE);
+       IP FUN [LFTA_LEGAL,COST LOW] strtoip_c(string HANDLE); 
+
+
+///////////////////////////////////////////////////////////
+//          Compute running sum
+///////////////////////////////////////////////////////////
+
+
+
+    ullong UDAF [RUNNING, SUBAGGR moving_sum_lfta, SUPERAGGR super_moving_sum_udaf ] moving_sum_udaf fstring12 (uint, uint);
+
+       uint EXTR moving_sum moving_sum_udaf moving_sum_extract (uint,uint);
+       uint FUN  [COST LOW] moving_sum_extract(ullong);
+
+       float EXTR moving_sum_exp moving_sum_udaf moving_sum_extract_exp (uint,uint, float);
+       float FUN  [COST LOW]  moving_sum_extract_exp(ullong, float);
+
+       ullong UDAF [RUNNING] super_moving_sum_udaf fstring12 (ullong);
+       ullong UDAF moving_sum_lfta fstring8 (uint, uint);
+
+
+///////////////////////////////////////////////////////////
+//               Compute the average of 
+//             all positive numbers 
+///////////////////////////////////////////////////////////
+
+       float UDAF POSAVG fstring16(float);
+
+
+///////////////////////////////////////////////////////////
+//               Simple average example 
+///////////////////////////////////////////////////////////
+
+       float EXTR extr_avg avg_udaf extr_avg_fcn (uint);
+       float FUN extr_avg_fcn (string);
+       string UDAF[SUBAGGR avg_udaf_lfta, SUPERAGGR avg_udaf_hfta] avg_udaf fstring12 (uint);
+       string UDAF avg_udaf_hfta fstring12 (string);
+       string UDAF avg_udaf_lfta fstring12 (uint);
+
+///////////////////////////////////////////////////////////
+//               SAMPLING 
+///////////////////////////////////////////////////////////
+
+        fstring100 STATE smart_sampling_state;
+       int SFUN packet_count smart_sampling_state ();
+       float SFUN gamma smart_sampling_state ();
+       int SFUN do_clean_count smart_sampling_state ();
+       int SFUN init_threshold smart_sampling_state ();
+        int SFUN delay smart_sampling_state();
+        int SFUN newly_closed smart_sampling_state();
+
+///////////////////////////////////////////////////////////
+//               Manku Heavy Hitter 
+///////////////////////////////////////////////////////////
+
+       fstring20 STATE manku_hh_state;
+       BOOL SFUN local_count manku_hh_state (UINT);
+        int SFUN current_bucket manku_hh_state ();
+
+///////////////////////////////////////////////////////////
+//               FIRST and LAST aggregation funciton
+//     Should be replaced by builtins
+///////////////////////////////////////////////////////////
+
+       uint UDAF [RUNNING, SUBAGGR FIRST_lfta, SUPERAGGR FIRST_hfta] FIRST uint (uint);
+       uint UDAF [RUNNING] FIRST_hfta uint (uint);
+       uint UDAF [RUNNING] FIRST_lfta uint (uint);
+
+       ullong UDAF [RUNNING, SUBAGGR FIRST_ULL_lfta, SUPERAGGR FIRST_ULL_hfta] FIRST ullong (ullong);
+       ullong UDAF [RUNNING] FIRST_ULL_hfta ullong (ullong);
+       ullong UDAF [RUNNING] FIRST_ULL_lfta ullong (ullong);
+
+       IP UDAF [RUNNING, SUBAGGR FIRST_lfta, SUPERAGGR FIRST_hfta] FIRST IP (IP);
+       IP UDAF [RUNNING] FIRST_hfta IP (IP);
+       IP UDAF [RUNNING] FIRST_lfta IP (IP);
+
+       string UDAF [RUNNING, SUBAGGR FIRST_STR_lfta, SUPERAGGR FIRST_STR_hfta] FIRST string (string);
+       string UDAF [RUNNING] FIRST_STR_hfta string (string);
+       string UDAF [RUNNING] FIRST_STR_lfta string (string);
+
+       uint UDAF [RUNNING, SUBAGGR LAST_lfta, SUPERAGGR LAST_hfta] LAST uint (uint);
+       uint UDAF [RUNNING] LAST_hfta uint (uint);
+       uint UDAF [RUNNING] LAST_lfta uint (uint);
+
+       ullong UDAF [RUNNING, SUBAGGR LAST_ULL_lfta, SUPERAGGR LAST_ULL_hfta] LAST ullong (ullong);
+       ullong UDAF [RUNNING] LAST_ULL_hfta ullong (ullong);
+       ullong UDAF [RUNNING] LAST_ULL_lfta ullong (ullong);
+
+       IP UDAF [RUNNING, SUBAGGR LAST_lfta, SUPERAGGR LAST_hfta] LAST IP (IP);
+       IP UDAF [RUNNING] LAST_hfta IP (IP);
+       IP UDAF [RUNNING] LAST_lfta IP (IP);
+
+       string UDAF [RUNNING, SUBAGGR LAST_STR_lfta, SUPERAGGR LAST_STR_hfta] LAST string (string);
+       string UDAF [RUNNING] LAST_STR_hfta string (string);
+       string UDAF [RUNNING] LAST_STR_lfta string (string);
+
+///////////////////////////////////////////////////////////
+//               integer array aggregation funciton
+//     We are going to store 4 values in LFTA in fixed size buffer
+//  plus one byte for array length (17 bytes total)
+//  HFTA will combine partial aggregates
+///////////////////////////////////////////////////////////
+
+       string UDAF [RUNNING, SUBAGGR running_array_aggr_lfta, SUPERAGGR running_array_aggr_hfta] running_array_aggr string (uint);
+       string UDAF [RUNNING] running_array_aggr_hfta string (string);
+       string UDAF [RUNNING] running_array_aggr_lfta fstring17 (uint);
+       
\ No newline at end of file
diff --git a/cfg/field_list.xml b/cfg/field_list.xml
new file mode 100644 (file)
index 0000000..0373edd
--- /dev/null
@@ -0,0 +1,3 @@
+<doc:Project xmlns:xmi="http://www.omg.org/XMI" xmlns:doc="http://lynx.research.att.com/models/doc" xmi:version="2.0" title="todo" name="gs/fields" description="GS Probe Data Dictionary">
+    <field name="systemTime" type="uint" description="Unix time of system when data is processed"/>
+</doc:Project>
diff --git a/cfg/ifres.xml b/cfg/ifres.xml
new file mode 100644 (file)
index 0000000..6196c10
--- /dev/null
@@ -0,0 +1,23 @@
+<Resources>
+     <Host Name='localhost'>
+         <Interface Name='GDATO'>
+           <InterfaceType value='GDAT'/><Filename value='exampleGdat'/>
+           <StartupDelay value='10'/>
+           <Verbose value='TRUE'/>
+         </Interface>
+         <Interface Name='CSV0'>
+           <InterfaceType value='CSV'/>
+           <CSVSeparator value='|'/>
+           <Filename value='exampleCsv'/>
+           <StartUpDelay value='10'/>
+           <Verbose value='TRUE'/>
+         </Interface>
+         <Interface Name='CSV0TCP'>
+           <InterfaceType value='CSVTCP'/>
+           <CSVSeparator value='|'/>
+           <TcpPort value='45678'/>
+           <StartUpDelay value='10'/>
+           <Verbose value='TRUE'/>
+         </Interface>
+        </Host>
+</Resources>
diff --git a/cfg/internal_fcn.def b/cfg/internal_fcn.def
new file mode 100644 (file)
index 0000000..dff17b1
--- /dev/null
@@ -0,0 +1,85 @@
+
+Add_Int_Timeval
+static struct timeval Add_Int_Timeval(int inc, struct timeval t){
+   struct timeval r;
+       r.tv_usec = t.tv_usec + (inc % 1000);
+       r.tv_sec = t.tv_sec + inc / 1000;
+       if(r.tv_usec > 999){
+               r.tv_usec -= 1000;
+               r.tv_sec++;
+       }
+       return(r);
+}      
+
+Add_Timeval_Int
+static struct timeval Add_Timeval_Int(struct timeval t, int inc){
+   struct timeval r;
+       r.tv_usec = t.tv_usec + (inc % 1000);
+       r.tv_sec = t.tv_sec + inc / 1000;
+       if(r.tv_usec > 999){
+               r.tv_usec -= 1000;
+               r.tv_sec++;
+       }
+       return(r);
+}
+
+Subtract_Timeval_Int
+static struct timeval Subtract_Timeval_Int(struct timeval t, int inc){
+   struct timeval r;
+       r.tv_usec = t.tv_usec - (inc % 1000);
+       r.tv_sec = t.tv_sec - inc / 1000;
+       if(r.tv_usec < 0){
+               r.tv_usec += 1000;
+               r.tv_sec--;
+       }
+       return(r);
+}
+
+Divide_Timeval_Int
+static struct timeval Divide_Timeval_Int(struct timeval t, int d){
+       struct timeval r;
+       r.tv_sec = t.tv_sec / d;
+       r.tv_usec = (t.tv_usec + 1000*( t.tv_sec % d )) / d;
+       return(r);
+}      
+       
+
+Subtract_Timeval_Timeval
+static int Subtract_Timeval_Timeval(struct timeval t1, struct timeval t2){
+       return(1000*(t1.tv_sec - t2.tv_sec) + (t1.tv_usec - t2.tv_usec) );
+}
+
+Compare_Timeval
+static int Compare_Timeval(struct timeval t1, struct timeval t2){
+       return( t1.tv_sec != t2.tv_sec ? t1.tv_sec - t2.tv_sec : t1.tv_usec - t2.tv_usec );
+}
+
+Timeval_Constructor
+static struct timeval Timeval_Constructor(int s, int m){
+   struct timeval r;
+       r.tv_sec = s;
+    r.tv_usec = m;
+       return(r);
+}
+
+String_Constructor
+static struct gs_string String_Constructor(char *l){
+  struct gs_string s;
+       s.data = l;
+    s.owner = NULL;
+       s.length = 0;
+    while(l[s.length] != '\0') s.length++;
+       return(s);
+}
+
+Compare_String
+
+str_assign_with_copy
+
+str_assign_with_copy_in_tuple
+
+str_replace
+
+str_length
+
+str_destroy
diff --git a/cfg/localhost.ifq b/cfg/localhost.ifq
new file mode 100644 (file)
index 0000000..683ba2d
--- /dev/null
@@ -0,0 +1,4 @@
+default : Contains[InterfaceType,GDAT] and Equals[Host,'localhost'];
+csv : Contains[InterfaceType,CSV] and Equals[Host,'localhost'];
+csvtcp : Contains[InterfaceType,CSVTCP] and Equals[Host,'localhost'];
+gdat: Contains[InterfaceType,GDAT] and Equals[Host,'localhost']
diff --git a/cfg/packet_schema.txt b/cfg/packet_schema.txt
new file mode 100644 (file)
index 0000000..5634820
--- /dev/null
@@ -0,0 +1,36 @@
+PROTOCOL base{
+       uint systemTime get_system_time (low_cardinality,required,increasing, snap_len 0);
+}
+
+PROTOCOL CSV_EXAMPLE (base) {
+       uint uintInPosition1  get_csv_uint_pos1;
+       ullong ullongInPosition2 get_csv_ullong_pos2;
+       IP ipInPosition3 get_csv_ip_pos3;
+       IPV6 ipv6InPosition4 get_csv_ipv6_pos4;
+       string stringInPosition5 get_csv_string_pos5;
+       bool boolInPosition6 get_csv_bool_pos6;
+       int intInPosition7 get_csv_int_pos7;
+       llong llongInPosition8 get_csv_llong_pos8;
+       float floatInPosition9 get_csv_float_pos9;
+}
+
+
+PROTOCOL CSV_TCPEXAMPLE (base) {
+       uint ivalue get_csv_uint_pos1 (increasing);
+       uint value get_csv_uint_pos2;
+}
+
+PROTOCOL GDAT_EXAMPLE (base) {
+       uint uintOldTime get_gdat_uint_pos1;
+        uint uintInPosition1  get_gdat_uint_pos2;
+        ullong ullongInPosition2 get_gdat_ullong_pos3;
+        IP ipInPosition3 get_gdat_ip_pos4;
+        IPV6 ipv6InPosition4 get_gdat_ipv6_pos5;
+        string stringInPosition5 get_gdat_string_pos6;
+        bool boolInPosition6 get_gdat_bool_pos7;
+        int intInPosition7 get_gdat_int_pos8;
+        llong llongInPosition8 get_gdat_llong_pos9;
+        float floatInPosition9 get_gdat_float_pos10;
+}
+
+
diff --git a/include/README.md b/include/README.md
new file mode 100644 (file)
index 0000000..8935956
--- /dev/null
@@ -0,0 +1,17 @@
+This directory contains the include files required by the SQL compiler
+
+## License and Trademarks
+
+Copyright 2014 Cask Data, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License"); you may not
+use this file except in compliance with the License. You may obtain a copy of
+the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+License for the specific language governing permissions and limitations under
+the License.
\ No newline at end of file
diff --git a/include/app.h b/include/app.h
new file mode 100644 (file)
index 0000000..d9967e3
--- /dev/null
@@ -0,0 +1,106 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+/*
+ * app.h: interface for applications
+ */
+#ifndef APP_H
+#define APP_H
+
+
+#include "fta.h"
+#include "lapp.h"
+
+/* HIGH LEVEL APPLICATION INTERFACE */
+/* ================================ */
+
+
+
+
+/* will call hostlib_init using the specified ringbuffer size
+ */
+gs_retval_t ftaapp_init(gs_uint32_t bufsz);
+
+/* this should be used before exit() to make sure everything gets
+ cleaned up
+ */
+gs_retval_t ftaapp_exit();
+
+/* adds an FTA by key returns unique streamid which can be used to reference FTA*/
+
+/* reuse:
+ if reuse is set to 0, only FTA information will be returned
+ if reuse is set to 1, instance will be returned provided there is an
+ instance that is marked as reusable by fta/app who instantiated it
+ */
+
+/* reusable:
+ if reusable is 0, new instance will be created and it will be marked as
+ non-reusable regardless of how reuse flag is set by query writer
+ if reusable is 1, new instance will be created and it will be marked as
+ reusable regardless of how reuse flag is set by query writer
+ if reusable is set to 2. new instance will be created with reusability flag
+ matching the reusability flag of the query being instantiated
+ */
+
+FTAID ftaapp_add_fta(FTAname name, gs_uint32_t reuse, gs_uint32_t reusable,
+                     gs_int32_t command, gs_int32_t sz, void *  data);
+
+/* adds an FTA by key returns unique streamid which can be used to reference
+ FTA. This FTA does not produce any local data. Instead it generates a
+ compressed outpufile in gdat format. The path specifies the directory
+ the file will be put in. base specifies the base part of the name
+ the <temporal field value> will be prepented to the name and gdat.gz
+ will be appended. The temporal field needs to be specified which
+ can be an uint, int, ullong or llong. The delta is an integer defining how
+ much the temoral value has to change before a new file is generated.
+ The same ftaapp_remote_fta function is used to remove these FTAs.
+ */
+FTAID ftaapp_add_fta_print(FTAname name, gs_uint32_t reuse, gs_uint32_t reusable,
+                           gs_int32_t command, gs_int32_t sz,
+                           void *  data, gs_sp_t path,
+                           gs_sp_t basename, gs_sp_t temporal_field, gs_sp_t split_field,
+                           gs_uint32_t delta, gs_uint32_t split);
+
+/* get the schema handle definition for the FTA associated with the streamid
+ the returned handle will be freed by the app library when the corresponding
+ fta is removed
+ */
+gs_schemahandle_t ftaapp_get_fta_schema(FTAID f);
+
+/* get a schema handle definition for the FTA associated with the FTA name
+ this handle has to be freed by the caller using the schema interface */
+gs_schemahandle_t ftaapp_get_fta_schema_by_name(gs_sp_t name);
+
+/* get an ascii representation of the schema definition
+ for the FTA associated with the FTA name. The ascii representation
+ is stored in a static buffer. The value will therefore change
+ after subsequent calls to this function and the function is not
+ multithread safe.*/
+gs_sp_t ftaapp_get_fta_ascii_schema_by_name(gs_sp_t name);
+
+/* control operations keyed of one to one mapping of stream id */
+gs_retval_t ftaapp_control(FTAID f, gs_int32_t command, gs_int32_t sz, void *  data);
+
+/* remove FTA keyed of stream id */
+/* if recursive is true the children of f will get removed too */
+gs_retval_t ftaapp_remove_fta(FTAID f, gs_uint32_t recursive);
+
+/* same as sgroup_get_buffer just repeated to have a complet ftapp interface */
+gs_retval_t ftaapp_get_tuple(FTAID * f, gs_uint32_t * size, void *tbuffer,
+                             gs_int32_t tbuf_size, gs_int32_t timeout);
+
+#endif
diff --git a/include/byteswap.h b/include/byteswap.h
new file mode 100644 (file)
index 0000000..31b4e90
--- /dev/null
@@ -0,0 +1,54 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef BYTESWAP_H
+#define BYTESWAP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+    
+#include "gsconfig.h"
+#include "gstypes.h"
+    
+    
+    gs_uint16_t gscpbswap16(gs_uint16_t);
+    gs_uint32_t gscpbswap32(gs_uint32_t);
+    gs_uint64_t gscpbswap64(gs_uint64_t);
+    
+#ifdef __cplusplus
+}
+#endif
+
+#undef ntohl
+#undef ntohs
+#undef htons
+#undef htonl
+#undef htonll
+#undef ntohll
+
+
+#define        ntohs(x)        gscpbswap16((gs_uint16_t)(x))
+#define        ntohl(x)        gscpbswap32((gs_uint32_t)(x))
+#define ntohll(x)       gscpbswap64((gs_uint64_t)(x))
+#define        htons(x)        gscpbswap16((gs_uint16_t)(x))
+#define        htonl(x)        gscpbswap32((gs_uint32_t)(x))
+#define htonll(x)       gscpbswap64((gs_uint64_t)(x))
+
+/* do nothing fo floating point numbers */
+#define htonf(x)        (x)
+#define ntohf(x)        (x)
+
+
+#endif
diff --git a/include/clearinghouseregistries.h b/include/clearinghouseregistries.h
new file mode 100644 (file)
index 0000000..8c66c9b
--- /dev/null
@@ -0,0 +1,64 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef CLEARINGHOUSEREGISTRIES_H
+#define CLEARINGHOUSEREGISTRIES_H
+
+#include "fta.h"
+#include "systat.h"
+#include "fta_stat.h"
+
+/* The table is used to maintain the location information
+ *  of FTAs within the clearinghouse it is not used outherwise
+ * Behaviour is undefined if the same name
+ * is registered more then once.
+ */
+
+/* These functions are used for both FTAs and instances of FTAs
+ * if ftaid.streamid == 0 then the function is called for a FTA
+ * if not it is called for an FTA instance.
+ * if an FTA is registered reusable must be set to 1
+ * if an FTA instance is registered reusable is either set to
+ *   0 or 1 depending if the fta can be reused
+ * if reuse is set to 1 an existing instance is returned
+ * if reuse is set to 0 the FTA and not an instance is returned
+ */
+
+/* Adds a FTA to the lookup table if FTAID schema */
+gs_retval_t ftalookup_register_fta(FTAID subscriber,
+                                   FTAID ftaid,
+                                   FTAname name,
+                                   gs_uint32_t reusable,
+                                   gs_csp_t schema);
+
+/* Removes the FTA from the lookup table */
+gs_retval_t ftalookup_unregister_fta(FTAID subscriber,
+                                     FTAID ftaid);
+
+/* Looks an FTA up by name */
+gs_retval_t ftalookup_lookup_fta_index(FTAID caller,
+                                       FTAname name,
+                                       gs_uint32_t reuse,
+                                       FTAID * ftaid,
+                                       gs_csp_t * schema);
+
+/* Gets called when a consumer stoped receiving data */
+
+gs_retval_t ftalookup_producer_failure(FTAID caller,FTAID producer);
+
+/* Gets called when a FTA sends a heart beat */
+
+gs_retval_t ftalookup_heartbeat(FTAID caller, gs_uint64_t trace_id,
+                                gs_uint32_t sz, fta_stat * trace );
+#endif
diff --git a/include/filter.h b/include/filter.h
new file mode 100644 (file)
index 0000000..9fe1141
--- /dev/null
@@ -0,0 +1,46 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+ * filter.h: hash table function which match the interface
+ */
+#ifndef FILTER_H
+#define FILTER_H
+
+/* FILTER FUNCTIONS */
+/* ===============  */
+
+/* The following functions are used to manage filter sets for flow
+   and connection filters
+*/
+
+struct filter {
+    gs_uint32_t size;
+    gs_uint8_t data[1];
+};
+
+struct filter * ftafilter_create(gs_int32_t size);
+void ftafilter_delete(struct filter * filter);
+void ftafilter_add_flow ( struct filter * filter, gs_uint32_t ip, gs_uint32_t port);
+void fyafilter_add_connection ( struct filter * filter, gs_uint32_t ip1,
+                            gs_uint32_t port1, gs_uint32_t ip2, gs_uint32_t port2);
+void ftafilter_rm_flow ( struct filter * filter, gs_uint32_t ip, gs_uint32_t port);
+void ftafilter_rm_connection ( struct filter * filter, gs_uint32_t ip1,
+                           gs_uint32_t port1, gs_uint32_t ip2, gs_uint32_t port2);
+struct vstring * ftafilter_to_vstring(struct filter * f );
+void ftafilter_vstring_free(struct vstring * res);
+
+
+#endif
diff --git a/include/fta.h b/include/fta.h
new file mode 100644 (file)
index 0000000..670090b
--- /dev/null
@@ -0,0 +1,189 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+/*
+ * fta.h: fta definition for applications
+ */
+#ifndef FTA_H
+#define FTA_H
+
+#include "gslog.h"
+#include "gsconfig.h"
+
+typedef struct FTAID {
+    gs_uint32_t ip;  /* identifies the node */
+    gs_uint32_t port; /* identifies a process */
+    gs_uint32_t index;  /* the index identifies a particular FTA in the process */
+    gs_p_t streamid; /* streamid if set identifies an instance */
+} FTAID;
+
+
+
+typedef struct PRINTFUNC {
+    gs_sp_t header;
+    gs_sp_t path;
+    gs_sp_t basename;
+    FILE * fa[MAXPRINTFILES];
+    gs_uint32_t nexttime;
+    gs_uint32_t split;
+    gs_uint32_t base;
+    gs_uint32_t itt;
+    gs_uint32_t delta;
+    gs_schemahandle_t schemaid;
+    gs_int32_t split_field;
+    gs_int32_t temporal_field;
+    gs_int32_t in_use;
+} PRINTFUNC;
+
+/* the following defines define the FTA commands */
+
+#define FTA_COMMAND_LOAD_PARAMS 1
+#define FTA_COMMAND_FLUSH 2
+#define FTA_COMMAND_GET_TEMP_STATUS 3
+#define FTA_COMMAND_SET_SAMPLING_RATE 4
+#define FTA_COMMAND_FILE_DONE 5
+
+typedef gs_csp_t FTAname;
+
+typedef gs_csp_t DEVname;
+
+#define DEFAULTDEV 0
+
+//     Use gs_param_handle_t defined in gscpv3/include/gstypes.h instead
+// typedef gs_uint32_t param_handle_t;
+
+struct FTA {
+    
+    /* reference counts managed by the RTS */
+    gs_uint32_t refcnt;
+    gs_uint32_t runrefcnt;
+    
+    /* the ID gets filled in by the runtime system */
+    FTAID ftaid;
+    
+    /* indicates if the FTA instance can be reused. Set by FTA 0 indicates
+     * that it can not be reused.
+     */
+    gs_uint32_t reusable;
+    
+    /* ftaids the HFTA is subscribed to*/
+    FTAID stream_subscribed[64];
+    
+    /* number of valid entries in stream_subscribe [0..stream_subscribed_cnt-1] */
+    gs_uint32_t stream_subscribed_cnt;
+    
+    /* State needed to print directly to a file out of a HFTA */
+    
+    PRINTFUNC printfunc;
+    
+    /* value of prefilter only used in lftas */
+    gs_uint64_t prefilter;
+    
+    /* allocates and initializes a paramterized instance of a FTA
+     */
+    struct FTA * (*alloc_fta) (FTAID ftaid, gs_uint32_t reusable,
+                               gs_int32_t command, gs_int32_t sz, void * value );
+    
+    /* release all resources associated with FTA (including the FTA) */
+    gs_retval_t (*free_fta) (struct FTA *, gs_uint32_t recursive);
+    
+    /* send control data from host to an instance of an FTA, may return status */
+    gs_retval_t (*control_fta) (struct FTA *, gs_int32_t command, gs_int32_t sz, void * value);
+    
+    /* gets called once every second. Might be delayed until the current thread execution
+     * returns into the run time system. If delayed for more then 1 second then only one
+     * call will be made at the next oportunity.
+     */
+    gs_retval_t (*clock_fta) (struct FTA *);
+    
+    /*
+     * process a packet received on the interface or a tuple received from
+     * another FTA. If ftaid is 0 then packet is of
+     * type struct packet otherwise it is a tuple as defined by the
+     * ftaid.
+     */
+    gs_retval_t (*accept_packet)(struct FTA *, FTAID * f, void * packet, gs_int32_t sz);
+};
+
+/* The following definitions are used or provided in automatically generated files */
+
+typedef  struct FTA * (*alloc_fta) (FTAID ftaid, gs_uint32_t reusable,
+gs_int32_t command, gs_int32_t sz, void * value ) ;
+
+
+/* FTA INTERFACE */
+/* ============== */
+/* These functions are used by FTAs in addition to the LOW and HIGH
+ * level application interface functions.
+ */
+
+/* start_service is called to process requests from the message queue
+ which would invoke callback functions registered by fta_register.
+ Number indicates how many seconds should be waited before the
+ function returns. If number < 0 then the function is an endless
+ loop (should be used for HFTA) if the number == 0 all currently
+ outstanding requests are processed before the function returns.
+ */
+gs_retval_t fta_start_service(gs_int32_t number);
+
+/* the dev name indicates on which device the FTA is supposed to execute.
+ * HFTA should always use DEFAULTDEV and a snaplen of -1
+ */
+FTAID fta_register(FTAname name, gs_uint32_t reusable, DEVname device,
+                   alloc_fta fta_alloc_functionptr, gs_csp_t schema,gs_int32_t snaplen,
+                   gs_uint64_t prefilter);
+
+gs_retval_t fta_unregister(FTAID f);
+
+
+/*
+ * get the maximum snap length of all ftas registered within the current proccess
+ */
+
+gs_retval_t fta_max_snaplen();
+
+/*
+ * Post a tupple back to the clearing house This tuple cannot
+ * use the lfta tuple allocation functions. NOTE: post tuple will
+ * return -1 if at least one ringbuffer for that FTA which is in the atomic
+ * set has not enought space. Otherwise 0 is returned.
+ */
+gs_retval_t hfta_post_tuple(struct FTA * self, gs_int32_t sz, void *tuple);
+
+/* the following function fills in the FTAID array r with the FTAIDs of processes receiving
+ * tuplese from the FTA specified in f. The space array indicates how many tuples of tuplesz
+ * can still fit in the ringbuffer corresponding to the FTAID of the process with the same index
+ * in r. The return values indicates how many ring buffers are valid in r. szr indicates the memory
+ * length (in elements) of  r and space. The function will fill at most szr elements into these array.
+ * If the return value is larger then szr it is an indication that not enough memory in r and space
+ * were provided to hold all results. A return value of -1 indicates an error.
+ */
+
+gs_retval_t hfta_get_ringbuf_space(struct FTA * f, FTAID * r, gs_int32_t* space, gs_int32_t szr, gs_int32_t tuplesz);
+
+
+/* the following function can be used to put a ringbuffer to a process identified by the FTAID
+ * process into one of the following 3 modes. ATOMIC makes the ringbuffer part of the atomic set.
+ * A post to the atomic set either succeed or fails entirely. BESTEFFORT is the besteffort set
+ * posts to BESTEFFORT ringbuffers might fail quitely. SUSPEND will prevent any tuples of being
+ * posted to that proccess from the specified FTA.
+ */
+
+#define HFTA_RINGBUF_ATOMIC 1
+#define HFTA_RINGBUF_BESTEFFORT 2
+#define HFTA_RINGBUF_SUSPEND 3
+
+gs_retval_t hfta_set_ringbuf_type(struct FTA * f, FTAID process, gs_int32_t state);
+
+#endif
diff --git a/include/fta_stat.h b/include/fta_stat.h
new file mode 100644 (file)
index 0000000..66dbb94
--- /dev/null
@@ -0,0 +1,35 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef FTA_STAT_H
+#define FTA_STAT_H
+
+/* statiss are collected by FTAs and regularly sent to cluster manager (currently every 1 sec)
+ * Statistics refers to time interval since the last time statistics was reported */
+typedef struct fta_stat {
+   FTAID ftaid;
+   gs_uint32_t in_tuple_cnt;           /* # of tuples received */
+   gs_uint32_t out_tuple_cnt;          /* # of tuples produced */
+   gs_uint32_t out_tuple_sz;           /* bytes in produced tuples */
+   gs_uint32_t accepted_tuple_cnt;     /* # of tuples that passed initial unpacking and selection predicate */
+   gs_uint64_t cycle_cnt;                      /* # of cpu cycles spent in accept_tuple */
+   gs_uint32_t collision_cnt;          /* # of collisions in an aggregation hash table */
+   gs_uint32_t eviction_cnt;           /* # of collisions in an aggregation hash table */
+   gs_float_t sampling_rate;                   /* sampling rate used by fta */
+
+  /* ...will add more fields in the future... */
+} fta_stat;
+
+#endif /* FTA_STAT_H */
diff --git a/include/gsconfig.h b/include/gsconfig.h
new file mode 100644 (file)
index 0000000..73ad9b8
--- /dev/null
@@ -0,0 +1,206 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef GSCONFIG
+#define GSCONFIG
+
+// Contains all defines etc... . As we don't have a proper configure script yet at least that way all the defines are in one place.
+
+// ==================================================
+// General defines
+// ==================================================
+
+
+// if set we use 64 BIT GS
+#define GS64
+
+// HOST NAME LENGTH FOR LOGGING
+#ifndef HOST_NAME_MAX
+#define HOST_NAME_MAX 255
+#endif
+
+// STATISTICS LOGGING INTERVAL IN SECONDS
+#define GSLOGINTERVAL 10
+
+// Start size of dynamiclly growing internal arrays
+// TODO: current implementation penalizes large initial size of the array with slow linear search, change the size to 1 for now
+#define STARTSZ 1       // T1024
+
+// Use blocking ringbuffer
+#define BLOCKRINGBUFFER
+
+//#define LOCALIP // restricts sockets to localhost IP
+
+
+// maximume number of print streams
+#define MAXPRINTFILES 16
+
+// allows sampling on the schema level
+//#define LOWSAMPLE 0
+
+// if defined outputs logs larger then that level to stderr
+#define LOGSTDERR LOG_WARNING
+
+
+// ==================================================
+// Callback  stuff
+// ==================================================
+
+// If POLLING is defined HFTA's poll the ring buffers every 100msec rather then
+// block on a message receive
+#define POLLING
+
+
+// ==================================================
+// LAP  stuff
+// ==================================================
+
+// ==================================================
+// Tool  stuff
+// ==================================================
+
+// BLOCK size for gdatcat
+#define CATBLOCKSZ 200*1024*1024
+
+// Enables bzip2 compression rather then gzip compression in gsgdatprint
+//#define GSBZIP2
+
+// Uses the gzip library rather then forking a gzip process in gsgdaprint
+//#define ZLIB
+
+
+// ==================================================
+// IPC  stuff
+// ==================================================
+
+#define MAXMSGSZ 10240
+#define MAXTUPLESZ 10240
+#define MAXRES MAXMSGSZ
+
+#define MAXSZ (((MAXTUPLESZ+128)>MAXMSGSZ?MAXTUPLESZ+128:MAXMSGSZ))
+
+#define SOCK_BUF_SZ 160*(MAXMSGSZ+4)
+#define SOCKET_HASH_SZ 512
+#define MAX_NUMBER_OF_SHM 64
+
+//#define PRINTMSG // prints low level IPC messages for debugging VERY VERBOSE
+
+/* maximum size of an FTA name */
+#define MAXFTANAME 256
+#define MAXPRINTSTRING 256
+
+/* maximum size of a schema definition */
+#define MAXSCHEMASZ (8*1024)
+
+
+// ==================================================
+// DAG related defines
+// ==================================================
+
+#define DAGMAXPACKETSZ 2*4096
+#define DAGTIMEOUT 50 /* timeout in msec  */
+
+/* GPP record type defines  has to match dagapi.h*/
+#ifndef TYPE_LEGACY
+#define TYPE_LEGACY       0
+#define TYPE_HDLC_POS     1
+#define TYPE_ETH          2
+#define TYPE_ATM          3
+#define TYPE_AAL5     4
+#endif
+
+/* GSCP special types */
+#define TYPE_PPP_POS 5
+#define TYPE_ETH_PPP 6
+#define TYPE_CRS1_OC768_POS 7
+#define TYPE_ETH_VPLS_GRE 8
+#define TYPE_ETH_GTP 9
+
+//#define DAGDEBUG
+
+//#define LLDUPREM
+
+//#define GTPONLY // then only the GTP parsing code gets compiled which saves a couple of milion cycles at high speeds.
+
+//#define DOUBLEHASH
+
+#define VMETR // detailed RTS stats
+
+#define DAGPOSCONFIGSTRING ""
+#define DAGETHCONFIGSTRING ""
+#define DAGATMAAL5CONFIGSTRING ""
+
+// ==================================================
+// PCAP  stuff
+// ==================================================
+
+
+#define PCAPTIMEOUT 50 /* timeout in msec for calls to pcap_process_packets */
+#define PCAPMAXPACKETSZ 1560
+#define PCAPBATCHSZ 1000
+#define PCAPMINBATCHSZ 30
+
+// ==================================================
+// REPLAY  stuff
+// ==================================================
+
+#define PCAPINITDELAY 120 /* time we wait before processing packets */
+#define PCAPREPLAYBATCHSZ 1
+//#define REPLAYNOW // if defined timestamps in pcap file are ignored
+
+// ==================================================
+// system stuff
+// ==================================================
+
+#ifdef sun // make sure the code which uses variables with the name sun
+// still works on a sun ....
+#undef sun
+#endif
+
+#ifndef AF_LOCAL
+#ifdef AF_UNIX
+#define AF_LOCAL AF_UNIX
+#endif
+#endif
+
+#ifndef SUN_LEN
+#define SUN_LEN(su) \
+(sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path))
+#endif
+
+#ifdef __linux__
+#include <sys/ioctl.h>
+#endif
+#ifndef IPC_RALL
+#define IPC_RALL           000444 /* read permission */
+#endif
+#ifndef IPC_WALL
+#define IPC_WALL           000222  /* write/alter permission */
+#endif
+#ifndef IPC_R
+#define IPC_R           000400  /* read permission */
+#endif
+#ifndef IPC_W
+#define IPC_W           000200  /* write/alter permission */
+#endif
+#ifndef IPC_CREAT
+#define IPC_CREAT       001000  /* create entry if key does not exist */
+#endif
+
+#ifndef ENOMSG
+#define ENOMSG EAGAIN  /* for MacOSX */
+#endif
+
+#endif
+
diff --git a/include/gshub.h b/include/gshub.h
new file mode 100644 (file)
index 0000000..cc3a6a9
--- /dev/null
@@ -0,0 +1,107 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+ /*
+ * gshub.h: interface to GSHUB to announce and discover gs instances, sources and sinks
+ */
+
+#ifndef GSHUB_H
+#define GSHUB_H
+
+#include "gstypes.h"
+#include "fta.h"
+#include "fta_stat.h"
+
+#define DISCOVER_INSTANCE_URL "/v1/discover-instance"
+#define DISCOVER_INITINSTANCE_URL "/v1/discover-initialized-instance"
+#define DISCOVER_SOURCE_URL "/v1/discover-source"
+#define DISCOVER_SINK_URL "/v1/discover-sink"
+#define DISCOVER_STARTPROCESSING_URL "/v1/discover-start-processing"
+#define ANNOUNCE_INSTANCE_URL "/v1/announce-instance"
+#define ANNOUNCE_INITINSTANCE_URL "/v1/announce-initialized-instance"
+#define ANNOUNCE_SOURCE_URL "/v1/announce-source"
+#define ANNOUNCE_SINK_URL "/v1/announce-sink"
+#define ANNOUNCE_STARTPROCESSING_URL "/v1/announce-start-processing"
+#define ANNOUNCE_STREAM_SUBSCRIPTION "/v1/announce-stream-subscription"
+#define ANNOUNCE_FTA_INSTANCE "/v1/announce-fta-instance"
+#define ANNOUNCE_METRICS "/v1/log-metrics"
+
+typedef struct {
+       gs_uint32_t ip;
+       gs_uint16_t port;
+} endpoint;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* saving and retrival of gshub endpoint */
+gs_retval_t set_hub(endpoint gshub);
+gs_retval_t get_hub(endpoint* gshub);
+
+/* savinf and retrieving instance name */
+gs_retval_t set_instance_name(gs_sp_t instancename);
+gs_sp_t get_instance_name();
+
+/* Discover gs instance endpoint by name.
+ * Return value of 0 indicates success. If blocking mode is used return value > 0 indicates that retry is needed. Return value < 0 indicates an error. */
+gs_retval_t get_instance(endpoint gshub, gs_sp_t instance_name, endpoint* instance, gs_bool_t block);
+
+/* Discover initialized gs instance endpoint by name.
+ * Return value of 0 indicates success. If blocking mode is used return value > 0 indicates that retry is needed. Return value < 0 indicates an error. */
+gs_retval_t get_initinstance(endpoint gshub, gs_sp_t instance_name, endpoint* instance, gs_bool_t block);
+
+/* Discover stream source endpoint by name.
+ * Return value of 0 indicates success. If blocking mode is used return value > 0 indicates that retry is needed. Return value < 0 indicates an error. */
+gs_retval_t get_streamsource(endpoint gshub, gs_sp_t source_name, endpoint* source, gs_bool_t block);
+
+/* Discover stream sink endpoint by name.
+ * Return value of 0 indicates success. If blocking mode is used return value > 0 indicates that retry is needed. Return value < 0 indicates an error. */
+gs_retval_t get_streamsink(endpoint gshub, gs_sp_t sink_name, endpoint* sink, gs_bool_t block);
+
+/* Discover if an isntance should start processing
+ * Return value of 0 indicates success. If blocking mode is used return value > 0 indicates that retry is needed. Return value < 0 indicates an error. */
+gs_retval_t get_startprocessing(endpoint gshub, gs_sp_t instance_name, gs_bool_t block);
+
+/* Announce gs instance endpoint to gshub. Return value of 0 indicates success. */
+gs_retval_t set_instance(endpoint gshub, gs_sp_t instance_name, endpoint instance);
+
+/* Announce initialized gs instance endpoint to gshub. Return value of 0 indicates success. */
+gs_retval_t set_initinstance(endpoint gshub, gs_sp_t instance_name);
+
+/* Announce stream source endpoint to gshub. Return value of 0 indicates success. */
+gs_retval_t set_streamsource(endpoint gshub, gs_sp_t source_name, endpoint source);
+
+/* Announce stream source endpoint to gshub. Return value of 0 indicates success. */
+gs_retval_t set_streamsink(endpoint gshub, gs_sp_t sink_name, endpoint sink);
+
+/* Announce to gshub that an instance can start processin. Return value of 0 indicates success. */
+gs_retval_t set_startprocessing(endpoint gshub, gs_sp_t instance_name);
+
+/* Announce stream subscription to gshub. Return value of 0 indicates success. */
+gs_retval_t set_streamsubscription(endpoint gshub, gs_sp_t instance_name, gs_sp_t sink_name);
+
+/* Announce new fta instantiation to gshub. Return value of 0 indicates success. */
+gs_retval_t set_ftainstance(endpoint gshub, gs_sp_t instance_name, gs_sp_t ftainstance_name, FTAID* id);
+
+/* Announce fta instance stats to gshub. Return value of 0 indicates success. */
+gs_retval_t set_instancestats(endpoint gshub, gs_sp_t instance_name, fta_stat* stats);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif         /* GSHUB_H */
diff --git a/include/gslog.h b/include/gslog.h
new file mode 100644 (file)
index 0000000..827af28
--- /dev/null
@@ -0,0 +1,102 @@
+ /*------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+ * gslog.h: syslog wrappers for GS-lite
+ */
+#ifndef GSLOG_H
+#define GSLOG_H
+
+
+#include "unistd.h"
+#include "sys/syslog.h"
+#include "stdio.h"
+#include "stdlib.h"
+#include "string.h"
+#include "stdarg.h"
+#include "time.h"
+#include "gsconfig.h"
+#include "gstypes.h"
+
+#ifdef LOGSTDERR
+static inline void gslog(int loglevel, const char * format, ...) {
+    va_list args;
+    va_start(args, format);
+    if (loglevel >= LOG_WARNING) {
+        vfprintf(stdout, format, args);
+        // Not generally syslog messages do not contain a \n so we need to add one for stdout/stderr
+        fprintf(stdout, "\n");
+        fflush(stdout);
+    } else {
+        //STDERR is not-buffered by default.
+        vfprintf(stderr, format, args);
+        fprintf(stderr, "\n");
+    }
+    va_end(args);
+}
+
+static inline void gsopenlog(gs_sp_t p) {
+    return;
+}
+
+#else
+
+#define gslog syslog
+
+#ifndef LOG_EMERG
+#define LOG_EMERG 7
+#endif
+
+// some state used for reporting
+
+extern gs_uint64_t intupledrop;
+extern gs_uint64_t outtupledrop;
+extern gs_uint64_t intuple;
+extern gs_uint64_t outtuple;
+extern gs_uint64_t inbytes;
+extern gs_uint64_t outbytes;
+extern gs_uint64_t cycles;
+
+
+static inline void gsopenlog(gs_sp_t p) {
+       gs_int8_t c[HOST_NAME_MAX+1];
+       gs_int8_t t[HOST_NAME_MAX+1+1000];
+       gs_sp_t t2;
+       if (gethostname(&c[0],HOST_NAME_MAX+1)!=0) {
+               fprintf(stderr,"GSCPV1::ERROR:could not get hostname\n");
+               exit(1);
+       }
+       c[HOST_NAME_MAX]=0;
+       sprintf(t,"GSCPv2:%s:%s:",c,p);
+       t2=strdup(t);
+       openlog(t2,LOG_NOWAIT|LOG_PID|LOG_CONS,LOG_LOCAL5);
+       gslog(LOG_INFO,"Started Logging");
+       intupledrop=0;
+       outtupledrop=0;
+       intuple=0;
+       outtuple=0;
+       inbytes=0;
+       outbytes=0;
+       cycles=0;
+}
+#endif
+
+static inline void gsstats() {
+       gs_uint32_t t;
+       //t=time(0);
+       //gslog(LOG_NOTICE,"STATS|%u|%llu|%llu|%llu|%llu|%llu|%llu|%llu",t,intuple,inbytes,intupledrop,outtuple,outbytes,outtupledrop,cycles);
+}
+
+#endif
diff --git a/include/gstypes.h b/include/gstypes.h
new file mode 100644 (file)
index 0000000..905fc09
--- /dev/null
@@ -0,0 +1,63 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef GSTYPES
+#define GSTYPES
+
+#include "gsconfig.h"
+
+// Basic type definitions used within the whole GS
+
+typedef unsigned char gs_uint8_t;
+typedef char gs_int8_t;
+typedef unsigned short gs_uint16_t;
+typedef short gs_int16_t;
+typedef unsigned int gs_uint32_t;
+typedef int gs_int32_t;
+typedef unsigned long long gs_uint64_t;
+typedef long long gs_int64_t;
+typedef gs_uint32_t gs_bool_t;
+typedef double gs_float_t;
+
+// Return value to check function call success
+typedef gs_int32_t gs_retval_t ;
+
+// Native String Pointer
+
+typedef gs_int8_t * gs_sp_t;
+
+// Const string pointer
+typedef const gs_int8_t * gs_csp_t;
+
+// Generic GS pointer
+
+#ifdef GS64
+
+typedef  gs_uint64_t gs_p_t;
+
+// Handle type for external handle functions
+typedef gs_int64_t gs_param_handle_t ;
+#else
+
+typedef  gs_uint32_t gs_p_t;
+
+// Handle type for external handle functions
+typedef gs_int32_t gs_param_handle_t ;
+#endif
+
+// Handle for GS schema
+
+typedef gs_int32_t gs_schemahandle_t ;
+
+#endif
diff --git a/include/hfta/base_operator.h b/include/hfta/base_operator.h
new file mode 100644 (file)
index 0000000..99df8fa
--- /dev/null
@@ -0,0 +1,56 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef BASE_OPERATOR_H
+#define BASE_OPERATOR_H
+
+#include "host_tuple.h"
+#include <list>
+using namespace std;
+
+class base_operator
+{
+protected:
+       unsigned int output_channel;
+       const char* op_name;
+public:
+//                     Tuple is presented to the operator.  Output tuples
+//                     returned in result
+       virtual int accept_tuple(host_tuple& tup, list<host_tuple>& result) = 0;
+//                     Flush output from the system
+       virtual int flush(list<host_tuple>& result) = 0;
+//                     Accept new query parameters
+       virtual int set_param_block(int sz, void * value) = 0;
+       virtual int get_temp_status(host_tuple& result) = 0;
+       virtual int get_blocked_status () = 0;
+
+       base_operator(const char* name) {
+               output_channel = 0;
+               op_name = name;
+       }
+
+       void set_output_channel(unsigned int channel) {
+               output_channel = channel;
+       }
+
+//                     Operator's memory footprint in bytes (estimate for the main structures - hash tables, etc )
+       virtual unsigned int get_mem_footprint() { return 0;    }
+
+       virtual const char* get_name() { return op_name; }
+
+       virtual ~base_operator() {}
+};
+
+#endif // BASE_OPERATOR_H
diff --git a/include/hfta/clean_operator.h b/include/hfta/clean_operator.h
new file mode 100644 (file)
index 0000000..6c8d0ed
--- /dev/null
@@ -0,0 +1,452 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef CLEAN_OPERATOR_H
+#define CLEAN_OPERATOR_H
+
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <list>
+#include "hash_table.h"
+#include <iostream>
+
+#define _GB_FLUSH_PER_TUPLE_ 1
+
+// #define _C_O_DEBUG 1
+
+using namespace std;
+
+template <class clean_func, class group, class aggregate, class state, class hasher_func, class equal_func, class superhasher_func, class superequal_func> class clean_operator: public base_operator{
+
+ private:
+
+  class superattribute{
+  public:
+    unsigned int count_distinct;
+    list<group*> l;
+
+    superattribute(){
+      count_distinct = 0;
+    };
+    ~superattribute(){};
+  };
+
+  clean_func func;
+  hash_table<group*, aggregate*, hasher_func, equal_func> group_table[2];
+  hash_table<group*, state*, superhasher_func, superequal_func> supergroup_table[2];
+  // maintains count_distinct for every supergroup
+  // also maintains list of groups of this supergroup
+  hash_table<group*, superattribute*, superhasher_func, superequal_func> sp_attribute[2];
+  bool flush_finished;
+  unsigned int curr_table;
+  unsigned int curr_supertable;
+  unsigned int curr_attrtable;
+  unsigned int packet_count;
+  unsigned int ccc;
+  typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator iter1; //find
+  typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator flush_pos;
+  typename hash_table<group*, state*, superhasher_func, superequal_func>::iterator iter2; //find
+  typename hash_table<group*, state*, superhasher_func, superequal_func>::iterator super_flush_pos;
+
+ public:
+
+//  clean_operator(int schema_hadle): func(1){
+  clean_operator(int schema_handle, const char* name) : base_operator(name), func(schema_handle){
+    flush_finished = true;
+    curr_table = 0;
+    curr_supertable = 0;
+    curr_attrtable = 0;
+    packet_count = 0;
+    ccc = 0;
+    flush_pos = group_table[1-curr_table].end();
+    super_flush_pos = supergroup_table[1-curr_supertable].end();
+  }
+
+  virtual int accept_tuple(host_tuple& tup, list<host_tuple>& result){
+    packet_count++;
+    // evict tuple from the old table
+    if(!flush_finished){
+      partial_flush(result);
+    }
+
+    //buffers to store keys
+    char buffer[sizeof(group)];
+
+    // key of the supergroup is all group-by attributes not including the once that define time window
+    // key of the supergroup is a subset of a group key
+    //cout << "clean_op: creating group" << "\n";
+    group* grp = func.create_group(tup,buffer);
+/*//                   Ignore temp tuples until we can fix their timestamps.
+if(func.temp_status_received()){
+  tup.free_tuple();
+ return 0;
+}*/
+    state* curr_state;
+    int cd = 0; //count_distinct
+
+    // do final clean at the border of the time window
+    if(func.flush_needed()){
+      //cout << "number of records: " << packet_count << endl;
+      //cout << "number of EVAL records: " << ccc << endl;
+      packet_count = 0;
+      ccc = 0;
+      // for every supergroup - clean group table
+      //cout << "FINAL CLEANING PHASE: " << "\n";
+      iter2 = supergroup_table[curr_supertable].begin();
+      while (iter2 != supergroup_table[curr_supertable].end()) {
+       cd =  ((*(sp_attribute[curr_attrtable].find((*iter2).first))).second)->count_distinct;
+       func.finalize_state((*iter2).second, cd);
+       clean((*iter2).first,(*iter2).second, true);
+       ++iter2;
+      }
+
+    }
+
+    if(!grp){
+      //cout << "clean_op: failed to create group" << "\n";
+      if(func.flush_needed()){
+       flush(result);
+       superflush();
+      }
+      if(func.temp_status_received()){
+       host_tuple temp_tup;
+       if (!func.create_temp_status_tuple(temp_tup, flush_finished)) {
+         temp_tup.channel = output_channel;
+         result.push_back(temp_tup);
+       }
+      }
+      tup.free_tuple();
+      return 0;
+    }
+
+    // first flush everything from the old table if needed
+    // need it before anything else because of the definition of the key for supergroup
+    if(func.flush_needed()){
+      //do flush of the old group table using state from the old supergroup table
+      flush(result);
+      //flush everything from the old supertable, swap tables;
+      superflush();
+    }
+
+    state* old_state;
+
+     //supergroup exists in the new table
+    if ((iter2 = supergroup_table[curr_supertable].find(grp)) != supergroup_table[curr_supertable].end()){
+      old_state = (*iter2).second;
+
+       superattribute *temp = (*(sp_attribute[curr_attrtable].find(grp))).second;
+       cd = temp->count_distinct;
+
+       if(!func.evaluate_predicate(tup,grp,old_state, cd)){
+        ccc++;
+        tup.free_tuple();
+        return 0;
+       }
+       // update superaggregates
+       func.update_plus_superaggr(tup, grp, old_state);
+       //((*(sp_attribute[curr_attrtable].find(grp))).second)->count_distinct++;
+       temp->count_distinct++;
+       cd = temp->count_distinct;
+       curr_state = old_state;
+    }
+    //new supergroup
+    else{
+
+      //look up the group in the old table,
+      if((iter2 = supergroup_table[1-curr_supertable].find(grp)) != supergroup_table[1-curr_supertable].end()){
+       cd  = ((*(sp_attribute[1-curr_attrtable].find(grp))).second)->count_distinct;
+       //curr_state = new state((*iter2).second);
+       curr_state = new state();
+       old_state = (*iter2).second;
+
+       //if there is one - do reinitialization
+       func.reinitialize_state(tup, grp, curr_state,old_state, cd);
+      }
+      else{
+       curr_state = new state();
+       //if there isn't - do initialization
+       func.initialize_state(tup, grp, curr_state);
+      }
+
+      // have to create new object for superkey
+      group* new_sgrp = new group(grp);
+
+      // need to insert the supergroup into the hash table even if the predicate
+      // evaluates to false, since the state is initialized with the first tuple of the supergroup
+
+      //insert supergroup into the hash table
+      supergroup_table[curr_supertable].insert(new_sgrp, curr_state);
+      // create superattribute object
+      superattribute* sp_attr = new superattribute();
+      sp_attribute[curr_attrtable].insert(new_sgrp,sp_attr);
+
+
+      if(!func.evaluate_predicate(tup, grp, curr_state, cd)){
+       ccc++;
+       tup.free_tuple();
+       return 0;
+      }
+
+      // update superaggregates
+      func.update_plus_superaggr(tup, grp, curr_state);
+      ((*(sp_attribute[curr_attrtable].find(grp))).second)->count_distinct++;
+    }
+
+    aggregate* ag;
+    cd = ((*(sp_attribute[curr_attrtable].find(grp))).second)->count_distinct;
+
+    if ((iter1 = group_table[curr_table].find(grp)) != group_table[curr_table].end()) {
+      //cout << "clean_op: group already exists" << "\n";
+      aggregate* old_aggr = (*iter1).second;
+
+      //adjust count_distinct due to aggregation
+      ((*(sp_attribute[curr_attrtable].find(grp))).second)->count_distinct--;
+
+      //update group aggregates
+      func.update_aggregate(tup, grp, old_aggr, curr_state, cd);
+      ag = old_aggr;
+    }
+    else{
+      //cout << "clean_op: creating a new group" << "\n";
+      // create a copy of the group on the heap
+      group *new_grp = new group(grp); // need a copy constructor for groups
+      aggregate* aggr = new aggregate();
+      // create an aggregate in preallocated buffer
+      aggr = func.create_aggregate(tup, grp, (char*)aggr, curr_state, cd);
+      //cout << "clean_op: inserting group into hash" << "\n";
+      group_table[curr_table].insert(new_grp, aggr);
+      ag = aggr;
+
+      // remember group in the list of supergroup
+      ((*(sp_attribute[curr_attrtable].find(new_grp))).second)->l.push_back(new_grp);
+
+    }
+
+
+    //used just for print
+    bool do_print = false;
+    cd =  ((*(sp_attribute[curr_attrtable].find(grp))).second)->count_distinct;
+
+    //CLEANING WHEN
+    if(func.need_to_clean(grp, curr_state, cd)){
+      clean(grp, curr_state, false);
+      do_print = true;
+    }
+
+    tup.free_tuple();
+    return 0;
+  }
+
+  virtual int flush(list<host_tuple>& result){
+
+    //cout << "clean_op: flush" << "\n";
+    host_tuple tup;
+    unsigned int old_table = 1-curr_table;
+    unsigned int old_supertable = 1-curr_supertable;
+    unsigned int old_attr = 1-curr_attrtable;
+    typename hash_table<group*, state*, superhasher_func, superequal_func>::iterator iter;
+    iter = supergroup_table[old_supertable].begin();
+    unsigned int cd  = 0;
+
+    //     if the old table isn't empty, flush it now.
+    if (!group_table[old_table].empty()) {
+      //cout << "clean_op: old table is not empty, flushing everything immediately" << "\n";
+      for (; flush_pos != group_table[old_table].end(); ++flush_pos) {
+
+       bool failed = false;
+       if((iter = supergroup_table[old_supertable].find((*flush_pos).first)) != supergroup_table[old_supertable].end()){
+
+         cd = ((*(sp_attribute[old_attr].find((*flush_pos).first))).second)->count_distinct;
+
+         tup = func.create_output_tuple((*flush_pos).first,(*flush_pos).second, (*iter).second, cd ,failed);
+         if (!failed) {
+           //cout << "sampled\n";
+           tup.channel = output_channel;
+           result.push_back(tup);
+         }
+
+         // may not need deletion of the list pointer, since the supergroup will be flushed soon anyway.
+       }
+
+       delete ((*flush_pos).first);
+       delete ((*flush_pos).second);
+      }
+      group_table[old_table].clear();
+      group_table[old_table].rehash();
+    }
+
+    //    swap tables, enable partial flush processing.
+    flush_pos = group_table[curr_table].begin();
+    curr_table = old_table;
+    flush_finished = false;
+
+    return 0;
+  }
+
+  virtual int partial_flush(list<host_tuple>& result){
+
+    //cout << "clean_op: partial flush" << "\n";
+    host_tuple tup;
+    unsigned int old_table = 1-curr_table;
+    unsigned int old_supertable = 1-curr_supertable;
+    unsigned int old_attr = 1-curr_attrtable;
+    unsigned int i;
+    unsigned int cd = 0;
+    typename hash_table<group*, state*, superhasher_func, superequal_func>::iterator iter;
+    iter = supergroup_table[old_supertable].begin();
+
+    // emit up to _GB_FLUSH_PER_TABLE_ output tuples.
+    if (!group_table[old_table].empty()) {
+      for (i=0; flush_pos != group_table[old_table].end() && i<_GB_FLUSH_PER_TUPLE_; ++flush_pos, ++i) {
+
+       bool failed = false;
+       // find supergroup of the group to be deleted
+       if((iter = supergroup_table[old_supertable].find((*flush_pos).first)) != supergroup_table[old_supertable].end()){
+
+         cd = ((*(sp_attribute[old_attr].find((*flush_pos).first))).second)->count_distinct;
+
+         tup = func.create_output_tuple((*flush_pos).first,(*flush_pos).second, (*iter).second, cd, failed);
+         if (!failed) {
+
+           //cout << "sampled\n";
+           tup.channel = output_channel;
+           result.push_back(tup);
+         }
+
+         // may not need deletion of the list pointer, since the supergroup will be flushed soon anyway.
+       }
+
+       delete ((*flush_pos).first);
+       delete ((*flush_pos).second);
+      }
+    }
+
+    //   finalize processing if empty.
+    if(flush_pos == group_table[old_table].end()) {
+      flush_finished = true;
+      group_table[old_table].clear();
+      group_table[old_table].rehash();
+    }
+
+    return 0;
+  }
+
+  virtual int superflush(){
+
+    // cout << "clean_op: superflush" << "\n";
+    typename hash_table<group*, superattribute*, superhasher_func, superequal_func>::iterator attr_flush_pos;
+    unsigned int old = 1-curr_supertable;
+    unsigned int attr_old = 1-curr_attrtable;
+
+    // if the old supergroup table isn't empty, flush it now.
+    if (!supergroup_table[old].empty()) {
+      //cout << "clean_op: flush supertable" << "\n";
+      for (; super_flush_pos != supergroup_table[old].end(); ++super_flush_pos) {
+       //find that supergroup in the attributes table
+       attr_flush_pos = sp_attribute[attr_old].find((*super_flush_pos).first);
+
+       delete ((*super_flush_pos).first);
+       delete ((*super_flush_pos).second);
+       //flush superattribute table too
+       //delete ((*attr_flush_pos).first);
+       delete ((*attr_flush_pos).second);
+      }
+      supergroup_table[old].clear();
+      supergroup_table[old].rehash();
+      sp_attribute[attr_old].clear();
+      sp_attribute[attr_old].rehash();
+    }
+
+    // swap supertables
+    super_flush_pos = supergroup_table[curr_supertable].begin();
+    curr_supertable = old;
+    // swap attribute tables
+    curr_attrtable = attr_old;
+
+    return 0;
+  }
+
+  virtual int clean(group* sgr, state* st, bool final_clean){
+    //cout << "clean_op: clean" << "\n";
+    bool sample = false;
+
+    typename list<group*>::iterator viter;
+    superattribute* glist = (*(sp_attribute[curr_attrtable].find(sgr))).second;
+    int cd = ((*(sp_attribute[curr_attrtable].find(sgr))).second)->count_distinct;
+//    glist->l.size();
+//    group_table[curr_table].size();
+    if (!glist->l.empty()){
+
+      //cout << "clean_op: list of group pointers is not empty" << "\n";
+      viter = glist->l.begin();
+      for(; viter != glist->l.end();){
+       iter1 = group_table[curr_table].find(*viter);
+       aggregate* old_aggr = (*iter1).second;
+
+       //if (((*iter1).first->valid)){
+       if (final_clean){
+           // HAVING
+         sample = func.final_sample_group((*iter1).first, old_aggr, st, cd);
+       }
+         else
+           // CLEANING BY
+           sample = func.sample_group((*iter1).first, old_aggr, st, cd);
+
+         if(!sample){
+           //cout << "clean_op: evicting group from the group table" << "\n";
+           //update superaggregates
+           func.update_minus_superaggr((*iter1).first, old_aggr, st);
+           //delete group
+           group* g = (*iter1).first;
+           aggregate* a = (*iter1).second;
+           group_table[curr_table].erase((*iter1).first);
+           delete g;
+           delete a;
+           //update count_distinct
+           ((*(sp_attribute[curr_attrtable].find((*iter1).first))).second)->count_distinct--;
+           //remove pointer from supergroup
+           viter = glist->l.erase(viter);
+         }
+         else
+           ++viter;
+      }
+    }
+
+    return 0;
+  }
+
+  virtual int set_param_block(int sz, void* value){
+    func.set_param_block(sz, value);
+    return 0;
+  }
+
+  virtual int get_temp_status(host_tuple& result){
+    result.channel = output_channel;
+    return func.create_temp_status_tuple(result, flush_finished);
+  }
+
+  virtual int get_blocked_status(){
+    return -1;
+  }
+
+  unsigned int get_mem_footprint() {
+               return group_table[0].get_mem_footprint() + group_table[1].get_mem_footprint() +
+               supergroup_table[0].get_mem_footprint() + supergroup_table[1].get_mem_footprint() +
+               sp_attribute[0].get_mem_footprint() + sp_attribute[1].get_mem_footprint();
+  }
+
+};
+
+#endif
diff --git a/include/hfta/file_output_operator.h b/include/hfta/file_output_operator.h
new file mode 100644 (file)
index 0000000..a446dc6
--- /dev/null
@@ -0,0 +1,216 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef FILE_OUTPUT_OPERATOR_H
+#define FILE_OUTPUT_OPERATOR_H
+
+#include <app.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <schemaparser.h>
+
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <list>
+#include<string>
+#include<vector>
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <schemaparser.h>
+
+using namespace std;
+
+#ifndef FILESTREAM_OPERATOR_UTILS
+#define FILESTREAM_OPERATOR_UTILS
+string fs_int_to_string(int i){
+    string ret;
+    char tmpstr[100];
+    sprintf(tmpstr,"%d",i);
+    ret=tmpstr;
+    return(ret);
+}
+#endif
+
+template <class file_output_functor> class file_output_operator :
+               public base_operator
+{
+private :
+       file_output_functor func;
+
+       FILE **output_file;
+       bool do_compression;
+       vector<string> xform_command;
+       vector<string> temp_fname;
+       vector<string> fname;
+       string qname;
+       string schema;
+       string file_header;
+       gs_uint32_t n_file_streams;
+
+int total_written;
+
+public:
+
+file_output_operator(int schema_handle, gs_csp_t name, gs_csp_t sch) : base_operator(name), func(schema_handle) {
+       char tmpstr[1000];
+       int i;
+
+       do_compression = func.do_compression();
+       n_file_streams = func.num_file_streams();
+       output_file = (FILE **)(malloc(sizeof(FILE *)*n_file_streams));
+       for(i=0;i<n_file_streams;++i){
+               output_file[i] = NULL;
+               xform_command.push_back("");
+               temp_fname.push_back("");
+               fname.push_back("");
+       }
+       qname = name;
+       schema = sch;
+       sprintf(tmpstr,"GDAT\nVERSION:%u\nSCHEMALENGTH:%lu\n",get_schemaparser_version(),strlen(sch)+1);
+       file_header = tmpstr;
+
+total_written = 0;
+}
+
+
+
+virtual int accept_tuple(host_tuple& tup, list<host_tuple>& result) {
+string fname_base;
+host_tuple res;
+gs_uint32_t i;
+
+       if(! func.temp_status_received(tup)){  // this operator doesn't write
+//                     Check for EOF conditions.
+               if(func.is_eof_tuple()){
+                       if(output_file[0] != NULL){
+                               for(i=0;i<n_file_streams;++i){
+                                       fclose(output_file[i]);
+                                       output_file[i] = NULL;
+                                       if(do_compression){
+                                               system(xform_command[i].c_str());
+                                       }
+                                       rename(temp_fname[i].c_str(), fname[i].c_str());
+                               }
+                       }
+                       if(func.propagate_tuple()){
+                               tup.channel = output_channel;
+                               result.push_back(tup);
+                       }
+                       return 0;
+               }
+
+               if(func.new_epoch()){
+                       if(output_file[0] != 0){
+total_written = 0;
+                               for(i=0;i<n_file_streams;++i){
+                                       fclose(output_file[i]);
+                                       if(do_compression){
+                                               system(xform_command[i].c_str());
+                                       }else{
+                                       rename(temp_fname[i].c_str(), fname[i].c_str());
+                                       }
+                               }
+                       }
+
+                       fname_base = func.get_filename_base();
+                       for(i=0;i<n_file_streams;++i){
+                               if(n_file_streams > 1){
+                                       temp_fname[i] = fname_base + "_stream"+fs_int_to_string(i)+ ".txt.tmp";
+                                       fname[i] = fname_base  + "_stream"+fs_int_to_string(i)+ ".txt";
+                               }else{
+                                       temp_fname[i] = fname_base + "_stream"+fs_int_to_string(i)+ ".txt.tmp";
+                                       fname[i] = fname_base  + "_stream"+fs_int_to_string(i)+ ".txt";
+                               }
+                               if (do_compression) {
+                                       xform_command[i] = "gzip -S .tmpgz "+temp_fname[i]+" ; mv "+temp_fname[i]+".tmpgz "+fname[i]+".gz";
+                               }
+//                     else{
+//                             xform_command = "mv "+temp_fname+" "+fname;
+//                     }
+                               if ((output_file[i]=fopen(temp_fname[i].c_str(),"w"))==0) {
+                                       gslog(LOG_EMERG,"Could not open file \"%s\".. EXITING\n", temp_fname[i].c_str());
+                                       exit(1);
+                               }
+                               fwrite(file_header.c_str(),strlen(file_header.c_str()),1,output_file[i]);
+                               fwrite(schema.c_str(),strlen(schema.c_str())+1,1,output_file[i]);
+                       }
+               }
+
+               gs_uint32_t sz = tup.tuple_size;
+               gs_uint32_t nsz = htonl(tup.tuple_size);
+               gs_uint32_t file_hash = func.output_hash();
+total_written += sizeof(gs_uint32_t) + sz;
+
+               if (fwrite(&nsz,sizeof(gs_uint32_t),1,output_file[file_hash])!=1) {
+                       gslog(LOG_EMERG,"file_output_operator: Could not write %d bytes to output \"%s\" .. EXITING\n", sizeof(gs_uint32_t), temp_fname[file_hash].c_str());
+                       exit(1);
+               }
+
+               if (fwrite(tup.data,sz,1,output_file[file_hash])!=1) {
+                       gslog(LOG_EMERG,"file_output_operator: Could not write %d bytes to output \"%s\" .. EXITING\n", sz, temp_fname[file_hash].c_str());
+                       exit(1);
+               }
+               if(func.propagate_tuple()){
+                       tup.channel = output_channel;
+                       result.push_back(tup);
+               }
+               return 0;
+       }else{
+/*
+               if (!func.create_temp_status_tuple(res)) {
+                       res.channel = output_channel;
+                       result.push_back(res);
+               }
+*/
+
+//fprintf(stderr,"\tis temp tuple\n");
+       }
+
+       if(func.propagate_tuple()){
+               tup.channel = output_channel;
+               result.push_back(tup);
+       }
+       return 0;
+}
+
+
+       virtual int flush(list<host_tuple>& result) {
+               return 0;
+       }
+
+       virtual int set_param_block(int sz, void * value) {
+//             func.set_param_block(sz, value);
+               return 0;
+       }
+
+       virtual int get_temp_status(host_tuple& result) {
+               result.channel = output_channel;
+               return func.create_temp_status_tuple(result);
+       }
+
+       virtual int get_blocked_status () {
+               return -1;              // selection operators are not blocked on any input
+       }
+};
+
+
+#endif // FILE_OUTPUT_OPERATOR_H
+
diff --git a/include/hfta/groupby_operator.h b/include/hfta/groupby_operator.h
new file mode 100644 (file)
index 0000000..26645c3
--- /dev/null
@@ -0,0 +1,238 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef GROUPBY_OPERATOR_H
+#define GROUPBY_OPERATOR_H
+
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <list>
+#include "hash_table.h"
+
+#define _GB_FLUSH_PER_TUPLE_ 1
+
+using namespace std;
+
+template <class groupby_func, class group, class aggregate, class hasher_func, class equal_func>
+class groupby_operator : public base_operator {
+private :
+       groupby_func func;
+       hash_table<group*, aggregate*, hasher_func, equal_func> group_table[2];
+       bool flush_finished;
+       unsigned int curr_table;
+       typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator flush_pos;
+       int n_patterns;
+
+
+
+public:
+       groupby_operator(int schema_handle, const char* name) : base_operator(name), func(schema_handle) {
+               flush_finished = true;
+               curr_table = 0;
+               flush_pos = group_table[1-curr_table].end();
+               n_patterns = func.n_groupby_patterns();
+       }
+
+       int accept_tuple(host_tuple& tup, list<host_tuple>& result) {
+
+//                     Push out completed groups
+
+               if(!flush_finished) partial_flush(result);
+
+               // create buffer on the stack to store key object
+               char buffer[sizeof(group)];
+
+               // extract the key information from the tuple and
+               // copy it into buffer
+               group* grp = func.create_group(tup, buffer);
+               if (!grp) {
+/*
+//                     Ignore temp tuples until we can fix their timestamps.
+if (func.temp_status_received()) {
+ tup.free_tuple();
+ return 0;
+}*/
+                       if (func.flush_needed()){
+                               flush_old(result);
+               }
+                       if (func.temp_status_received()) {
+                               host_tuple temp_tup;
+                               if (!func.create_temp_status_tuple(temp_tup, flush_finished)) {
+                                       temp_tup.channel = output_channel;
+                                       result.push_back(temp_tup);
+                               }
+                       }
+                       tup.free_tuple();
+                       return 0;
+               }
+
+               typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator iter;
+               if ((iter = group_table[curr_table].find(grp)) != group_table[curr_table].end()) {
+//                             Temporal GBvar is part of the group so no flush is needed.
+                       aggregate* old_aggr = (*iter).second;
+                       func.update_aggregate(tup, grp, old_aggr);
+               }else{
+                       if (func.flush_needed()) {
+                               flush_old(result);
+                       }
+                       if(n_patterns <= 1){
+                       // create a copy of the group on the heap
+                               group* new_grp = new group(grp);        // need a copy constructor for groups
+//                     aggregate* aggr = (aggregate*)malloc(sizeof(aggregate));
+                               aggregate* aggr = new aggregate();
+                       // create an aggregate in preallocated buffer
+                               aggr = func.create_aggregate(tup, (char*)aggr);
+
+                               group_table[curr_table].insert(new_grp, aggr);
+                       }else{
+                               int p;
+                               for(p=0;p<n_patterns;++p){
+                                       group* new_grp = new group(grp, func.get_pattern(p));
+                                       aggregate* aggr = new aggregate();
+                                       aggr = func.create_aggregate(tup, (char*)aggr);
+                                       group_table[curr_table].insert(new_grp, aggr);
+                               }
+                       }
+               }
+               tup.free_tuple();
+               return 0;
+       }
+
+       int partial_flush(list<host_tuple>& result) {
+               host_tuple tup;
+               unsigned int old_table = 1-curr_table;
+               unsigned int i;
+
+//                             emit up to _GB_FLUSH_PER_TABLE_ output tuples.
+               if (!group_table[old_table].empty()) {
+                       for (i=0; flush_pos != group_table[old_table].end() && i<_GB_FLUSH_PER_TUPLE_; ++flush_pos, ++i) {
+                               bool failed = false;
+                               tup = func.create_output_tuple((*flush_pos).first,(*flush_pos).second, failed);
+                               if (!failed) {
+                                       tup.channel = output_channel;
+                                       result.push_back(tup);
+                               }
+                               delete ((*flush_pos).first);
+                               delete ((*flush_pos).second);
+//                             free((*flush_pos).second);
+                       }
+               }
+
+//                     Finalize processing if empty.
+               if(flush_pos == group_table[old_table].end()) {
+                       flush_finished = true;
+                       group_table[old_table].clear();
+                       group_table[old_table].rehash();
+               }
+               return 0;
+       }
+
+       int flush(list<host_tuple>& result) {
+               host_tuple tup;
+               typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator iter;
+               unsigned int old_table = 1-curr_table;
+
+//                     If the old table isn't empty, flush it now.
+               if (!group_table[old_table].empty()) {
+                       for (; flush_pos != group_table[old_table].end(); ++flush_pos) {
+                               bool failed = false;
+                               tup = func.create_output_tuple((*flush_pos).first,(*flush_pos).second, failed);
+                               if (!failed) {
+
+                                       tup.channel = output_channel;
+                                       result.push_back(tup);
+                               }
+                               delete ((*flush_pos).first);
+                               delete ((*flush_pos).second);
+//                             free((*flush_pos).second);
+                       }
+                       group_table[old_table].clear();
+                       group_table[old_table].rehash();
+               }
+
+               flush_pos = group_table[curr_table].begin();
+//                     If the old table isn't empty, flush it now.
+               if (!group_table[curr_table].empty()) {
+                       for (; flush_pos != group_table[curr_table].end(); ++flush_pos) {
+                               bool failed = false;
+                               tup = func.create_output_tuple((*flush_pos).first,(*flush_pos).second, failed);
+                               if (!failed) {
+
+                                       tup.channel = output_channel;
+                                       result.push_back(tup);
+                               }
+                               delete ((*flush_pos).first);
+                               delete ((*flush_pos).second);
+//                             free((*flush_pos).second);
+                       }
+                       group_table[curr_table].clear();
+               }
+
+               flush_finished = true;
+
+               return 0;
+       }
+
+       int flush_old(list<host_tuple>& result) {
+               host_tuple tup;
+               typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator iter;
+               unsigned int old_table = 1-curr_table;
+
+//                     If the old table isn't empty, flush it now.
+               if (!group_table[old_table].empty()) {
+                       for (; flush_pos != group_table[old_table].end(); ++flush_pos) {
+                               bool failed = false;
+                               tup = func.create_output_tuple((*flush_pos).first,(*flush_pos).second, failed);
+                               if (!failed) {
+
+                                       tup.channel = output_channel;
+                                       result.push_back(tup);
+                               }
+                               delete ((*flush_pos).first);
+                               delete ((*flush_pos).second);
+//                             free((*flush_pos).second);
+                       }
+                       group_table[old_table].clear();
+                       group_table[old_table].rehash();
+               }
+
+//                     swap tables, enable partial flush processing.
+               flush_pos = group_table[curr_table].begin();
+               curr_table = old_table;
+               flush_finished = false;
+
+               return 0;
+       }
+
+       int set_param_block(int sz, void * value) {
+               func.set_param_block(sz, value);
+               return 0;
+       }
+
+       int get_temp_status(host_tuple& result) {
+               result.channel = output_channel;
+               return func.create_temp_status_tuple(result, flush_finished);
+       }
+
+       int get_blocked_status () {
+               return -1;
+       }
+
+       unsigned int get_mem_footprint() {
+               return group_table[0].get_mem_footprint() + group_table[1].get_mem_footprint();
+       }
+};
+
+#endif // GROUPBY_OPERATOR_H
diff --git a/include/hfta/groupby_operator_oop.h b/include/hfta/groupby_operator_oop.h
new file mode 100644 (file)
index 0000000..03a577f
--- /dev/null
@@ -0,0 +1,399 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef GROUPBY_OPERATOR_OOP_H
+#define GROUPBY_OPERATOR_OOP_H
+
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <list>
+#include <vector>
+#include "hash_table.h"
+#include <cassert>
+
+//             TED: should be supplied by the groupby_func
+#define _GB_FLUSH_PER_TUPLE_ 1
+
+/* max allowed disorder  -- Jin */
+//             TED: should be supplied by the groupby_func
+#define DISORDER_LEVEL 2
+
+//#define NDEBUG
+
+using namespace std;
+
+// ASSUME temporal_type is one of int, uint, llong, ullong
+
+template <class groupby_func, class group, class aggregate, class hasher_func, class equal_func, class temporal_type>
+class groupby_operator_oop : public base_operator {
+private :
+       groupby_func func;
+
+       /* a list of hash tables, which maintains aggregates for current window and also k previous ones  -- Jin */
+       vector<hash_table<group*, aggregate*, hasher_func, equal_func>* > group_tables;
+
+       /* the minimum and maximum window id of the hash tables  -- Jin  */
+       temporal_type min_wid, max_wid;
+
+
+       bool flush_finished;
+       temporal_type curr_table;
+       typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator flush_pos;
+
+       temporal_type last_flushed_temporal_gb;
+       temporal_type last_temporal_gb;
+
+int n_slow_flush;
+       int n_patterns;
+
+
+public:
+       groupby_operator_oop(int schema_handle, const char* name) : base_operator(name), func(schema_handle) {
+               flush_finished = true;
+
+               min_wid = 0;
+               max_wid = 0;
+n_slow_flush = 0;
+               n_patterns = func.n_groupby_patterns();
+       }
+
+       ~groupby_operator_oop() {
+               hash_table<group*, aggregate*, hasher_func, equal_func>* table;
+               // delete all the elements in the group_tables list;
+               while (!group_tables.empty()) {
+                       table = group_tables.back();
+                       group_tables.pop_back();
+                       table->clear();
+//fprintf(stderr,"Deleting group table (c) at %lx\n",(gs_uint64_t)(table));
+                       delete (table);
+               }
+
+       }
+
+       int accept_tuple(host_tuple& tup, list<host_tuple>& result) {
+
+
+               // Push out completed groups
+               if(!flush_finished) partial_flush(result);
+
+               // create buffer on the stack to store key object
+               char buffer[sizeof(group)];
+
+               // extract the key information from the tuple and
+               // copy it into buffer
+               group* grp = func.create_group(tup, buffer);
+
+
+               if (!grp) {
+//printf("grp==NULL recieved ");
+                       if (func.temp_status_received()) {
+//printf("temp status record ");
+                               last_flushed_temporal_gb = func.get_last_flushed_gb ();
+                               last_temporal_gb = func.get_last_gb ();
+                       }
+//printf("\n");
+
+//fprintf(stderr,"min_wid=%d, max_wid=%d, last_temporal_gb=%d, last_flushed_temporal_gb=%d, flush_finished=%d\n",min_wid, max_wid, last_temporal_gb, last_flushed_temporal_gb, flush_finished);
+
+                       /* no data has arrived, and so we ignore the temp tuples -- Jin */
+                       if (group_tables.size()>0) {
+
+                               gs_int64_t index;
+                               if(last_flushed_temporal_gb >= min_wid){
+                                       index = last_flushed_temporal_gb - min_wid;
+                               }else{
+                                       index = -(min_wid - last_flushed_temporal_gb);  // unsigned arithmetic
+                               }
+
+                               if (func.flush_needed() && index>=0) {
+#ifdef NDEBUG
+//fprintf(stderr, "flush needed: last_flushed_gb  %u , min_wid %u \n", last_flushed_temporal_gb, min_wid);
+#endif
+                                       // Init flush on first temp tuple -- Jin
+                                       if ( !flush_finished) {
+#ifdef NDEBUG
+//fprintf(stderr, "last_flushed_gb is %u, min_wid is %u \n", last_flushed_temporal_gb, min_wid);
+#endif
+                                               flush_old(result);
+                                       }
+                                       if (last_temporal_gb > min_wid && group_tables.size()>0) {
+                                               flush_finished = false;
+                                       }
+
+                               // we start to flush from the head of the group tables -- Jin
+                                       if(group_tables.size()>0){
+                                               flush_pos = group_tables[0]->begin();
+                                       }
+
+#ifdef NDEBUG
+//fprintf(stderr, "after flush old \n");
+#endif
+                               }
+                       }
+
+                       host_tuple temp_tup;
+                       if (!func.create_temp_status_tuple(temp_tup, flush_finished)) {
+                               temp_tup.channel = output_channel;
+                               result.push_back(temp_tup);
+                       }
+
+                       tup.free_tuple();
+                       return 0;
+               }
+
+//fprintf (stderr, "after create group grp=%lx, curr_table = %d\n",(gs_uint64_t)grp, grp->get_curr_gb());
+
+               /*  This is a regular tuple -- Jin */
+               typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator iter;
+               /*  first, decide which hash table we need to work at  */
+               curr_table = grp->get_curr_gb();
+               if (max_wid == 0 && min_wid == 0) {
+                       group_tables.push_back((new hash_table<group*, aggregate*, hasher_func, equal_func>()));
+//fprintf(stderr,"Added (1) hash tbl at %lx, pos=%d\n",(gs_uint64_t)(group_tables.back()),group_tables.size());
+                       max_wid = min_wid = curr_table;
+               }
+               if (curr_table < min_wid) {
+                       for (temporal_type i = curr_table; i < min_wid; i++){
+                               group_tables.insert(group_tables.begin(), new hash_table<group*, aggregate*, hasher_func, equal_func>());
+//fprintf(stderr,"Added (2) hash tbl at %lx, pos=%d\n",(gs_uint64_t)(group_tables.back()),group_tables.size());
+                       }
+                       min_wid = curr_table;
+               }
+               if (curr_table > max_wid) {
+                       hash_table<group*, aggregate*, hasher_func, equal_func>* pt;
+                       for (temporal_type i = max_wid; i < curr_table; i++) {
+                               pt =new hash_table<group*, aggregate*, hasher_func, equal_func>();
+                               group_tables.push_back(pt);
+//fprintf(stderr,"Added (3) hash tbl at %lx, pos=%d\n",(gs_uint64_t)(group_tables.back()),group_tables.size());
+                       }
+
+                       max_wid = curr_table;
+               }
+               gs_int64_t index = curr_table - min_wid;
+
+               if ((iter = group_tables[index]->find(grp)) != group_tables[index]->end()) {
+                       aggregate* old_aggr = (*iter).second;
+                       func.update_aggregate(tup, grp, old_aggr);
+               }else{
+                       /* We only flush when a temp tuple is received, so we only check on temp tuple  -- Jin */
+                       // create a copy of the group on the heap
+                       if(n_patterns <= 1){
+
+                               group* new_grp = new group(grp);        // need a copy constructor for groups
+
+                               aggregate* aggr = new aggregate();
+
+                       // create an aggregate in preallocated buffer
+                               aggr = func.create_aggregate(tup, (char*)aggr);
+
+//                             hash_table<group*, aggregate*, hasher_func, equal_func>* pt;
+                               group_tables[index]->insert(new_grp, aggr);
+                       }else{
+                               int p;
+                               for(p=0;p<n_patterns;++p){
+                                       group* new_grp = new group(grp, func.get_pattern(p));
+                                       aggregate* aggr = new aggregate();
+                                       aggr = func.create_aggregate(tup, (char*)aggr);
+                                       group_tables[index]->insert(new_grp, aggr);
+                               }
+                       }
+               }
+               tup.free_tuple();
+               return 0;
+       }
+
+       int partial_flush(list<host_tuple>& result) {
+               host_tuple tup;
+               /* the hash table we should flush is func->last_flushed_gb_0  -- Jin */
+               /* should we guarantee that everything before func->last_flushed_gb_0 also flushed ??? */
+
+               gs_int64_t i;
+
+//fprintf(stderr, "partial_flush size of group_tables = %u, min_wid is %u, max_wid is %u last_temporal_gb=%d \n", group_tables.size(), min_wid, max_wid, last_temporal_gb);
+       if(group_tables.size()==0){
+               flush_finished = true;
+//fprintf(stderr, "out of partial flush early \n");
+               return 0;
+       }
+
+//                             emit up to _GB_FLUSH_PER_TABLE_ output tuples.
+               if (!group_tables[0]->empty()) {
+                       for (i=0; flush_pos!=group_tables[0]->end() && i < _GB_FLUSH_PER_TUPLE_; ++flush_pos, ++i) {
+n_slow_flush++;
+                               bool failed = false;
+                               tup = func.create_output_tuple((*flush_pos).first,(*flush_pos).second, failed);
+                               if (!failed) {
+                                       tup.channel = output_channel;
+                                       result.push_back(tup);
+                               }
+//fprintf(stderr,"partial_flush Deleting at Flush_pos=%lx \n",(gs_uint64_t)((*flush_pos).first));
+                               delete ((*flush_pos).first);
+                               delete ((*flush_pos).second);
+                       }
+               }
+
+//                     Finalize processing if empty.
+               if (flush_pos == group_tables[0]->end()) {
+                       /* one window is completely flushed, so recycle the hash table  -- Jin */
+
+                       hash_table<group*, aggregate*, hasher_func, equal_func>* table =  group_tables[0];
+
+//fprintf(stderr,"partial_flush Delelting group table %lx\n",(gs_uint64_t)(group_tables[0]));
+                       group_tables[0]->clear();
+                       delete (group_tables[0]);
+
+                       group_tables.erase(group_tables.begin());
+
+                       min_wid++;
+
+                       if (last_temporal_gb > min_wid && group_tables.size()>0) {
+                               flush_pos = group_tables[0]->begin();
+
+                       } else {
+                               flush_finished = true;
+                       }
+               }
+//fprintf(stderr, "out of partial flush \n");
+               return 0;
+       }
+
+
+       /* Where is this function called ??? */  /* externally */
+       int flush(list<host_tuple>& result) {
+               host_tuple tup;
+               typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator iter;
+               /* the hash table we should flush is func->last_flushed_gb_0  -- Jin */
+               /* should we guarantee that everything before func->last_flushed_gb_0 also flushed ??? */
+               while ( group_tables.size() > 0) {
+                       if (!group_tables[0]->empty()) {
+                               if (flush_finished)
+                                       flush_pos = group_tables[0]->begin();
+                               for (; flush_pos != group_tables[0]->end(); ++flush_pos) {
+                                       bool failed = false;
+
+                                       tup = func.create_output_tuple((*flush_pos).first,(*flush_pos).second, failed);
+
+                                       if (!failed) {
+
+                                               tup.channel = output_channel;
+                                               result.push_back(tup);
+                                       }
+//fprintf(stderr,"flush_old Deleting at Flush_pos=%lx \n",(gs_uint64_t)((*flush_pos).first));
+                                       delete ((*flush_pos).first);
+                                       delete ((*flush_pos).second);
+
+                               }
+                       }
+                       min_wid++;
+
+               // remove the hashtable from group_tables
+                       hash_table<group*, aggregate*, hasher_func, equal_func>* table = group_tables[0];
+
+                       table->clear();
+//fprintf(stderr,"flush_old Delelting group table %lx\n",(gs_uint64_t)(group_tables[0]));
+                       delete (table);
+                       group_tables.erase(group_tables.begin());
+
+                       if(group_tables.size()>0){
+                               flush_pos = group_tables[0]->begin();
+                       }
+               }
+
+
+
+               flush_finished = true;
+
+               return 0;
+       }
+
+       /* flushes every hash table before last_flush_gb, and get ready to flush the next window  -- Jin */
+       int flush_old(list<host_tuple>& result) {
+               host_tuple tup;
+               typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator iter;
+               gs_int64_t num, i;
+
+//fprintf(stderr, "flush_old size of group_tables = %u, min_wid is %u, max_wid is %u last_temporal_gb=%d, num=%d\n", group_tables.size(), min_wid, max_wid, last_temporal_gb, num);
+
+               num = last_temporal_gb - min_wid;
+
+               //If the old table isn't empty, flush it now.
+               for (i = 0; i < num && group_tables.size() > 0; i++) {
+                       if (!group_tables[0]->empty()) {
+                               for (; flush_pos != group_tables[0]->end(); ++flush_pos) {
+                                       bool failed = false;
+
+                                       tup = func.create_output_tuple((*flush_pos).first,(*flush_pos).second, failed);
+
+                                       if (!failed) {
+
+                                               tup.channel = output_channel;
+                                               result.push_back(tup);
+                                       }
+//fprintf(stderr,"flush_old Deleting at Flush_pos=%lx \n",(gs_uint64_t)((*flush_pos).first));
+                                       delete ((*flush_pos).first);
+                                       delete ((*flush_pos).second);
+
+                               }
+                       }
+                       min_wid++;
+
+               // remove the hashtable from group_tables
+                       hash_table<group*, aggregate*, hasher_func, equal_func>* table = group_tables[0];
+
+                       table->clear();
+//fprintf(stderr,"flush_old Delelting group table %lx\n",(gs_uint64_t)(group_tables[0]));
+                       delete (table);
+                       group_tables.erase(group_tables.begin());
+
+                       if(group_tables.size()>0){
+                               flush_pos = group_tables[0]->begin();
+                       }
+               }
+
+               flush_finished = true;
+
+//fprintf(stderr, "end of flush_old \n");
+
+               return 0;
+       }
+
+
+       int set_param_block(int sz, void * value) {
+               func.set_param_block(sz, value);
+               return 0;
+       }
+
+       int get_temp_status(host_tuple& result) {
+               result.channel = output_channel;
+               return func.create_temp_status_tuple(result, flush_finished);
+       }
+
+       int get_blocked_status () {
+               return -1;
+       }
+
+       unsigned int get_mem_footprint() {
+               unsigned int ret;
+               unsigned int i;
+
+               for(i=0;i<group_tables.size();++i)
+                       ret += group_tables[i]->get_mem_footprint() ;
+
+               return ret;
+       }
+};
+
+#endif // GROUPBY_OPERATOR_OOP_H
+
diff --git a/include/hfta/hash_table.h b/include/hfta/hash_table.h
new file mode 100644 (file)
index 0000000..f5b1afe
--- /dev/null
@@ -0,0 +1,610 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef __HASH_TABLE_H
+#define __HASH_TABLE_H
+
+#include <stdlib.h>
+#include <stdio.h>
+
+
+
+#define NUM_PRIMES 23
+
+static unsigned int primes[NUM_PRIMES] =  {
+       11, 23, 47, 97, 197, 397, 797, 1597, 3203, 6421, 12853,
+       25717, 51437, 102877, 205759, 411527, 823117, 1646237,
+       3292489, 6584983, 13169977, 26339969, 52679969
+};
+
+
+
+template <class key_type, class value_type, class hasher_func, class equal_func>
+class hash_table  {
+
+public :
+       struct data_item {
+               key_type first;
+               value_type second;
+               data_item* next;        // next data item in overflow chain
+
+               data_item(const key_type& k, const value_type& v) : first(k), second(v), next(NULL) { }
+       };
+
+       struct hash_bucket {
+               data_item* data;        //
+               hash_bucket* next_bucket;       // index of the next bucket in the list of used buckets
+               hash_bucket* prev_bucket;       // index of the next bucket in the list of used buckets
+
+               hash_bucket() {
+                       data = NULL;
+                       next_bucket = 0;        // 0 means no bucket follows this one
+                       prev_bucket = 0;        // 0 means no bucket precedes this one
+               }
+       };
+
+       struct iterator {
+               hash_bucket* bucket;
+               data_item* data;
+
+               iterator& operator++() {
+                       if (data->next)
+                               data = data->next;
+                       else {
+                               bucket = bucket->next_bucket;
+                               if (bucket)
+                                       data = bucket->data;
+                               else
+                                       data = NULL;
+                       }
+                       return *this;
+               }
+
+//                     Like ++, but don't go beyond the end of the bucket chain.
+               iterator& next() {
+                       if (data->next)
+                               data = data->next;
+                       else {
+                               bucket = NULL;
+                               data = NULL;
+                       }
+                       return *this;
+               }
+
+               bool operator!=(const iterator& it) {
+                       return (data != it.data || bucket != it.bucket);
+               }
+
+               bool operator==(const iterator& it) {
+                       return (data == it.data && bucket == it.bucket);
+               }
+
+               data_item &operator*() {
+                       return *data;
+               }
+       };
+
+private:
+       hasher_func hasher;
+       equal_func equal;
+
+       double load_factor;
+//     double max_load;
+
+       size_t _size;
+       size_t _max_size;
+       size_t num_buckets;
+       size_t hash_mask;
+
+       hash_bucket* first_bucket;      // first used bucket
+       hash_bucket* last_bucket;               // last used bucket
+
+       hash_bucket* buckets;
+
+       // memory footpritn in bytes
+       unsigned int total_memory;
+
+public:
+
+
+       hash_table(const size_t n_buckets = 131072, const double load = 0.5) {
+               load_factor = load;
+               int nb;
+               for(nb=2;nb<n_buckets;nb*=2);
+               num_buckets = nb;
+               hash_mask = nb-1;
+               buckets = new hash_bucket[num_buckets];
+
+               _size = 0;
+               _max_size = 0;
+//             max_load = 0.0;
+               first_bucket = 0;
+               last_bucket = 0;
+
+               total_memory = num_buckets * sizeof(hash_bucket);
+       }
+
+       int insert(const key_type& key, const value_type& val) {
+               data_item* d = new data_item(key, val);
+               total_memory += sizeof(data_item);
+
+               // find the insertion bucket
+               size_t bucket_index = hasher(key) & hash_mask;
+               // if the bucket is empty just add new data_item
+               if (!buckets[bucket_index].data) {
+                       // create new data item
+
+                       buckets[bucket_index].data = d;
+                       if (!first_bucket){
+                               first_bucket = &buckets[bucket_index];
+                       }else{
+                               last_bucket->next_bucket = &buckets[bucket_index];
+                       }
+
+                       if (last_bucket)
+                               buckets[bucket_index].prev_bucket = last_bucket;
+
+                       last_bucket = &buckets[bucket_index];
+               } else {        // we already have data items in this bucket
+                       // prepend the item to overflow chain
+                       data_item* temp = buckets[bucket_index].data;
+                       buckets[bucket_index].data = d;
+                       d->next = temp;
+               }
+               _size++;
+               if(_size>_max_size)
+                       _max_size = _size;
+
+               return 0;
+       }
+
+       data_item *iterate_find(data_item* t, const key_type& key) {
+               data_item *temp = t;
+                       while (temp && !equal(temp->first, key)){
+                               temp = temp->next;
+                       }
+               return temp;
+       }
+
+
+       iterator find(const key_type& key) {
+               iterator iter;
+
+               // find the insertion bucket
+               size_t bucket_index = hasher(key) & hash_mask;
+               // if the bucket is empty just add new data_item
+               if (!buckets[bucket_index].data) {
+                       iter.bucket = NULL;
+                       iter.data = NULL;
+               } else {        // we already have data items in this bucket
+                       data_item* temp = buckets[bucket_index].data;
+//                     temp = iterate_find(temp,key);
+
+                       while (temp && !equal(temp->first, key))
+                               temp = temp->next;
+
+                       iter.data = temp;
+                       if (!temp)
+                               iter.bucket = NULL;
+                       else
+                               iter.bucket = &buckets[bucket_index];
+               }
+               return iter;
+       }
+
+       void erase(const key_type& key) {
+               // find the  bucket
+               size_t bucket_index = hasher(key) & hash_mask;
+               // if the bucket is empty just add new data_item
+               if (!buckets[bucket_index].data)
+                       return;
+
+               data_item* temp = buckets[bucket_index].data;
+               data_item* prev = NULL;
+               while (temp && !equal(temp->first, key)) {
+                       prev = temp;
+                       temp = temp->next;
+               }
+               if (!temp)
+                       return;
+
+               // delete this data item from the chain
+               _size--;
+               if (!prev){     // we are deleting the first element in chain
+                       buckets[bucket_index].data = temp->next;
+
+                       if(temp->next == NULL){
+                               if(buckets[bucket_index].next_bucket){
+                                       buckets[bucket_index].next_bucket->prev_bucket = buckets[bucket_index].prev_bucket;
+                               }else{
+                                       last_bucket = buckets[bucket_index].prev_bucket;
+                               }
+                               if(buckets[bucket_index].prev_bucket){
+                                       buckets[bucket_index].prev_bucket->next_bucket = buckets[bucket_index].next_bucket;
+                               }else{
+                                       first_bucket = buckets[bucket_index].next_bucket;
+                               }
+                               buckets[bucket_index].next_bucket = NULL;
+                               buckets[bucket_index].prev_bucket = NULL;
+                       }
+               }else{
+                       prev->next = temp->next;
+               }
+        delete temp;
+        total_memory -= sizeof(data_item);
+       }
+
+       void erase_full(const key_type& key) {
+               // find the  bucket
+               size_t bucket_index = hasher(key) & hash_mask;
+               // if the bucket is empty just add new data_item
+               if (!buckets[bucket_index].data)
+                       return;
+
+               data_item* temp = buckets[bucket_index].data;
+               data_item* prev = NULL;
+               while (temp && !equal(temp->first, key)) {
+                       prev = temp;
+                       temp = temp->next;
+               }
+               if (!temp)
+                       return;
+
+               // delete this data item from the chain
+               _size--;
+               if (!prev){     // we are deleting the first element in chain
+                       buckets[bucket_index].data = temp->next;
+
+                       if(temp->next == NULL){
+                               if(buckets[bucket_index].next_bucket){
+                                       buckets[bucket_index].next_bucket->prev_bucket = buckets[bucket_index].prev_bucket;
+                               }else{
+                                       last_bucket = buckets[bucket_index].prev_bucket;
+                               }
+                               if(buckets[bucket_index].prev_bucket){
+                                       buckets[bucket_index].prev_bucket->next_bucket = buckets[bucket_index].next_bucket;
+                               }else{
+                                       first_bucket = buckets[bucket_index].next_bucket;
+                               }
+                               buckets[bucket_index].next_bucket = NULL;
+                               buckets[bucket_index].prev_bucket = NULL;
+                       }
+               }else{
+                       prev->next = temp->next;
+               }
+        delete (*temp).first;
+        delete (*temp).second;
+        delete temp;
+        total_memory -= sizeof(data_item);
+       }
+
+       iterator begin() {
+               iterator iter;
+               // find the first data item
+               iter.bucket = first_bucket;
+               iter.data = (first_bucket) ? first_bucket->data : NULL;
+               return iter;
+       }
+
+       iterator end() {
+               iterator iter;
+               iter.bucket = NULL;
+               iter.data = NULL;
+               return iter;
+       }
+
+       void clear() {
+               data_item* temp;
+               data_item* next;
+
+               hash_bucket* tmp;
+               while (first_bucket) {
+                       temp = first_bucket->data;
+                       while ( (next = temp->next) ) {
+                               delete temp;
+                               temp = next;
+                       }
+                       if(temp) delete(temp);
+                       first_bucket->data = NULL;
+                       tmp = first_bucket;
+                       first_bucket = first_bucket->next_bucket;
+                       tmp->next_bucket = NULL;
+                       tmp->prev_bucket = NULL;
+               }
+               last_bucket = NULL;
+               _size = 0;
+               total_memory = num_buckets * sizeof(hash_bucket);
+
+       }
+
+       int rehash() {
+               if (_size) {
+                       fprintf(stderr, "Error: rehashing non-empty hash table\n");
+                       exit(1);
+               }
+
+               double max_load = (1.0 * _max_size) / num_buckets;
+               if (max_load > load_factor ) {
+                       delete[] buckets;
+                       // roughly double the size of the table
+
+                       num_buckets *= 2;
+                       hash_mask = num_buckets-1;
+
+                       buckets = new hash_bucket[num_buckets];
+                       total_memory = num_buckets * sizeof(hash_bucket);
+               }
+               _max_size = _size;
+               return 0;
+       }
+
+
+       size_t size() const {
+               return _size;
+       }
+
+       bool empty() const {
+               return (_size == 0);
+       }
+
+       ~hash_table() {
+               clear();
+               delete[] buckets;
+       }
+
+       unsigned int get_mem_footprint() {
+               return total_memory;
+       }
+
+};
+
+
+template <class key_type, class hasher_func, class equal_func>
+class hash_set  {
+
+public :
+       struct data_item {
+               key_type key;
+               data_item* next;        // next data item in overflow chain
+
+               data_item(const key_type& k) : key(k), next(NULL) { }
+       };
+
+       struct hash_bucket {
+               data_item* data;        //
+               hash_bucket* next_bucket;       // index of the next bucket in the list of used buckets
+
+               hash_bucket() {
+                       data = NULL;
+                       next_bucket = 0;        // 0 means no bucket follows this one
+               }
+       };
+
+       struct iterator {
+               hash_bucket* bucket;
+               data_item* data;
+
+               iterator& operator++() {
+                       if (data->next)
+                               data = data->next;
+                       else {
+                               bucket = bucket->next_bucket;
+                               if (bucket)
+                                       data = bucket->data;
+                               else
+                                       data = NULL;
+                       }
+                       return *this;
+               }
+
+               bool operator!=(const iterator& it) {
+                       return (data != it.data || bucket != it.bucket);
+               }
+
+               bool operator==(const iterator& it) {
+                       return (data == it.data && bucket == it.bucket);
+               }
+
+//                     NOTE : not certain if returning ref always works
+               key_type &operator*() {
+                       return data->key;
+               }
+       };
+
+private:
+       hasher_func hasher;
+       equal_func equal;
+
+       double load_factor;
+//     double max_load;
+
+       size_t _size;
+       size_t _max_size;
+       size_t num_buckets;
+       size_t hash_mask;
+
+       hash_bucket* first_bucket;      // first used bucket
+       hash_bucket* last_bucket;               // last used bucket
+
+       hash_bucket* buckets;
+
+public:
+       hash_set(const size_t n_buckets = 131072, const double load = 0.75) {
+               load_factor = load;
+
+               int nb;
+               for(nb=2;nb<n_buckets;nb*=2);
+               num_buckets = nb;
+               hash_mask = num_buckets-1;
+
+               buckets = new hash_bucket[num_buckets];
+
+               _size = 0;
+               _max_size = 0;
+//             max_load = 0.0;
+               first_bucket = 0;
+               last_bucket = 0;
+       }
+
+       int insert(const key_type& key) {
+               data_item* d = new data_item(key);
+
+               // find the insertion bucket
+               size_t bucket_index = hasher(key) & hash_mask;
+               // if the bucket is empty just add new data_item
+               if (!buckets[bucket_index].data) {
+                       // create new data item
+
+                       buckets[bucket_index].data = d;
+                       if (!first_bucket)
+                               first_bucket = &buckets[bucket_index];
+                       else
+                               last_bucket->next_bucket = &buckets[bucket_index];
+                       last_bucket = &buckets[bucket_index];
+               } else {        // we already have data items in this bucket
+                       // prepend the item to overflow chain
+                       data_item* temp = buckets[bucket_index].data;
+                       buckets[bucket_index].data = d;
+                       d->next = temp;
+               }
+               _size++;
+               if(_size>_max_size)
+                       _max_size = _size;
+
+               return 0;
+       }
+
+       iterator find(const key_type& key) {
+               iterator iter;
+
+               // find the insertion bucket
+               size_t bucket_index = hasher(key) & hash_mask;
+               // if the bucket is empty just add new data_item
+               if (!buckets[bucket_index].data) {
+                       iter.bucket = NULL;
+                       iter.data = NULL;
+               } else {        // we already have data items in this bucket
+                       data_item* temp = buckets[bucket_index].data;
+                       while (temp && !equal(temp->key, key))
+                               temp = temp->next;
+                       iter.data = temp;
+                       if (!temp)
+                               iter.bucket = NULL;
+                       else
+                               iter.bucket = &buckets[bucket_index];
+               }
+               return iter;
+       }
+
+       void erase(const key_type& key) {
+               // find the  bucket
+               size_t bucket_index = hasher(key) & hash_mask;
+               // if the bucket is empty just add new data_item
+               if (!buckets[bucket_index].data)
+                       return;
+
+               data_item* temp = buckets[bucket_index].data;
+               data_item* prev = NULL;
+               while (temp && !equal(temp->key, key)) {
+                       prev = temp;
+                       temp = temp->next;
+               }
+               if (!temp)
+                       return;
+
+               // delete this data item from the chain
+               _size--;
+               if (!prev)      // we are deleting the first element in chain
+                       buckets[bucket_index].data = temp->next;
+               else
+                       prev->next = temp->next;
+                delete temp;
+       }
+
+       iterator begin() {
+               iterator iter;
+               // find the first data item
+               iter.bucket = first_bucket;
+               iter.data = (first_bucket) ? first_bucket->data : NULL;
+               return iter;
+       }
+
+       iterator end() {
+               iterator iter;
+               iter.bucket = NULL;
+               iter.data = NULL;
+               return iter;
+       }
+
+       void clear() {
+               data_item* temp;
+               data_item* next;
+
+               hash_bucket* tmp;
+               while (first_bucket) {
+                       temp = first_bucket->data;
+                       while ( (next = temp->next) ) {
+                               delete temp;
+                               temp = next;
+                       }
+                       if(temp) delete(temp);
+                       first_bucket->data = NULL;
+                       tmp = first_bucket;
+                       first_bucket = first_bucket->next_bucket;
+                       tmp->next_bucket = NULL;
+               }
+               last_bucket = NULL;
+               _size = 0;
+
+       }
+
+       int rehash() {
+               if (_size) {
+                       fprintf(stderr, "Error: rehashing non-empty hash table\n");
+                       exit(1);
+               }
+
+               double max_load = (1.0 * _max_size) / num_buckets;
+
+               if (max_load > load_factor ) {
+                       delete[] buckets;
+                       // roughly double the size of the table
+
+                       num_buckets *= 2;
+                       hash_mask = num_buckets -1;
+                       buckets = new hash_bucket[num_buckets];
+               }
+               _max_size = _size;
+               return 0;
+       }
+
+
+       size_t size() const {
+               return _size;
+       }
+
+       bool empty() const {
+               return (_size == 0);
+       }
+
+       ~hash_set() {
+               clear();
+               delete[] buckets;
+       }
+
+};
+
+
+#endif // __HASH_TABLE_H
diff --git a/include/hfta/hfta.h b/include/hfta/hfta.h
new file mode 100644 (file)
index 0000000..535b375
--- /dev/null
@@ -0,0 +1,1097 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef __HFTA_H
+#define __HFTA_H
+
+#include "gstypes.h"
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <vector>
+#include <map>
+#include "rdtsc.h"
+using namespace std;
+
+#define hfta_ullong_hashfunc(x) (((int)(*(x)))^((int)((*(x))>>32)))
+#define LLMIN(x,y) ((x)<(y)?(x):(y))
+#define LLMAX(x,y) ((x)<(y)?(y):(x))
+#define UMIN(x,y) ((x)<(y)?(x):(y))
+#define UMAX(x,y) ((x)<(y)?(y):(x))
+#define EQ(x,y) ((x)==(y))
+#define GEQ(x,y) ((x)>=(y))
+#define LEQ(x,y) ((x)<=(y))
+//     Cast away temporality
+#define non_temporal(x)(x)
+
+
+
+extern "C" {
+#include <lapp.h>
+#include <fta.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <schemaparser.h>
+}
+
+struct param_block {
+       gs_int32_t block_length;
+       void* data;
+};
+
+// forward declaration of operator_node
+struct operator_node;
+
+struct lfta_info {
+       gs_schemahandle_t schema_handle;
+       gs_sp_t schema;
+       gs_sp_t fta_name;
+#ifdef PLAN_DAG
+       list<operator_node*> parent_list;
+       list<unsigned> out_channel_list;
+#else
+       operator_node* parent;
+       unsigned output_channel;
+#endif
+       FTAID f;
+
+       lfta_info() {
+               schema_handle = -1;
+               schema = NULL;
+               #ifndef PLAN_DAG
+                       parent = NULL;
+                       output_channel = 0;
+               #endif
+       }
+
+       ~lfta_info() {
+               if (fta_name)
+                       free (fta_name);
+               if (schema)
+                       free (schema);
+               if (schema_handle >= 0)
+                       ftaschema_free(schema_handle);
+       }
+};
+
+
+struct operator_node {
+       base_operator* op;
+
+#ifdef PLAN_DAG
+       list<operator_node*> parent_list;
+       list<unsigned> out_channel_list;
+#else
+       operator_node* parent;
+#endif
+
+       operator_node* left_child;
+       operator_node* right_child;
+       lfta_info* left_lfta;
+       lfta_info* right_lfta;
+
+       list<host_tuple> input_queue;
+
+       operator_node(base_operator* o) {
+               op = o;
+               #ifndef PLAN_DAG
+                       parent = NULL;
+               #endif
+               left_child = right_child = NULL;
+               left_lfta = right_lfta = NULL;
+       }
+
+       ~operator_node() {
+               delete op;
+       }
+
+       void set_left_child_node(operator_node* child) {
+               left_child = child;
+               if (child) {
+                       #ifdef PLAN_DAG
+                               child->parent_list.push_back(this);
+                               child->out_channel_list.push_back(0);
+                       #else
+                               child->parent = this;
+                               child->op->set_output_channel(0);
+                       #endif
+               }
+       }
+
+       void set_right_child_node(operator_node* child) {
+               right_child = child;
+               if (child) {
+                       #ifdef PLAN_DAG
+                               child->parent_list.push_back(this);
+                               child->out_channel_list.push_back(1);
+                       #else
+                               child->parent = this;
+                               child->op->set_output_channel(1);
+                       #endif
+               }
+       }
+
+       void set_left_lfta(lfta_info* l_lfta) {
+               left_lfta = l_lfta;
+               if (left_lfta) {
+                       #ifdef PLAN_DAG
+                               left_lfta->parent_list.push_back(this);
+                               left_lfta->out_channel_list.push_back(0);
+                       #else
+                               left_lfta->parent = this;
+                               left_lfta->output_channel = 0;
+                       #endif
+               }
+       }
+
+       void set_right_lfta(lfta_info* r_lfta) {
+               right_lfta = r_lfta;
+               if (right_lfta) {
+                       #ifdef PLAN_DAG
+                               right_lfta->parent_list.push_back(this);
+                               right_lfta->out_channel_list.push_back(1);
+                       #else
+                               right_lfta->parent = this;
+                               right_lfta->output_channel = 1;
+                       #endif
+               }
+       }
+
+};
+
+
+
+int get_lfta_params(gs_int32_t sz, void * value, list<param_block>& lst);
+void finalize_tuple(host_tuple &tup);
+void finalize_tuple(host_tuple &tup);
+gs_retval_t UNOP_HFTA_free_fta (struct FTA *ftap, gs_uint32_t recursive);
+gs_retval_t UNOP_HFTA_control_fta (struct FTA *ftap, gs_int32_t command, gs_int32_t sz, void * value);
+gs_retval_t UNOP_HFTA_accept_packet (struct FTA *ftap, FTAID *ftaid, void * packet, gs_int32_t length);
+gs_retval_t UNOP_HFTA_clock_fta(struct FTA *ftap);
+
+gs_retval_t MULTOP_HFTA_free_fta (struct FTA *ftap, gs_uint32_t recursive);
+gs_retval_t MULTOP_HFTA_control_fta (struct FTA *ftap, gs_int32_t command, gs_int32_t sz, void * value);
+gs_retval_t MULTOP_HFTA_accept_packet (struct FTA *ftap, FTAID *ftaid, void * packet, gs_int32_t length);
+gs_retval_t MULTOP_HFTA_clock_fta(struct FTA *ftap);
+
+struct UNOP_HFTA {
+       struct FTA _fta;
+       base_operator* oper;
+       FTAID f;
+       bool failed;
+       gs_schemahandle_t schema_handle;
+
+       list<host_tuple> output_queue;
+
+       // To create an hfta we will need all the parameters passed to alloc_fta by host library plus
+       // lfta_name and an instance of the base_operator
+       // We don't need to know the output schema as this information is already embeded
+       // in create_output_tuple method of operators' functor.
+       UNOP_HFTA(struct FTAID ftaid, FTAID child_ftaid, gs_int32_t command, gs_int32_t sz, void * value, base_operator* op,
+               gs_csp_t fta_name, char* schema, gs_schemahandle_t sch_handle, bool fta_reusable, gs_uint32_t reuse_option) {
+
+               failed = false;
+               oper = op;
+               f = child_ftaid;
+               schema_handle = sch_handle;
+
+               // assign streamid
+               _fta.ftaid = ftaid;
+               _fta.ftaid.streamid = (gs_p_t)this;
+
+#ifdef DEBUG
+               fprintf(stderr,"Instantiate a FTA\n");
+#endif
+               /* extract lfta param block from hfta param block */
+               list<param_block> param_list;
+               get_lfta_params(sz, value, param_list);
+               param_block param = param_list.front();
+
+
+        gs_uint32_t reuse_flag = 2;
+        // we will try to create a new instance of child FTA only if it is parameterized
+        if (param.block_length > 0 && (reuse_option == 0 || (!fta_reusable && reuse_option == 2))) {
+               f.streamid = 0; // not interested in existing instances
+               reuse_flag = 0;
+               }
+
+               if ((fta_alloc_instance(_fta.ftaid, &f,fta_name,schema,reuse_flag, FTA_COMMAND_LOAD_PARAMS,param.block_length,param.data))!=0) {
+               fprintf(stderr,"HFTA::error:could instantiate a FTA");
+                       failed = true;
+                   return;
+           }
+
+               free(param.data);
+               // set the operator's parameters
+               if(oper->set_param_block(sz, (void*)value)) failed = true;;
+
+
+               fprintf(stderr,"HFTA::Low level FTA (%s) instanciation done\n", fta_name);
+               _fta.stream_subscribed_cnt = 1;
+               _fta.stream_subscribed[0] = f;
+
+               _fta.alloc_fta = NULL;  // why should this be a part of the FTA (it is a factory function)
+               _fta.free_fta = UNOP_HFTA_free_fta;
+               _fta.control_fta = UNOP_HFTA_control_fta;
+               _fta.accept_packet = UNOP_HFTA_accept_packet;
+               _fta.clock_fta = UNOP_HFTA_clock_fta;
+       }
+
+       ~UNOP_HFTA() {
+         delete oper;    // free operators memory
+
+     }
+
+     int flush() {
+               list<host_tuple> res;
+               if (!oper->flush(res)) {
+
+                       if (!res.empty()) {
+                               // go through the list of returned tuples and finalyze them
+                               list<host_tuple>::iterator iter = res.begin();
+                               while (iter != res.end()) {
+                                       host_tuple& tup = *iter;
+
+                                       // finalize the tuple
+                                       if (tup.tuple_size)
+                                               finalize_tuple(tup);
+                                       iter++;
+                               }
+
+                               // append returned list to output_queue
+                               output_queue.splice(output_queue.end(), res);
+
+
+                               // post tuples
+                               while (!output_queue.empty()) {
+                                       host_tuple& tup = output_queue.front();
+                                       #ifdef DEBUG
+                                               fprintf(stderr, "HFTA::about to post tuple\n");
+                                       #endif
+                                       if (hfta_post_tuple(&_fta,tup.tuple_size,tup.data) == 0) {
+                                               tup.free_tuple();
+                                               output_queue.pop_front();
+                                       } else
+                                               break;
+                               }
+                       }
+               }
+
+               return 0;
+        }
+
+       bool init_failed(){return failed;}
+};
+
+gs_retval_t UNOP_HFTA_free_fta (struct FTA *fta, gs_uint32_t recursive) {
+       UNOP_HFTA* ftap = (UNOP_HFTA*)fta;      // deallocate the fta and call the destructor
+                                                               // will be called on program exit
+
+       if (recursive)
+               // free instance we are subscribed to
+               fta_free_instance(gscpipc_getftaid(), ftap->f, recursive);
+
+       delete ftap;
+       return 0;
+}
+
+gs_retval_t UNOP_HFTA_control_fta (struct FTA *fta, gs_int32_t command, gs_int32_t sz, void * value) {
+       UNOP_HFTA* ftap = (UNOP_HFTA*)fta;
+
+       if (command == FTA_COMMAND_FLUSH) {
+               // ask lfta to do the flush
+               fta_control(gscpipc_getftaid(), ftap->f, FTA_COMMAND_FLUSH, sz, value);
+               ftap->flush();
+
+       } else if (command == FTA_COMMAND_LOAD_PARAMS) {
+               // ask lfta to do the flush
+               fta_control(gscpipc_getftaid(), ftap->f, FTA_COMMAND_FLUSH, sz, value);
+               ftap->flush();
+
+               /* extract lfta param block from hfta param block */
+               list<param_block> param_list;
+               get_lfta_params(sz, value, param_list);
+               param_block param = param_list.front();
+               // load new parameters into lfta
+               fta_control(gscpipc_getftaid(), ftap->f, FTA_COMMAND_LOAD_PARAMS, param.block_length,param.data);
+               free(param.data);
+
+               // notify the operator about the change of parameter
+               ftap->oper->set_param_block(sz, (void*)value);
+
+       } else if (command == FTA_COMMAND_GET_TEMP_STATUS) {
+               // we no longer use temp_status commands
+               // hearbeat mechanism is used instead
+       }
+       return 0;
+}
+
+gs_retval_t UNOP_HFTA_accept_packet (struct FTA *fta, FTAID *ftaid, void * packet, gs_int32_t length) {
+       UNOP_HFTA* ftap = (UNOP_HFTA*)fta;
+#ifdef DEBUG
+       fprintf(stderr, "HFTA::accepted packet\n");
+#endif
+       if (!length)     /* ignore null tuples */
+               return 0;
+
+       host_tuple temp;
+       temp.tuple_size = length;
+       temp.data = packet;
+       temp.channel = 0;
+       temp.heap_resident = false;
+
+       // pass the tuple to operator
+       list<host_tuple> res;
+       int ret;
+       fta_stat* tup_trace = NULL;
+       gs_uint32_t tup_trace_sz = 0;
+       gs_uint64_t trace_id = 0;
+       bool temp_tuple_received = false;
+
+
+       // if the tuple is temporal we need to extract the hearbeat payload
+       if (ftaschema_is_temporal_tuple(ftap->schema_handle, packet)) {
+               temp_tuple_received = true;
+               if (ftaschema_get_trace(ftap->schema_handle, packet, length, &trace_id, &tup_trace_sz, &tup_trace))
+                       fprintf(stderr, "HFTA error: received temporal status tuple with no trace\n");
+       }
+
+       if (ftaschema_is_eof_tuple(ftap->schema_handle, packet)) {
+               /* perform a flush  */
+               ftap->flush();
+
+               /* post eof_tuple to a parent */
+               host_tuple eof_tuple;
+               ftap->oper->get_temp_status(eof_tuple);
+
+               /* last byte of the tuple specifies the tuple type
+                * set it to EOF_TUPLE
+               */
+               *((char*)eof_tuple.data + (eof_tuple.tuple_size - sizeof(char))) = EOF_TUPLE;
+               hfta_post_tuple(fta,eof_tuple.tuple_size,eof_tuple.data);
+
+               return 0;
+       }
+
+       ret = ftap->oper->accept_tuple(temp, res);
+
+       // go through the list of returned tuples and finalyze them
+       list<host_tuple>::iterator iter = res.begin();
+       while (iter != res.end()) {
+               host_tuple& tup = *iter;
+
+               // finalize the tuple
+               if (tup.tuple_size)
+                       finalize_tuple(tup);
+               iter++;
+       }
+
+       // if we received temporal tuple, last tuple of the result must be temporal too
+       // we need to extend the trace by adding ftaid and send a hearbeat to clearinghouse
+       if (temp_tuple_received) {
+               fta_stat stats;
+               host_tuple& temp_tup = res.back();
+
+
+               int new_tuple_size = temp_tup.tuple_size + sizeof(gs_uint64_t) + (tup_trace_sz + 1)* sizeof(fta_stat);
+               char* new_data = (char*)malloc(new_tuple_size);
+               memcpy(new_data, temp_tup.data, temp_tup.tuple_size);
+               memcpy(new_data + temp_tup.tuple_size, &trace_id, sizeof(gs_uint64_t));
+               memcpy(new_data + temp_tup.tuple_size + sizeof(gs_uint64_t), (char*)tup_trace, tup_trace_sz * sizeof(fta_stat));
+               memcpy(new_data + temp_tup.tuple_size + sizeof(gs_uint64_t) + tup_trace_sz * sizeof(fta_stat), (char*)ftaid, sizeof(FTAID));
+
+               memset((char*)&stats, 0, sizeof(fta_stat));
+               memcpy(new_data + temp_tup.tuple_size + sizeof(gs_uint64_t) + tup_trace_sz * sizeof(fta_stat), (char*)&stats, sizeof(fta_stat));
+
+               // Send a hearbeat message to clearinghouse.
+               fta_heartbeat(ftap->_fta.ftaid, trace_id, tup_trace_sz + 1, (fta_stat *)((char*)new_data + temp_tup.tuple_size + sizeof(gs_uint64_t)));
+
+               temp_tup.free_tuple();
+               temp_tup.data = new_data;
+               temp_tup.tuple_size = new_tuple_size;
+       }
+
+       // append returned list to output_queue
+       ftap->output_queue.splice(ftap->output_queue.end(), res);
+
+       // post tuples
+       while (!ftap->output_queue.empty()) {
+               host_tuple& tup = ftap->output_queue.front();
+               #ifdef DEBUG
+                       fprintf(stderr, "HFTA::about to post tuple\n");
+               #endif
+               if (hfta_post_tuple(fta,tup.tuple_size,tup.data) == 0) {
+                       tup.free_tuple();
+                       ftap->output_queue.pop_front();
+               } else
+                       break;
+       }
+
+       return 1;
+}
+
+gs_retval_t UNOP_HFTA_clock_fta(struct FTA *ftap) {
+
+       // Send a hearbeat message to clearinghouse.to indicate we are alive
+       fta_heartbeat(ftap->ftaid, 0, 0, 0);
+
+       return 0;
+}
+
+
+struct MULTOP_HFTA {
+       struct FTA _fta;
+       gs_csp_t fta_name;
+       gs_schemahandle_t schema_handle;
+       operator_node* root;
+       vector<operator_node*> sorted_nodes;
+       int num_operators;
+       list<lfta_info*> *lfta_list;
+       /* number of eof tuples we received so far
+        * receiving eof tuples from every source fta will cause a flush
+       */
+       int num_eof_tuples;
+
+       bool failed;
+       bool reusable;
+
+       list<host_tuple> output_queue;
+
+       // Runtime stats
+       gs_uint32_t in_tuple_cnt;
+       gs_uint32_t out_tuple_cnt;
+       gs_uint32_t out_tuple_sz;
+       gs_uint64_t cycle_cnt;
+
+       gs_uint64_t trace_id;
+
+       // memory occupied by output queue
+       gs_uint32_t output_queue_mem;
+
+
+       // To create an hfta we will need all the parameters passed to alloc_fta by host library plus
+       // lfta_name and an instance of the base_operator. We don't need to know the schema for lfta,
+       // as the schema handle is already passed during operator creation time.
+       // We also don't need to know the output schema as this information is already embeded
+       // in create_output_tuple method of operators' functor.
+
+
+
+       MULTOP_HFTA(struct FTAID ftaid, gs_csp_t name, gs_int32_t command, gs_int32_t sz, void * value, gs_schemahandle_t sch_handle, operator_node* node,
+               list<lfta_info*> *lftas, bool fta_reusable, gs_uint32_t reuse_option) {
+
+               fta_name = name;
+               failed = false;
+
+               root = node;
+               lfta_list = lftas;
+
+               // assign streamid
+               _fta.ftaid = ftaid;
+               _fta.ftaid.streamid = (gs_p_t)this;
+
+               schema_handle = sch_handle;
+
+               output_queue_mem = 0;
+
+               // topologically sort the operators in the tree (or DAG)
+               // for DAG we make sure we add the node to the sorted list only once
+               operator_node* current_node;
+               map<operator_node*, int> node_map;
+               vector<operator_node*> node_list;
+
+               int i = 0;
+               node_list.push_back(root);
+               node_map[root] = 0;
+
+               num_operators = 1;
+
+               while (i < node_list.size()) {
+                       current_node = node_list[i];
+                       if (current_node->left_child && node_map.find(current_node->left_child) == node_map.end()) {
+                               node_map[current_node->left_child] = num_operators++;
+                               node_list.push_back(current_node->left_child);
+                       }
+                       if (current_node->right_child && node_map.find(current_node->right_child) == node_map.end()) {
+                               node_map[current_node->right_child] = num_operators++;
+                               node_list.push_back(current_node->right_child);
+                       }
+                       i++;
+               }
+               num_operators = i;
+
+               // build adjacency lists for query DAG
+               list<int>* adj_lists = new list<int>[num_operators];
+               bool* leaf_flags = new bool[num_operators];
+               memset(leaf_flags, 0, num_operators * sizeof(bool));
+               for (i = 0; i < num_operators; ++i) {
+                       current_node = node_list[i];
+                       if (current_node->left_child) {
+                               adj_lists[i].push_back(node_map[current_node->left_child]);
+                       }
+                       if (current_node->right_child && current_node->left_child != current_node->right_child) {
+                               adj_lists[i].push_back(node_map[current_node->right_child]);
+                       }
+               }
+
+               // run topolofical sort
+               bool leaf_found = true;
+               while (leaf_found) {
+                       leaf_found = false;
+                       // add all leafs to sorted_nodes
+                       for (i = 0; i < num_operators; ++i) {
+                               if (!leaf_flags[i] && adj_lists[i].empty()) {
+                                       leaf_flags[i] = true;
+                                       sorted_nodes.push_back(node_list[i]);
+                                       leaf_found = true;
+
+                                       // remove the node from its parents adjecency lists
+                                       for (int j = 0; j < num_operators; ++j) {
+                                               list<int>::iterator iter;
+                                               for (iter = adj_lists[j].begin(); iter != adj_lists[j].end(); iter++) {
+                                                       if (*iter == i) {
+                                                               adj_lists[j].erase(iter);
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               delete[] adj_lists;
+               delete[] leaf_flags;
+
+               // set the parameter block for every operator in tree
+               for (i = 0; i < num_operators; ++i)
+                       if(sorted_nodes[i]->op->set_param_block(sz, (void*)value)) failed = true;
+
+#ifdef DEBUG
+               fprintf(stderr,"Instantiate FTAs\n");
+#endif
+               /* extract lfta param block from hfta param block */
+//                     NOTE: param_list must line up with lfta_list
+               list<param_block> param_list;
+               get_lfta_params(sz, value, param_list);
+               list<param_block>::iterator iter1;
+               list<lfta_info*>::iterator iter2 = lfta_list->begin();
+
+               for (iter1 = param_list.begin(), i = 0; iter1 != param_list.end(); iter1++, iter2++, i++) {
+                       lfta_info* inf = *iter2;
+
+               #ifdef DEBUG
+                       fprintf(stderr,"Instantiate a FTA\n");
+               #endif
+
+                       gs_uint32_t reuse_flag = 2;
+
+                       // we will try to create a new instance of child FTA only if it is parameterized
+                       if ((*iter1).block_length > 0 && (reuse_option == 0 || (!fta_reusable && reuse_option == 2))) {
+                               (*iter2)->f.streamid = 0;       // not interested in existing instances
+                               reuse_flag = 0;
+                       }
+                       if (fta_alloc_instance(_fta.ftaid, &(*iter2)->f,(*iter2)->fta_name, (*iter2)->schema, reuse_flag, FTA_COMMAND_LOAD_PARAMS,(*iter1).block_length,(*iter1).data)!=0) {
+                               fprintf(stderr,"HFTA::error:could instantiate a FTA");
+                               failed = true;
+                               return;
+                       }
+
+                       free((*iter1).data);
+
+                       //fprintf(stderr,"HFTA::Low level FTA instanciation done\n");
+
+                       _fta.stream_subscribed[i]=(*iter2)->f;
+               }
+               _fta.stream_subscribed_cnt = i;
+
+               num_eof_tuples = 0;
+
+               _fta.alloc_fta = NULL;  // why should this be a part of the FTA (it is a factory function)
+               _fta.free_fta = MULTOP_HFTA_free_fta;
+               _fta.control_fta = MULTOP_HFTA_control_fta;
+               _fta.accept_packet = MULTOP_HFTA_accept_packet;
+               _fta.clock_fta = MULTOP_HFTA_clock_fta;
+
+               // init runtime stats
+               in_tuple_cnt = 0;
+               out_tuple_cnt = 0;
+               out_tuple_sz = 0;
+               cycle_cnt = 0;
+
+       }
+
+       ~MULTOP_HFTA() {
+
+               list<lfta_info*>::iterator iter;
+               int i = 0;
+
+               for (iter = lfta_list->begin(); i < _fta.stream_subscribed_cnt; iter++, i++) {
+               delete *iter;
+               }
+
+               delete root;    // free operators memory
+               delete lfta_list;
+
+
+     }
+
+       int flush() {
+
+               list<host_tuple> res;
+
+               // go through the list of operators in topological order
+               // and flush them
+               list<host_tuple>::iterator iter;
+               list<host_tuple> temp_output_queue;
+
+               for (int i = 0; i < num_operators; ++i) {
+                       operator_node* node = sorted_nodes[i];
+
+#ifdef PLAN_DAG
+                       list<host_tuple>& current_output_queue = (i < (num_operators - 1)) ? temp_output_queue : res;
+#else
+                       // for trees we can put output tuples directly into parent's input buffer
+                       list<host_tuple>& current_output_queue = (i < (num_operators - 1)) ? node->parent->input_queue : res;
+#endif
+                       // consume tuples waiting in your queue
+                       for (iter = node->input_queue.begin(); iter != node->input_queue.end(); iter++) {
+                               node->op->accept_tuple(*(iter), current_output_queue);
+                       }
+                       node->op->flush(current_output_queue);
+                       node->input_queue.clear();
+
+#ifdef PLAN_DAG
+                       // copy the tuples from output queue into input queues of all parents
+                       list<operator_node*>::iterator node_iter;
+
+                       if (!node->parent_list.empty()) {
+                               // append the content of the output queue to parent input queue
+
+                               for (iter = temp_output_queue.begin(); iter != temp_output_queue.end(); iter++) {
+                                       int* ref_cnt = 0;
+                                       if (node->parent_list.size() > 1) {
+                                               ref_cnt = (int*)malloc(sizeof(int));
+                                               *ref_cnt = node->parent_list.size() - 1;
+                                       }
+
+                                       for (node_iter = node->parent_list.begin(); node_iter != node->parent_list.end(); node_iter++) {
+                                               (*iter).ref_cnt = ref_cnt;
+                                               (*node_iter)->input_queue.push_back(*iter);
+                                       }
+                               }
+                       }
+#endif
+               }
+
+               if (!res.empty()) {
+                       // go through the list of returned tuples and finalyze them
+                       list<host_tuple>::iterator iter = res.begin();
+                       while (iter != res.end()) {
+                               host_tuple& tup = *iter;
+
+                               // finalize the tuple
+                               if (tup.tuple_size)
+                                       finalize_tuple(tup);
+
+                               output_queue_mem += tup.tuple_size;
+                               iter++;
+                       }
+
+                       // append returned list to output_queue
+                       output_queue.splice(output_queue.end(), res);
+
+
+                       // post tuples
+                       while (!output_queue.empty()) {
+                               host_tuple& tup = output_queue.front();
+                               #ifdef DEBUG
+                                       fprintf(stderr, "HFTA::about to post tuple\n");
+                               #endif
+                               if (hfta_post_tuple(&_fta,tup.tuple_size,tup.data) == 0) {
+                                       output_queue_mem -= tup.tuple_size;
+                                       tup.free_tuple();
+                                       output_queue.pop_front();
+                               } else
+                                       break;
+                       }
+               }
+
+               return 0;
+       }
+
+       bool init_failed(){return failed;}
+};
+
+
+gs_retval_t MULTOP_HFTA_free_fta (struct FTA *fta, gs_uint32_t recursive) {
+       MULTOP_HFTA* ftap = (MULTOP_HFTA*)fta;  // deallocate the fta and call the destructor
+                                                               // will be called on program exit
+
+       if (recursive) {
+               // free instance we are subscribed to
+               list<lfta_info*>::iterator iter;
+               int i = 0;
+
+               for (iter = ftap->lfta_list->begin(); i < fta->stream_subscribed_cnt; iter++, i++) {
+                       fta_free_instance(gscpipc_getftaid(), (*iter)->f, recursive);
+               }
+       }
+
+       delete ftap;
+       return 0;
+}
+
+gs_retval_t MULTOP_HFTA_control_fta (struct FTA *fta, gs_int32_t command, gs_int32_t sz, void * value) {
+       MULTOP_HFTA* ftap = (MULTOP_HFTA*)fta;
+
+       if (command == FTA_COMMAND_FLUSH) {
+
+               // ask lftas to do the flush
+               list<lfta_info*>::iterator iter;
+               for (iter = ftap->lfta_list->begin(); iter != ftap->lfta_list->end(); iter++) {
+                       fta_control(gscpipc_getftaid(), (*iter)->f, FTA_COMMAND_FLUSH, sz, value);
+               }
+               // flush hfta operators
+               ftap->flush();
+
+       } else if (command == FTA_COMMAND_LOAD_PARAMS) {
+
+               list<param_block> param_list;
+               get_lfta_params(sz, value, param_list);
+
+               // ask lftas to do the flush and set new parameters
+               list<lfta_info*>::iterator iter;
+               list<param_block>::iterator iter2;
+               for (iter = ftap->lfta_list->begin(), iter2 = param_list.begin(); iter != ftap->lfta_list->end(); iter++, iter2++) {
+                       fta_control(gscpipc_getftaid(), (*iter)->f, FTA_COMMAND_FLUSH, 0, NULL);
+                       fta_control(gscpipc_getftaid(), (*iter)->f, FTA_COMMAND_LOAD_PARAMS, (*iter2).block_length,(*iter2).data);
+                       free((*iter2).data);
+               }
+               // flush hfta operators
+               ftap->flush();
+
+               // set the new parameter block for every operator in tree
+               for (int i = 0; i < ftap->num_operators; ++i)
+                       ftap->sorted_nodes[i]->op->set_param_block(sz, (void*)value);
+
+       } else if (command == FTA_COMMAND_GET_TEMP_STATUS) {
+               // we no longer use temp_status commands
+               // hearbeat mechanism is used instead
+       }
+       return 0;
+}
+
+gs_retval_t MULTOP_HFTA_accept_packet (struct FTA *fta, FTAID *ftaid, void * packet, gs_int32_t length) {
+       MULTOP_HFTA* ftap = (MULTOP_HFTA*)fta;
+
+       gs_uint64_t start_cycle = rdtsc();
+#ifdef DEBUG
+       fprintf(stderr, "HFTA::accepted packet\n");
+#endif
+       if (!length)     /* ignore null tuples */
+               return 0;
+
+       ftap->in_tuple_cnt++;
+
+       host_tuple temp;
+       temp.tuple_size = length;
+       temp.data = packet;
+       temp.channel = 0;
+       temp.heap_resident = false;
+
+// fprintf(stderr,"created temp, channel=%d, resident=%d\n",temp.channel, (int)temp.heap_resident);
+
+       // find from which lfta the tuple came
+       list<lfta_info*>::iterator iter;
+       lfta_info* inf = NULL;
+       int i;
+
+       for (i = 0, iter = ftap->lfta_list->begin(); i < ftap->_fta.stream_subscribed_cnt; iter++, i++) {
+               if (ftap->_fta.stream_subscribed[i].ip == ftaid->ip  &&
+                       ftap->_fta.stream_subscribed[i].port == ftaid->port &&
+                       ftap->_fta.stream_subscribed[i].index == ftaid->index &&
+                       ftap->_fta.stream_subscribed[i].streamid == ftaid->streamid) {
+                       inf = *iter;
+                       break;
+               }
+       }
+
+       if (!inf) {
+               fprintf(stderr,"HFTA::error:received tuple from unknown stream\n");
+               exit(1);
+       }
+
+       // route tuple through operator chain
+       list<host_tuple> result;
+       host_tuple tup;
+       int ret;
+       #ifndef PLAN_DAG
+               temp.channel = inf->output_channel;
+       #endif
+       operator_node* current_node = NULL, *child = NULL;
+       list<host_tuple> temp_output_queue;
+
+
+       fta_stat* tup_trace = NULL;
+       gs_uint32_t tup_trace_sz = 0;
+       gs_uint64_t trace_id = 0;
+       bool temp_tuple_received = false;
+
+       // if the tuple is temporal we need to extract the heartbeat payload
+       if (ftaschema_is_temporal_tuple(inf->schema_handle, packet)) {
+               temp_tuple_received = true;
+               if (ftaschema_get_trace(inf->schema_handle, packet, length, &trace_id, &tup_trace_sz, &tup_trace))
+                       fprintf(stderr, "HFTA error: received temporal status tuple with no trace\n");
+       }
+
+       if (ftaschema_is_eof_tuple(inf->schema_handle, packet)) {
+
+               if (++ftap->num_eof_tuples < ftap->lfta_list->size())
+                       return 0;
+
+               ftap->num_eof_tuples = 0;
+
+               /* perform a flush  */
+               ftap->flush();
+
+               /* post eof_tuple to a parent */
+               host_tuple eof_tuple;
+               ftap->sorted_nodes[ftap->num_operators - 1]->op->get_temp_status(eof_tuple);
+
+               /* last byte of the tuple specify the tuple type
+                * set it to EOF_TUPLE
+               */
+               *((char*)eof_tuple.data + (eof_tuple.tuple_size - sizeof(char))) = EOF_TUPLE;
+               hfta_post_tuple(fta,eof_tuple.tuple_size,eof_tuple.data);
+               ftap->out_tuple_cnt++;
+               ftap->out_tuple_sz+=eof_tuple.tuple_size;
+
+               return 0;
+       }
+
+       list<host_tuple>::iterator iter2;
+
+#ifdef PLAN_DAG
+
+       // push tuple to all parent operators of the lfta
+       list<operator_node*>::iterator node_iter;
+       list<unsigned>::iterator chan_iter;
+       for (node_iter = inf->parent_list.begin(), chan_iter = inf->out_channel_list.begin(); node_iter != inf->parent_list.end(); node_iter++, chan_iter++) {
+               temp.channel = *chan_iter;
+               (*node_iter)->input_queue.push_back(temp);
+       }
+
+       for (i = 0; i < ftap->num_operators; ++i) {
+
+               operator_node* node = ftap->sorted_nodes[i];
+               list<host_tuple>& current_output_queue = (i < (ftap->num_operators - 1)) ? temp_output_queue : result;
+
+               // consume tuples waiting in your queue
+               for (iter2 = node->input_queue.begin(); iter2 != node->input_queue.end(); iter2++) {
+                       node->op->accept_tuple(*(iter2), current_output_queue);
+               }
+               node->input_queue.clear();
+
+               // copy the tuples from output queue into input queues of all parents
+
+               if (!node->parent_list.empty()) {
+
+                       // append the content of the output queue to parent input queue
+                       for (iter2 = temp_output_queue.begin(); iter2 != temp_output_queue.end(); iter2++) {
+
+                               int* ref_cnt = 0;
+                               if (node->parent_list.size() > 1) {
+                                       ref_cnt = (int*)malloc(sizeof(int));
+                                       *ref_cnt = node->parent_list.size() - 1;
+                               }
+
+                               for (node_iter = node->parent_list.begin(), chan_iter = node->out_channel_list.begin(); node_iter != node->parent_list.end(); node_iter++, chan_iter++) {
+                                       (*iter2).ref_cnt = ref_cnt;
+                                       (*iter2).channel = *chan_iter;
+                                       (*node_iter)->input_queue.push_back(*iter2);
+                               }
+                       }
+               }
+               temp_output_queue.clear();
+       }
+#else
+       current_node = inf->parent;
+
+// fprintf(stderr,"Pushing temp, channel=%d, resident=%d\n",temp.channel, (int)temp.heap_resident);
+       current_node->input_queue.push_back(temp);
+
+       do {
+//fprintf(stderr,"Routing tuple, current node is %d, parent is %d\n",current_node,current_node->parent);
+               list<host_tuple>& current_output_queue = (current_node->parent) ? current_node->parent->input_queue : result;
+
+               // consume tuples waiting in your queue
+               for (iter2 = current_node->input_queue.begin(); iter2 != current_node->input_queue.end(); iter2++) {
+                       current_node->op->accept_tuple((*iter2),current_output_queue);
+               }
+//                     All consumed, delete them
+               current_node->input_queue.clear();
+               current_node = current_node->parent;
+
+       } while (current_node);
+#endif
+
+
+       host_tuple temp_tup;
+
+       bool no_temp_tuple = false;
+
+       // if we received temporal tuple, last tuple of the result must be temporal too
+       // we need to extend the trace by adding ftaid and send a hearbeat to clearinghouse
+       if (temp_tuple_received) {
+
+               if (result.empty()) {
+                       no_temp_tuple = true;
+
+               } else {
+                       fta_stat stats;
+                       temp_tup = result.back();
+                       finalize_tuple(temp_tup);
+
+                       int new_tuple_size = temp_tup.tuple_size + sizeof(gs_uint64_t) + (tup_trace_sz + 1)* sizeof(fta_stat);
+                       char* new_data = (char*)malloc(new_tuple_size);
+                       memcpy(new_data, temp_tup.data, temp_tup.tuple_size);
+                       memcpy(new_data + temp_tup.tuple_size, &trace_id, sizeof(gs_uint64_t));
+                       memcpy(new_data + temp_tup.tuple_size + sizeof(gs_uint64_t), (char*)tup_trace, tup_trace_sz * sizeof(fta_stat));
+
+
+                       memset((char*)&stats, 0, sizeof(fta_stat));
+                       stats.ftaid = fta->ftaid;
+                       stats.in_tuple_cnt = ftap->in_tuple_cnt;
+                       stats.out_tuple_cnt = ftap->out_tuple_cnt;
+                       stats.out_tuple_sz = ftap->out_tuple_sz;
+                       stats.cycle_cnt = ftap->cycle_cnt;
+                       memcpy(new_data + temp_tup.tuple_size + sizeof(gs_uint64_t) + tup_trace_sz * sizeof(fta_stat), (char*)&stats, sizeof(fta_stat));
+
+                       // Send a hearbeat message to clearinghouse.
+                       fta_heartbeat(fta->ftaid, trace_id, tup_trace_sz + 1, (fta_stat *)((char*)new_data + temp_tup.tuple_size + sizeof(gs_uint64_t)));
+
+                       // reset the stats
+                       ftap->in_tuple_cnt = 0;
+                       ftap->out_tuple_cnt = 0;
+                       ftap->out_tuple_sz = 0;
+                       ftap->cycle_cnt = 0;
+
+                       free(temp_tup.data);
+                       temp_tup.data = new_data;
+                       temp_tup.tuple_size = new_tuple_size;
+                       result.pop_back();
+               }
+       }
+
+       // go through the list of returned tuples and finalyze them
+       // since we can produce multiple temporal tuples in DAG plans
+       // we can drop all of them except the last one
+       iter2 = result.begin();
+       while(iter2 != result.end()) {
+               host_tuple tup = *iter2;
+
+               // finalize the tuple
+               if (tup.tuple_size) {
+                       finalize_tuple(tup);
+
+       #ifdef PLAN_DAG
+               if (ftaschema_is_temporal_tuple(ftap->schema_handle, tup.data))
+                       tup.free_tuple();
+               else
+       #endif
+                       {
+                       ftap->output_queue.push_back(tup);
+                       ftap->output_queue_mem += tup.tuple_size;
+                       }
+
+               }
+               iter2++;
+       }
+
+       // append returned list to output_queue
+       // ftap->output_queue.splice(ftap->output_queue.end(), result);
+
+       if (temp_tuple_received && !no_temp_tuple) {
+               ftap->output_queue.push_back(temp_tup);
+               ftap->output_queue_mem += temp_tup.tuple_size;
+       }
+
+       // post tuples
+       while (!ftap->output_queue.empty()) {
+               host_tuple& tup = ftap->output_queue.front();
+               #ifdef DEBUG
+                       fprintf(stderr, "HFTA::about to post tuple\n");
+               #endif
+               if (hfta_post_tuple(fta,tup.tuple_size,tup.data) == 0) {
+                       ftap->out_tuple_cnt++;
+                       ftap->out_tuple_sz+=tup.tuple_size;
+                       ftap->output_queue_mem -= tup.tuple_size;
+                       tup.free_tuple();
+                       ftap->output_queue.pop_front();
+               } else
+                       break;
+       }
+
+       ftap->cycle_cnt += rdtsc() - start_cycle;
+
+       return 1;
+}
+
+gs_retval_t MULTOP_HFTA_clock_fta(struct FTA *fta) {
+       MULTOP_HFTA* ftap = (MULTOP_HFTA*)fta;
+
+#ifdef HFTA_PROFILE
+        /* Print stats */
+        fprintf(stderr, "FTA = %s|", ftap->fta_name);
+        fprintf(stderr, "in_tuple_cnt = %u|", ftap->in_tuple_cnt);
+        fprintf(stderr, "out_tuple_cnt = %u|", ftap->out_tuple_cnt);
+        fprintf(stderr, "out_tuple_sz = %u|", ftap->out_tuple_sz);
+        fprintf(stderr, "cycle_cnt = %llu|", ftap->cycle_cnt);
+
+
+               fprintf(stderr, "mem_footprint  %s = %d", ftap->sorted_nodes[0]->op->get_name(), ftap->sorted_nodes[0]->op->get_mem_footprint());
+               unsigned int total_mem = ftap->sorted_nodes[0]->op->get_mem_footprint();
+
+               for (int i = 1; i < ftap->num_operators; ++i) {
+                       operator_node* node = ftap->sorted_nodes[i];
+                       fprintf(stderr, ",%s = %d", node->op->get_name(), node->op->get_mem_footprint());
+                       total_mem += node->op->get_mem_footprint();
+               }
+               fprintf(stderr, ", total = %d|", total_mem );
+               fprintf(stderr, "output_buffer_size = %d\n", ftap->output_queue_mem );
+#endif
+
+       fta_stat stats;
+       memset((char*)&stats, 0, sizeof(fta_stat));
+       stats.ftaid = fta->ftaid;
+       stats.in_tuple_cnt = ftap->in_tuple_cnt;
+       stats.out_tuple_cnt = ftap->out_tuple_cnt;
+       stats.out_tuple_sz = ftap->out_tuple_sz;
+       stats.cycle_cnt = ftap->cycle_cnt;
+
+       // Send a hearbeat message to clearinghouse.
+       fta_heartbeat(fta->ftaid, ftap->trace_id++, 1, &stats);
+
+       // resets runtime stats
+       ftap->in_tuple_cnt = 0;
+       ftap->out_tuple_cnt = 0;
+       ftap->out_tuple_sz = 0;
+       ftap->cycle_cnt = 0;
+
+       return 0;
+}
+
+
+#endif // __HFTA_H
+
diff --git a/include/hfta/hfta_runtime_library.h b/include/hfta/hfta_runtime_library.h
new file mode 100644 (file)
index 0000000..3a20ff3
--- /dev/null
@@ -0,0 +1,118 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef __HFTA_RUNTIME_LIBRARY__
+#define __HFTA_RUNTIME_LIBRARY__
+#include "host_tuple.h"
+#include "gsconfig.h"
+#include "gstypes.h"
+
+#define DNS_SAMPLE_HASH_SZ 50000000
+#define DNS_HITLIST_HASH_SZ 50000000
+#define DNS_HITLIST_ENTRY_SZ 500000
+
+
+//             Internal functions
+gs_retval_t Vstring_Constructor(vstring *, gs_csp_t);
+gs_retval_t hfta_vstr_length(vstring *);
+void hfta_vstr_assign_with_copy_in_tuple(vstring32 *, vstring *, gs_sp_t, int);
+void hfta_vstr_assign_with_copy(vstring *, vstring *);
+void hfta_vstr_destroy(vstring *);
+void hfta_vstr_replace(vstring *, vstring *);
+
+gs_uint32_t hfta_vstr_hashfunc(const vstring *);
+gs_retval_t hfta_vstr_compare(const vstring *, const vstring *);
+
+gs_retval_t hfta_ipv6_compare(const hfta_ipv6_str &i1, const hfta_ipv6_str &i2);
+hfta_ipv6_str And_Ipv6(const hfta_ipv6_str &i1, const hfta_ipv6_str &i2);
+hfta_ipv6_str Or_Ipv6(const hfta_ipv6_str &i1, const hfta_ipv6_str &i2);
+gs_uint32_t hfta_ipv6_hashfunc(const hfta_ipv6_str *s) ;
+hfta_ipv6_str hton_ipv6(hfta_ipv6_str s);
+hfta_ipv6_str ntoh_ipv6(hfta_ipv6_str s);
+gs_retval_t HFTA_Ipv6_Constructor(hfta_ipv6_str *s, gs_csp_t l) ;
+
+
+
+
+//             External functions
+
+inline static gs_retval_t str_truncate(vstring * result, vstring *str, gs_uint32_t length) {
+       result->offset=str->offset;
+       result->length=(str->length<length)?str->length:length;
+       result->reserved=SHALLOW_COPY;
+       return 0;
+}
+
+gs_retval_t str_exists_substr(vstring * s1, vstring * s2);
+gs_retval_t str_compare(vstring * s1, vstring * s2);
+
+gs_uint32_t str_match_offset(gs_uint32_t offset,vstring *s1,vstring *s2);
+gs_uint32_t byte_match_offset( gs_uint32_t offset, gs_uint32_t val,vstring *s2);
+
+
+// REGEX functions
+
+gs_retval_t str_regex_match(vstring* str, gs_param_handle_t pattern_handle);
+gs_param_handle_t register_handle_for_str_regex_match_slot_1(vstring* pattern);
+gs_retval_t deregister_handle_for_str_regex_match_slot_1(gs_param_handle_t handle);
+
+gs_retval_t str_partial_regex_match(vstring* str, gs_param_handle_t pattern_handle);
+gs_param_handle_t register_handle_for_str_partial_regex_match_slot_1(vstring* pattern);
+gs_retval_t deregister_handle_for_str_partial_regex_match_slot_1(gs_param_handle_t handle);
+
+gs_param_handle_t register_handle_for_str_extract_regex_slot_1(vstring* pattern);
+gs_retval_t str_extract_regex( vstring * result, vstring * str, gs_param_handle_t handle);
+gs_retval_t deregister_handle_for_str_extract_regex_slot_1(gs_param_handle_t handle);
+
+
+
+
+// type conversion
+#define INT(c) ((int)(c))
+#define UINT(c) ((gs_uint32_t)(c))
+#define FLOAT(c) ((gs_float_t)(c))
+#define ULLONG(c) ((gs_uint64_t)(c))
+
+// string conversions
+
+gs_uint32_t strtoi(gs_uint32_t * r, struct vstring *data);
+gs_uint32_t strtoip(gs_uint32_t * r, struct vstring *data);
+
+//     constant string conversions
+gs_param_handle_t register_handle_for_strtoi_c_slot_0(vstring* istr) ;
+gs_retval_t deregister_handle_for_strtoi_c_slot_0(gs_param_handle_t h) ;
+#define strtoi_c(h) ((gs_uint32_t)(h))
+
+gs_param_handle_t register_handle_for_strtoip_c_slot_0(vstring* istr) ;
+gs_retval_t deregister_handle_for_strtoip_c_slot_0(gs_param_handle_t h) ;
+#define strtoip_c(h) ((gs_uint32_t)(h))
+
+
+inline gs_uint32_t str_match_offset( gs_uint32_t offset, struct vstring * s1, struct vstring * s2) {
+       register gs_uint8_t *st1 = (gs_uint8_t *) s1->offset;
+       register gs_uint8_t *st2 = (gs_uint8_t *) (s2->offset+offset);
+       register gs_int32_t x;
+       register gs_int32_t len2 = s2->length-offset;
+       register gs_int32_t len1 = s1->length;
+       if (len2<len1) return 0;
+       for(x=0; x<len1; x++) {
+               if (st1[x]!=st2[x]) return 0;
+       }
+       return 1;
+}
+
+
+
+#endif
diff --git a/include/hfta/hfta_sfun.h b/include/hfta/hfta_sfun.h
new file mode 100644 (file)
index 0000000..4c05838
--- /dev/null
@@ -0,0 +1,113 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+#ifndef _HFTA_SFUN_H_INCLUDED_
+#define _HFTA_SFUN_H_INCLUDED_
+
+#include "vstring.h"
+#include "host_tuple.h"
+
+////////////////////////////////////////////////////////////////
+///            Dummy state and functions, for testing
+////////////////////////////////////////////////////////////////////
+
+void _sfun_state_destroy_Foo(char(*)[20] );
+void _sfun_state_dirty_init_Foo(char(*)[20],char(*)[20], int);
+void _sfun_state_final_init_Foo(char(*)[20], int);
+void _sfun_state_clean_init_Foo(char(*)[20]);
+unsigned int Bar(char(*)[20], int, unsigned int);
+
+int packet_count(void *s, int curr_num_samples);
+double gamma(void *s, int curr_num_samples);
+int init_threshold(void *s, int curr_num_samples);
+int do_clean_count(void *s, int curr_num_samples);
+int delay(void *s, int curr_num_samples);
+int newly_closed(void *s, int curr_num_samples);
+
+////////////////////////////////////////////////////
+///            Adaptive smart sampling
+////////////////////////////////////////////////////////////////////
+void _sfun_state_clean_init_smart_sampling_state(void *s);
+void _sfun_state_dirty_init_smart_sampling_state(void *s_new, void *s_old, int curr_num_samples);
+void _sfun_state_final_init_smart_sampling_state(void *s, int curr_num_samples);
+void _sfun_state_destroy_smart_sampling_state(void *s){};
+
+int ssample(void *s,int curr_num_samples, unsigned long long int len, unsigned int sample_size);
+int ssample(void *s,int curr_num_samples, int len, unsigned int sample_size){
+       return ssample(s,curr_num_samples,(unsigned long long int)len,sample_size);
+}
+int ssample(void *s,int curr_num_samples, unsigned int len, unsigned int sample_size){
+       return ssample(s,curr_num_samples,(unsigned long long int)len,sample_size);
+}
+
+int ssfinal_clean(void *s, int curr_num_sample, unsigned long long int glens);
+int ssfinal_clean(void *s, int curr_num_samples, int glen){
+       return ssfinal_clean(s, curr_num_samples, (unsigned long long int)glen);
+}
+int ssfinal_clean(void *s, int curr_num_samples, unsigned int glen){
+       return ssfinal_clean(s, curr_num_samples, (unsigned long long int)glen);
+}
+
+int ssdo_clean(void *s, int curr_num_samples);
+
+int ssclean_with(void *s,int curr_num_sample, unsigned long long int glens);
+int ssclean_with(void *s,int curr_num_sample, unsigned int glens){
+       return ssclean_with(s, curr_num_sample, (unsigned long long int)glens);
+}
+int ssclean_with(void *s,int curr_num_sample, int glens){
+       return ssclean_with(s, curr_num_sample, (unsigned long long int)glens);
+}
+
+double ssthreshold(void *s, int curr_num_sample);
+int count_distinct(void *s, int curr_num_samples);
+int packet_count(void *s, int curr_num_samples);
+double gamma(void *s, int curr_num_samples);
+int init_threshold(void *s, int curr_num_samples);
+int do_clean_count(void *s, int curr_num_samples);
+int delay(void *s, int curr_num_samples);
+int newly_closed(void *s, int curr_num_samples);
+
+//flow sampling
+int flow_ssdo_clean(void *s, int curr_num_samples,unsigned int maxtime);
+
+int flow_ssample(void *s,int curr_num_samples, unsigned int sample_size);
+
+int flow_ssclean_with(void *s,int curr_num_sample, unsigned int ccondition,  unsigned int delay,  unsigned int maxtime, unsigned long long int glens);
+int flow_ssclean_with(void *s,int curr_num_sample, unsigned int ccondition, unsigned int delay, unsigned int maxtime, unsigned int glens){
+       return flow_ssclean_with(s, curr_num_sample, ccondition, delay, maxtime, (unsigned long long int)glens);
+}
+int flow_ssclean_with(void *s,int curr_num_sample, unsigned int ccondition, unsigned int delay, unsigned int maxtime, int glens){
+       return flow_ssclean_with(s, curr_num_sample, ccondition, delay, maxtime, (unsigned long long int)glens);
+}
+
+int flow_ssfinal_clean(void *s, int curr_num_sample, unsigned int ccondition, unsigned int delay, unsigned int maxtime, unsigned long long int glens);
+int flow_ssfinal_clean(void *s, int curr_num_samples,unsigned int ccondition, unsigned int delay, unsigned int maxtime, int glen){
+       return flow_ssfinal_clean(s, curr_num_samples, ccondition, delay, maxtime, (unsigned long long int)glen);
+}
+int flow_ssfinal_clean(void *s, int curr_num_samples,unsigned int ccondition, unsigned int delay, unsigned int maxtime, unsigned int glen){
+       return flow_ssfinal_clean(s, curr_num_samples, ccondition, delay, maxtime, (unsigned long long int)glen);
+}
+
+////////////////////////////////////////////////////////////////////
+///             Manku-Motwani Heavy Hitters
+////////////////////////////////////////////////////////////////////
+void _sfun_state_clean_init_manku_hh_state(void *s);
+void _sfun_state_dirty_init_manku_hh_state(void *s_new, void *s_old, int curr_num_samples);
+void _sfun_state_final_init_manku_hh_state(void *s, int curr_num_samples);
+void _sfun_state_destroy_manku_hh_state(void *s){};
+
+/////////////////////////////////////////////////////////////////////
+
+#endif
diff --git a/include/hfta/hfta_udaf.h b/include/hfta/hfta_udaf.h
new file mode 100644 (file)
index 0000000..d97e0dd
--- /dev/null
@@ -0,0 +1,123 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef _HFTA_UDAF_H_INCLUDED_
+#define _HFTA_UDAF_H_INCLUDED_
+
+#include "vstring.h"
+#include "host_tuple.h"
+#include "gsconfig.h"
+
+// -------------------------------------------------------------------
+//             sum over 3 intervals : test rUDAF
+void sum3_HFTA_AGGR_INIT_(gs_sp_t buf) ;
+void sum3_HFTA_AGGR_UPDATE_(gs_sp_t buf, gs_uint32_t s) ;
+void sum3_HFTA_AGGR_OUTPUT_(gs_uint32_t *result, gs_sp_t buf) ;
+void sum3_HFTA_AGGR_DESTROY_(gs_sp_t buf) ;
+void sum3_HFTA_AGGR_REINIT_( gs_sp_t buf) ;
+
+
+// -------------------------------------------------------------------
+//             running sum over arbitrary intervals.
+void moving_sum_udaf_HFTA_AGGR_INIT_(gs_sp_t buf) ;
+void moving_sum_udaf_HFTA_AGGR_UPDATE_(gs_sp_t buf, gs_uint32_t s, gs_uint32_t N) ;
+void moving_sum_udaf_HFTA_AGGR_OUTPUT_(gs_uint64_t *result, gs_sp_t buf) ;
+void moving_sum_udaf_HFTA_AGGR_DESTROY_(gs_sp_t buf) ;
+void moving_sum_udaf_HFTA_AGGR_REINIT_( gs_sp_t buf) ;
+
+#define super_moving_sum_udaf_HFTA_AGGR_INIT_ moving_sum_udaf_HFTA_AGGR_INIT_
+void super_moving_sum_udaf_HFTA_AGGR_UPDATE_(gs_sp_t buf, gs_uint64_t s) ;
+#define super_moving_sum_udaf_HFTA_AGGR_OUTPUT_ moving_sum_udaf_HFTA_AGGR_OUTPUT_
+#define super_moving_sum_udaf_HFTA_AGGR_DESTROY_ moving_sum_udaf_HFTA_AGGR_DESTROY_
+#define super_moving_sum_udaf_HFTA_AGGR_REINIT_ moving_sum_udaf_HFTA_AGGR_REINIT_
+
+gs_uint32_t moving_sum_extract(gs_uint64_t result);
+gs_float_t moving_sum_extract_exp(gs_uint64_t result, gs_float_t alpha);
+
+
+/////////////////////////////////////////////////////////////////////////
+/////   Calculate the average of all positive float numbers
+
+void POSAVG_HFTA_AGGR_INIT_(gs_sp_t buf);
+void POSAVG_HFTA_AGGR_UPDATE_(gs_sp_t buf, gs_float_t v);
+void POSAVG_HFTA_AGGR_OUTPUT_(gs_float_t * v, gs_sp_t buf);
+void POSAVG_HFTA_AGGR_DESTROY_(gs_sp_t buf);
+
+
+///////////////////////////////////////////////////////////////////
+/////                  avg_udaf (simple example)
+
+//             hfta avg_udaf
+void avg_udaf_HFTA_AGGR_INIT_(gs_sp_t b);
+void avg_udaf_HFTA_AGGR_UPDATE_(gs_sp_t b, gs_uint32_t v);
+void avg_udaf_HFTA_AGGR_OUTPUT_(vstring *r,gs_sp_t b);
+void avg_udaf_HFTA_AGGR_DESTROY_(gs_sp_t b);
+
+//             avg_udaf superaggregate
+void avg_udaf_hfta_HFTA_AGGR_INIT_(gs_sp_t b);
+void avg_udaf_hfta_HFTA_AGGR_UPDATE_(gs_sp_t b, vstring *v);
+void avg_udaf_hfta_HFTA_AGGR_OUTPUT_(vstring *r,gs_sp_t b);
+void avg_udaf_hfta_HFTA_AGGR_DESTROY_(gs_sp_t b);
+
+//             Extraction function
+gs_float_t extr_avg_fcn(vstring *v);
+
+//      first aggregate
+void FIRST_hfta_HFTA_AGGR_INIT_(gs_uint32_t* scratch);
+void FIRST_hfta_HFTA_AGGR_REINIT_(gs_uint32_t* scratch);
+void FIRST_hfta_HFTA_AGGR_UPDATE_(gs_uint32_t* scratch, gs_uint32_t val);
+void FIRST_hfta_HFTA_AGGR_OUTPUT_(gs_uint32_t* res, gs_uint32_t* scratch);
+void FIRST_hfta_HFTA_AGGR_DESTROY_(gs_uint32_t* scratch);
+
+void FIRST_ULL_hfta_HFTA_AGGR_INIT_(gs_uint64_t* scratch);
+void FIRST_ULL_hfta_HFTA_AGGR_REINIT_(gs_uint64_t* scratch);
+void FIRST_ULL_hfta_HFTA_AGGR_UPDATE_(gs_uint64_t* scratch, gs_uint64_t val);
+void FIRST_ULL_hfta_HFTA_AGGR_OUTPUT_(gs_uint64_t* res, gs_uint64_t* scratch);
+void FIRST_ULL_hfta_HFTA_AGGR_DESTROY_(gs_uint64_t* scratch);
+
+void FIRST_STR_hfta_HFTA_AGGR_INIT_(vstring* scratch);
+void FIRST_STR_hfta_HFTA_AGGR_REINIT_(vstring* scratch);
+void FIRST_STR_hfta_HFTA_AGGR_UPDATE_(vstring* scratch, vstring* val);
+void FIRST_STR_hfta_HFTA_AGGR_OUTPUT_(vstring* res, vstring* scratch);
+void FIRST_STR_hfta_HFTA_AGGR_DESTROY_(vstring* scratch);
+
+//      last aggregate
+void LAST_hfta_HFTA_AGGR_INIT_(gs_uint32_t* scratch);
+void LAST_hfta_HFTA_AGGR_REINIT_(gs_uint32_t* scratch);
+void LAST_hfta_HFTA_AGGR_UPDATE_(gs_uint32_t* scratch, gs_uint32_t val);
+void LAST_hfta_HFTA_AGGR_OUTPUT_(gs_uint32_t* res, gs_uint32_t* scratch);
+void LAST_hfta_HFTA_AGGR_DESTROY_(gs_uint32_t* scratch);
+
+void LAST_ULL_hfta_HFTA_AGGR_INIT_(gs_uint64_t* scratch);
+void LAST_ULL_hfta_HFTA_AGGR_REINIT_(gs_uint64_t* scratch);
+void LAST_ULL_hfta_HFTA_AGGR_UPDATE_(gs_uint64_t* scratch, gs_uint64_t val);
+void LAST_ULL_hfta_HFTA_AGGR_OUTPUT_(gs_uint64_t* res, gs_uint64_t* scratch);
+void LAST_ULL_hfta_HFTA_AGGR_DESTROY_(gs_uint64_t* scratch);
+
+void LAST_STR_hfta_HFTA_AGGR_INIT_(vstring* scratch);
+void LAST_STR_hfta_HFTA_AGGR_REINIT_(vstring* scratch);
+void LAST_STR_hfta_HFTA_AGGR_UPDATE_(vstring* scratch, vstring* val);
+void LAST_STR_hfta_HFTA_AGGR_OUTPUT_(vstring* res, vstring* scratch);
+void LAST_STR_hfta_HFTA_AGGR_DESTROY_(vstring* scratch);
+
+//             running_array_aggr aggregate
+void running_array_aggr_hfta_HFTA_AGGR_INIT_(vstring* scratch);
+void running_array_aggr_hfta_HFTA_AGGR_REINIT_(vstring* scratch);
+void running_array_aggr_hfta_HFTA_AGGR_UPDATE_(vstring* scratch, vstring* val);
+void running_array_aggr_hfta_HFTA_AGGR_OUTPUT_(vstring* res, vstring* scratch);
+void running_array_aggr_hfta_HFTA_AGGR_DESTROY_(vstring* scratch);
+
+
+#endif
diff --git a/include/hfta/host_tuple.h b/include/hfta/host_tuple.h
new file mode 100644 (file)
index 0000000..146d432
--- /dev/null
@@ -0,0 +1,81 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef HOST_TUPLE_H
+#define HOST_TUPLE_H
+
+#include <stdlib.h>
+#include "fta.h"
+
+
+/* vstring_type specifis the format in which vstirng data is stored
+we will use the reserved field of vstirng to store the vstring_type
+vstring_type desclaration should probably be in host.h
+*/
+enum vstring_type {
+       // data immediately follows the tuple fields
+       PACKED,
+       // data allocated on a heap in one block
+       // offset is interpreted as pointer to data
+       INTERNAL,
+        // vstring is a shallow copy of another vstring (or its part)
+        // offset is interpreted as pointer to data
+        SHALLOW_COPY,
+       // data allocated on a heap as single linked list of data blocks
+       // offset is interpreted as pointer to the head of the list
+       // list node has the following format
+       // {int length, node* next) followed by the data block
+       SLIST,
+       // data allocated on a heap as double linked list of data blocks
+       // offset is interpreted as pointer to the head of the list
+       // list node has the following format
+       // {int length, node* next, node* prev) followed by the data block
+       DLIST
+};
+
+struct host_tuple {
+
+       size_t tuple_size;              // tuple size in bytes
+       void* data;                             // tuple data
+       unsigned int channel;   // input or output channel the tuple should go to
+       bool heap_resident;     // indicates whether tuple is heap or stack resident
+
+       // we need to use reference counting for query plans that are DAGs
+#ifdef PLAN_DAG
+       int* ref_cnt;
+       host_tuple() {ref_cnt = NULL;}
+#endif
+
+
+       inline void free_tuple() {
+               if (heap_resident) {
+                       #ifdef PLAN_DAG
+                               if (!ref_cnt)
+                                       free(data);
+                               else if (*ref_cnt == 0) {
+                                       free(data);
+                                       free(ref_cnt);
+                               } else {
+                                       (*ref_cnt)--;
+                               }
+                       #else
+                               free(data);
+                       #endif
+               }
+       }
+
+};
+
+#endif // HOST_TUPLE_H
diff --git a/include/hfta/join_eq_hash_operator.h b/include/hfta/join_eq_hash_operator.h
new file mode 100644 (file)
index 0000000..5038f7a
--- /dev/null
@@ -0,0 +1,417 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef JOIN_EQ_HASH_OPERATOR_H
+#define JOIN_EQ_HASH_OPERATOR_H
+
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <list>
+#include"hash_table.h"
+using namespace std;
+
+#include <stdio.h>
+
+#define JOIN_OP_INNER_JOIN 0
+#define JOIN_OP_LEFT_OUTER_JOIN 1
+#define JOIN_OP_RIGHT_OUTER_JOIN 2
+#define JOIN_OP_OUTER_JOIN 3
+
+
+#define MAX_TUPLE_SIZE 1024
+
+template <class join_eq_hash_functor, class timestamp, class hashkey, class hasher_func, class equal_func>
+class join_eq_hash_operator : public base_operator {
+private :
+       //      type of join : inner vs. outer
+       unsigned int join_type;
+int n_calls, n_iters, n_eqk;
+
+       // for tracing
+       int sch0, sch1;
+
+       // list of tuples from one of the channel waiting to be compared
+       // against tuple from the other channel
+       list<host_tuple> input_queue[2];
+
+//             Admission control timestamp objects
+       timestamp *max_input_ts[2], *curr_ts;
+       bool hash_empty, curr_ts_valid;
+
+//     max tuples received from input channels
+       char max_input_tuple_data[2][MAX_TUPLE_SIZE];
+       host_tuple max_input_tuple[2];
+
+//             The hash tables for the join algorithm
+       hash_table<hashkey*, host_tuple, hasher_func, equal_func> join_tbl[2];
+
+
+       // comparator object used to provide methods for performing the joins.
+       join_eq_hash_functor func;
+
+       // soft limit on queue size - we consider operator blocked on its input
+       // whenever we reach this soft limit (not used anymore)
+       size_t soft_queue_size_limit;
+
+//                     For matching on join hash key
+       equal_func equal_key;
+
+       // memory footprint for the join queues in bytes
+       unsigned int queue_mem;
+
+
+       // appends tuple to the end of the one of the input queues
+       // if tuple is stack resident, makes it heap resident
+       int append_tuple(host_tuple& tup, int q) {
+               int ret = input_queue[q].empty() ? 1 : 2;
+               if (!tup.heap_resident) {
+                       char* data = (char*)malloc(tup.tuple_size);
+                       memcpy(data, tup.data, tup.tuple_size);
+                       tup.data = data;
+                       tup.heap_resident = true;
+               }
+               input_queue[q].push_back(tup);
+               queue_mem += tup.tuple_size;
+               return ret;
+       }
+
+//             -1 if input queue i has smaller ts, 0 it equal, 1 if curr_ts is smaller
+       int compare_qts_to_hashts(int i){
+               timestamp tmp_ts;
+               if(max_input_ts[i] == NULL) return(-1);
+               if(input_queue[i].empty())
+                       return(func.compare_ts_with_ts(max_input_ts[i], curr_ts));
+               func.load_ts_from_tup(&tmp_ts,input_queue[i].front());
+               return(func.compare_ts_with_ts(&tmp_ts, curr_ts));
+       }
+
+//             -1 if q0 is smaller, 1 if q1 is smaller, 0 if equal
+       int compare_qts(){
+               if(max_input_ts[0] == NULL) return(-1);
+               if(max_input_ts[1] == NULL) return(1);
+               timestamp tmp_lts, tmp_rts, *lts,*rts;
+
+               if(input_queue[0].empty()){
+                       lts = max_input_ts[0];
+               }else{
+                       func.load_ts_from_tup(&tmp_lts, input_queue[0].front());
+                       lts = &tmp_lts;
+               }
+
+               if(input_queue[1].empty()){
+                       rts = max_input_ts[1];
+               }else{
+                       func.load_ts_from_tup(&tmp_rts, input_queue[1].front());
+                       rts = &tmp_rts;
+               }
+
+               return(func.compare_ts_with_ts(lts,rts));
+       }
+
+       int compare_tup_with_ts(host_tuple &tup, timestamp *ts){
+               timestamp tmp_ts;
+               func.load_ts_from_tup(&tmp_ts, tup);
+               return(func.compare_ts_with_ts(&tmp_ts, ts));
+       }
+
+       void process_join(list<host_tuple>& result){
+         int i;
+         for(i=0;i<2;++i){
+               while(curr_ts_valid && !input_queue[i].empty() && compare_tup_with_ts(input_queue[i].front(), curr_ts) == 0 ){
+//                             apply tuples to join
+                       int other = 1-i;        // the other channel
+                       bool failed;
+
+//                                     Get tuple from list
+                       host_tuple qtup = input_queue[i].front();
+                       input_queue[i].pop_front();
+                       queue_mem -= qtup.tuple_size;
+
+//                                             Put it into its join table
+                       hashkey *qtup_key = func.create_key(qtup,failed); // on heap
+                       if(failed){
+                               qtup.free_tuple();
+                               continue;
+                       }
+                       join_tbl[i].insert(qtup_key, qtup);
+
+//                                             Join with matching tuples in other table.
+
+                       typename hash_table<hashkey*, host_tuple, hasher_func, equal_func>::iterator jti = join_tbl[other].find(qtup_key);
+                       while(jti != join_tbl[other].end()){
+                               if(equal_key((*jti).first, qtup_key)){
+                                 host_tuple otup;
+                                 if(i==0)
+                                   otup = func.create_output_tuple( qtup, (*jti).second, failed );
+                                 else
+                                   otup = func.create_output_tuple( (*jti).second, qtup, failed );
+                                 if(!failed){
+                                       otup.channel = output_channel;
+                                       result.push_back(otup);
+                                       qtup_key->touch();
+                                       (*jti).first->touch();
+                                 }
+                               }
+                               jti = jti.next();
+                       }
+               }
+         }
+       }
+
+  void process_outer_join(list<host_tuple>& result){
+       int i;
+       bool failed;
+    host_tuple empty_tuple;
+       empty_tuple.tuple_size = 0; empty_tuple.data = NULL;
+
+       hash_empty = true;
+       typename hash_table<hashkey*, host_tuple, hasher_func, equal_func>::iterator jti;
+       for(i=0;i<2;++i){
+               if(!join_tbl[i].empty()){
+                       if(join_type & (i+1)){
+                               for(jti=join_tbl[i].begin();jti!=join_tbl[i].end();++jti){
+//             Outer join processing
+                                       if( ! (*jti).first->is_touched() ){
+                                         host_tuple otup;
+                                         if(i==0)
+                                       otup = func.create_output_tuple(  (*jti).second, empty_tuple, failed );
+                                         else
+                                       otup = func.create_output_tuple( empty_tuple, (*jti).second, failed );
+                                         if(!failed){
+                                               otup.channel = output_channel;
+                                               result.push_back(otup);
+                                         }
+                                       }
+//             end outer join processing
+
+                                       delete((*jti).first);
+                                       (*jti).second.free_tuple();
+                               }
+                       }else{
+                               for(jti=join_tbl[i].begin();jti!=join_tbl[i].end();++jti){
+                                       delete((*jti).first);
+                                       (*jti).second.free_tuple();
+                               }
+                       }
+               }
+               join_tbl[i].clear(); join_tbl[i].rehash();
+       }
+
+  }
+
+public:
+       join_eq_hash_operator(int schema_handle0, int schema_handle1, unsigned int jtype, const char* name, size_t size_limit = 10000) : base_operator(name), func(schema_handle0, schema_handle1) {
+               join_type = jtype;
+               max_input_ts[0] = NULL; max_input_ts[1] = NULL;
+               max_input_tuple[0].data = max_input_tuple_data[0];
+               max_input_tuple[1].data = max_input_tuple_data[1];
+
+               curr_ts =  new timestamp();
+               curr_ts_valid = false;
+               hash_empty = true;
+               soft_queue_size_limit = size_limit;
+
+               sch0=schema_handle0;
+               sch1=schema_handle1;
+n_calls=0; n_iters=0; n_eqk=0;
+
+               queue_mem = 0;
+       }
+
+       int accept_tuple(host_tuple& tup, list<host_tuple>& result) {
+               bool do_join_update = false;
+               int i;
+               bool failed;
+
+//                     Dummy tuple for outer join processing.
+               host_tuple empty_tuple;
+               empty_tuple.tuple_size = 0; empty_tuple.data = NULL;
+
+
+               if (tup.channel > 1) {
+                       gslog(LOG_ALERT, "Illegal channel number %d for two-way join, handles=%d, %d\n", tup.channel, sch0, sch1);
+                       return 0;
+               }
+
+               bool is_temp_tuple = func.temp_status_received(tup);
+
+//                     Ensure that the queue ts is initialized.
+               if(max_input_ts[tup.channel] == NULL){
+                       max_input_ts[tup.channel] = new timestamp();
+                       if(! func.load_ts_from_tup(max_input_ts[tup.channel],tup)){
+                               tup.free_tuple();
+                               delete max_input_ts[tup.channel];
+                               max_input_ts[tup.channel] = NULL;
+                               return(0);      // can't load ts -- bail out.
+                       }
+
+                       if( max_input_ts[1-tup.channel]){
+                               int qcmp = compare_qts();
+                               if(qcmp<=0){
+                                       func.load_ts_from_ts(curr_ts, max_input_ts[0]);
+                               }else{
+                                       func.load_ts_from_ts(curr_ts, max_input_ts[1]);
+                               }
+                               curr_ts_valid = true;
+                       }
+               }
+
+// reject "out of order" tuple - silently.
+               timestamp tup_ts;
+               if(! func.load_ts_from_tup(&tup_ts,tup)){
+                       tup.free_tuple();
+                       return(0);      // can't load ts -- bail out.
+               }
+
+           int tup_order=func.compare_ts_with_ts(&tup_ts,max_input_ts[tup.channel]);
+               if (tup_order < 0){
+printf("out of order ts.\n");
+                       tup.free_tuple();
+
+                       // even for out of order temporal tuples we need to post new temporal tuple
+                       if (is_temp_tuple) {
+                               host_tuple temp_tup;
+                               temp_tup.channel = output_channel;
+                               if (!get_temp_status(temp_tup))
+                                       result.push_back(temp_tup);
+                       }
+                       return  0;
+               }
+
+//     Update max if larger
+               if(tup_order > 0){
+                       func.load_ts_from_ts(max_input_ts[tup.channel],&tup_ts);
+
+                       // save the content of the max tuple
+                       max_input_tuple[tup.channel].channel = tup.channel;
+                       max_input_tuple[tup.channel].tuple_size = tup.tuple_size;
+                       memcpy(max_input_tuple[tup.channel].data, tup.data, tup.tuple_size);
+
+//                     do_join_update = true;
+               }
+
+//             Add to input queue if it passes the prefilter.
+               if(!is_temp_tuple && func.apply_prefilter(tup)){
+                       if(append_tuple(tup,tup.channel) == 1){
+                               do_join_update = true;  // added tuple to empty queue
+                       }
+               }else{
+                       tup.free_tuple();
+               }
+
+//             If status changed, apply tuples to join.
+//             (updated max time, added tuple to empty queue)
+
+//             clear queues, advance curr_ts
+                       if(compare_qts_to_hashts(0)>0 && compare_qts_to_hashts(1)>0){
+                               process_outer_join(result);
+
+
+                         int minq = 0;
+                         if(compare_qts() > 0)
+                               minq = 1;
+                         if(input_queue[minq].empty())
+                               func.load_ts_from_ts(curr_ts,max_input_ts[minq]);
+                         else
+                               func.load_ts_from_tup(curr_ts,input_queue[minq].front());
+                       }
+
+//                             Process any tuples to be joined.
+                                       process_join(result);
+
+
+               // post new temporal tuple
+
+               if(is_temp_tuple) {
+                       host_tuple temp_tup;
+                       temp_tup.channel = output_channel;
+                       if (!get_temp_status(temp_tup))
+                               result.push_back(temp_tup);
+               }
+
+               return 0;
+       }
+
+       int flush(list<host_tuple>& result) {
+
+               process_outer_join(result);
+
+               int minq = 0;
+               if(compare_qts() > 0)
+                       minq = 1;
+
+               if(input_queue[minq].empty())
+                       func.load_ts_from_ts(curr_ts,max_input_ts[minq]);
+               else
+                       func.load_ts_from_tup(curr_ts,input_queue[minq].front());
+
+               process_join(result);
+
+               return 0;
+       }
+
+       int set_param_block(int sz, void * value) {
+               func.set_param_block(sz, value);
+               return 0;
+       }
+
+
+       int get_temp_status(host_tuple& result) {
+//                     temp tuple timestamp should be minimum between
+//                     minimums of all input queues
+
+               // find the inputstream in minimum lowebound of the timestamp
+               int qcmp = compare_qts();
+               int minq = 0; if(qcmp>0) minq = 1;
+
+               host_tuple empty_tuple;
+               empty_tuple.tuple_size = 0; empty_tuple.data = NULL;
+               host_tuple& left_tuple = empty_tuple;
+               host_tuple& right_tuple = empty_tuple;
+
+               if (minq == 0) {
+                       if(max_input_ts[minq]) {
+                               if (input_queue[minq].empty())
+                                       left_tuple = max_input_tuple[minq];
+                               else
+                                       left_tuple = input_queue[minq].front();
+                       }
+               } else {
+                       if(max_input_ts[minq]) {
+                               if (input_queue[minq].empty())
+                                       right_tuple = max_input_tuple[minq];
+                               else
+                                       right_tuple = input_queue[minq].front();
+                       }
+               }
+
+               result.channel = output_channel;
+               return func.create_temp_status_tuple(left_tuple, right_tuple, result);
+       }
+
+
+       int get_blocked_status () {
+               if(input_queue[0].size() > soft_queue_size_limit) return(0);
+               if(input_queue[1].size() > soft_queue_size_limit) return(1);
+               return -1;
+       }
+
+       unsigned int get_mem_footprint() {
+               return join_tbl[0].get_mem_footprint() + join_tbl[1].get_mem_footprint() + queue_mem;
+       }
+};
+
+#endif // JOIN_EQ_HASH_OPERATOR_H
+
diff --git a/include/hfta/merge_operator.h b/include/hfta/merge_operator.h
new file mode 100644 (file)
index 0000000..662fd32
--- /dev/null
@@ -0,0 +1,247 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef MERGE_OPERATOR_H
+#define MERGE_OPERATOR_H
+
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <list>
+using namespace std;
+
+#include <stdio.h>
+
+
+//int last_tb = 0;
+
+template <class merge_functor>
+class merge_operator : public base_operator {
+private :
+       // input channel on which we want to receive the next tuple
+       // value -1 indicates that we never received a single tuple
+       // and we are not concerned on which channel tuple will arrive
+       int wait_channel;
+
+       // list of tuples from one of the channel waiting to be compared
+       // against tuple from the other channel
+       list<host_tuple> merge_queue;
+       int merge_qsize;
+
+       // comparator object used to compare the tuples
+       merge_functor func;
+
+       // soft limit on queue size - we consider operator blocked on its input
+       // whenever we reach this soft limit (not used anymore)
+       size_t soft_queue_size_limit;
+
+       int dropped_cnt;
+
+       // memory footprint for the merge queue in bytes
+       unsigned int queue_mem;
+
+       // appends tuple to the end of the merge_queue
+       // if tuple is stack resident, makes it heap resident
+       void append_tuple(host_tuple& tup) {
+               if (!tup.heap_resident) {
+                       char* data = (char*)malloc(tup.tuple_size);
+                       memcpy(data, tup.data, tup.tuple_size);
+                       tup.data = data;
+                       tup.heap_resident = true;
+               }
+               merge_queue.push_back(tup);
+               merge_qsize++;
+               queue_mem += tup.tuple_size;
+       }
+
+       void purge_queue(int channel, list<host_tuple>& result){
+               if (merge_queue.empty())
+                       return;
+               host_tuple top_tuple = merge_queue.front();
+               // remove all the tuple smaller than arrived tuple
+               while(func.compare_stored_with_temp_status(top_tuple, 1-channel) <= 0) {
+                       merge_queue.pop_front();
+                       merge_qsize--;
+                       queue_mem -= top_tuple.tuple_size;
+                       if(merge_qsize<0) abort();
+                       func.update_stored_temp_status(top_tuple,channel);
+                       func.xform_tuple(top_tuple);
+                       top_tuple.channel = output_channel;
+                       result.push_back(top_tuple);
+
+                       if (merge_queue.empty())
+                               break;
+
+                       top_tuple = merge_queue.front();
+                       func.update_stored_temp_status(top_tuple,channel);
+               }
+       }
+
+
+
+public:
+
+       merge_operator(int schema_handle1, int schema_handle2, size_t size_limit, const char* name ) : base_operator(name), func(schema_handle1) {
+               wait_channel = -1;
+               soft_queue_size_limit = size_limit;
+               merge_qsize = 0;
+               dropped_cnt = 0;
+               queue_mem = 0;
+       }
+
+
+       int accept_tuple(host_tuple& tup, list<host_tuple>& result) {
+               int last_channel;
+
+               if (tup.channel > 1) {
+                       fprintf(stderr, "Illegal channel number %d for two-way merge\n", tup.channel);
+                       return 0;
+               }
+
+               /* reject "out of order" tuple - we can receive those after forced flush */
+               func.get_timestamp(tup);
+               int res = func.compare_with_temp_status(tup.channel);
+               bool is_temp_tuple = func.temp_status_received(tup);
+
+/*
+//                     Ignore temp tuples until we can fix their timestamps.
+if(is_temp_tuple){
+ tup.free_tuple();
+ return 0;
+}*/
+               if (res < 0){   // out of order tuple
+
+                       if (++dropped_cnt % 100000 == 0) {
+                               gslog(LOG_ALERT, "%d tuples dropped by %s  merge\n", dropped_cnt,get_name());
+                       }
+                       //if(func.print_warnings())
+                       //      fprintf(stderr,"Warning: merge %s receives an out-of-order tuple on channel %d.\n", get_name(), tup.channel);
+                       // free tuple memory
+                       tup.free_tuple();
+                       return 0;
+               } else {
+
+                       if (wait_channel < 0 || wait_channel != tup.channel) {
+                               if (wait_channel < 0)
+                                       func.update_temp_status(tup);
+
+                               if (!is_temp_tuple){
+                                       if(func.compare_with_temp_status(1-tup.channel) <= 0){
+                                               if (!tup.heap_resident) {
+                                                       char* data = (char*)malloc(tup.tuple_size);
+                                                       memcpy(data, tup.data, tup.tuple_size);
+                                                       tup.data = data;
+                                                       tup.heap_resident = true;
+                                               }
+                                               func.xform_tuple(tup);
+                                               tup.channel = output_channel;
+                                               result.push_back(tup);
+                                       }else{
+                                               append_tuple(tup);              // put arrived tuple in the queue
+                                       }
+                               }
+//                             func.update_temp_status_by_slack(tup, 1-tup.channel);
+//                             purge_queue(tup.channel, result);
+
+                               wait_channel = 1-tup.channel;
+                       }else{
+       //                              If possible, clear tuples from the other queue.
+                               func.update_temp_status(tup);
+                               purge_queue(1-tup.channel, result);
+
+                               if(func.compare_with_temp_status(1-tup.channel) <= 0) { // other tuples in the queue are larger that arrived tuple
+                                       if (!is_temp_tuple) {
+                                               if (!tup.heap_resident) {
+                                                        char* data = (char*)malloc(tup.tuple_size);
+                                                        memcpy(data, tup.data, tup.tuple_size);
+                                                        tup.data = data;
+                                                        tup.heap_resident = true;
+                                                }
+                                               func.xform_tuple(tup);
+                                               tup.channel = output_channel;
+                                               result.push_back(tup);
+                                       }
+                               }
+                               else {
+                                       if (!is_temp_tuple)
+                                               append_tuple(tup);              // put arrived tuple in the queue
+                                       wait_channel = 1 - tup.channel; // now we want the tuple from other channel
+                               }
+                       }
+
+               }
+
+               // temp status tuples emited by merge don't serve any other purpose
+               // other than tracing the flow of tuples
+               if (is_temp_tuple) {
+                       host_tuple temp_tup;
+                       if (!func.create_temp_status_tuple(temp_tup)) {
+                               temp_tup.channel = output_channel;
+                               result.push_back(temp_tup);
+                       }
+                       // clear memory of heap-resident temporal tuples
+                       tup.free_tuple();
+               }
+
+               if (!merge_qsize)
+                       wait_channel = -1;
+
+               return 0;
+       }
+
+       int flush(list<host_tuple>& result) {
+
+               if (merge_queue.empty())
+                       return 0;
+
+               host_tuple top_tuple;
+               list<host_tuple>::iterator iter;
+               for (iter = merge_queue.begin(); iter != merge_queue.end(); iter++) {
+                       top_tuple = *iter;
+                       func.update_stored_temp_status(top_tuple,top_tuple.channel);
+                       func.xform_tuple(top_tuple);
+                       top_tuple.channel = output_channel;
+                       result.push_back(top_tuple);
+               }
+
+               queue_mem = 0;
+
+               return 0;
+       }
+
+       int set_param_block(int sz, void * value) {
+                       return 0;
+       }
+
+
+       int get_temp_status(host_tuple& result) {
+               result.channel = output_channel;
+               return func.create_temp_status_tuple(result);
+       }
+
+
+       int get_blocked_status () {
+               if (merge_qsize> soft_queue_size_limit)
+                       return wait_channel;
+               else
+                       return -1;
+       }
+
+       unsigned int get_mem_footprint() {
+               return queue_mem;
+       }
+
+};
+
+#endif // MERGE_OPERATOR_H
diff --git a/include/hfta/merge_operator_oop.h b/include/hfta/merge_operator_oop.h
new file mode 100644 (file)
index 0000000..b416d34
--- /dev/null
@@ -0,0 +1,182 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef MERGE_OPERATOR_OOP_H
+#define MERGE_OPERATOR_OOP_H
+
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <list>
+using namespace std;
+
+#include <stdio.h>
+
+
+//int last_tb = 0;
+
+template <class merge_functor>
+class merge_operator_oop : public base_operator {
+private :
+       // input channel on which we want to receive the next tuple
+       // value -1 indicates that we never received a single tuple
+       // and we are not concerned on which channel tuple will arrive
+       int wait_channel;
+
+       // list of tuples from one of the channel waiting to be compared
+       // against tuple from the other channel
+       list<host_tuple> merge_queue;
+       int merge_qsize;
+
+       // comparator object used to compare the tuples
+       merge_functor func;
+
+       // soft limit on queue size - we consider operator blocked on its input
+       // whenever we reach this soft limit (not used anymore)
+       size_t soft_queue_size_limit;
+
+       int dropped_cnt;
+
+       // memory footprint for the merge queue in bytes
+       unsigned int queue_mem;
+
+       // appends tuple to the end of the merge_queue
+// tuple is stack resident, makes it heap resident
+       void append_tuple(host_tuple& tup) {
+               if (!tup.heap_resident) {
+                       char* data = (char*)malloc(tup.tuple_size);
+                       memcpy(data, tup.data, tup.tuple_size);
+                       tup.data = data;
+                       tup.heap_resident = true;
+               }
+               merge_queue.push_back(tup);
+               merge_qsize++;
+               queue_mem += tup.tuple_size;
+       }
+
+
+       // purge tuples in the queue, which are from stream channel -- Jin
+       void purge_queue(int channel, list<host_tuple>& result){
+               if (merge_queue.empty())
+                       return;
+               host_tuple top_tuple = merge_queue.front();
+               // remove all the tuple smaller than arrived tuple
+               while(func.compare_with_temp_status(top_tuple, 1-channel) <= 0) {
+                       merge_queue.pop_front();
+                       merge_qsize--;
+                       queue_mem -= top_tuple.tuple_size;
+                       if(merge_qsize<0) abort();
+                       func.update_temp_status(top_tuple,channel);
+                       func.xform_tuple(top_tuple);
+                       top_tuple.channel = output_channel;
+                       result.push_back(top_tuple);
+
+                       if (merge_queue.empty())
+                               break;
+
+                       top_tuple = merge_queue.front();
+                       func.update_temp_status(top_tuple,channel);
+               }
+       }
+
+
+
+public:
+
+       merge_operator_oop(int schema_handle1, int schema_handle2, size_t size_limit, const char* name ) : base_operator(name), func(schema_handle1) {
+               wait_channel = -1;
+               soft_queue_size_limit = size_limit;
+               merge_qsize = 0;
+               dropped_cnt = 0;
+               queue_mem = 0;
+       }
+
+       int accept_tuple(host_tuple& tup, list<host_tuple>& result) {
+               int last_channel;
+
+               if (tup.channel > 1) {
+                       fprintf(stderr, "Illegal channel number %d for two-way merge\n", tup.channel);
+                       return 0;
+               }
+
+               func.get_timestamp(tup);
+               func.compare_with_temp_status(tup.channel);
+               bool is_temp_tuple = func.temp_status_received(tup);
+
+               if (!is_temp_tuple) {
+                       result.push_back(tup);
+               } else {
+                       func.update_temp_status(tup);
+
+                       host_tuple temp_tup;
+                       if (!func.create_temp_status_tuple(temp_tup)) {
+                               temp_tup.channel = output_channel;
+                               result.push_back(temp_tup);
+                       }
+                       // clear memory of heap-resident temporal tuples
+                       tup.free_tuple();
+               }
+
+               return 0;
+       }
+
+
+
+       /* where is this called?  when using the blocking mode -- Jin */
+       int flush(list<host_tuple>& result) {
+
+               if (merge_queue.empty())
+                       return 0;
+
+               host_tuple top_tuple;
+               list<host_tuple>::iterator iter;
+               for (iter = merge_queue.begin(); iter != merge_queue.end(); iter++) {
+                       top_tuple = *iter;
+                       func.update_stored_temp_status(top_tuple,top_tuple.channel);
+                       func.xform_tuple(top_tuple);
+                       top_tuple.channel = output_channel;
+                       result.push_back(top_tuple);
+               }
+
+               queue_mem = 0;
+
+               return 0;
+       }
+
+       int set_param_block(int sz, void * value) {
+                       return 0;
+       }
+
+
+       int get_temp_status(host_tuple& result) {
+               result.channel = output_channel;
+               return func.create_temp_status_tuple(result);
+       }
+
+
+       int get_blocked_status () {
+               if (merge_qsize> soft_queue_size_limit)
+                       return wait_channel;
+               else
+                       return -1;
+       }
+
+       unsigned int get_mem_footprint() {
+               return queue_mem;
+       }
+
+};
+
+#endif // MERGE_OPERATOR_OOP_H
+
diff --git a/include/hfta/running_gb_operator.h b/include/hfta/running_gb_operator.h
new file mode 100644 (file)
index 0000000..5bd7388
--- /dev/null
@@ -0,0 +1,141 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef RWGROUPBY_OPERATOR_H
+#define RWGROUPBY_OPERATOR_H
+
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <list>
+#include "hash_table.h"
+
+#define _GB_FLUSH_PER_TUPLE_ 1
+
+using namespace std;
+
+template <class groupby_func, class group, class aggregate, class hasher_func, class equal_func>
+class running_agg_operator : public base_operator {
+private :
+       groupby_func func;
+       hash_table<group*, aggregate*, hasher_func, equal_func> group_table;
+       typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator flush_pos;
+
+
+
+public:
+       running_agg_operator(int schema_handle, const char* name) : base_operator(name), func(schema_handle) {
+               flush_pos = group_table.end();
+       }
+
+       virtual int accept_tuple(host_tuple& tup, list<host_tuple>& result) {
+
+//                     Push out completed groups
+
+               // create buffer on the stack to store key object
+               char buffer[sizeof(group)];
+
+               // extract the key information from the tuple and
+               // copy it into buffer
+               group* grp = func.create_group(tup, buffer);
+/*//                   Ignore temp tuples until we can fix their timestamps.
+if (func.temp_status_received()) {
+ tup.free_tuple();
+ return 0;
+}
+*/
+
+               if (!grp) {
+                       if (func.flush_needed()){
+                               flush(result);
+                       }
+                       if (func.temp_status_received()) {
+                               host_tuple temp_tup;
+                               if (!func.create_temp_status_tuple(temp_tup, true)) {
+                                       temp_tup.channel = output_channel;
+                                       result.push_back(temp_tup);
+                               }
+                       }
+                       tup.free_tuple();
+                       return 0;
+               }
+
+               if (func.flush_needed()) {
+                       flush(result);
+               }
+               typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator iter;
+               if ((iter = group_table.find(grp)) != group_table.end()) {
+                       aggregate* old_aggr = (*iter).second;
+                       func.update_aggregate(tup, grp, old_aggr);
+               }else{
+                       // create a copy of the group on the heap
+                       group* new_grp = new group(grp);        // need a copy constructor for groups
+//                     aggregate* aggr = (aggregate*)malloc(sizeof(aggregate));
+                       aggregate* aggr = new aggregate();
+                       // create an aggregate in preallocated buffer
+                       aggr = func.create_aggregate(tup, (char*)aggr);
+
+                       group_table.insert(new_grp, aggr);
+               }
+               tup.free_tuple();
+               return 0;
+       }
+
+       virtual int flush(list<host_tuple>& result) {
+               host_tuple tup;
+               typename hash_table<group*, aggregate*, hasher_func, equal_func>::iterator iter;
+//             If the old table isn't empty, flush it now.
+               for (flush_pos = group_table.begin(); flush_pos != group_table.end(); ) {
+                       bool failed = false;
+                       tup = func.create_output_tuple((*flush_pos).first,(*flush_pos).second, failed);
+                       if (!failed) {
+                               tup.channel = output_channel;
+                               result.push_back(tup);
+                       }
+                       if(func.cleaning_when((*flush_pos).first,(*flush_pos).second)){
+                           group* g = (*flush_pos).first;
+                       aggregate* a = (*flush_pos).second;
+                               ++flush_pos;
+                               group_table.erase(g);
+                               delete (g);
+                               delete (a);
+                       }else{
+                               func.reinit_aggregates((*flush_pos).first, (*flush_pos).second);
+                               ++flush_pos;
+                       }
+               }
+
+               return 0;
+       }
+
+       virtual int set_param_block(int sz, void * value) {
+               func.set_param_block(sz, value);
+               return 0;
+       }
+
+       virtual int get_temp_status(host_tuple& result) {
+               result.channel = output_channel;
+               return func.create_temp_status_tuple(result, true);
+       }
+
+       virtual int get_blocked_status () {
+               return -1;
+       }
+
+       unsigned int get_mem_footprint() {
+               return group_table.get_mem_footprint();
+       }
+};
+
+#endif // GROUPBY_OPERATOR_H
diff --git a/include/hfta/selection_operator.h b/include/hfta/selection_operator.h
new file mode 100644 (file)
index 0000000..1da2640
--- /dev/null
@@ -0,0 +1,71 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef SELECTION_OPERATOR_H
+#define SELECTION_OPERATOR_H
+
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <list>
+using namespace std;
+
+template <class select_project_functor> class select_project_operator :
+               public base_operator
+{
+private :
+       select_project_functor func;
+public:
+
+       select_project_operator(int schema_handle, const char* name) : base_operator(name), func(schema_handle) { }
+
+       virtual int accept_tuple(host_tuple& tup, list<host_tuple>& result) {
+               host_tuple res;
+
+               if (func.predicate(tup)) {
+                       res = func.create_output_tuple();
+                       res.channel = output_channel;
+                       result.push_back(res);
+               } else {
+                       if (func.temp_status_received()) {
+                               if (!func.create_temp_status_tuple(res)) {
+                                       res.channel = output_channel;
+                                       result.push_back(res);
+                               }
+                       }
+               }
+               tup.free_tuple();
+               return 0;
+       }
+
+       virtual int flush(list<host_tuple>& result) {
+               return 0;
+       }
+
+       virtual int set_param_block(int sz, void * value) {
+               func.set_param_block(sz, value);
+               return 0;
+       }
+
+       virtual int get_temp_status(host_tuple& result) {
+               result.channel = output_channel;
+               return func.create_temp_status_tuple(result);
+       }
+
+       virtual int get_blocked_status () {
+               return -1;              // selection operators are not blocked on any input
+       }
+};
+
+#endif // SELECTION_OPERATOR_H
diff --git a/include/hfta/zfile_output_operator.h b/include/hfta/zfile_output_operator.h
new file mode 100644 (file)
index 0000000..51b9ef8
--- /dev/null
@@ -0,0 +1,205 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef ZFILE_OUTPUT_OPERATOR_H
+#define ZFILE_OUTPUT_OPERATOR_H
+
+#include <app.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <schemaparser.h>
+
+#include "host_tuple.h"
+#include "base_operator.h"
+#include <list>
+#include<string>
+#include<vector>
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <schemaparser.h>
+
+#include <zlib.h>
+
+using namespace std;
+
+#ifndef FILESTREAM_OPERATOR_UTILS
+#define FILESTREAM_OPERATOR_UTILS
+string fs_int_to_string(int i){
+    string ret;
+    char tmpstr[100];
+    sprintf(tmpstr,"%d",i);
+    ret=tmpstr;
+    return(ret);
+}
+#endif
+
+template <class file_output_functor> class zfile_output_operator :
+               public base_operator
+{
+private :
+       file_output_functor func;
+
+       gzFile *output_file;
+       vector<string> xform_command;
+       vector<string> temp_fname;
+       vector<string> fname;
+       string qname;
+       string schema;
+       string file_header;
+       gs_uint32_t n_file_streams;
+
+int total_written;
+
+public:
+
+zfile_output_operator(int schema_handle, gs_csp_t name, gs_csp_t sch) : base_operator(name), func(schema_handle) {
+       char tmpstr[1000];
+       int i;
+
+       n_file_streams = func.num_file_streams();
+       output_file = (gzFile *)(malloc(sizeof(gzFile )*n_file_streams));
+       for(i=0;i<n_file_streams;++i){
+               output_file[i] = NULL;
+               xform_command.push_back("");
+               temp_fname.push_back("");
+               fname.push_back("");
+       }
+       qname = name;
+       schema = sch;
+       sprintf(tmpstr,"GDAT\nVERSION:%u\nSCHEMALENGTH:%lu\n",get_schemaparser_version(),strlen(sch)+1);
+       file_header = tmpstr;
+
+total_written = 0;
+}
+
+
+
+virtual int accept_tuple(host_tuple& tup, list<host_tuple>& result) {
+string fname_base;
+host_tuple res;
+gs_uint32_t i;
+
+       if(! func.temp_status_received(tup)){  // this operator doesn't write
+//                     Check for EOF conditions.
+               if(func.is_eof_tuple()){
+                       if(output_file[0] != NULL){
+                               for(i=0;i<n_file_streams;++i){
+                                       gzclose(output_file[i]);
+                                       output_file[i] = NULL;
+                                       rename(temp_fname[i].c_str(), fname[i].c_str());
+                               }
+                       }
+                       if(func.propagate_tuple()){
+                               tup.channel = output_channel;
+                               result.push_back(tup);
+                       }
+                       return 0;
+               }
+
+               if(func.new_epoch()){
+                       if(output_file[0] != 0){
+total_written = 0;
+                               for(i=0;i<n_file_streams;++i){
+                                       gzclose(output_file[i]);
+                                       rename(temp_fname[i].c_str(), fname[i].c_str());
+                               }
+                       }
+
+                       fname_base = func.get_filename_base();
+                       for(i=0;i<n_file_streams;++i){
+                               if(n_file_streams > 1){
+                                       temp_fname[i] = fname_base + "_stream"+fs_int_to_string(i)+ ".txt.gz.tmp";
+                                       fname[i] = fname_base + "_stream"+fs_int_to_string(i) + ".txt.gz";
+                               }else{
+                                       temp_fname[i] = fname_base + "_stream"+fs_int_to_string(i)+ ".txt.gz.tmp";
+                                       fname[i] = fname_base + "_stream"+fs_int_to_string(i) + ".txt.gz";
+                               }
+//                     else{
+//                             xform_command = "mv "+temp_fname+" "+fname;
+//                     }
+                               if ((output_file[i]=gzopen(temp_fname[i].c_str(),"wb"))==0) {
+                                       gslog(LOG_EMERG,"Could not open file \"%s\".. EXITING\n", temp_fname[i].c_str());
+                                       exit(1);
+                               }
+                               gzwrite(output_file[i],file_header.c_str(),strlen(file_header.c_str()));
+                               gzwrite(output_file[i],schema.c_str(),strlen(schema.c_str())+1);
+                       }
+               }
+
+               gs_uint32_t sz = tup.tuple_size;
+               gs_uint32_t nsz = htonl(tup.tuple_size);
+               gs_uint32_t file_hash = func.output_hash();
+total_written += sizeof(gs_uint32_t) + sz;
+               if (gzwrite(output_file[file_hash],&nsz,sizeof(gs_uint32_t))==0) {
+                       gslog(LOG_EMERG,"zfile_output_operator: Could not write %d bytes to output\"%s\".. EXITING\n", sizeof(gs_uint32_t), temp_fname[file_hash].c_str());
+                       exit(1);
+               }
+
+               if (gzwrite(output_file[file_hash],tup.data,sz)==0) {
+                       gslog(LOG_EMERG,"zfile_output_operator: Could not write %d bytes to output\"%s\".. EXITING\n", sz, temp_fname[file_hash].c_str());
+                       exit(1);
+               }
+               if(func.propagate_tuple()){
+                       tup.channel = output_channel;
+                       result.push_back(tup);
+               }
+               return 0;
+       }else{
+/*
+               if (!func.create_temp_status_tuple(res)) {
+                       res.channel = output_channel;
+                       result.push_back(res);
+               }
+*/
+
+//fprintf(stderr,"\tis temp tuple\n");
+       }
+
+       if(func.propagate_tuple()){
+               tup.channel = output_channel;
+               result.push_back(tup);
+       }
+       return 0;
+}
+
+
+       virtual int flush(list<host_tuple>& result) {
+               return 0;
+       }
+
+       virtual int set_param_block(int sz, void * value) {
+//             func.set_param_block(sz, value);
+               return 0;
+       }
+
+       virtual int get_temp_status(host_tuple& result) {
+               result.channel = output_channel;
+               return func.create_temp_status_tuple(result);
+       }
+
+       virtual int get_blocked_status () {
+               return -1;              // selection operators are not blocked on any input
+       }
+};
+
+
+#endif // ZFILE_OUTPUT_OPERATOR_H
+
diff --git a/include/lapp.h b/include/lapp.h
new file mode 100644 (file)
index 0000000..cfa1fbb
--- /dev/null
@@ -0,0 +1,131 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+/*
+ * lapp.h: low level interface for applications
+ */
+#ifndef LAPP_H
+#define LAPP_H
+
+#include <fta.h>
+#include <systat.h>
+#include <fta_stat.h>
+
+#define REGULAR_TUPLE 0
+#define TEMPORAL_TUPLE 1
+#define EOF_TUPLE 2
+
+/* LOW LEVEL APPLICATION INTERFACE */
+/* =============================== */
+
+/* NOTE: A streamid is only unique in the context of a particular
+ * producer. Therefore, all the fields in the FTAID need to be compared
+ * to decided if to FTA instances are the same
+ */
+
+#define CLEARINGHOUSE 1
+#define APP 2
+#define HFTA 3
+#define LFTA 4
+
+/* deviceid should be set to DEFAULTDEV mapcnt and map to 0 for HFTAs and apps */
+
+gs_retval_t hostlib_init(gs_int32_t type, gs_int32_t recvbuffersz, gs_int32_t deviceid,  gs_int32_t mapcnt, gs_sp_t map[]);
+
+void hostlib_free();
+
+/* find an FTA message queue ID, index and schema based on an FTA key
+ * if reuse is set we return an already running instance if possible*/
+
+gs_retval_t fta_find(FTAname name, gs_uint32_t  reuse,  FTAID * ftaid,
+                     gs_sp_t schema , gs_int32_t buffersz );
+
+/* the following is used to send a heart beat message to the clearinghouse. Self is the FTAID of the sending
+ * fta instance*/
+
+gs_retval_t fta_heartbeat(FTAID self, gs_uint64_t trace_id,
+                          gs_uint32_t  sz, fta_stat * trace);
+
+/*
+ * FTA's cannot be dynamically installed (since we currently don't
+ * have a run-time linker in the card).  however, new parameterized
+ * instances of previously installed FTAs can be created.  The FTA
+ * template IDs have to defined in an include file.  the following
+ * call will result in a call to the FTA's alloc_fta function.
+ * if sucessfull the streamid is set in the ftaid.
+ */
+
+gs_retval_t fta_alloc_instance(FTAID subscriber,
+                               FTAID * ftaid, FTAname name, gs_sp_t schema,
+                               gs_uint32_t  reusable,
+                               gs_int32_t command, gs_int32_t sz, void *  data);
+
+/* see app.h for description of the additional parameter */
+gs_retval_t fta_alloc_print_instance(FTAID subscriber,
+                                     FTAID * ftaid,
+                                     FTAname name, gs_sp_t schema,gs_uint32_t  reusable,
+                                     gs_int32_t command, gs_int32_t sz, void *  data,
+                                     gs_sp_t path,gs_sp_t basename,
+                                     gs_sp_t temporal_field, gs_sp_t split_field,
+                                     gs_uint32_t  delta, gs_uint32_t  split);
+
+
+/*
+ * the next two functions result in callouts to the corresponding FTA
+ * functions (fta_free, control_fta).
+ */
+
+gs_retval_t fta_free_instance(FTAID subscriber,FTAID ftaid, gs_uint32_t  recursive);
+
+
+gs_retval_t fta_control(FTAID subscriber,
+                        FTAID ftaid, gs_int32_t command, gs_int32_t sz, void * value);
+
+
+/*
+ * gscp_get_buffer: get a tuple from a read shared buffer
+ * established with any other porcess  when an FTA
+ * was established. Returns -1 on error, 0 on success and 1 on timeout and 2 for a temporal tuple.
+ * On a timeout the streamid is set to 1 and the length to 0.
+ * The timeout is in seconds. A timeout of 0 makes the call blocking
+ * a timeout of -1 returns imidiatly if no buffer is availabe.
+ */
+gs_retval_t gscp_get_buffer(FTAID * ftaid, gs_int32_t * size, void *tbuffer,
+                            gs_int32_t tbuf_size, gs_int32_t timeout);
+
+/* the following function send a control callback to every
+ active FTA in a particular process identified by the
+ IP and port part of the ftaid. The result is < 0 if not
+ successful if the control operation is returning a result it is ignored.
+ The main purpose of this message is to support a
+ flush of all FTAs in a proccess*/
+
+gs_retval_t process_control(FTAID ftaid, gs_int32_t command,
+                            gs_int32_t sz, void * value);
+
+
+/* called by an FTA if one of its producers fails. Self is the FTAID of the instance
+ * sending the notification */
+
+gs_retval_t fta_notify_producer_failure(FTAID self, FTAID producer);
+
+/* returns FTAID of current process */
+FTAID  gscpipc_getftaid();
+
+extern gs_uint64_t shared_memory_full_warning;
+
+/* returns 1 if GSCP ringbuffers are in blocking mode */
+gs_retval_t gscp_blocking_mode();
+
+#endif
diff --git a/include/lfta/csv2_macro.h b/include/lfta/csv2_macro.h
new file mode 100644 (file)
index 0000000..914f7d2
--- /dev/null
@@ -0,0 +1,10017 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef CSV2_MACRO_H
+#define CSV2_MACRO_H
+#define get_csv2_uint_pos1(X,Y) get_csv2_uint((X),(Y),1)
+#define get_csv2_ullong_pos1(X,Y) get_csv2_ullong((X),(Y),1)
+#define get_csv2_ip_pos1(X,Y) get_csv2_ip((X),(Y),1)
+#define get_csv2_ipv6_pos1(X,Y) get_csv2_ipv6((X),(Y),1)
+#define get_csv2_string_pos1(X,Y) get_csv2_string((X),(Y),1)
+#define get_csv2_v_str_pos1(X,Y) get_csv2_string((X),(Y),1)
+#define get_csv2_bool_pos1(X,Y) get_csv2_bool((X),(Y),1)
+#define get_csv2_int_pos1(X,Y) get_csv2_int((X),(Y),1)
+#define get_csv2_llong_pos1(X,Y) get_csv2_llong((X),(Y),1)
+#define get_csv2_float_pos1(X,Y) get_csv2_float((X),(Y),1)
+#define get_csv2_uint_pos2(X,Y) get_csv2_uint((X),(Y),2)
+#define get_csv2_ullong_pos2(X,Y) get_csv2_ullong((X),(Y),2)
+#define get_csv2_ip_pos2(X,Y) get_csv2_ip((X),(Y),2)
+#define get_csv2_ipv6_pos2(X,Y) get_csv2_ipv6((X),(Y),2)
+#define get_csv2_string_pos2(X,Y) get_csv2_string((X),(Y),2)
+#define get_csv2_v_str_pos2(X,Y) get_csv2_string((X),(Y),2)
+#define get_csv2_bool_pos2(X,Y) get_csv2_bool((X),(Y),2)
+#define get_csv2_int_pos2(X,Y) get_csv2_int((X),(Y),2)
+#define get_csv2_llong_pos2(X,Y) get_csv2_llong((X),(Y),2)
+#define get_csv2_float_pos2(X,Y) get_csv2_float((X),(Y),2)
+#define get_csv2_uint_pos3(X,Y) get_csv2_uint((X),(Y),3)
+#define get_csv2_ullong_pos3(X,Y) get_csv2_ullong((X),(Y),3)
+#define get_csv2_ip_pos3(X,Y) get_csv2_ip((X),(Y),3)
+#define get_csv2_ipv6_pos3(X,Y) get_csv2_ipv6((X),(Y),3)
+#define get_csv2_string_pos3(X,Y) get_csv2_string((X),(Y),3)
+#define get_csv2_v_str_pos3(X,Y) get_csv2_string((X),(Y),3)
+#define get_csv2_bool_pos3(X,Y) get_csv2_bool((X),(Y),3)
+#define get_csv2_int_pos3(X,Y) get_csv2_int((X),(Y),3)
+#define get_csv2_llong_pos3(X,Y) get_csv2_llong((X),(Y),3)
+#define get_csv2_float_pos3(X,Y) get_csv2_float((X),(Y),3)
+#define get_csv2_uint_pos4(X,Y) get_csv2_uint((X),(Y),4)
+#define get_csv2_ullong_pos4(X,Y) get_csv2_ullong((X),(Y),4)
+#define get_csv2_ip_pos4(X,Y) get_csv2_ip((X),(Y),4)
+#define get_csv2_ipv6_pos4(X,Y) get_csv2_ipv6((X),(Y),4)
+#define get_csv2_string_pos4(X,Y) get_csv2_string((X),(Y),4)
+#define get_csv2_v_str_pos4(X,Y) get_csv2_string((X),(Y),4)
+#define get_csv2_bool_pos4(X,Y) get_csv2_bool((X),(Y),4)
+#define get_csv2_int_pos4(X,Y) get_csv2_int((X),(Y),4)
+#define get_csv2_llong_pos4(X,Y) get_csv2_llong((X),(Y),4)
+#define get_csv2_float_pos4(X,Y) get_csv2_float((X),(Y),4)
+#define get_csv2_uint_pos5(X,Y) get_csv2_uint((X),(Y),5)
+#define get_csv2_ullong_pos5(X,Y) get_csv2_ullong((X),(Y),5)
+#define get_csv2_ip_pos5(X,Y) get_csv2_ip((X),(Y),5)
+#define get_csv2_ipv6_pos5(X,Y) get_csv2_ipv6((X),(Y),5)
+#define get_csv2_string_pos5(X,Y) get_csv2_string((X),(Y),5)
+#define get_csv2_v_str_pos5(X,Y) get_csv2_string((X),(Y),5)
+#define get_csv2_bool_pos5(X,Y) get_csv2_bool((X),(Y),5)
+#define get_csv2_int_pos5(X,Y) get_csv2_int((X),(Y),5)
+#define get_csv2_llong_pos5(X,Y) get_csv2_llong((X),(Y),5)
+#define get_csv2_float_pos5(X,Y) get_csv2_float((X),(Y),5)
+#define get_csv2_uint_pos6(X,Y) get_csv2_uint((X),(Y),6)
+#define get_csv2_ullong_pos6(X,Y) get_csv2_ullong((X),(Y),6)
+#define get_csv2_ip_pos6(X,Y) get_csv2_ip((X),(Y),6)
+#define get_csv2_ipv6_pos6(X,Y) get_csv2_ipv6((X),(Y),6)
+#define get_csv2_string_pos6(X,Y) get_csv2_string((X),(Y),6)
+#define get_csv2_v_str_pos6(X,Y) get_csv2_string((X),(Y),6)
+#define get_csv2_bool_pos6(X,Y) get_csv2_bool((X),(Y),6)
+#define get_csv2_int_pos6(X,Y) get_csv2_int((X),(Y),6)
+#define get_csv2_llong_pos6(X,Y) get_csv2_llong((X),(Y),6)
+#define get_csv2_float_pos6(X,Y) get_csv2_float((X),(Y),6)
+#define get_csv2_uint_pos7(X,Y) get_csv2_uint((X),(Y),7)
+#define get_csv2_ullong_pos7(X,Y) get_csv2_ullong((X),(Y),7)
+#define get_csv2_ip_pos7(X,Y) get_csv2_ip((X),(Y),7)
+#define get_csv2_ipv6_pos7(X,Y) get_csv2_ipv6((X),(Y),7)
+#define get_csv2_string_pos7(X,Y) get_csv2_string((X),(Y),7)
+#define get_csv2_v_str_pos7(X,Y) get_csv2_string((X),(Y),7)
+#define get_csv2_bool_pos7(X,Y) get_csv2_bool((X),(Y),7)
+#define get_csv2_int_pos7(X,Y) get_csv2_int((X),(Y),7)
+#define get_csv2_llong_pos7(X,Y) get_csv2_llong((X),(Y),7)
+#define get_csv2_float_pos7(X,Y) get_csv2_float((X),(Y),7)
+#define get_csv2_uint_pos8(X,Y) get_csv2_uint((X),(Y),8)
+#define get_csv2_ullong_pos8(X,Y) get_csv2_ullong((X),(Y),8)
+#define get_csv2_ip_pos8(X,Y) get_csv2_ip((X),(Y),8)
+#define get_csv2_ipv6_pos8(X,Y) get_csv2_ipv6((X),(Y),8)
+#define get_csv2_string_pos8(X,Y) get_csv2_string((X),(Y),8)
+#define get_csv2_v_str_pos8(X,Y) get_csv2_string((X),(Y),8)
+#define get_csv2_bool_pos8(X,Y) get_csv2_bool((X),(Y),8)
+#define get_csv2_int_pos8(X,Y) get_csv2_int((X),(Y),8)
+#define get_csv2_llong_pos8(X,Y) get_csv2_llong((X),(Y),8)
+#define get_csv2_float_pos8(X,Y) get_csv2_float((X),(Y),8)
+#define get_csv2_uint_pos9(X,Y) get_csv2_uint((X),(Y),9)
+#define get_csv2_ullong_pos9(X,Y) get_csv2_ullong((X),(Y),9)
+#define get_csv2_ip_pos9(X,Y) get_csv2_ip((X),(Y),9)
+#define get_csv2_ipv6_pos9(X,Y) get_csv2_ipv6((X),(Y),9)
+#define get_csv2_string_pos9(X,Y) get_csv2_string((X),(Y),9)
+#define get_csv2_v_str_pos9(X,Y) get_csv2_string((X),(Y),9)
+#define get_csv2_bool_pos9(X,Y) get_csv2_bool((X),(Y),9)
+#define get_csv2_int_pos9(X,Y) get_csv2_int((X),(Y),9)
+#define get_csv2_llong_pos9(X,Y) get_csv2_llong((X),(Y),9)
+#define get_csv2_float_pos9(X,Y) get_csv2_float((X),(Y),9)
+#define get_csv2_uint_pos10(X,Y) get_csv2_uint((X),(Y),10)
+#define get_csv2_ullong_pos10(X,Y) get_csv2_ullong((X),(Y),10)
+#define get_csv2_ip_pos10(X,Y) get_csv2_ip((X),(Y),10)
+#define get_csv2_ipv6_pos10(X,Y) get_csv2_ipv6((X),(Y),10)
+#define get_csv2_string_pos10(X,Y) get_csv2_string((X),(Y),10)
+#define get_csv2_v_str_pos10(X,Y) get_csv2_string((X),(Y),10)
+#define get_csv2_bool_pos10(X,Y) get_csv2_bool((X),(Y),10)
+#define get_csv2_int_pos10(X,Y) get_csv2_int((X),(Y),10)
+#define get_csv2_llong_pos10(X,Y) get_csv2_llong((X),(Y),10)
+#define get_csv2_float_pos10(X,Y) get_csv2_float((X),(Y),10)
+#define get_csv2_uint_pos11(X,Y) get_csv2_uint((X),(Y),11)
+#define get_csv2_ullong_pos11(X,Y) get_csv2_ullong((X),(Y),11)
+#define get_csv2_ip_pos11(X,Y) get_csv2_ip((X),(Y),11)
+#define get_csv2_ipv6_pos11(X,Y) get_csv2_ipv6((X),(Y),11)
+#define get_csv2_string_pos11(X,Y) get_csv2_string((X),(Y),11)
+#define get_csv2_v_str_pos11(X,Y) get_csv2_string((X),(Y),11)
+#define get_csv2_bool_pos11(X,Y) get_csv2_bool((X),(Y),11)
+#define get_csv2_int_pos11(X,Y) get_csv2_int((X),(Y),11)
+#define get_csv2_llong_pos11(X,Y) get_csv2_llong((X),(Y),11)
+#define get_csv2_float_pos11(X,Y) get_csv2_float((X),(Y),11)
+#define get_csv2_uint_pos12(X,Y) get_csv2_uint((X),(Y),12)
+#define get_csv2_ullong_pos12(X,Y) get_csv2_ullong((X),(Y),12)
+#define get_csv2_ip_pos12(X,Y) get_csv2_ip((X),(Y),12)
+#define get_csv2_ipv6_pos12(X,Y) get_csv2_ipv6((X),(Y),12)
+#define get_csv2_string_pos12(X,Y) get_csv2_string((X),(Y),12)
+#define get_csv2_v_str_pos12(X,Y) get_csv2_string((X),(Y),12)
+#define get_csv2_bool_pos12(X,Y) get_csv2_bool((X),(Y),12)
+#define get_csv2_int_pos12(X,Y) get_csv2_int((X),(Y),12)
+#define get_csv2_llong_pos12(X,Y) get_csv2_llong((X),(Y),12)
+#define get_csv2_float_pos12(X,Y) get_csv2_float((X),(Y),12)
+#define get_csv2_uint_pos13(X,Y) get_csv2_uint((X),(Y),13)
+#define get_csv2_ullong_pos13(X,Y) get_csv2_ullong((X),(Y),13)
+#define get_csv2_ip_pos13(X,Y) get_csv2_ip((X),(Y),13)
+#define get_csv2_ipv6_pos13(X,Y) get_csv2_ipv6((X),(Y),13)
+#define get_csv2_string_pos13(X,Y) get_csv2_string((X),(Y),13)
+#define get_csv2_v_str_pos13(X,Y) get_csv2_string((X),(Y),13)
+#define get_csv2_bool_pos13(X,Y) get_csv2_bool((X),(Y),13)
+#define get_csv2_int_pos13(X,Y) get_csv2_int((X),(Y),13)
+#define get_csv2_llong_pos13(X,Y) get_csv2_llong((X),(Y),13)
+#define get_csv2_float_pos13(X,Y) get_csv2_float((X),(Y),13)
+#define get_csv2_uint_pos14(X,Y) get_csv2_uint((X),(Y),14)
+#define get_csv2_ullong_pos14(X,Y) get_csv2_ullong((X),(Y),14)
+#define get_csv2_ip_pos14(X,Y) get_csv2_ip((X),(Y),14)
+#define get_csv2_ipv6_pos14(X,Y) get_csv2_ipv6((X),(Y),14)
+#define get_csv2_string_pos14(X,Y) get_csv2_string((X),(Y),14)
+#define get_csv2_v_str_pos14(X,Y) get_csv2_string((X),(Y),14)
+#define get_csv2_bool_pos14(X,Y) get_csv2_bool((X),(Y),14)
+#define get_csv2_int_pos14(X,Y) get_csv2_int((X),(Y),14)
+#define get_csv2_llong_pos14(X,Y) get_csv2_llong((X),(Y),14)
+#define get_csv2_float_pos14(X,Y) get_csv2_float((X),(Y),14)
+#define get_csv2_uint_pos15(X,Y) get_csv2_uint((X),(Y),15)
+#define get_csv2_ullong_pos15(X,Y) get_csv2_ullong((X),(Y),15)
+#define get_csv2_ip_pos15(X,Y) get_csv2_ip((X),(Y),15)
+#define get_csv2_ipv6_pos15(X,Y) get_csv2_ipv6((X),(Y),15)
+#define get_csv2_string_pos15(X,Y) get_csv2_string((X),(Y),15)
+#define get_csv2_v_str_pos15(X,Y) get_csv2_string((X),(Y),15)
+#define get_csv2_bool_pos15(X,Y) get_csv2_bool((X),(Y),15)
+#define get_csv2_int_pos15(X,Y) get_csv2_int((X),(Y),15)
+#define get_csv2_llong_pos15(X,Y) get_csv2_llong((X),(Y),15)
+#define get_csv2_float_pos15(X,Y) get_csv2_float((X),(Y),15)
+#define get_csv2_uint_pos16(X,Y) get_csv2_uint((X),(Y),16)
+#define get_csv2_ullong_pos16(X,Y) get_csv2_ullong((X),(Y),16)
+#define get_csv2_ip_pos16(X,Y) get_csv2_ip((X),(Y),16)
+#define get_csv2_ipv6_pos16(X,Y) get_csv2_ipv6((X),(Y),16)
+#define get_csv2_string_pos16(X,Y) get_csv2_string((X),(Y),16)
+#define get_csv2_v_str_pos16(X,Y) get_csv2_string((X),(Y),16)
+#define get_csv2_bool_pos16(X,Y) get_csv2_bool((X),(Y),16)
+#define get_csv2_int_pos16(X,Y) get_csv2_int((X),(Y),16)
+#define get_csv2_llong_pos16(X,Y) get_csv2_llong((X),(Y),16)
+#define get_csv2_float_pos16(X,Y) get_csv2_float((X),(Y),16)
+#define get_csv2_uint_pos17(X,Y) get_csv2_uint((X),(Y),17)
+#define get_csv2_ullong_pos17(X,Y) get_csv2_ullong((X),(Y),17)
+#define get_csv2_ip_pos17(X,Y) get_csv2_ip((X),(Y),17)
+#define get_csv2_ipv6_pos17(X,Y) get_csv2_ipv6((X),(Y),17)
+#define get_csv2_string_pos17(X,Y) get_csv2_string((X),(Y),17)
+#define get_csv2_v_str_pos17(X,Y) get_csv2_string((X),(Y),17)
+#define get_csv2_bool_pos17(X,Y) get_csv2_bool((X),(Y),17)
+#define get_csv2_int_pos17(X,Y) get_csv2_int((X),(Y),17)
+#define get_csv2_llong_pos17(X,Y) get_csv2_llong((X),(Y),17)
+#define get_csv2_float_pos17(X,Y) get_csv2_float((X),(Y),17)
+#define get_csv2_uint_pos18(X,Y) get_csv2_uint((X),(Y),18)
+#define get_csv2_ullong_pos18(X,Y) get_csv2_ullong((X),(Y),18)
+#define get_csv2_ip_pos18(X,Y) get_csv2_ip((X),(Y),18)
+#define get_csv2_ipv6_pos18(X,Y) get_csv2_ipv6((X),(Y),18)
+#define get_csv2_string_pos18(X,Y) get_csv2_string((X),(Y),18)
+#define get_csv2_v_str_pos18(X,Y) get_csv2_string((X),(Y),18)
+#define get_csv2_bool_pos18(X,Y) get_csv2_bool((X),(Y),18)
+#define get_csv2_int_pos18(X,Y) get_csv2_int((X),(Y),18)
+#define get_csv2_llong_pos18(X,Y) get_csv2_llong((X),(Y),18)
+#define get_csv2_float_pos18(X,Y) get_csv2_float((X),(Y),18)
+#define get_csv2_uint_pos19(X,Y) get_csv2_uint((X),(Y),19)
+#define get_csv2_ullong_pos19(X,Y) get_csv2_ullong((X),(Y),19)
+#define get_csv2_ip_pos19(X,Y) get_csv2_ip((X),(Y),19)
+#define get_csv2_ipv6_pos19(X,Y) get_csv2_ipv6((X),(Y),19)
+#define get_csv2_string_pos19(X,Y) get_csv2_string((X),(Y),19)
+#define get_csv2_v_str_pos19(X,Y) get_csv2_string((X),(Y),19)
+#define get_csv2_bool_pos19(X,Y) get_csv2_bool((X),(Y),19)
+#define get_csv2_int_pos19(X,Y) get_csv2_int((X),(Y),19)
+#define get_csv2_llong_pos19(X,Y) get_csv2_llong((X),(Y),19)
+#define get_csv2_float_pos19(X,Y) get_csv2_float((X),(Y),19)
+#define get_csv2_uint_pos20(X,Y) get_csv2_uint((X),(Y),20)
+#define get_csv2_ullong_pos20(X,Y) get_csv2_ullong((X),(Y),20)
+#define get_csv2_ip_pos20(X,Y) get_csv2_ip((X),(Y),20)
+#define get_csv2_ipv6_pos20(X,Y) get_csv2_ipv6((X),(Y),20)
+#define get_csv2_string_pos20(X,Y) get_csv2_string((X),(Y),20)
+#define get_csv2_v_str_pos20(X,Y) get_csv2_string((X),(Y),20)
+#define get_csv2_bool_pos20(X,Y) get_csv2_bool((X),(Y),20)
+#define get_csv2_int_pos20(X,Y) get_csv2_int((X),(Y),20)
+#define get_csv2_llong_pos20(X,Y) get_csv2_llong((X),(Y),20)
+#define get_csv2_float_pos20(X,Y) get_csv2_float((X),(Y),20)
+#define get_csv2_uint_pos21(X,Y) get_csv2_uint((X),(Y),21)
+#define get_csv2_ullong_pos21(X,Y) get_csv2_ullong((X),(Y),21)
+#define get_csv2_ip_pos21(X,Y) get_csv2_ip((X),(Y),21)
+#define get_csv2_ipv6_pos21(X,Y) get_csv2_ipv6((X),(Y),21)
+#define get_csv2_string_pos21(X,Y) get_csv2_string((X),(Y),21)
+#define get_csv2_v_str_pos21(X,Y) get_csv2_string((X),(Y),21)
+#define get_csv2_bool_pos21(X,Y) get_csv2_bool((X),(Y),21)
+#define get_csv2_int_pos21(X,Y) get_csv2_int((X),(Y),21)
+#define get_csv2_llong_pos21(X,Y) get_csv2_llong((X),(Y),21)
+#define get_csv2_float_pos21(X,Y) get_csv2_float((X),(Y),21)
+#define get_csv2_uint_pos22(X,Y) get_csv2_uint((X),(Y),22)
+#define get_csv2_ullong_pos22(X,Y) get_csv2_ullong((X),(Y),22)
+#define get_csv2_ip_pos22(X,Y) get_csv2_ip((X),(Y),22)
+#define get_csv2_ipv6_pos22(X,Y) get_csv2_ipv6((X),(Y),22)
+#define get_csv2_string_pos22(X,Y) get_csv2_string((X),(Y),22)
+#define get_csv2_v_str_pos22(X,Y) get_csv2_string((X),(Y),22)
+#define get_csv2_bool_pos22(X,Y) get_csv2_bool((X),(Y),22)
+#define get_csv2_int_pos22(X,Y) get_csv2_int((X),(Y),22)
+#define get_csv2_llong_pos22(X,Y) get_csv2_llong((X),(Y),22)
+#define get_csv2_float_pos22(X,Y) get_csv2_float((X),(Y),22)
+#define get_csv2_uint_pos23(X,Y) get_csv2_uint((X),(Y),23)
+#define get_csv2_ullong_pos23(X,Y) get_csv2_ullong((X),(Y),23)
+#define get_csv2_ip_pos23(X,Y) get_csv2_ip((X),(Y),23)
+#define get_csv2_ipv6_pos23(X,Y) get_csv2_ipv6((X),(Y),23)
+#define get_csv2_string_pos23(X,Y) get_csv2_string((X),(Y),23)
+#define get_csv2_v_str_pos23(X,Y) get_csv2_string((X),(Y),23)
+#define get_csv2_bool_pos23(X,Y) get_csv2_bool((X),(Y),23)
+#define get_csv2_int_pos23(X,Y) get_csv2_int((X),(Y),23)
+#define get_csv2_llong_pos23(X,Y) get_csv2_llong((X),(Y),23)
+#define get_csv2_float_pos23(X,Y) get_csv2_float((X),(Y),23)
+#define get_csv2_uint_pos24(X,Y) get_csv2_uint((X),(Y),24)
+#define get_csv2_ullong_pos24(X,Y) get_csv2_ullong((X),(Y),24)
+#define get_csv2_ip_pos24(X,Y) get_csv2_ip((X),(Y),24)
+#define get_csv2_ipv6_pos24(X,Y) get_csv2_ipv6((X),(Y),24)
+#define get_csv2_string_pos24(X,Y) get_csv2_string((X),(Y),24)
+#define get_csv2_v_str_pos24(X,Y) get_csv2_string((X),(Y),24)
+#define get_csv2_bool_pos24(X,Y) get_csv2_bool((X),(Y),24)
+#define get_csv2_int_pos24(X,Y) get_csv2_int((X),(Y),24)
+#define get_csv2_llong_pos24(X,Y) get_csv2_llong((X),(Y),24)
+#define get_csv2_float_pos24(X,Y) get_csv2_float((X),(Y),24)
+#define get_csv2_uint_pos25(X,Y) get_csv2_uint((X),(Y),25)
+#define get_csv2_ullong_pos25(X,Y) get_csv2_ullong((X),(Y),25)
+#define get_csv2_ip_pos25(X,Y) get_csv2_ip((X),(Y),25)
+#define get_csv2_ipv6_pos25(X,Y) get_csv2_ipv6((X),(Y),25)
+#define get_csv2_string_pos25(X,Y) get_csv2_string((X),(Y),25)
+#define get_csv2_v_str_pos25(X,Y) get_csv2_string((X),(Y),25)
+#define get_csv2_bool_pos25(X,Y) get_csv2_bool((X),(Y),25)
+#define get_csv2_int_pos25(X,Y) get_csv2_int((X),(Y),25)
+#define get_csv2_llong_pos25(X,Y) get_csv2_llong((X),(Y),25)
+#define get_csv2_float_pos25(X,Y) get_csv2_float((X),(Y),25)
+#define get_csv2_uint_pos26(X,Y) get_csv2_uint((X),(Y),26)
+#define get_csv2_ullong_pos26(X,Y) get_csv2_ullong((X),(Y),26)
+#define get_csv2_ip_pos26(X,Y) get_csv2_ip((X),(Y),26)
+#define get_csv2_ipv6_pos26(X,Y) get_csv2_ipv6((X),(Y),26)
+#define get_csv2_string_pos26(X,Y) get_csv2_string((X),(Y),26)
+#define get_csv2_v_str_pos26(X,Y) get_csv2_string((X),(Y),26)
+#define get_csv2_bool_pos26(X,Y) get_csv2_bool((X),(Y),26)
+#define get_csv2_int_pos26(X,Y) get_csv2_int((X),(Y),26)
+#define get_csv2_llong_pos26(X,Y) get_csv2_llong((X),(Y),26)
+#define get_csv2_float_pos26(X,Y) get_csv2_float((X),(Y),26)
+#define get_csv2_uint_pos27(X,Y) get_csv2_uint((X),(Y),27)
+#define get_csv2_ullong_pos27(X,Y) get_csv2_ullong((X),(Y),27)
+#define get_csv2_ip_pos27(X,Y) get_csv2_ip((X),(Y),27)
+#define get_csv2_ipv6_pos27(X,Y) get_csv2_ipv6((X),(Y),27)
+#define get_csv2_string_pos27(X,Y) get_csv2_string((X),(Y),27)
+#define get_csv2_v_str_pos27(X,Y) get_csv2_string((X),(Y),27)
+#define get_csv2_bool_pos27(X,Y) get_csv2_bool((X),(Y),27)
+#define get_csv2_int_pos27(X,Y) get_csv2_int((X),(Y),27)
+#define get_csv2_llong_pos27(X,Y) get_csv2_llong((X),(Y),27)
+#define get_csv2_float_pos27(X,Y) get_csv2_float((X),(Y),27)
+#define get_csv2_uint_pos28(X,Y) get_csv2_uint((X),(Y),28)
+#define get_csv2_ullong_pos28(X,Y) get_csv2_ullong((X),(Y),28)
+#define get_csv2_ip_pos28(X,Y) get_csv2_ip((X),(Y),28)
+#define get_csv2_ipv6_pos28(X,Y) get_csv2_ipv6((X),(Y),28)
+#define get_csv2_string_pos28(X,Y) get_csv2_string((X),(Y),28)
+#define get_csv2_v_str_pos28(X,Y) get_csv2_string((X),(Y),28)
+#define get_csv2_bool_pos28(X,Y) get_csv2_bool((X),(Y),28)
+#define get_csv2_int_pos28(X,Y) get_csv2_int((X),(Y),28)
+#define get_csv2_llong_pos28(X,Y) get_csv2_llong((X),(Y),28)
+#define get_csv2_float_pos28(X,Y) get_csv2_float((X),(Y),28)
+#define get_csv2_uint_pos29(X,Y) get_csv2_uint((X),(Y),29)
+#define get_csv2_ullong_pos29(X,Y) get_csv2_ullong((X),(Y),29)
+#define get_csv2_ip_pos29(X,Y) get_csv2_ip((X),(Y),29)
+#define get_csv2_ipv6_pos29(X,Y) get_csv2_ipv6((X),(Y),29)
+#define get_csv2_string_pos29(X,Y) get_csv2_string((X),(Y),29)
+#define get_csv2_v_str_pos29(X,Y) get_csv2_string((X),(Y),29)
+#define get_csv2_bool_pos29(X,Y) get_csv2_bool((X),(Y),29)
+#define get_csv2_int_pos29(X,Y) get_csv2_int((X),(Y),29)
+#define get_csv2_llong_pos29(X,Y) get_csv2_llong((X),(Y),29)
+#define get_csv2_float_pos29(X,Y) get_csv2_float((X),(Y),29)
+#define get_csv2_uint_pos30(X,Y) get_csv2_uint((X),(Y),30)
+#define get_csv2_ullong_pos30(X,Y) get_csv2_ullong((X),(Y),30)
+#define get_csv2_ip_pos30(X,Y) get_csv2_ip((X),(Y),30)
+#define get_csv2_ipv6_pos30(X,Y) get_csv2_ipv6((X),(Y),30)
+#define get_csv2_string_pos30(X,Y) get_csv2_string((X),(Y),30)
+#define get_csv2_v_str_pos30(X,Y) get_csv2_string((X),(Y),30)
+#define get_csv2_bool_pos30(X,Y) get_csv2_bool((X),(Y),30)
+#define get_csv2_int_pos30(X,Y) get_csv2_int((X),(Y),30)
+#define get_csv2_llong_pos30(X,Y) get_csv2_llong((X),(Y),30)
+#define get_csv2_float_pos30(X,Y) get_csv2_float((X),(Y),30)
+#define get_csv2_uint_pos31(X,Y) get_csv2_uint((X),(Y),31)
+#define get_csv2_ullong_pos31(X,Y) get_csv2_ullong((X),(Y),31)
+#define get_csv2_ip_pos31(X,Y) get_csv2_ip((X),(Y),31)
+#define get_csv2_ipv6_pos31(X,Y) get_csv2_ipv6((X),(Y),31)
+#define get_csv2_string_pos31(X,Y) get_csv2_string((X),(Y),31)
+#define get_csv2_v_str_pos31(X,Y) get_csv2_string((X),(Y),31)
+#define get_csv2_bool_pos31(X,Y) get_csv2_bool((X),(Y),31)
+#define get_csv2_int_pos31(X,Y) get_csv2_int((X),(Y),31)
+#define get_csv2_llong_pos31(X,Y) get_csv2_llong((X),(Y),31)
+#define get_csv2_float_pos31(X,Y) get_csv2_float((X),(Y),31)
+#define get_csv2_uint_pos32(X,Y) get_csv2_uint((X),(Y),32)
+#define get_csv2_ullong_pos32(X,Y) get_csv2_ullong((X),(Y),32)
+#define get_csv2_ip_pos32(X,Y) get_csv2_ip((X),(Y),32)
+#define get_csv2_ipv6_pos32(X,Y) get_csv2_ipv6((X),(Y),32)
+#define get_csv2_string_pos32(X,Y) get_csv2_string((X),(Y),32)
+#define get_csv2_v_str_pos32(X,Y) get_csv2_string((X),(Y),32)
+#define get_csv2_bool_pos32(X,Y) get_csv2_bool((X),(Y),32)
+#define get_csv2_int_pos32(X,Y) get_csv2_int((X),(Y),32)
+#define get_csv2_llong_pos32(X,Y) get_csv2_llong((X),(Y),32)
+#define get_csv2_float_pos32(X,Y) get_csv2_float((X),(Y),32)
+#define get_csv2_uint_pos33(X,Y) get_csv2_uint((X),(Y),33)
+#define get_csv2_ullong_pos33(X,Y) get_csv2_ullong((X),(Y),33)
+#define get_csv2_ip_pos33(X,Y) get_csv2_ip((X),(Y),33)
+#define get_csv2_ipv6_pos33(X,Y) get_csv2_ipv6((X),(Y),33)
+#define get_csv2_string_pos33(X,Y) get_csv2_string((X),(Y),33)
+#define get_csv2_v_str_pos33(X,Y) get_csv2_string((X),(Y),33)
+#define get_csv2_bool_pos33(X,Y) get_csv2_bool((X),(Y),33)
+#define get_csv2_int_pos33(X,Y) get_csv2_int((X),(Y),33)
+#define get_csv2_llong_pos33(X,Y) get_csv2_llong((X),(Y),33)
+#define get_csv2_float_pos33(X,Y) get_csv2_float((X),(Y),33)
+#define get_csv2_uint_pos34(X,Y) get_csv2_uint((X),(Y),34)
+#define get_csv2_ullong_pos34(X,Y) get_csv2_ullong((X),(Y),34)
+#define get_csv2_ip_pos34(X,Y) get_csv2_ip((X),(Y),34)
+#define get_csv2_ipv6_pos34(X,Y) get_csv2_ipv6((X),(Y),34)
+#define get_csv2_string_pos34(X,Y) get_csv2_string((X),(Y),34)
+#define get_csv2_v_str_pos34(X,Y) get_csv2_string((X),(Y),34)
+#define get_csv2_bool_pos34(X,Y) get_csv2_bool((X),(Y),34)
+#define get_csv2_int_pos34(X,Y) get_csv2_int((X),(Y),34)
+#define get_csv2_llong_pos34(X,Y) get_csv2_llong((X),(Y),34)
+#define get_csv2_float_pos34(X,Y) get_csv2_float((X),(Y),34)
+#define get_csv2_uint_pos35(X,Y) get_csv2_uint((X),(Y),35)
+#define get_csv2_ullong_pos35(X,Y) get_csv2_ullong((X),(Y),35)
+#define get_csv2_ip_pos35(X,Y) get_csv2_ip((X),(Y),35)
+#define get_csv2_ipv6_pos35(X,Y) get_csv2_ipv6((X),(Y),35)
+#define get_csv2_string_pos35(X,Y) get_csv2_string((X),(Y),35)
+#define get_csv2_v_str_pos35(X,Y) get_csv2_string((X),(Y),35)
+#define get_csv2_bool_pos35(X,Y) get_csv2_bool((X),(Y),35)
+#define get_csv2_int_pos35(X,Y) get_csv2_int((X),(Y),35)
+#define get_csv2_llong_pos35(X,Y) get_csv2_llong((X),(Y),35)
+#define get_csv2_float_pos35(X,Y) get_csv2_float((X),(Y),35)
+#define get_csv2_uint_pos36(X,Y) get_csv2_uint((X),(Y),36)
+#define get_csv2_ullong_pos36(X,Y) get_csv2_ullong((X),(Y),36)
+#define get_csv2_ip_pos36(X,Y) get_csv2_ip((X),(Y),36)
+#define get_csv2_ipv6_pos36(X,Y) get_csv2_ipv6((X),(Y),36)
+#define get_csv2_string_pos36(X,Y) get_csv2_string((X),(Y),36)
+#define get_csv2_v_str_pos36(X,Y) get_csv2_string((X),(Y),36)
+#define get_csv2_bool_pos36(X,Y) get_csv2_bool((X),(Y),36)
+#define get_csv2_int_pos36(X,Y) get_csv2_int((X),(Y),36)
+#define get_csv2_llong_pos36(X,Y) get_csv2_llong((X),(Y),36)
+#define get_csv2_float_pos36(X,Y) get_csv2_float((X),(Y),36)
+#define get_csv2_uint_pos37(X,Y) get_csv2_uint((X),(Y),37)
+#define get_csv2_ullong_pos37(X,Y) get_csv2_ullong((X),(Y),37)
+#define get_csv2_ip_pos37(X,Y) get_csv2_ip((X),(Y),37)
+#define get_csv2_ipv6_pos37(X,Y) get_csv2_ipv6((X),(Y),37)
+#define get_csv2_string_pos37(X,Y) get_csv2_string((X),(Y),37)
+#define get_csv2_v_str_pos37(X,Y) get_csv2_string((X),(Y),37)
+#define get_csv2_bool_pos37(X,Y) get_csv2_bool((X),(Y),37)
+#define get_csv2_int_pos37(X,Y) get_csv2_int((X),(Y),37)
+#define get_csv2_llong_pos37(X,Y) get_csv2_llong((X),(Y),37)
+#define get_csv2_float_pos37(X,Y) get_csv2_float((X),(Y),37)
+#define get_csv2_uint_pos38(X,Y) get_csv2_uint((X),(Y),38)
+#define get_csv2_ullong_pos38(X,Y) get_csv2_ullong((X),(Y),38)
+#define get_csv2_ip_pos38(X,Y) get_csv2_ip((X),(Y),38)
+#define get_csv2_ipv6_pos38(X,Y) get_csv2_ipv6((X),(Y),38)
+#define get_csv2_string_pos38(X,Y) get_csv2_string((X),(Y),38)
+#define get_csv2_v_str_pos38(X,Y) get_csv2_string((X),(Y),38)
+#define get_csv2_bool_pos38(X,Y) get_csv2_bool((X),(Y),38)
+#define get_csv2_int_pos38(X,Y) get_csv2_int((X),(Y),38)
+#define get_csv2_llong_pos38(X,Y) get_csv2_llong((X),(Y),38)
+#define get_csv2_float_pos38(X,Y) get_csv2_float((X),(Y),38)
+#define get_csv2_uint_pos39(X,Y) get_csv2_uint((X),(Y),39)
+#define get_csv2_ullong_pos39(X,Y) get_csv2_ullong((X),(Y),39)
+#define get_csv2_ip_pos39(X,Y) get_csv2_ip((X),(Y),39)
+#define get_csv2_ipv6_pos39(X,Y) get_csv2_ipv6((X),(Y),39)
+#define get_csv2_string_pos39(X,Y) get_csv2_string((X),(Y),39)
+#define get_csv2_v_str_pos39(X,Y) get_csv2_string((X),(Y),39)
+#define get_csv2_bool_pos39(X,Y) get_csv2_bool((X),(Y),39)
+#define get_csv2_int_pos39(X,Y) get_csv2_int((X),(Y),39)
+#define get_csv2_llong_pos39(X,Y) get_csv2_llong((X),(Y),39)
+#define get_csv2_float_pos39(X,Y) get_csv2_float((X),(Y),39)
+#define get_csv2_uint_pos40(X,Y) get_csv2_uint((X),(Y),40)
+#define get_csv2_ullong_pos40(X,Y) get_csv2_ullong((X),(Y),40)
+#define get_csv2_ip_pos40(X,Y) get_csv2_ip((X),(Y),40)
+#define get_csv2_ipv6_pos40(X,Y) get_csv2_ipv6((X),(Y),40)
+#define get_csv2_string_pos40(X,Y) get_csv2_string((X),(Y),40)
+#define get_csv2_v_str_pos40(X,Y) get_csv2_string((X),(Y),40)
+#define get_csv2_bool_pos40(X,Y) get_csv2_bool((X),(Y),40)
+#define get_csv2_int_pos40(X,Y) get_csv2_int((X),(Y),40)
+#define get_csv2_llong_pos40(X,Y) get_csv2_llong((X),(Y),40)
+#define get_csv2_float_pos40(X,Y) get_csv2_float((X),(Y),40)
+#define get_csv2_uint_pos41(X,Y) get_csv2_uint((X),(Y),41)
+#define get_csv2_ullong_pos41(X,Y) get_csv2_ullong((X),(Y),41)
+#define get_csv2_ip_pos41(X,Y) get_csv2_ip((X),(Y),41)
+#define get_csv2_ipv6_pos41(X,Y) get_csv2_ipv6((X),(Y),41)
+#define get_csv2_string_pos41(X,Y) get_csv2_string((X),(Y),41)
+#define get_csv2_v_str_pos41(X,Y) get_csv2_string((X),(Y),41)
+#define get_csv2_bool_pos41(X,Y) get_csv2_bool((X),(Y),41)
+#define get_csv2_int_pos41(X,Y) get_csv2_int((X),(Y),41)
+#define get_csv2_llong_pos41(X,Y) get_csv2_llong((X),(Y),41)
+#define get_csv2_float_pos41(X,Y) get_csv2_float((X),(Y),41)
+#define get_csv2_uint_pos42(X,Y) get_csv2_uint((X),(Y),42)
+#define get_csv2_ullong_pos42(X,Y) get_csv2_ullong((X),(Y),42)
+#define get_csv2_ip_pos42(X,Y) get_csv2_ip((X),(Y),42)
+#define get_csv2_ipv6_pos42(X,Y) get_csv2_ipv6((X),(Y),42)
+#define get_csv2_string_pos42(X,Y) get_csv2_string((X),(Y),42)
+#define get_csv2_v_str_pos42(X,Y) get_csv2_string((X),(Y),42)
+#define get_csv2_bool_pos42(X,Y) get_csv2_bool((X),(Y),42)
+#define get_csv2_int_pos42(X,Y) get_csv2_int((X),(Y),42)
+#define get_csv2_llong_pos42(X,Y) get_csv2_llong((X),(Y),42)
+#define get_csv2_float_pos42(X,Y) get_csv2_float((X),(Y),42)
+#define get_csv2_uint_pos43(X,Y) get_csv2_uint((X),(Y),43)
+#define get_csv2_ullong_pos43(X,Y) get_csv2_ullong((X),(Y),43)
+#define get_csv2_ip_pos43(X,Y) get_csv2_ip((X),(Y),43)
+#define get_csv2_ipv6_pos43(X,Y) get_csv2_ipv6((X),(Y),43)
+#define get_csv2_string_pos43(X,Y) get_csv2_string((X),(Y),43)
+#define get_csv2_v_str_pos43(X,Y) get_csv2_string((X),(Y),43)
+#define get_csv2_bool_pos43(X,Y) get_csv2_bool((X),(Y),43)
+#define get_csv2_int_pos43(X,Y) get_csv2_int((X),(Y),43)
+#define get_csv2_llong_pos43(X,Y) get_csv2_llong((X),(Y),43)
+#define get_csv2_float_pos43(X,Y) get_csv2_float((X),(Y),43)
+#define get_csv2_uint_pos44(X,Y) get_csv2_uint((X),(Y),44)
+#define get_csv2_ullong_pos44(X,Y) get_csv2_ullong((X),(Y),44)
+#define get_csv2_ip_pos44(X,Y) get_csv2_ip((X),(Y),44)
+#define get_csv2_ipv6_pos44(X,Y) get_csv2_ipv6((X),(Y),44)
+#define get_csv2_string_pos44(X,Y) get_csv2_string((X),(Y),44)
+#define get_csv2_v_str_pos44(X,Y) get_csv2_string((X),(Y),44)
+#define get_csv2_bool_pos44(X,Y) get_csv2_bool((X),(Y),44)
+#define get_csv2_int_pos44(X,Y) get_csv2_int((X),(Y),44)
+#define get_csv2_llong_pos44(X,Y) get_csv2_llong((X),(Y),44)
+#define get_csv2_float_pos44(X,Y) get_csv2_float((X),(Y),44)
+#define get_csv2_uint_pos45(X,Y) get_csv2_uint((X),(Y),45)
+#define get_csv2_ullong_pos45(X,Y) get_csv2_ullong((X),(Y),45)
+#define get_csv2_ip_pos45(X,Y) get_csv2_ip((X),(Y),45)
+#define get_csv2_ipv6_pos45(X,Y) get_csv2_ipv6((X),(Y),45)
+#define get_csv2_string_pos45(X,Y) get_csv2_string((X),(Y),45)
+#define get_csv2_v_str_pos45(X,Y) get_csv2_string((X),(Y),45)
+#define get_csv2_bool_pos45(X,Y) get_csv2_bool((X),(Y),45)
+#define get_csv2_int_pos45(X,Y) get_csv2_int((X),(Y),45)
+#define get_csv2_llong_pos45(X,Y) get_csv2_llong((X),(Y),45)
+#define get_csv2_float_pos45(X,Y) get_csv2_float((X),(Y),45)
+#define get_csv2_uint_pos46(X,Y) get_csv2_uint((X),(Y),46)
+#define get_csv2_ullong_pos46(X,Y) get_csv2_ullong((X),(Y),46)
+#define get_csv2_ip_pos46(X,Y) get_csv2_ip((X),(Y),46)
+#define get_csv2_ipv6_pos46(X,Y) get_csv2_ipv6((X),(Y),46)
+#define get_csv2_string_pos46(X,Y) get_csv2_string((X),(Y),46)
+#define get_csv2_v_str_pos46(X,Y) get_csv2_string((X),(Y),46)
+#define get_csv2_bool_pos46(X,Y) get_csv2_bool((X),(Y),46)
+#define get_csv2_int_pos46(X,Y) get_csv2_int((X),(Y),46)
+#define get_csv2_llong_pos46(X,Y) get_csv2_llong((X),(Y),46)
+#define get_csv2_float_pos46(X,Y) get_csv2_float((X),(Y),46)
+#define get_csv2_uint_pos47(X,Y) get_csv2_uint((X),(Y),47)
+#define get_csv2_ullong_pos47(X,Y) get_csv2_ullong((X),(Y),47)
+#define get_csv2_ip_pos47(X,Y) get_csv2_ip((X),(Y),47)
+#define get_csv2_ipv6_pos47(X,Y) get_csv2_ipv6((X),(Y),47)
+#define get_csv2_string_pos47(X,Y) get_csv2_string((X),(Y),47)
+#define get_csv2_v_str_pos47(X,Y) get_csv2_string((X),(Y),47)
+#define get_csv2_bool_pos47(X,Y) get_csv2_bool((X),(Y),47)
+#define get_csv2_int_pos47(X,Y) get_csv2_int((X),(Y),47)
+#define get_csv2_llong_pos47(X,Y) get_csv2_llong((X),(Y),47)
+#define get_csv2_float_pos47(X,Y) get_csv2_float((X),(Y),47)
+#define get_csv2_uint_pos48(X,Y) get_csv2_uint((X),(Y),48)
+#define get_csv2_ullong_pos48(X,Y) get_csv2_ullong((X),(Y),48)
+#define get_csv2_ip_pos48(X,Y) get_csv2_ip((X),(Y),48)
+#define get_csv2_ipv6_pos48(X,Y) get_csv2_ipv6((X),(Y),48)
+#define get_csv2_string_pos48(X,Y) get_csv2_string((X),(Y),48)
+#define get_csv2_v_str_pos48(X,Y) get_csv2_string((X),(Y),48)
+#define get_csv2_bool_pos48(X,Y) get_csv2_bool((X),(Y),48)
+#define get_csv2_int_pos48(X,Y) get_csv2_int((X),(Y),48)
+#define get_csv2_llong_pos48(X,Y) get_csv2_llong((X),(Y),48)
+#define get_csv2_float_pos48(X,Y) get_csv2_float((X),(Y),48)
+#define get_csv2_uint_pos49(X,Y) get_csv2_uint((X),(Y),49)
+#define get_csv2_ullong_pos49(X,Y) get_csv2_ullong((X),(Y),49)
+#define get_csv2_ip_pos49(X,Y) get_csv2_ip((X),(Y),49)
+#define get_csv2_ipv6_pos49(X,Y) get_csv2_ipv6((X),(Y),49)
+#define get_csv2_string_pos49(X,Y) get_csv2_string((X),(Y),49)
+#define get_csv2_v_str_pos49(X,Y) get_csv2_string((X),(Y),49)
+#define get_csv2_bool_pos49(X,Y) get_csv2_bool((X),(Y),49)
+#define get_csv2_int_pos49(X,Y) get_csv2_int((X),(Y),49)
+#define get_csv2_llong_pos49(X,Y) get_csv2_llong((X),(Y),49)
+#define get_csv2_float_pos49(X,Y) get_csv2_float((X),(Y),49)
+#define get_csv2_uint_pos50(X,Y) get_csv2_uint((X),(Y),50)
+#define get_csv2_ullong_pos50(X,Y) get_csv2_ullong((X),(Y),50)
+#define get_csv2_ip_pos50(X,Y) get_csv2_ip((X),(Y),50)
+#define get_csv2_ipv6_pos50(X,Y) get_csv2_ipv6((X),(Y),50)
+#define get_csv2_string_pos50(X,Y) get_csv2_string((X),(Y),50)
+#define get_csv2_v_str_pos50(X,Y) get_csv2_string((X),(Y),50)
+#define get_csv2_bool_pos50(X,Y) get_csv2_bool((X),(Y),50)
+#define get_csv2_int_pos50(X,Y) get_csv2_int((X),(Y),50)
+#define get_csv2_llong_pos50(X,Y) get_csv2_llong((X),(Y),50)
+#define get_csv2_float_pos50(X,Y) get_csv2_float((X),(Y),50)
+#define get_csv2_uint_pos51(X,Y) get_csv2_uint((X),(Y),51)
+#define get_csv2_ullong_pos51(X,Y) get_csv2_ullong((X),(Y),51)
+#define get_csv2_ip_pos51(X,Y) get_csv2_ip((X),(Y),51)
+#define get_csv2_ipv6_pos51(X,Y) get_csv2_ipv6((X),(Y),51)
+#define get_csv2_string_pos51(X,Y) get_csv2_string((X),(Y),51)
+#define get_csv2_v_str_pos51(X,Y) get_csv2_string((X),(Y),51)
+#define get_csv2_bool_pos51(X,Y) get_csv2_bool((X),(Y),51)
+#define get_csv2_int_pos51(X,Y) get_csv2_int((X),(Y),51)
+#define get_csv2_llong_pos51(X,Y) get_csv2_llong((X),(Y),51)
+#define get_csv2_float_pos51(X,Y) get_csv2_float((X),(Y),51)
+#define get_csv2_uint_pos52(X,Y) get_csv2_uint((X),(Y),52)
+#define get_csv2_ullong_pos52(X,Y) get_csv2_ullong((X),(Y),52)
+#define get_csv2_ip_pos52(X,Y) get_csv2_ip((X),(Y),52)
+#define get_csv2_ipv6_pos52(X,Y) get_csv2_ipv6((X),(Y),52)
+#define get_csv2_string_pos52(X,Y) get_csv2_string((X),(Y),52)
+#define get_csv2_v_str_pos52(X,Y) get_csv2_string((X),(Y),52)
+#define get_csv2_bool_pos52(X,Y) get_csv2_bool((X),(Y),52)
+#define get_csv2_int_pos52(X,Y) get_csv2_int((X),(Y),52)
+#define get_csv2_llong_pos52(X,Y) get_csv2_llong((X),(Y),52)
+#define get_csv2_float_pos52(X,Y) get_csv2_float((X),(Y),52)
+#define get_csv2_uint_pos53(X,Y) get_csv2_uint((X),(Y),53)
+#define get_csv2_ullong_pos53(X,Y) get_csv2_ullong((X),(Y),53)
+#define get_csv2_ip_pos53(X,Y) get_csv2_ip((X),(Y),53)
+#define get_csv2_ipv6_pos53(X,Y) get_csv2_ipv6((X),(Y),53)
+#define get_csv2_string_pos53(X,Y) get_csv2_string((X),(Y),53)
+#define get_csv2_v_str_pos53(X,Y) get_csv2_string((X),(Y),53)
+#define get_csv2_bool_pos53(X,Y) get_csv2_bool((X),(Y),53)
+#define get_csv2_int_pos53(X,Y) get_csv2_int((X),(Y),53)
+#define get_csv2_llong_pos53(X,Y) get_csv2_llong((X),(Y),53)
+#define get_csv2_float_pos53(X,Y) get_csv2_float((X),(Y),53)
+#define get_csv2_uint_pos54(X,Y) get_csv2_uint((X),(Y),54)
+#define get_csv2_ullong_pos54(X,Y) get_csv2_ullong((X),(Y),54)
+#define get_csv2_ip_pos54(X,Y) get_csv2_ip((X),(Y),54)
+#define get_csv2_ipv6_pos54(X,Y) get_csv2_ipv6((X),(Y),54)
+#define get_csv2_string_pos54(X,Y) get_csv2_string((X),(Y),54)
+#define get_csv2_v_str_pos54(X,Y) get_csv2_string((X),(Y),54)
+#define get_csv2_bool_pos54(X,Y) get_csv2_bool((X),(Y),54)
+#define get_csv2_int_pos54(X,Y) get_csv2_int((X),(Y),54)
+#define get_csv2_llong_pos54(X,Y) get_csv2_llong((X),(Y),54)
+#define get_csv2_float_pos54(X,Y) get_csv2_float((X),(Y),54)
+#define get_csv2_uint_pos55(X,Y) get_csv2_uint((X),(Y),55)
+#define get_csv2_ullong_pos55(X,Y) get_csv2_ullong((X),(Y),55)
+#define get_csv2_ip_pos55(X,Y) get_csv2_ip((X),(Y),55)
+#define get_csv2_ipv6_pos55(X,Y) get_csv2_ipv6((X),(Y),55)
+#define get_csv2_string_pos55(X,Y) get_csv2_string((X),(Y),55)
+#define get_csv2_v_str_pos55(X,Y) get_csv2_string((X),(Y),55)
+#define get_csv2_bool_pos55(X,Y) get_csv2_bool((X),(Y),55)
+#define get_csv2_int_pos55(X,Y) get_csv2_int((X),(Y),55)
+#define get_csv2_llong_pos55(X,Y) get_csv2_llong((X),(Y),55)
+#define get_csv2_float_pos55(X,Y) get_csv2_float((X),(Y),55)
+#define get_csv2_uint_pos56(X,Y) get_csv2_uint((X),(Y),56)
+#define get_csv2_ullong_pos56(X,Y) get_csv2_ullong((X),(Y),56)
+#define get_csv2_ip_pos56(X,Y) get_csv2_ip((X),(Y),56)
+#define get_csv2_ipv6_pos56(X,Y) get_csv2_ipv6((X),(Y),56)
+#define get_csv2_string_pos56(X,Y) get_csv2_string((X),(Y),56)
+#define get_csv2_v_str_pos56(X,Y) get_csv2_string((X),(Y),56)
+#define get_csv2_bool_pos56(X,Y) get_csv2_bool((X),(Y),56)
+#define get_csv2_int_pos56(X,Y) get_csv2_int((X),(Y),56)
+#define get_csv2_llong_pos56(X,Y) get_csv2_llong((X),(Y),56)
+#define get_csv2_float_pos56(X,Y) get_csv2_float((X),(Y),56)
+#define get_csv2_uint_pos57(X,Y) get_csv2_uint((X),(Y),57)
+#define get_csv2_ullong_pos57(X,Y) get_csv2_ullong((X),(Y),57)
+#define get_csv2_ip_pos57(X,Y) get_csv2_ip((X),(Y),57)
+#define get_csv2_ipv6_pos57(X,Y) get_csv2_ipv6((X),(Y),57)
+#define get_csv2_string_pos57(X,Y) get_csv2_string((X),(Y),57)
+#define get_csv2_v_str_pos57(X,Y) get_csv2_string((X),(Y),57)
+#define get_csv2_bool_pos57(X,Y) get_csv2_bool((X),(Y),57)
+#define get_csv2_int_pos57(X,Y) get_csv2_int((X),(Y),57)
+#define get_csv2_llong_pos57(X,Y) get_csv2_llong((X),(Y),57)
+#define get_csv2_float_pos57(X,Y) get_csv2_float((X),(Y),57)
+#define get_csv2_uint_pos58(X,Y) get_csv2_uint((X),(Y),58)
+#define get_csv2_ullong_pos58(X,Y) get_csv2_ullong((X),(Y),58)
+#define get_csv2_ip_pos58(X,Y) get_csv2_ip((X),(Y),58)
+#define get_csv2_ipv6_pos58(X,Y) get_csv2_ipv6((X),(Y),58)
+#define get_csv2_string_pos58(X,Y) get_csv2_string((X),(Y),58)
+#define get_csv2_v_str_pos58(X,Y) get_csv2_string((X),(Y),58)
+#define get_csv2_bool_pos58(X,Y) get_csv2_bool((X),(Y),58)
+#define get_csv2_int_pos58(X,Y) get_csv2_int((X),(Y),58)
+#define get_csv2_llong_pos58(X,Y) get_csv2_llong((X),(Y),58)
+#define get_csv2_float_pos58(X,Y) get_csv2_float((X),(Y),58)
+#define get_csv2_uint_pos59(X,Y) get_csv2_uint((X),(Y),59)
+#define get_csv2_ullong_pos59(X,Y) get_csv2_ullong((X),(Y),59)
+#define get_csv2_ip_pos59(X,Y) get_csv2_ip((X),(Y),59)
+#define get_csv2_ipv6_pos59(X,Y) get_csv2_ipv6((X),(Y),59)
+#define get_csv2_string_pos59(X,Y) get_csv2_string((X),(Y),59)
+#define get_csv2_v_str_pos59(X,Y) get_csv2_string((X),(Y),59)
+#define get_csv2_bool_pos59(X,Y) get_csv2_bool((X),(Y),59)
+#define get_csv2_int_pos59(X,Y) get_csv2_int((X),(Y),59)
+#define get_csv2_llong_pos59(X,Y) get_csv2_llong((X),(Y),59)
+#define get_csv2_float_pos59(X,Y) get_csv2_float((X),(Y),59)
+#define get_csv2_uint_pos60(X,Y) get_csv2_uint((X),(Y),60)
+#define get_csv2_ullong_pos60(X,Y) get_csv2_ullong((X),(Y),60)
+#define get_csv2_ip_pos60(X,Y) get_csv2_ip((X),(Y),60)
+#define get_csv2_ipv6_pos60(X,Y) get_csv2_ipv6((X),(Y),60)
+#define get_csv2_string_pos60(X,Y) get_csv2_string((X),(Y),60)
+#define get_csv2_v_str_pos60(X,Y) get_csv2_string((X),(Y),60)
+#define get_csv2_bool_pos60(X,Y) get_csv2_bool((X),(Y),60)
+#define get_csv2_int_pos60(X,Y) get_csv2_int((X),(Y),60)
+#define get_csv2_llong_pos60(X,Y) get_csv2_llong((X),(Y),60)
+#define get_csv2_float_pos60(X,Y) get_csv2_float((X),(Y),60)
+#define get_csv2_uint_pos61(X,Y) get_csv2_uint((X),(Y),61)
+#define get_csv2_ullong_pos61(X,Y) get_csv2_ullong((X),(Y),61)
+#define get_csv2_ip_pos61(X,Y) get_csv2_ip((X),(Y),61)
+#define get_csv2_ipv6_pos61(X,Y) get_csv2_ipv6((X),(Y),61)
+#define get_csv2_string_pos61(X,Y) get_csv2_string((X),(Y),61)
+#define get_csv2_v_str_pos61(X,Y) get_csv2_string((X),(Y),61)
+#define get_csv2_bool_pos61(X,Y) get_csv2_bool((X),(Y),61)
+#define get_csv2_int_pos61(X,Y) get_csv2_int((X),(Y),61)
+#define get_csv2_llong_pos61(X,Y) get_csv2_llong((X),(Y),61)
+#define get_csv2_float_pos61(X,Y) get_csv2_float((X),(Y),61)
+#define get_csv2_uint_pos62(X,Y) get_csv2_uint((X),(Y),62)
+#define get_csv2_ullong_pos62(X,Y) get_csv2_ullong((X),(Y),62)
+#define get_csv2_ip_pos62(X,Y) get_csv2_ip((X),(Y),62)
+#define get_csv2_ipv6_pos62(X,Y) get_csv2_ipv6((X),(Y),62)
+#define get_csv2_string_pos62(X,Y) get_csv2_string((X),(Y),62)
+#define get_csv2_v_str_pos62(X,Y) get_csv2_string((X),(Y),62)
+#define get_csv2_bool_pos62(X,Y) get_csv2_bool((X),(Y),62)
+#define get_csv2_int_pos62(X,Y) get_csv2_int((X),(Y),62)
+#define get_csv2_llong_pos62(X,Y) get_csv2_llong((X),(Y),62)
+#define get_csv2_float_pos62(X,Y) get_csv2_float((X),(Y),62)
+#define get_csv2_uint_pos63(X,Y) get_csv2_uint((X),(Y),63)
+#define get_csv2_ullong_pos63(X,Y) get_csv2_ullong((X),(Y),63)
+#define get_csv2_ip_pos63(X,Y) get_csv2_ip((X),(Y),63)
+#define get_csv2_ipv6_pos63(X,Y) get_csv2_ipv6((X),(Y),63)
+#define get_csv2_string_pos63(X,Y) get_csv2_string((X),(Y),63)
+#define get_csv2_v_str_pos63(X,Y) get_csv2_string((X),(Y),63)
+#define get_csv2_bool_pos63(X,Y) get_csv2_bool((X),(Y),63)
+#define get_csv2_int_pos63(X,Y) get_csv2_int((X),(Y),63)
+#define get_csv2_llong_pos63(X,Y) get_csv2_llong((X),(Y),63)
+#define get_csv2_float_pos63(X,Y) get_csv2_float((X),(Y),63)
+#define get_csv2_uint_pos64(X,Y) get_csv2_uint((X),(Y),64)
+#define get_csv2_ullong_pos64(X,Y) get_csv2_ullong((X),(Y),64)
+#define get_csv2_ip_pos64(X,Y) get_csv2_ip((X),(Y),64)
+#define get_csv2_ipv6_pos64(X,Y) get_csv2_ipv6((X),(Y),64)
+#define get_csv2_string_pos64(X,Y) get_csv2_string((X),(Y),64)
+#define get_csv2_v_str_pos64(X,Y) get_csv2_string((X),(Y),64)
+#define get_csv2_bool_pos64(X,Y) get_csv2_bool((X),(Y),64)
+#define get_csv2_int_pos64(X,Y) get_csv2_int((X),(Y),64)
+#define get_csv2_llong_pos64(X,Y) get_csv2_llong((X),(Y),64)
+#define get_csv2_float_pos64(X,Y) get_csv2_float((X),(Y),64)
+#define get_csv2_uint_pos65(X,Y) get_csv2_uint((X),(Y),65)
+#define get_csv2_ullong_pos65(X,Y) get_csv2_ullong((X),(Y),65)
+#define get_csv2_ip_pos65(X,Y) get_csv2_ip((X),(Y),65)
+#define get_csv2_ipv6_pos65(X,Y) get_csv2_ipv6((X),(Y),65)
+#define get_csv2_string_pos65(X,Y) get_csv2_string((X),(Y),65)
+#define get_csv2_v_str_pos65(X,Y) get_csv2_string((X),(Y),65)
+#define get_csv2_bool_pos65(X,Y) get_csv2_bool((X),(Y),65)
+#define get_csv2_int_pos65(X,Y) get_csv2_int((X),(Y),65)
+#define get_csv2_llong_pos65(X,Y) get_csv2_llong((X),(Y),65)
+#define get_csv2_float_pos65(X,Y) get_csv2_float((X),(Y),65)
+#define get_csv2_uint_pos66(X,Y) get_csv2_uint((X),(Y),66)
+#define get_csv2_ullong_pos66(X,Y) get_csv2_ullong((X),(Y),66)
+#define get_csv2_ip_pos66(X,Y) get_csv2_ip((X),(Y),66)
+#define get_csv2_ipv6_pos66(X,Y) get_csv2_ipv6((X),(Y),66)
+#define get_csv2_string_pos66(X,Y) get_csv2_string((X),(Y),66)
+#define get_csv2_v_str_pos66(X,Y) get_csv2_string((X),(Y),66)
+#define get_csv2_bool_pos66(X,Y) get_csv2_bool((X),(Y),66)
+#define get_csv2_int_pos66(X,Y) get_csv2_int((X),(Y),66)
+#define get_csv2_llong_pos66(X,Y) get_csv2_llong((X),(Y),66)
+#define get_csv2_float_pos66(X,Y) get_csv2_float((X),(Y),66)
+#define get_csv2_uint_pos67(X,Y) get_csv2_uint((X),(Y),67)
+#define get_csv2_ullong_pos67(X,Y) get_csv2_ullong((X),(Y),67)
+#define get_csv2_ip_pos67(X,Y) get_csv2_ip((X),(Y),67)
+#define get_csv2_ipv6_pos67(X,Y) get_csv2_ipv6((X),(Y),67)
+#define get_csv2_string_pos67(X,Y) get_csv2_string((X),(Y),67)
+#define get_csv2_v_str_pos67(X,Y) get_csv2_string((X),(Y),67)
+#define get_csv2_bool_pos67(X,Y) get_csv2_bool((X),(Y),67)
+#define get_csv2_int_pos67(X,Y) get_csv2_int((X),(Y),67)
+#define get_csv2_llong_pos67(X,Y) get_csv2_llong((X),(Y),67)
+#define get_csv2_float_pos67(X,Y) get_csv2_float((X),(Y),67)
+#define get_csv2_uint_pos68(X,Y) get_csv2_uint((X),(Y),68)
+#define get_csv2_ullong_pos68(X,Y) get_csv2_ullong((X),(Y),68)
+#define get_csv2_ip_pos68(X,Y) get_csv2_ip((X),(Y),68)
+#define get_csv2_ipv6_pos68(X,Y) get_csv2_ipv6((X),(Y),68)
+#define get_csv2_string_pos68(X,Y) get_csv2_string((X),(Y),68)
+#define get_csv2_v_str_pos68(X,Y) get_csv2_string((X),(Y),68)
+#define get_csv2_bool_pos68(X,Y) get_csv2_bool((X),(Y),68)
+#define get_csv2_int_pos68(X,Y) get_csv2_int((X),(Y),68)
+#define get_csv2_llong_pos68(X,Y) get_csv2_llong((X),(Y),68)
+#define get_csv2_float_pos68(X,Y) get_csv2_float((X),(Y),68)
+#define get_csv2_uint_pos69(X,Y) get_csv2_uint((X),(Y),69)
+#define get_csv2_ullong_pos69(X,Y) get_csv2_ullong((X),(Y),69)
+#define get_csv2_ip_pos69(X,Y) get_csv2_ip((X),(Y),69)
+#define get_csv2_ipv6_pos69(X,Y) get_csv2_ipv6((X),(Y),69)
+#define get_csv2_string_pos69(X,Y) get_csv2_string((X),(Y),69)
+#define get_csv2_v_str_pos69(X,Y) get_csv2_string((X),(Y),69)
+#define get_csv2_bool_pos69(X,Y) get_csv2_bool((X),(Y),69)
+#define get_csv2_int_pos69(X,Y) get_csv2_int((X),(Y),69)
+#define get_csv2_llong_pos69(X,Y) get_csv2_llong((X),(Y),69)
+#define get_csv2_float_pos69(X,Y) get_csv2_float((X),(Y),69)
+#define get_csv2_uint_pos70(X,Y) get_csv2_uint((X),(Y),70)
+#define get_csv2_ullong_pos70(X,Y) get_csv2_ullong((X),(Y),70)
+#define get_csv2_ip_pos70(X,Y) get_csv2_ip((X),(Y),70)
+#define get_csv2_ipv6_pos70(X,Y) get_csv2_ipv6((X),(Y),70)
+#define get_csv2_string_pos70(X,Y) get_csv2_string((X),(Y),70)
+#define get_csv2_v_str_pos70(X,Y) get_csv2_string((X),(Y),70)
+#define get_csv2_bool_pos70(X,Y) get_csv2_bool((X),(Y),70)
+#define get_csv2_int_pos70(X,Y) get_csv2_int((X),(Y),70)
+#define get_csv2_llong_pos70(X,Y) get_csv2_llong((X),(Y),70)
+#define get_csv2_float_pos70(X,Y) get_csv2_float((X),(Y),70)
+#define get_csv2_uint_pos71(X,Y) get_csv2_uint((X),(Y),71)
+#define get_csv2_ullong_pos71(X,Y) get_csv2_ullong((X),(Y),71)
+#define get_csv2_ip_pos71(X,Y) get_csv2_ip((X),(Y),71)
+#define get_csv2_ipv6_pos71(X,Y) get_csv2_ipv6((X),(Y),71)
+#define get_csv2_string_pos71(X,Y) get_csv2_string((X),(Y),71)
+#define get_csv2_v_str_pos71(X,Y) get_csv2_string((X),(Y),71)
+#define get_csv2_bool_pos71(X,Y) get_csv2_bool((X),(Y),71)
+#define get_csv2_int_pos71(X,Y) get_csv2_int((X),(Y),71)
+#define get_csv2_llong_pos71(X,Y) get_csv2_llong((X),(Y),71)
+#define get_csv2_float_pos71(X,Y) get_csv2_float((X),(Y),71)
+#define get_csv2_uint_pos72(X,Y) get_csv2_uint((X),(Y),72)
+#define get_csv2_ullong_pos72(X,Y) get_csv2_ullong((X),(Y),72)
+#define get_csv2_ip_pos72(X,Y) get_csv2_ip((X),(Y),72)
+#define get_csv2_ipv6_pos72(X,Y) get_csv2_ipv6((X),(Y),72)
+#define get_csv2_string_pos72(X,Y) get_csv2_string((X),(Y),72)
+#define get_csv2_v_str_pos72(X,Y) get_csv2_string((X),(Y),72)
+#define get_csv2_bool_pos72(X,Y) get_csv2_bool((X),(Y),72)
+#define get_csv2_int_pos72(X,Y) get_csv2_int((X),(Y),72)
+#define get_csv2_llong_pos72(X,Y) get_csv2_llong((X),(Y),72)
+#define get_csv2_float_pos72(X,Y) get_csv2_float((X),(Y),72)
+#define get_csv2_uint_pos73(X,Y) get_csv2_uint((X),(Y),73)
+#define get_csv2_ullong_pos73(X,Y) get_csv2_ullong((X),(Y),73)
+#define get_csv2_ip_pos73(X,Y) get_csv2_ip((X),(Y),73)
+#define get_csv2_ipv6_pos73(X,Y) get_csv2_ipv6((X),(Y),73)
+#define get_csv2_string_pos73(X,Y) get_csv2_string((X),(Y),73)
+#define get_csv2_v_str_pos73(X,Y) get_csv2_string((X),(Y),73)
+#define get_csv2_bool_pos73(X,Y) get_csv2_bool((X),(Y),73)
+#define get_csv2_int_pos73(X,Y) get_csv2_int((X),(Y),73)
+#define get_csv2_llong_pos73(X,Y) get_csv2_llong((X),(Y),73)
+#define get_csv2_float_pos73(X,Y) get_csv2_float((X),(Y),73)
+#define get_csv2_uint_pos74(X,Y) get_csv2_uint((X),(Y),74)
+#define get_csv2_ullong_pos74(X,Y) get_csv2_ullong((X),(Y),74)
+#define get_csv2_ip_pos74(X,Y) get_csv2_ip((X),(Y),74)
+#define get_csv2_ipv6_pos74(X,Y) get_csv2_ipv6((X),(Y),74)
+#define get_csv2_string_pos74(X,Y) get_csv2_string((X),(Y),74)
+#define get_csv2_v_str_pos74(X,Y) get_csv2_string((X),(Y),74)
+#define get_csv2_bool_pos74(X,Y) get_csv2_bool((X),(Y),74)
+#define get_csv2_int_pos74(X,Y) get_csv2_int((X),(Y),74)
+#define get_csv2_llong_pos74(X,Y) get_csv2_llong((X),(Y),74)
+#define get_csv2_float_pos74(X,Y) get_csv2_float((X),(Y),74)
+#define get_csv2_uint_pos75(X,Y) get_csv2_uint((X),(Y),75)
+#define get_csv2_ullong_pos75(X,Y) get_csv2_ullong((X),(Y),75)
+#define get_csv2_ip_pos75(X,Y) get_csv2_ip((X),(Y),75)
+#define get_csv2_ipv6_pos75(X,Y) get_csv2_ipv6((X),(Y),75)
+#define get_csv2_string_pos75(X,Y) get_csv2_string((X),(Y),75)
+#define get_csv2_v_str_pos75(X,Y) get_csv2_string((X),(Y),75)
+#define get_csv2_bool_pos75(X,Y) get_csv2_bool((X),(Y),75)
+#define get_csv2_int_pos75(X,Y) get_csv2_int((X),(Y),75)
+#define get_csv2_llong_pos75(X,Y) get_csv2_llong((X),(Y),75)
+#define get_csv2_float_pos75(X,Y) get_csv2_float((X),(Y),75)
+#define get_csv2_uint_pos76(X,Y) get_csv2_uint((X),(Y),76)
+#define get_csv2_ullong_pos76(X,Y) get_csv2_ullong((X),(Y),76)
+#define get_csv2_ip_pos76(X,Y) get_csv2_ip((X),(Y),76)
+#define get_csv2_ipv6_pos76(X,Y) get_csv2_ipv6((X),(Y),76)
+#define get_csv2_string_pos76(X,Y) get_csv2_string((X),(Y),76)
+#define get_csv2_v_str_pos76(X,Y) get_csv2_string((X),(Y),76)
+#define get_csv2_bool_pos76(X,Y) get_csv2_bool((X),(Y),76)
+#define get_csv2_int_pos76(X,Y) get_csv2_int((X),(Y),76)
+#define get_csv2_llong_pos76(X,Y) get_csv2_llong((X),(Y),76)
+#define get_csv2_float_pos76(X,Y) get_csv2_float((X),(Y),76)
+#define get_csv2_uint_pos77(X,Y) get_csv2_uint((X),(Y),77)
+#define get_csv2_ullong_pos77(X,Y) get_csv2_ullong((X),(Y),77)
+#define get_csv2_ip_pos77(X,Y) get_csv2_ip((X),(Y),77)
+#define get_csv2_ipv6_pos77(X,Y) get_csv2_ipv6((X),(Y),77)
+#define get_csv2_string_pos77(X,Y) get_csv2_string((X),(Y),77)
+#define get_csv2_v_str_pos77(X,Y) get_csv2_string((X),(Y),77)
+#define get_csv2_bool_pos77(X,Y) get_csv2_bool((X),(Y),77)
+#define get_csv2_int_pos77(X,Y) get_csv2_int((X),(Y),77)
+#define get_csv2_llong_pos77(X,Y) get_csv2_llong((X),(Y),77)
+#define get_csv2_float_pos77(X,Y) get_csv2_float((X),(Y),77)
+#define get_csv2_uint_pos78(X,Y) get_csv2_uint((X),(Y),78)
+#define get_csv2_ullong_pos78(X,Y) get_csv2_ullong((X),(Y),78)
+#define get_csv2_ip_pos78(X,Y) get_csv2_ip((X),(Y),78)
+#define get_csv2_ipv6_pos78(X,Y) get_csv2_ipv6((X),(Y),78)
+#define get_csv2_string_pos78(X,Y) get_csv2_string((X),(Y),78)
+#define get_csv2_v_str_pos78(X,Y) get_csv2_string((X),(Y),78)
+#define get_csv2_bool_pos78(X,Y) get_csv2_bool((X),(Y),78)
+#define get_csv2_int_pos78(X,Y) get_csv2_int((X),(Y),78)
+#define get_csv2_llong_pos78(X,Y) get_csv2_llong((X),(Y),78)
+#define get_csv2_float_pos78(X,Y) get_csv2_float((X),(Y),78)
+#define get_csv2_uint_pos79(X,Y) get_csv2_uint((X),(Y),79)
+#define get_csv2_ullong_pos79(X,Y) get_csv2_ullong((X),(Y),79)
+#define get_csv2_ip_pos79(X,Y) get_csv2_ip((X),(Y),79)
+#define get_csv2_ipv6_pos79(X,Y) get_csv2_ipv6((X),(Y),79)
+#define get_csv2_string_pos79(X,Y) get_csv2_string((X),(Y),79)
+#define get_csv2_v_str_pos79(X,Y) get_csv2_string((X),(Y),79)
+#define get_csv2_bool_pos79(X,Y) get_csv2_bool((X),(Y),79)
+#define get_csv2_int_pos79(X,Y) get_csv2_int((X),(Y),79)
+#define get_csv2_llong_pos79(X,Y) get_csv2_llong((X),(Y),79)
+#define get_csv2_float_pos79(X,Y) get_csv2_float((X),(Y),79)
+#define get_csv2_uint_pos80(X,Y) get_csv2_uint((X),(Y),80)
+#define get_csv2_ullong_pos80(X,Y) get_csv2_ullong((X),(Y),80)
+#define get_csv2_ip_pos80(X,Y) get_csv2_ip((X),(Y),80)
+#define get_csv2_ipv6_pos80(X,Y) get_csv2_ipv6((X),(Y),80)
+#define get_csv2_string_pos80(X,Y) get_csv2_string((X),(Y),80)
+#define get_csv2_v_str_pos80(X,Y) get_csv2_string((X),(Y),80)
+#define get_csv2_bool_pos80(X,Y) get_csv2_bool((X),(Y),80)
+#define get_csv2_int_pos80(X,Y) get_csv2_int((X),(Y),80)
+#define get_csv2_llong_pos80(X,Y) get_csv2_llong((X),(Y),80)
+#define get_csv2_float_pos80(X,Y) get_csv2_float((X),(Y),80)
+#define get_csv2_uint_pos81(X,Y) get_csv2_uint((X),(Y),81)
+#define get_csv2_ullong_pos81(X,Y) get_csv2_ullong((X),(Y),81)
+#define get_csv2_ip_pos81(X,Y) get_csv2_ip((X),(Y),81)
+#define get_csv2_ipv6_pos81(X,Y) get_csv2_ipv6((X),(Y),81)
+#define get_csv2_string_pos81(X,Y) get_csv2_string((X),(Y),81)
+#define get_csv2_v_str_pos81(X,Y) get_csv2_string((X),(Y),81)
+#define get_csv2_bool_pos81(X,Y) get_csv2_bool((X),(Y),81)
+#define get_csv2_int_pos81(X,Y) get_csv2_int((X),(Y),81)
+#define get_csv2_llong_pos81(X,Y) get_csv2_llong((X),(Y),81)
+#define get_csv2_float_pos81(X,Y) get_csv2_float((X),(Y),81)
+#define get_csv2_uint_pos82(X,Y) get_csv2_uint((X),(Y),82)
+#define get_csv2_ullong_pos82(X,Y) get_csv2_ullong((X),(Y),82)
+#define get_csv2_ip_pos82(X,Y) get_csv2_ip((X),(Y),82)
+#define get_csv2_ipv6_pos82(X,Y) get_csv2_ipv6((X),(Y),82)
+#define get_csv2_string_pos82(X,Y) get_csv2_string((X),(Y),82)
+#define get_csv2_v_str_pos82(X,Y) get_csv2_string((X),(Y),82)
+#define get_csv2_bool_pos82(X,Y) get_csv2_bool((X),(Y),82)
+#define get_csv2_int_pos82(X,Y) get_csv2_int((X),(Y),82)
+#define get_csv2_llong_pos82(X,Y) get_csv2_llong((X),(Y),82)
+#define get_csv2_float_pos82(X,Y) get_csv2_float((X),(Y),82)
+#define get_csv2_uint_pos83(X,Y) get_csv2_uint((X),(Y),83)
+#define get_csv2_ullong_pos83(X,Y) get_csv2_ullong((X),(Y),83)
+#define get_csv2_ip_pos83(X,Y) get_csv2_ip((X),(Y),83)
+#define get_csv2_ipv6_pos83(X,Y) get_csv2_ipv6((X),(Y),83)
+#define get_csv2_string_pos83(X,Y) get_csv2_string((X),(Y),83)
+#define get_csv2_v_str_pos83(X,Y) get_csv2_string((X),(Y),83)
+#define get_csv2_bool_pos83(X,Y) get_csv2_bool((X),(Y),83)
+#define get_csv2_int_pos83(X,Y) get_csv2_int((X),(Y),83)
+#define get_csv2_llong_pos83(X,Y) get_csv2_llong((X),(Y),83)
+#define get_csv2_float_pos83(X,Y) get_csv2_float((X),(Y),83)
+#define get_csv2_uint_pos84(X,Y) get_csv2_uint((X),(Y),84)
+#define get_csv2_ullong_pos84(X,Y) get_csv2_ullong((X),(Y),84)
+#define get_csv2_ip_pos84(X,Y) get_csv2_ip((X),(Y),84)
+#define get_csv2_ipv6_pos84(X,Y) get_csv2_ipv6((X),(Y),84)
+#define get_csv2_string_pos84(X,Y) get_csv2_string((X),(Y),84)
+#define get_csv2_v_str_pos84(X,Y) get_csv2_string((X),(Y),84)
+#define get_csv2_bool_pos84(X,Y) get_csv2_bool((X),(Y),84)
+#define get_csv2_int_pos84(X,Y) get_csv2_int((X),(Y),84)
+#define get_csv2_llong_pos84(X,Y) get_csv2_llong((X),(Y),84)
+#define get_csv2_float_pos84(X,Y) get_csv2_float((X),(Y),84)
+#define get_csv2_uint_pos85(X,Y) get_csv2_uint((X),(Y),85)
+#define get_csv2_ullong_pos85(X,Y) get_csv2_ullong((X),(Y),85)
+#define get_csv2_ip_pos85(X,Y) get_csv2_ip((X),(Y),85)
+#define get_csv2_ipv6_pos85(X,Y) get_csv2_ipv6((X),(Y),85)
+#define get_csv2_string_pos85(X,Y) get_csv2_string((X),(Y),85)
+#define get_csv2_v_str_pos85(X,Y) get_csv2_string((X),(Y),85)
+#define get_csv2_bool_pos85(X,Y) get_csv2_bool((X),(Y),85)
+#define get_csv2_int_pos85(X,Y) get_csv2_int((X),(Y),85)
+#define get_csv2_llong_pos85(X,Y) get_csv2_llong((X),(Y),85)
+#define get_csv2_float_pos85(X,Y) get_csv2_float((X),(Y),85)
+#define get_csv2_uint_pos86(X,Y) get_csv2_uint((X),(Y),86)
+#define get_csv2_ullong_pos86(X,Y) get_csv2_ullong((X),(Y),86)
+#define get_csv2_ip_pos86(X,Y) get_csv2_ip((X),(Y),86)
+#define get_csv2_ipv6_pos86(X,Y) get_csv2_ipv6((X),(Y),86)
+#define get_csv2_string_pos86(X,Y) get_csv2_string((X),(Y),86)
+#define get_csv2_v_str_pos86(X,Y) get_csv2_string((X),(Y),86)
+#define get_csv2_bool_pos86(X,Y) get_csv2_bool((X),(Y),86)
+#define get_csv2_int_pos86(X,Y) get_csv2_int((X),(Y),86)
+#define get_csv2_llong_pos86(X,Y) get_csv2_llong((X),(Y),86)
+#define get_csv2_float_pos86(X,Y) get_csv2_float((X),(Y),86)
+#define get_csv2_uint_pos87(X,Y) get_csv2_uint((X),(Y),87)
+#define get_csv2_ullong_pos87(X,Y) get_csv2_ullong((X),(Y),87)
+#define get_csv2_ip_pos87(X,Y) get_csv2_ip((X),(Y),87)
+#define get_csv2_ipv6_pos87(X,Y) get_csv2_ipv6((X),(Y),87)
+#define get_csv2_string_pos87(X,Y) get_csv2_string((X),(Y),87)
+#define get_csv2_v_str_pos87(X,Y) get_csv2_string((X),(Y),87)
+#define get_csv2_bool_pos87(X,Y) get_csv2_bool((X),(Y),87)
+#define get_csv2_int_pos87(X,Y) get_csv2_int((X),(Y),87)
+#define get_csv2_llong_pos87(X,Y) get_csv2_llong((X),(Y),87)
+#define get_csv2_float_pos87(X,Y) get_csv2_float((X),(Y),87)
+#define get_csv2_uint_pos88(X,Y) get_csv2_uint((X),(Y),88)
+#define get_csv2_ullong_pos88(X,Y) get_csv2_ullong((X),(Y),88)
+#define get_csv2_ip_pos88(X,Y) get_csv2_ip((X),(Y),88)
+#define get_csv2_ipv6_pos88(X,Y) get_csv2_ipv6((X),(Y),88)
+#define get_csv2_string_pos88(X,Y) get_csv2_string((X),(Y),88)
+#define get_csv2_v_str_pos88(X,Y) get_csv2_string((X),(Y),88)
+#define get_csv2_bool_pos88(X,Y) get_csv2_bool((X),(Y),88)
+#define get_csv2_int_pos88(X,Y) get_csv2_int((X),(Y),88)
+#define get_csv2_llong_pos88(X,Y) get_csv2_llong((X),(Y),88)
+#define get_csv2_float_pos88(X,Y) get_csv2_float((X),(Y),88)
+#define get_csv2_uint_pos89(X,Y) get_csv2_uint((X),(Y),89)
+#define get_csv2_ullong_pos89(X,Y) get_csv2_ullong((X),(Y),89)
+#define get_csv2_ip_pos89(X,Y) get_csv2_ip((X),(Y),89)
+#define get_csv2_ipv6_pos89(X,Y) get_csv2_ipv6((X),(Y),89)
+#define get_csv2_string_pos89(X,Y) get_csv2_string((X),(Y),89)
+#define get_csv2_v_str_pos89(X,Y) get_csv2_string((X),(Y),89)
+#define get_csv2_bool_pos89(X,Y) get_csv2_bool((X),(Y),89)
+#define get_csv2_int_pos89(X,Y) get_csv2_int((X),(Y),89)
+#define get_csv2_llong_pos89(X,Y) get_csv2_llong((X),(Y),89)
+#define get_csv2_float_pos89(X,Y) get_csv2_float((X),(Y),89)
+#define get_csv2_uint_pos90(X,Y) get_csv2_uint((X),(Y),90)
+#define get_csv2_ullong_pos90(X,Y) get_csv2_ullong((X),(Y),90)
+#define get_csv2_ip_pos90(X,Y) get_csv2_ip((X),(Y),90)
+#define get_csv2_ipv6_pos90(X,Y) get_csv2_ipv6((X),(Y),90)
+#define get_csv2_string_pos90(X,Y) get_csv2_string((X),(Y),90)
+#define get_csv2_v_str_pos90(X,Y) get_csv2_string((X),(Y),90)
+#define get_csv2_bool_pos90(X,Y) get_csv2_bool((X),(Y),90)
+#define get_csv2_int_pos90(X,Y) get_csv2_int((X),(Y),90)
+#define get_csv2_llong_pos90(X,Y) get_csv2_llong((X),(Y),90)
+#define get_csv2_float_pos90(X,Y) get_csv2_float((X),(Y),90)
+#define get_csv2_uint_pos91(X,Y) get_csv2_uint((X),(Y),91)
+#define get_csv2_ullong_pos91(X,Y) get_csv2_ullong((X),(Y),91)
+#define get_csv2_ip_pos91(X,Y) get_csv2_ip((X),(Y),91)
+#define get_csv2_ipv6_pos91(X,Y) get_csv2_ipv6((X),(Y),91)
+#define get_csv2_string_pos91(X,Y) get_csv2_string((X),(Y),91)
+#define get_csv2_v_str_pos91(X,Y) get_csv2_string((X),(Y),91)
+#define get_csv2_bool_pos91(X,Y) get_csv2_bool((X),(Y),91)
+#define get_csv2_int_pos91(X,Y) get_csv2_int((X),(Y),91)
+#define get_csv2_llong_pos91(X,Y) get_csv2_llong((X),(Y),91)
+#define get_csv2_float_pos91(X,Y) get_csv2_float((X),(Y),91)
+#define get_csv2_uint_pos92(X,Y) get_csv2_uint((X),(Y),92)
+#define get_csv2_ullong_pos92(X,Y) get_csv2_ullong((X),(Y),92)
+#define get_csv2_ip_pos92(X,Y) get_csv2_ip((X),(Y),92)
+#define get_csv2_ipv6_pos92(X,Y) get_csv2_ipv6((X),(Y),92)
+#define get_csv2_string_pos92(X,Y) get_csv2_string((X),(Y),92)
+#define get_csv2_v_str_pos92(X,Y) get_csv2_string((X),(Y),92)
+#define get_csv2_bool_pos92(X,Y) get_csv2_bool((X),(Y),92)
+#define get_csv2_int_pos92(X,Y) get_csv2_int((X),(Y),92)
+#define get_csv2_llong_pos92(X,Y) get_csv2_llong((X),(Y),92)
+#define get_csv2_float_pos92(X,Y) get_csv2_float((X),(Y),92)
+#define get_csv2_uint_pos93(X,Y) get_csv2_uint((X),(Y),93)
+#define get_csv2_ullong_pos93(X,Y) get_csv2_ullong((X),(Y),93)
+#define get_csv2_ip_pos93(X,Y) get_csv2_ip((X),(Y),93)
+#define get_csv2_ipv6_pos93(X,Y) get_csv2_ipv6((X),(Y),93)
+#define get_csv2_string_pos93(X,Y) get_csv2_string((X),(Y),93)
+#define get_csv2_v_str_pos93(X,Y) get_csv2_string((X),(Y),93)
+#define get_csv2_bool_pos93(X,Y) get_csv2_bool((X),(Y),93)
+#define get_csv2_int_pos93(X,Y) get_csv2_int((X),(Y),93)
+#define get_csv2_llong_pos93(X,Y) get_csv2_llong((X),(Y),93)
+#define get_csv2_float_pos93(X,Y) get_csv2_float((X),(Y),93)
+#define get_csv2_uint_pos94(X,Y) get_csv2_uint((X),(Y),94)
+#define get_csv2_ullong_pos94(X,Y) get_csv2_ullong((X),(Y),94)
+#define get_csv2_ip_pos94(X,Y) get_csv2_ip((X),(Y),94)
+#define get_csv2_ipv6_pos94(X,Y) get_csv2_ipv6((X),(Y),94)
+#define get_csv2_string_pos94(X,Y) get_csv2_string((X),(Y),94)
+#define get_csv2_v_str_pos94(X,Y) get_csv2_string((X),(Y),94)
+#define get_csv2_bool_pos94(X,Y) get_csv2_bool((X),(Y),94)
+#define get_csv2_int_pos94(X,Y) get_csv2_int((X),(Y),94)
+#define get_csv2_llong_pos94(X,Y) get_csv2_llong((X),(Y),94)
+#define get_csv2_float_pos94(X,Y) get_csv2_float((X),(Y),94)
+#define get_csv2_uint_pos95(X,Y) get_csv2_uint((X),(Y),95)
+#define get_csv2_ullong_pos95(X,Y) get_csv2_ullong((X),(Y),95)
+#define get_csv2_ip_pos95(X,Y) get_csv2_ip((X),(Y),95)
+#define get_csv2_ipv6_pos95(X,Y) get_csv2_ipv6((X),(Y),95)
+#define get_csv2_string_pos95(X,Y) get_csv2_string((X),(Y),95)
+#define get_csv2_v_str_pos95(X,Y) get_csv2_string((X),(Y),95)
+#define get_csv2_bool_pos95(X,Y) get_csv2_bool((X),(Y),95)
+#define get_csv2_int_pos95(X,Y) get_csv2_int((X),(Y),95)
+#define get_csv2_llong_pos95(X,Y) get_csv2_llong((X),(Y),95)
+#define get_csv2_float_pos95(X,Y) get_csv2_float((X),(Y),95)
+#define get_csv2_uint_pos96(X,Y) get_csv2_uint((X),(Y),96)
+#define get_csv2_ullong_pos96(X,Y) get_csv2_ullong((X),(Y),96)
+#define get_csv2_ip_pos96(X,Y) get_csv2_ip((X),(Y),96)
+#define get_csv2_ipv6_pos96(X,Y) get_csv2_ipv6((X),(Y),96)
+#define get_csv2_string_pos96(X,Y) get_csv2_string((X),(Y),96)
+#define get_csv2_v_str_pos96(X,Y) get_csv2_string((X),(Y),96)
+#define get_csv2_bool_pos96(X,Y) get_csv2_bool((X),(Y),96)
+#define get_csv2_int_pos96(X,Y) get_csv2_int((X),(Y),96)
+#define get_csv2_llong_pos96(X,Y) get_csv2_llong((X),(Y),96)
+#define get_csv2_float_pos96(X,Y) get_csv2_float((X),(Y),96)
+#define get_csv2_uint_pos97(X,Y) get_csv2_uint((X),(Y),97)
+#define get_csv2_ullong_pos97(X,Y) get_csv2_ullong((X),(Y),97)
+#define get_csv2_ip_pos97(X,Y) get_csv2_ip((X),(Y),97)
+#define get_csv2_ipv6_pos97(X,Y) get_csv2_ipv6((X),(Y),97)
+#define get_csv2_string_pos97(X,Y) get_csv2_string((X),(Y),97)
+#define get_csv2_v_str_pos97(X,Y) get_csv2_string((X),(Y),97)
+#define get_csv2_bool_pos97(X,Y) get_csv2_bool((X),(Y),97)
+#define get_csv2_int_pos97(X,Y) get_csv2_int((X),(Y),97)
+#define get_csv2_llong_pos97(X,Y) get_csv2_llong((X),(Y),97)
+#define get_csv2_float_pos97(X,Y) get_csv2_float((X),(Y),97)
+#define get_csv2_uint_pos98(X,Y) get_csv2_uint((X),(Y),98)
+#define get_csv2_ullong_pos98(X,Y) get_csv2_ullong((X),(Y),98)
+#define get_csv2_ip_pos98(X,Y) get_csv2_ip((X),(Y),98)
+#define get_csv2_ipv6_pos98(X,Y) get_csv2_ipv6((X),(Y),98)
+#define get_csv2_string_pos98(X,Y) get_csv2_string((X),(Y),98)
+#define get_csv2_v_str_pos98(X,Y) get_csv2_string((X),(Y),98)
+#define get_csv2_bool_pos98(X,Y) get_csv2_bool((X),(Y),98)
+#define get_csv2_int_pos98(X,Y) get_csv2_int((X),(Y),98)
+#define get_csv2_llong_pos98(X,Y) get_csv2_llong((X),(Y),98)
+#define get_csv2_float_pos98(X,Y) get_csv2_float((X),(Y),98)
+#define get_csv2_uint_pos99(X,Y) get_csv2_uint((X),(Y),99)
+#define get_csv2_ullong_pos99(X,Y) get_csv2_ullong((X),(Y),99)
+#define get_csv2_ip_pos99(X,Y) get_csv2_ip((X),(Y),99)
+#define get_csv2_ipv6_pos99(X,Y) get_csv2_ipv6((X),(Y),99)
+#define get_csv2_string_pos99(X,Y) get_csv2_string((X),(Y),99)
+#define get_csv2_v_str_pos99(X,Y) get_csv2_string((X),(Y),99)
+#define get_csv2_bool_pos99(X,Y) get_csv2_bool((X),(Y),99)
+#define get_csv2_int_pos99(X,Y) get_csv2_int((X),(Y),99)
+#define get_csv2_llong_pos99(X,Y) get_csv2_llong((X),(Y),99)
+#define get_csv2_float_pos99(X,Y) get_csv2_float((X),(Y),99)
+#define get_csv2_uint_pos100(X,Y) get_csv2_uint((X),(Y),100)
+#define get_csv2_ullong_pos100(X,Y) get_csv2_ullong((X),(Y),100)
+#define get_csv2_ip_pos100(X,Y) get_csv2_ip((X),(Y),100)
+#define get_csv2_ipv6_pos100(X,Y) get_csv2_ipv6((X),(Y),100)
+#define get_csv2_string_pos100(X,Y) get_csv2_string((X),(Y),100)
+#define get_csv2_v_str_pos100(X,Y) get_csv2_string((X),(Y),100)
+#define get_csv2_bool_pos100(X,Y) get_csv2_bool((X),(Y),100)
+#define get_csv2_int_pos100(X,Y) get_csv2_int((X),(Y),100)
+#define get_csv2_llong_pos100(X,Y) get_csv2_llong((X),(Y),100)
+#define get_csv2_float_pos100(X,Y) get_csv2_float((X),(Y),100)
+#define get_csv2_uint_pos101(X,Y) get_csv2_uint((X),(Y),101)
+#define get_csv2_ullong_pos101(X,Y) get_csv2_ullong((X),(Y),101)
+#define get_csv2_ip_pos101(X,Y) get_csv2_ip((X),(Y),101)
+#define get_csv2_ipv6_pos101(X,Y) get_csv2_ipv6((X),(Y),101)
+#define get_csv2_string_pos101(X,Y) get_csv2_string((X),(Y),101)
+#define get_csv2_v_str_pos101(X,Y) get_csv2_string((X),(Y),101)
+#define get_csv2_bool_pos101(X,Y) get_csv2_bool((X),(Y),101)
+#define get_csv2_int_pos101(X,Y) get_csv2_int((X),(Y),101)
+#define get_csv2_llong_pos101(X,Y) get_csv2_llong((X),(Y),101)
+#define get_csv2_float_pos101(X,Y) get_csv2_float((X),(Y),101)
+#define get_csv2_uint_pos102(X,Y) get_csv2_uint((X),(Y),102)
+#define get_csv2_ullong_pos102(X,Y) get_csv2_ullong((X),(Y),102)
+#define get_csv2_ip_pos102(X,Y) get_csv2_ip((X),(Y),102)
+#define get_csv2_ipv6_pos102(X,Y) get_csv2_ipv6((X),(Y),102)
+#define get_csv2_string_pos102(X,Y) get_csv2_string((X),(Y),102)
+#define get_csv2_v_str_pos102(X,Y) get_csv2_string((X),(Y),102)
+#define get_csv2_bool_pos102(X,Y) get_csv2_bool((X),(Y),102)
+#define get_csv2_int_pos102(X,Y) get_csv2_int((X),(Y),102)
+#define get_csv2_llong_pos102(X,Y) get_csv2_llong((X),(Y),102)
+#define get_csv2_float_pos102(X,Y) get_csv2_float((X),(Y),102)
+#define get_csv2_uint_pos103(X,Y) get_csv2_uint((X),(Y),103)
+#define get_csv2_ullong_pos103(X,Y) get_csv2_ullong((X),(Y),103)
+#define get_csv2_ip_pos103(X,Y) get_csv2_ip((X),(Y),103)
+#define get_csv2_ipv6_pos103(X,Y) get_csv2_ipv6((X),(Y),103)
+#define get_csv2_string_pos103(X,Y) get_csv2_string((X),(Y),103)
+#define get_csv2_v_str_pos103(X,Y) get_csv2_string((X),(Y),103)
+#define get_csv2_bool_pos103(X,Y) get_csv2_bool((X),(Y),103)
+#define get_csv2_int_pos103(X,Y) get_csv2_int((X),(Y),103)
+#define get_csv2_llong_pos103(X,Y) get_csv2_llong((X),(Y),103)
+#define get_csv2_float_pos103(X,Y) get_csv2_float((X),(Y),103)
+#define get_csv2_uint_pos104(X,Y) get_csv2_uint((X),(Y),104)
+#define get_csv2_ullong_pos104(X,Y) get_csv2_ullong((X),(Y),104)
+#define get_csv2_ip_pos104(X,Y) get_csv2_ip((X),(Y),104)
+#define get_csv2_ipv6_pos104(X,Y) get_csv2_ipv6((X),(Y),104)
+#define get_csv2_string_pos104(X,Y) get_csv2_string((X),(Y),104)
+#define get_csv2_v_str_pos104(X,Y) get_csv2_string((X),(Y),104)
+#define get_csv2_bool_pos104(X,Y) get_csv2_bool((X),(Y),104)
+#define get_csv2_int_pos104(X,Y) get_csv2_int((X),(Y),104)
+#define get_csv2_llong_pos104(X,Y) get_csv2_llong((X),(Y),104)
+#define get_csv2_float_pos104(X,Y) get_csv2_float((X),(Y),104)
+#define get_csv2_uint_pos105(X,Y) get_csv2_uint((X),(Y),105)
+#define get_csv2_ullong_pos105(X,Y) get_csv2_ullong((X),(Y),105)
+#define get_csv2_ip_pos105(X,Y) get_csv2_ip((X),(Y),105)
+#define get_csv2_ipv6_pos105(X,Y) get_csv2_ipv6((X),(Y),105)
+#define get_csv2_string_pos105(X,Y) get_csv2_string((X),(Y),105)
+#define get_csv2_v_str_pos105(X,Y) get_csv2_string((X),(Y),105)
+#define get_csv2_bool_pos105(X,Y) get_csv2_bool((X),(Y),105)
+#define get_csv2_int_pos105(X,Y) get_csv2_int((X),(Y),105)
+#define get_csv2_llong_pos105(X,Y) get_csv2_llong((X),(Y),105)
+#define get_csv2_float_pos105(X,Y) get_csv2_float((X),(Y),105)
+#define get_csv2_uint_pos106(X,Y) get_csv2_uint((X),(Y),106)
+#define get_csv2_ullong_pos106(X,Y) get_csv2_ullong((X),(Y),106)
+#define get_csv2_ip_pos106(X,Y) get_csv2_ip((X),(Y),106)
+#define get_csv2_ipv6_pos106(X,Y) get_csv2_ipv6((X),(Y),106)
+#define get_csv2_string_pos106(X,Y) get_csv2_string((X),(Y),106)
+#define get_csv2_v_str_pos106(X,Y) get_csv2_string((X),(Y),106)
+#define get_csv2_bool_pos106(X,Y) get_csv2_bool((X),(Y),106)
+#define get_csv2_int_pos106(X,Y) get_csv2_int((X),(Y),106)
+#define get_csv2_llong_pos106(X,Y) get_csv2_llong((X),(Y),106)
+#define get_csv2_float_pos106(X,Y) get_csv2_float((X),(Y),106)
+#define get_csv2_uint_pos107(X,Y) get_csv2_uint((X),(Y),107)
+#define get_csv2_ullong_pos107(X,Y) get_csv2_ullong((X),(Y),107)
+#define get_csv2_ip_pos107(X,Y) get_csv2_ip((X),(Y),107)
+#define get_csv2_ipv6_pos107(X,Y) get_csv2_ipv6((X),(Y),107)
+#define get_csv2_string_pos107(X,Y) get_csv2_string((X),(Y),107)
+#define get_csv2_v_str_pos107(X,Y) get_csv2_string((X),(Y),107)
+#define get_csv2_bool_pos107(X,Y) get_csv2_bool((X),(Y),107)
+#define get_csv2_int_pos107(X,Y) get_csv2_int((X),(Y),107)
+#define get_csv2_llong_pos107(X,Y) get_csv2_llong((X),(Y),107)
+#define get_csv2_float_pos107(X,Y) get_csv2_float((X),(Y),107)
+#define get_csv2_uint_pos108(X,Y) get_csv2_uint((X),(Y),108)
+#define get_csv2_ullong_pos108(X,Y) get_csv2_ullong((X),(Y),108)
+#define get_csv2_ip_pos108(X,Y) get_csv2_ip((X),(Y),108)
+#define get_csv2_ipv6_pos108(X,Y) get_csv2_ipv6((X),(Y),108)
+#define get_csv2_string_pos108(X,Y) get_csv2_string((X),(Y),108)
+#define get_csv2_v_str_pos108(X,Y) get_csv2_string((X),(Y),108)
+#define get_csv2_bool_pos108(X,Y) get_csv2_bool((X),(Y),108)
+#define get_csv2_int_pos108(X,Y) get_csv2_int((X),(Y),108)
+#define get_csv2_llong_pos108(X,Y) get_csv2_llong((X),(Y),108)
+#define get_csv2_float_pos108(X,Y) get_csv2_float((X),(Y),108)
+#define get_csv2_uint_pos109(X,Y) get_csv2_uint((X),(Y),109)
+#define get_csv2_ullong_pos109(X,Y) get_csv2_ullong((X),(Y),109)
+#define get_csv2_ip_pos109(X,Y) get_csv2_ip((X),(Y),109)
+#define get_csv2_ipv6_pos109(X,Y) get_csv2_ipv6((X),(Y),109)
+#define get_csv2_string_pos109(X,Y) get_csv2_string((X),(Y),109)
+#define get_csv2_v_str_pos109(X,Y) get_csv2_string((X),(Y),109)
+#define get_csv2_bool_pos109(X,Y) get_csv2_bool((X),(Y),109)
+#define get_csv2_int_pos109(X,Y) get_csv2_int((X),(Y),109)
+#define get_csv2_llong_pos109(X,Y) get_csv2_llong((X),(Y),109)
+#define get_csv2_float_pos109(X,Y) get_csv2_float((X),(Y),109)
+#define get_csv2_uint_pos110(X,Y) get_csv2_uint((X),(Y),110)
+#define get_csv2_ullong_pos110(X,Y) get_csv2_ullong((X),(Y),110)
+#define get_csv2_ip_pos110(X,Y) get_csv2_ip((X),(Y),110)
+#define get_csv2_ipv6_pos110(X,Y) get_csv2_ipv6((X),(Y),110)
+#define get_csv2_string_pos110(X,Y) get_csv2_string((X),(Y),110)
+#define get_csv2_v_str_pos110(X,Y) get_csv2_string((X),(Y),110)
+#define get_csv2_bool_pos110(X,Y) get_csv2_bool((X),(Y),110)
+#define get_csv2_int_pos110(X,Y) get_csv2_int((X),(Y),110)
+#define get_csv2_llong_pos110(X,Y) get_csv2_llong((X),(Y),110)
+#define get_csv2_float_pos110(X,Y) get_csv2_float((X),(Y),110)
+#define get_csv2_uint_pos111(X,Y) get_csv2_uint((X),(Y),111)
+#define get_csv2_ullong_pos111(X,Y) get_csv2_ullong((X),(Y),111)
+#define get_csv2_ip_pos111(X,Y) get_csv2_ip((X),(Y),111)
+#define get_csv2_ipv6_pos111(X,Y) get_csv2_ipv6((X),(Y),111)
+#define get_csv2_string_pos111(X,Y) get_csv2_string((X),(Y),111)
+#define get_csv2_v_str_pos111(X,Y) get_csv2_string((X),(Y),111)
+#define get_csv2_bool_pos111(X,Y) get_csv2_bool((X),(Y),111)
+#define get_csv2_int_pos111(X,Y) get_csv2_int((X),(Y),111)
+#define get_csv2_llong_pos111(X,Y) get_csv2_llong((X),(Y),111)
+#define get_csv2_float_pos111(X,Y) get_csv2_float((X),(Y),111)
+#define get_csv2_uint_pos112(X,Y) get_csv2_uint((X),(Y),112)
+#define get_csv2_ullong_pos112(X,Y) get_csv2_ullong((X),(Y),112)
+#define get_csv2_ip_pos112(X,Y) get_csv2_ip((X),(Y),112)
+#define get_csv2_ipv6_pos112(X,Y) get_csv2_ipv6((X),(Y),112)
+#define get_csv2_string_pos112(X,Y) get_csv2_string((X),(Y),112)
+#define get_csv2_v_str_pos112(X,Y) get_csv2_string((X),(Y),112)
+#define get_csv2_bool_pos112(X,Y) get_csv2_bool((X),(Y),112)
+#define get_csv2_int_pos112(X,Y) get_csv2_int((X),(Y),112)
+#define get_csv2_llong_pos112(X,Y) get_csv2_llong((X),(Y),112)
+#define get_csv2_float_pos112(X,Y) get_csv2_float((X),(Y),112)
+#define get_csv2_uint_pos113(X,Y) get_csv2_uint((X),(Y),113)
+#define get_csv2_ullong_pos113(X,Y) get_csv2_ullong((X),(Y),113)
+#define get_csv2_ip_pos113(X,Y) get_csv2_ip((X),(Y),113)
+#define get_csv2_ipv6_pos113(X,Y) get_csv2_ipv6((X),(Y),113)
+#define get_csv2_string_pos113(X,Y) get_csv2_string((X),(Y),113)
+#define get_csv2_v_str_pos113(X,Y) get_csv2_string((X),(Y),113)
+#define get_csv2_bool_pos113(X,Y) get_csv2_bool((X),(Y),113)
+#define get_csv2_int_pos113(X,Y) get_csv2_int((X),(Y),113)
+#define get_csv2_llong_pos113(X,Y) get_csv2_llong((X),(Y),113)
+#define get_csv2_float_pos113(X,Y) get_csv2_float((X),(Y),113)
+#define get_csv2_uint_pos114(X,Y) get_csv2_uint((X),(Y),114)
+#define get_csv2_ullong_pos114(X,Y) get_csv2_ullong((X),(Y),114)
+#define get_csv2_ip_pos114(X,Y) get_csv2_ip((X),(Y),114)
+#define get_csv2_ipv6_pos114(X,Y) get_csv2_ipv6((X),(Y),114)
+#define get_csv2_string_pos114(X,Y) get_csv2_string((X),(Y),114)
+#define get_csv2_v_str_pos114(X,Y) get_csv2_string((X),(Y),114)
+#define get_csv2_bool_pos114(X,Y) get_csv2_bool((X),(Y),114)
+#define get_csv2_int_pos114(X,Y) get_csv2_int((X),(Y),114)
+#define get_csv2_llong_pos114(X,Y) get_csv2_llong((X),(Y),114)
+#define get_csv2_float_pos114(X,Y) get_csv2_float((X),(Y),114)
+#define get_csv2_uint_pos115(X,Y) get_csv2_uint((X),(Y),115)
+#define get_csv2_ullong_pos115(X,Y) get_csv2_ullong((X),(Y),115)
+#define get_csv2_ip_pos115(X,Y) get_csv2_ip((X),(Y),115)
+#define get_csv2_ipv6_pos115(X,Y) get_csv2_ipv6((X),(Y),115)
+#define get_csv2_string_pos115(X,Y) get_csv2_string((X),(Y),115)
+#define get_csv2_v_str_pos115(X,Y) get_csv2_string((X),(Y),115)
+#define get_csv2_bool_pos115(X,Y) get_csv2_bool((X),(Y),115)
+#define get_csv2_int_pos115(X,Y) get_csv2_int((X),(Y),115)
+#define get_csv2_llong_pos115(X,Y) get_csv2_llong((X),(Y),115)
+#define get_csv2_float_pos115(X,Y) get_csv2_float((X),(Y),115)
+#define get_csv2_uint_pos116(X,Y) get_csv2_uint((X),(Y),116)
+#define get_csv2_ullong_pos116(X,Y) get_csv2_ullong((X),(Y),116)
+#define get_csv2_ip_pos116(X,Y) get_csv2_ip((X),(Y),116)
+#define get_csv2_ipv6_pos116(X,Y) get_csv2_ipv6((X),(Y),116)
+#define get_csv2_string_pos116(X,Y) get_csv2_string((X),(Y),116)
+#define get_csv2_v_str_pos116(X,Y) get_csv2_string((X),(Y),116)
+#define get_csv2_bool_pos116(X,Y) get_csv2_bool((X),(Y),116)
+#define get_csv2_int_pos116(X,Y) get_csv2_int((X),(Y),116)
+#define get_csv2_llong_pos116(X,Y) get_csv2_llong((X),(Y),116)
+#define get_csv2_float_pos116(X,Y) get_csv2_float((X),(Y),116)
+#define get_csv2_uint_pos117(X,Y) get_csv2_uint((X),(Y),117)
+#define get_csv2_ullong_pos117(X,Y) get_csv2_ullong((X),(Y),117)
+#define get_csv2_ip_pos117(X,Y) get_csv2_ip((X),(Y),117)
+#define get_csv2_ipv6_pos117(X,Y) get_csv2_ipv6((X),(Y),117)
+#define get_csv2_string_pos117(X,Y) get_csv2_string((X),(Y),117)
+#define get_csv2_v_str_pos117(X,Y) get_csv2_string((X),(Y),117)
+#define get_csv2_bool_pos117(X,Y) get_csv2_bool((X),(Y),117)
+#define get_csv2_int_pos117(X,Y) get_csv2_int((X),(Y),117)
+#define get_csv2_llong_pos117(X,Y) get_csv2_llong((X),(Y),117)
+#define get_csv2_float_pos117(X,Y) get_csv2_float((X),(Y),117)
+#define get_csv2_uint_pos118(X,Y) get_csv2_uint((X),(Y),118)
+#define get_csv2_ullong_pos118(X,Y) get_csv2_ullong((X),(Y),118)
+#define get_csv2_ip_pos118(X,Y) get_csv2_ip((X),(Y),118)
+#define get_csv2_ipv6_pos118(X,Y) get_csv2_ipv6((X),(Y),118)
+#define get_csv2_string_pos118(X,Y) get_csv2_string((X),(Y),118)
+#define get_csv2_v_str_pos118(X,Y) get_csv2_string((X),(Y),118)
+#define get_csv2_bool_pos118(X,Y) get_csv2_bool((X),(Y),118)
+#define get_csv2_int_pos118(X,Y) get_csv2_int((X),(Y),118)
+#define get_csv2_llong_pos118(X,Y) get_csv2_llong((X),(Y),118)
+#define get_csv2_float_pos118(X,Y) get_csv2_float((X),(Y),118)
+#define get_csv2_uint_pos119(X,Y) get_csv2_uint((X),(Y),119)
+#define get_csv2_ullong_pos119(X,Y) get_csv2_ullong((X),(Y),119)
+#define get_csv2_ip_pos119(X,Y) get_csv2_ip((X),(Y),119)
+#define get_csv2_ipv6_pos119(X,Y) get_csv2_ipv6((X),(Y),119)
+#define get_csv2_string_pos119(X,Y) get_csv2_string((X),(Y),119)
+#define get_csv2_v_str_pos119(X,Y) get_csv2_string((X),(Y),119)
+#define get_csv2_bool_pos119(X,Y) get_csv2_bool((X),(Y),119)
+#define get_csv2_int_pos119(X,Y) get_csv2_int((X),(Y),119)
+#define get_csv2_llong_pos119(X,Y) get_csv2_llong((X),(Y),119)
+#define get_csv2_float_pos119(X,Y) get_csv2_float((X),(Y),119)
+#define get_csv2_uint_pos120(X,Y) get_csv2_uint((X),(Y),120)
+#define get_csv2_ullong_pos120(X,Y) get_csv2_ullong((X),(Y),120)
+#define get_csv2_ip_pos120(X,Y) get_csv2_ip((X),(Y),120)
+#define get_csv2_ipv6_pos120(X,Y) get_csv2_ipv6((X),(Y),120)
+#define get_csv2_string_pos120(X,Y) get_csv2_string((X),(Y),120)
+#define get_csv2_v_str_pos120(X,Y) get_csv2_string((X),(Y),120)
+#define get_csv2_bool_pos120(X,Y) get_csv2_bool((X),(Y),120)
+#define get_csv2_int_pos120(X,Y) get_csv2_int((X),(Y),120)
+#define get_csv2_llong_pos120(X,Y) get_csv2_llong((X),(Y),120)
+#define get_csv2_float_pos120(X,Y) get_csv2_float((X),(Y),120)
+#define get_csv2_uint_pos121(X,Y) get_csv2_uint((X),(Y),121)
+#define get_csv2_ullong_pos121(X,Y) get_csv2_ullong((X),(Y),121)
+#define get_csv2_ip_pos121(X,Y) get_csv2_ip((X),(Y),121)
+#define get_csv2_ipv6_pos121(X,Y) get_csv2_ipv6((X),(Y),121)
+#define get_csv2_string_pos121(X,Y) get_csv2_string((X),(Y),121)
+#define get_csv2_v_str_pos121(X,Y) get_csv2_string((X),(Y),121)
+#define get_csv2_bool_pos121(X,Y) get_csv2_bool((X),(Y),121)
+#define get_csv2_int_pos121(X,Y) get_csv2_int((X),(Y),121)
+#define get_csv2_llong_pos121(X,Y) get_csv2_llong((X),(Y),121)
+#define get_csv2_float_pos121(X,Y) get_csv2_float((X),(Y),121)
+#define get_csv2_uint_pos122(X,Y) get_csv2_uint((X),(Y),122)
+#define get_csv2_ullong_pos122(X,Y) get_csv2_ullong((X),(Y),122)
+#define get_csv2_ip_pos122(X,Y) get_csv2_ip((X),(Y),122)
+#define get_csv2_ipv6_pos122(X,Y) get_csv2_ipv6((X),(Y),122)
+#define get_csv2_string_pos122(X,Y) get_csv2_string((X),(Y),122)
+#define get_csv2_v_str_pos122(X,Y) get_csv2_string((X),(Y),122)
+#define get_csv2_bool_pos122(X,Y) get_csv2_bool((X),(Y),122)
+#define get_csv2_int_pos122(X,Y) get_csv2_int((X),(Y),122)
+#define get_csv2_llong_pos122(X,Y) get_csv2_llong((X),(Y),122)
+#define get_csv2_float_pos122(X,Y) get_csv2_float((X),(Y),122)
+#define get_csv2_uint_pos123(X,Y) get_csv2_uint((X),(Y),123)
+#define get_csv2_ullong_pos123(X,Y) get_csv2_ullong((X),(Y),123)
+#define get_csv2_ip_pos123(X,Y) get_csv2_ip((X),(Y),123)
+#define get_csv2_ipv6_pos123(X,Y) get_csv2_ipv6((X),(Y),123)
+#define get_csv2_string_pos123(X,Y) get_csv2_string((X),(Y),123)
+#define get_csv2_v_str_pos123(X,Y) get_csv2_string((X),(Y),123)
+#define get_csv2_bool_pos123(X,Y) get_csv2_bool((X),(Y),123)
+#define get_csv2_int_pos123(X,Y) get_csv2_int((X),(Y),123)
+#define get_csv2_llong_pos123(X,Y) get_csv2_llong((X),(Y),123)
+#define get_csv2_float_pos123(X,Y) get_csv2_float((X),(Y),123)
+#define get_csv2_uint_pos124(X,Y) get_csv2_uint((X),(Y),124)
+#define get_csv2_ullong_pos124(X,Y) get_csv2_ullong((X),(Y),124)
+#define get_csv2_ip_pos124(X,Y) get_csv2_ip((X),(Y),124)
+#define get_csv2_ipv6_pos124(X,Y) get_csv2_ipv6((X),(Y),124)
+#define get_csv2_string_pos124(X,Y) get_csv2_string((X),(Y),124)
+#define get_csv2_v_str_pos124(X,Y) get_csv2_string((X),(Y),124)
+#define get_csv2_bool_pos124(X,Y) get_csv2_bool((X),(Y),124)
+#define get_csv2_int_pos124(X,Y) get_csv2_int((X),(Y),124)
+#define get_csv2_llong_pos124(X,Y) get_csv2_llong((X),(Y),124)
+#define get_csv2_float_pos124(X,Y) get_csv2_float((X),(Y),124)
+#define get_csv2_uint_pos125(X,Y) get_csv2_uint((X),(Y),125)
+#define get_csv2_ullong_pos125(X,Y) get_csv2_ullong((X),(Y),125)
+#define get_csv2_ip_pos125(X,Y) get_csv2_ip((X),(Y),125)
+#define get_csv2_ipv6_pos125(X,Y) get_csv2_ipv6((X),(Y),125)
+#define get_csv2_string_pos125(X,Y) get_csv2_string((X),(Y),125)
+#define get_csv2_v_str_pos125(X,Y) get_csv2_string((X),(Y),125)
+#define get_csv2_bool_pos125(X,Y) get_csv2_bool((X),(Y),125)
+#define get_csv2_int_pos125(X,Y) get_csv2_int((X),(Y),125)
+#define get_csv2_llong_pos125(X,Y) get_csv2_llong((X),(Y),125)
+#define get_csv2_float_pos125(X,Y) get_csv2_float((X),(Y),125)
+#define get_csv2_uint_pos126(X,Y) get_csv2_uint((X),(Y),126)
+#define get_csv2_ullong_pos126(X,Y) get_csv2_ullong((X),(Y),126)
+#define get_csv2_ip_pos126(X,Y) get_csv2_ip((X),(Y),126)
+#define get_csv2_ipv6_pos126(X,Y) get_csv2_ipv6((X),(Y),126)
+#define get_csv2_string_pos126(X,Y) get_csv2_string((X),(Y),126)
+#define get_csv2_v_str_pos126(X,Y) get_csv2_string((X),(Y),126)
+#define get_csv2_bool_pos126(X,Y) get_csv2_bool((X),(Y),126)
+#define get_csv2_int_pos126(X,Y) get_csv2_int((X),(Y),126)
+#define get_csv2_llong_pos126(X,Y) get_csv2_llong((X),(Y),126)
+#define get_csv2_float_pos126(X,Y) get_csv2_float((X),(Y),126)
+#define get_csv2_uint_pos127(X,Y) get_csv2_uint((X),(Y),127)
+#define get_csv2_ullong_pos127(X,Y) get_csv2_ullong((X),(Y),127)
+#define get_csv2_ip_pos127(X,Y) get_csv2_ip((X),(Y),127)
+#define get_csv2_ipv6_pos127(X,Y) get_csv2_ipv6((X),(Y),127)
+#define get_csv2_string_pos127(X,Y) get_csv2_string((X),(Y),127)
+#define get_csv2_v_str_pos127(X,Y) get_csv2_string((X),(Y),127)
+#define get_csv2_bool_pos127(X,Y) get_csv2_bool((X),(Y),127)
+#define get_csv2_int_pos127(X,Y) get_csv2_int((X),(Y),127)
+#define get_csv2_llong_pos127(X,Y) get_csv2_llong((X),(Y),127)
+#define get_csv2_float_pos127(X,Y) get_csv2_float((X),(Y),127)
+#define get_csv2_uint_pos128(X,Y) get_csv2_uint((X),(Y),128)
+#define get_csv2_ullong_pos128(X,Y) get_csv2_ullong((X),(Y),128)
+#define get_csv2_ip_pos128(X,Y) get_csv2_ip((X),(Y),128)
+#define get_csv2_ipv6_pos128(X,Y) get_csv2_ipv6((X),(Y),128)
+#define get_csv2_string_pos128(X,Y) get_csv2_string((X),(Y),128)
+#define get_csv2_v_str_pos128(X,Y) get_csv2_string((X),(Y),128)
+#define get_csv2_bool_pos128(X,Y) get_csv2_bool((X),(Y),128)
+#define get_csv2_int_pos128(X,Y) get_csv2_int((X),(Y),128)
+#define get_csv2_llong_pos128(X,Y) get_csv2_llong((X),(Y),128)
+#define get_csv2_float_pos128(X,Y) get_csv2_float((X),(Y),128)
+#define get_csv2_uint_pos129(X,Y) get_csv2_uint((X),(Y),129)
+#define get_csv2_ullong_pos129(X,Y) get_csv2_ullong((X),(Y),129)
+#define get_csv2_ip_pos129(X,Y) get_csv2_ip((X),(Y),129)
+#define get_csv2_ipv6_pos129(X,Y) get_csv2_ipv6((X),(Y),129)
+#define get_csv2_string_pos129(X,Y) get_csv2_string((X),(Y),129)
+#define get_csv2_v_str_pos129(X,Y) get_csv2_string((X),(Y),129)
+#define get_csv2_bool_pos129(X,Y) get_csv2_bool((X),(Y),129)
+#define get_csv2_int_pos129(X,Y) get_csv2_int((X),(Y),129)
+#define get_csv2_llong_pos129(X,Y) get_csv2_llong((X),(Y),129)
+#define get_csv2_float_pos129(X,Y) get_csv2_float((X),(Y),129)
+#define get_csv2_uint_pos130(X,Y) get_csv2_uint((X),(Y),130)
+#define get_csv2_ullong_pos130(X,Y) get_csv2_ullong((X),(Y),130)
+#define get_csv2_ip_pos130(X,Y) get_csv2_ip((X),(Y),130)
+#define get_csv2_ipv6_pos130(X,Y) get_csv2_ipv6((X),(Y),130)
+#define get_csv2_string_pos130(X,Y) get_csv2_string((X),(Y),130)
+#define get_csv2_v_str_pos130(X,Y) get_csv2_string((X),(Y),130)
+#define get_csv2_bool_pos130(X,Y) get_csv2_bool((X),(Y),130)
+#define get_csv2_int_pos130(X,Y) get_csv2_int((X),(Y),130)
+#define get_csv2_llong_pos130(X,Y) get_csv2_llong((X),(Y),130)
+#define get_csv2_float_pos130(X,Y) get_csv2_float((X),(Y),130)
+#define get_csv2_uint_pos131(X,Y) get_csv2_uint((X),(Y),131)
+#define get_csv2_ullong_pos131(X,Y) get_csv2_ullong((X),(Y),131)
+#define get_csv2_ip_pos131(X,Y) get_csv2_ip((X),(Y),131)
+#define get_csv2_ipv6_pos131(X,Y) get_csv2_ipv6((X),(Y),131)
+#define get_csv2_string_pos131(X,Y) get_csv2_string((X),(Y),131)
+#define get_csv2_v_str_pos131(X,Y) get_csv2_string((X),(Y),131)
+#define get_csv2_bool_pos131(X,Y) get_csv2_bool((X),(Y),131)
+#define get_csv2_int_pos131(X,Y) get_csv2_int((X),(Y),131)
+#define get_csv2_llong_pos131(X,Y) get_csv2_llong((X),(Y),131)
+#define get_csv2_float_pos131(X,Y) get_csv2_float((X),(Y),131)
+#define get_csv2_uint_pos132(X,Y) get_csv2_uint((X),(Y),132)
+#define get_csv2_ullong_pos132(X,Y) get_csv2_ullong((X),(Y),132)
+#define get_csv2_ip_pos132(X,Y) get_csv2_ip((X),(Y),132)
+#define get_csv2_ipv6_pos132(X,Y) get_csv2_ipv6((X),(Y),132)
+#define get_csv2_string_pos132(X,Y) get_csv2_string((X),(Y),132)
+#define get_csv2_v_str_pos132(X,Y) get_csv2_string((X),(Y),132)
+#define get_csv2_bool_pos132(X,Y) get_csv2_bool((X),(Y),132)
+#define get_csv2_int_pos132(X,Y) get_csv2_int((X),(Y),132)
+#define get_csv2_llong_pos132(X,Y) get_csv2_llong((X),(Y),132)
+#define get_csv2_float_pos132(X,Y) get_csv2_float((X),(Y),132)
+#define get_csv2_uint_pos133(X,Y) get_csv2_uint((X),(Y),133)
+#define get_csv2_ullong_pos133(X,Y) get_csv2_ullong((X),(Y),133)
+#define get_csv2_ip_pos133(X,Y) get_csv2_ip((X),(Y),133)
+#define get_csv2_ipv6_pos133(X,Y) get_csv2_ipv6((X),(Y),133)
+#define get_csv2_string_pos133(X,Y) get_csv2_string((X),(Y),133)
+#define get_csv2_v_str_pos133(X,Y) get_csv2_string((X),(Y),133)
+#define get_csv2_bool_pos133(X,Y) get_csv2_bool((X),(Y),133)
+#define get_csv2_int_pos133(X,Y) get_csv2_int((X),(Y),133)
+#define get_csv2_llong_pos133(X,Y) get_csv2_llong((X),(Y),133)
+#define get_csv2_float_pos133(X,Y) get_csv2_float((X),(Y),133)
+#define get_csv2_uint_pos134(X,Y) get_csv2_uint((X),(Y),134)
+#define get_csv2_ullong_pos134(X,Y) get_csv2_ullong((X),(Y),134)
+#define get_csv2_ip_pos134(X,Y) get_csv2_ip((X),(Y),134)
+#define get_csv2_ipv6_pos134(X,Y) get_csv2_ipv6((X),(Y),134)
+#define get_csv2_string_pos134(X,Y) get_csv2_string((X),(Y),134)
+#define get_csv2_v_str_pos134(X,Y) get_csv2_string((X),(Y),134)
+#define get_csv2_bool_pos134(X,Y) get_csv2_bool((X),(Y),134)
+#define get_csv2_int_pos134(X,Y) get_csv2_int((X),(Y),134)
+#define get_csv2_llong_pos134(X,Y) get_csv2_llong((X),(Y),134)
+#define get_csv2_float_pos134(X,Y) get_csv2_float((X),(Y),134)
+#define get_csv2_uint_pos135(X,Y) get_csv2_uint((X),(Y),135)
+#define get_csv2_ullong_pos135(X,Y) get_csv2_ullong((X),(Y),135)
+#define get_csv2_ip_pos135(X,Y) get_csv2_ip((X),(Y),135)
+#define get_csv2_ipv6_pos135(X,Y) get_csv2_ipv6((X),(Y),135)
+#define get_csv2_string_pos135(X,Y) get_csv2_string((X),(Y),135)
+#define get_csv2_v_str_pos135(X,Y) get_csv2_string((X),(Y),135)
+#define get_csv2_bool_pos135(X,Y) get_csv2_bool((X),(Y),135)
+#define get_csv2_int_pos135(X,Y) get_csv2_int((X),(Y),135)
+#define get_csv2_llong_pos135(X,Y) get_csv2_llong((X),(Y),135)
+#define get_csv2_float_pos135(X,Y) get_csv2_float((X),(Y),135)
+#define get_csv2_uint_pos136(X,Y) get_csv2_uint((X),(Y),136)
+#define get_csv2_ullong_pos136(X,Y) get_csv2_ullong((X),(Y),136)
+#define get_csv2_ip_pos136(X,Y) get_csv2_ip((X),(Y),136)
+#define get_csv2_ipv6_pos136(X,Y) get_csv2_ipv6((X),(Y),136)
+#define get_csv2_string_pos136(X,Y) get_csv2_string((X),(Y),136)
+#define get_csv2_v_str_pos136(X,Y) get_csv2_string((X),(Y),136)
+#define get_csv2_bool_pos136(X,Y) get_csv2_bool((X),(Y),136)
+#define get_csv2_int_pos136(X,Y) get_csv2_int((X),(Y),136)
+#define get_csv2_llong_pos136(X,Y) get_csv2_llong((X),(Y),136)
+#define get_csv2_float_pos136(X,Y) get_csv2_float((X),(Y),136)
+#define get_csv2_uint_pos137(X,Y) get_csv2_uint((X),(Y),137)
+#define get_csv2_ullong_pos137(X,Y) get_csv2_ullong((X),(Y),137)
+#define get_csv2_ip_pos137(X,Y) get_csv2_ip((X),(Y),137)
+#define get_csv2_ipv6_pos137(X,Y) get_csv2_ipv6((X),(Y),137)
+#define get_csv2_string_pos137(X,Y) get_csv2_string((X),(Y),137)
+#define get_csv2_v_str_pos137(X,Y) get_csv2_string((X),(Y),137)
+#define get_csv2_bool_pos137(X,Y) get_csv2_bool((X),(Y),137)
+#define get_csv2_int_pos137(X,Y) get_csv2_int((X),(Y),137)
+#define get_csv2_llong_pos137(X,Y) get_csv2_llong((X),(Y),137)
+#define get_csv2_float_pos137(X,Y) get_csv2_float((X),(Y),137)
+#define get_csv2_uint_pos138(X,Y) get_csv2_uint((X),(Y),138)
+#define get_csv2_ullong_pos138(X,Y) get_csv2_ullong((X),(Y),138)
+#define get_csv2_ip_pos138(X,Y) get_csv2_ip((X),(Y),138)
+#define get_csv2_ipv6_pos138(X,Y) get_csv2_ipv6((X),(Y),138)
+#define get_csv2_string_pos138(X,Y) get_csv2_string((X),(Y),138)
+#define get_csv2_v_str_pos138(X,Y) get_csv2_string((X),(Y),138)
+#define get_csv2_bool_pos138(X,Y) get_csv2_bool((X),(Y),138)
+#define get_csv2_int_pos138(X,Y) get_csv2_int((X),(Y),138)
+#define get_csv2_llong_pos138(X,Y) get_csv2_llong((X),(Y),138)
+#define get_csv2_float_pos138(X,Y) get_csv2_float((X),(Y),138)
+#define get_csv2_uint_pos139(X,Y) get_csv2_uint((X),(Y),139)
+#define get_csv2_ullong_pos139(X,Y) get_csv2_ullong((X),(Y),139)
+#define get_csv2_ip_pos139(X,Y) get_csv2_ip((X),(Y),139)
+#define get_csv2_ipv6_pos139(X,Y) get_csv2_ipv6((X),(Y),139)
+#define get_csv2_string_pos139(X,Y) get_csv2_string((X),(Y),139)
+#define get_csv2_v_str_pos139(X,Y) get_csv2_string((X),(Y),139)
+#define get_csv2_bool_pos139(X,Y) get_csv2_bool((X),(Y),139)
+#define get_csv2_int_pos139(X,Y) get_csv2_int((X),(Y),139)
+#define get_csv2_llong_pos139(X,Y) get_csv2_llong((X),(Y),139)
+#define get_csv2_float_pos139(X,Y) get_csv2_float((X),(Y),139)
+#define get_csv2_uint_pos140(X,Y) get_csv2_uint((X),(Y),140)
+#define get_csv2_ullong_pos140(X,Y) get_csv2_ullong((X),(Y),140)
+#define get_csv2_ip_pos140(X,Y) get_csv2_ip((X),(Y),140)
+#define get_csv2_ipv6_pos140(X,Y) get_csv2_ipv6((X),(Y),140)
+#define get_csv2_string_pos140(X,Y) get_csv2_string((X),(Y),140)
+#define get_csv2_v_str_pos140(X,Y) get_csv2_string((X),(Y),140)
+#define get_csv2_bool_pos140(X,Y) get_csv2_bool((X),(Y),140)
+#define get_csv2_int_pos140(X,Y) get_csv2_int((X),(Y),140)
+#define get_csv2_llong_pos140(X,Y) get_csv2_llong((X),(Y),140)
+#define get_csv2_float_pos140(X,Y) get_csv2_float((X),(Y),140)
+#define get_csv2_uint_pos141(X,Y) get_csv2_uint((X),(Y),141)
+#define get_csv2_ullong_pos141(X,Y) get_csv2_ullong((X),(Y),141)
+#define get_csv2_ip_pos141(X,Y) get_csv2_ip((X),(Y),141)
+#define get_csv2_ipv6_pos141(X,Y) get_csv2_ipv6((X),(Y),141)
+#define get_csv2_string_pos141(X,Y) get_csv2_string((X),(Y),141)
+#define get_csv2_v_str_pos141(X,Y) get_csv2_string((X),(Y),141)
+#define get_csv2_bool_pos141(X,Y) get_csv2_bool((X),(Y),141)
+#define get_csv2_int_pos141(X,Y) get_csv2_int((X),(Y),141)
+#define get_csv2_llong_pos141(X,Y) get_csv2_llong((X),(Y),141)
+#define get_csv2_float_pos141(X,Y) get_csv2_float((X),(Y),141)
+#define get_csv2_uint_pos142(X,Y) get_csv2_uint((X),(Y),142)
+#define get_csv2_ullong_pos142(X,Y) get_csv2_ullong((X),(Y),142)
+#define get_csv2_ip_pos142(X,Y) get_csv2_ip((X),(Y),142)
+#define get_csv2_ipv6_pos142(X,Y) get_csv2_ipv6((X),(Y),142)
+#define get_csv2_string_pos142(X,Y) get_csv2_string((X),(Y),142)
+#define get_csv2_v_str_pos142(X,Y) get_csv2_string((X),(Y),142)
+#define get_csv2_bool_pos142(X,Y) get_csv2_bool((X),(Y),142)
+#define get_csv2_int_pos142(X,Y) get_csv2_int((X),(Y),142)
+#define get_csv2_llong_pos142(X,Y) get_csv2_llong((X),(Y),142)
+#define get_csv2_float_pos142(X,Y) get_csv2_float((X),(Y),142)
+#define get_csv2_uint_pos143(X,Y) get_csv2_uint((X),(Y),143)
+#define get_csv2_ullong_pos143(X,Y) get_csv2_ullong((X),(Y),143)
+#define get_csv2_ip_pos143(X,Y) get_csv2_ip((X),(Y),143)
+#define get_csv2_ipv6_pos143(X,Y) get_csv2_ipv6((X),(Y),143)
+#define get_csv2_string_pos143(X,Y) get_csv2_string((X),(Y),143)
+#define get_csv2_v_str_pos143(X,Y) get_csv2_string((X),(Y),143)
+#define get_csv2_bool_pos143(X,Y) get_csv2_bool((X),(Y),143)
+#define get_csv2_int_pos143(X,Y) get_csv2_int((X),(Y),143)
+#define get_csv2_llong_pos143(X,Y) get_csv2_llong((X),(Y),143)
+#define get_csv2_float_pos143(X,Y) get_csv2_float((X),(Y),143)
+#define get_csv2_uint_pos144(X,Y) get_csv2_uint((X),(Y),144)
+#define get_csv2_ullong_pos144(X,Y) get_csv2_ullong((X),(Y),144)
+#define get_csv2_ip_pos144(X,Y) get_csv2_ip((X),(Y),144)
+#define get_csv2_ipv6_pos144(X,Y) get_csv2_ipv6((X),(Y),144)
+#define get_csv2_string_pos144(X,Y) get_csv2_string((X),(Y),144)
+#define get_csv2_v_str_pos144(X,Y) get_csv2_string((X),(Y),144)
+#define get_csv2_bool_pos144(X,Y) get_csv2_bool((X),(Y),144)
+#define get_csv2_int_pos144(X,Y) get_csv2_int((X),(Y),144)
+#define get_csv2_llong_pos144(X,Y) get_csv2_llong((X),(Y),144)
+#define get_csv2_float_pos144(X,Y) get_csv2_float((X),(Y),144)
+#define get_csv2_uint_pos145(X,Y) get_csv2_uint((X),(Y),145)
+#define get_csv2_ullong_pos145(X,Y) get_csv2_ullong((X),(Y),145)
+#define get_csv2_ip_pos145(X,Y) get_csv2_ip((X),(Y),145)
+#define get_csv2_ipv6_pos145(X,Y) get_csv2_ipv6((X),(Y),145)
+#define get_csv2_string_pos145(X,Y) get_csv2_string((X),(Y),145)
+#define get_csv2_v_str_pos145(X,Y) get_csv2_string((X),(Y),145)
+#define get_csv2_bool_pos145(X,Y) get_csv2_bool((X),(Y),145)
+#define get_csv2_int_pos145(X,Y) get_csv2_int((X),(Y),145)
+#define get_csv2_llong_pos145(X,Y) get_csv2_llong((X),(Y),145)
+#define get_csv2_float_pos145(X,Y) get_csv2_float((X),(Y),145)
+#define get_csv2_uint_pos146(X,Y) get_csv2_uint((X),(Y),146)
+#define get_csv2_ullong_pos146(X,Y) get_csv2_ullong((X),(Y),146)
+#define get_csv2_ip_pos146(X,Y) get_csv2_ip((X),(Y),146)
+#define get_csv2_ipv6_pos146(X,Y) get_csv2_ipv6((X),(Y),146)
+#define get_csv2_string_pos146(X,Y) get_csv2_string((X),(Y),146)
+#define get_csv2_v_str_pos146(X,Y) get_csv2_string((X),(Y),146)
+#define get_csv2_bool_pos146(X,Y) get_csv2_bool((X),(Y),146)
+#define get_csv2_int_pos146(X,Y) get_csv2_int((X),(Y),146)
+#define get_csv2_llong_pos146(X,Y) get_csv2_llong((X),(Y),146)
+#define get_csv2_float_pos146(X,Y) get_csv2_float((X),(Y),146)
+#define get_csv2_uint_pos147(X,Y) get_csv2_uint((X),(Y),147)
+#define get_csv2_ullong_pos147(X,Y) get_csv2_ullong((X),(Y),147)
+#define get_csv2_ip_pos147(X,Y) get_csv2_ip((X),(Y),147)
+#define get_csv2_ipv6_pos147(X,Y) get_csv2_ipv6((X),(Y),147)
+#define get_csv2_string_pos147(X,Y) get_csv2_string((X),(Y),147)
+#define get_csv2_v_str_pos147(X,Y) get_csv2_string((X),(Y),147)
+#define get_csv2_bool_pos147(X,Y) get_csv2_bool((X),(Y),147)
+#define get_csv2_int_pos147(X,Y) get_csv2_int((X),(Y),147)
+#define get_csv2_llong_pos147(X,Y) get_csv2_llong((X),(Y),147)
+#define get_csv2_float_pos147(X,Y) get_csv2_float((X),(Y),147)
+#define get_csv2_uint_pos148(X,Y) get_csv2_uint((X),(Y),148)
+#define get_csv2_ullong_pos148(X,Y) get_csv2_ullong((X),(Y),148)
+#define get_csv2_ip_pos148(X,Y) get_csv2_ip((X),(Y),148)
+#define get_csv2_ipv6_pos148(X,Y) get_csv2_ipv6((X),(Y),148)
+#define get_csv2_string_pos148(X,Y) get_csv2_string((X),(Y),148)
+#define get_csv2_v_str_pos148(X,Y) get_csv2_string((X),(Y),148)
+#define get_csv2_bool_pos148(X,Y) get_csv2_bool((X),(Y),148)
+#define get_csv2_int_pos148(X,Y) get_csv2_int((X),(Y),148)
+#define get_csv2_llong_pos148(X,Y) get_csv2_llong((X),(Y),148)
+#define get_csv2_float_pos148(X,Y) get_csv2_float((X),(Y),148)
+#define get_csv2_uint_pos149(X,Y) get_csv2_uint((X),(Y),149)
+#define get_csv2_ullong_pos149(X,Y) get_csv2_ullong((X),(Y),149)
+#define get_csv2_ip_pos149(X,Y) get_csv2_ip((X),(Y),149)
+#define get_csv2_ipv6_pos149(X,Y) get_csv2_ipv6((X),(Y),149)
+#define get_csv2_string_pos149(X,Y) get_csv2_string((X),(Y),149)
+#define get_csv2_v_str_pos149(X,Y) get_csv2_string((X),(Y),149)
+#define get_csv2_bool_pos149(X,Y) get_csv2_bool((X),(Y),149)
+#define get_csv2_int_pos149(X,Y) get_csv2_int((X),(Y),149)
+#define get_csv2_llong_pos149(X,Y) get_csv2_llong((X),(Y),149)
+#define get_csv2_float_pos149(X,Y) get_csv2_float((X),(Y),149)
+#define get_csv2_uint_pos150(X,Y) get_csv2_uint((X),(Y),150)
+#define get_csv2_ullong_pos150(X,Y) get_csv2_ullong((X),(Y),150)
+#define get_csv2_ip_pos150(X,Y) get_csv2_ip((X),(Y),150)
+#define get_csv2_ipv6_pos150(X,Y) get_csv2_ipv6((X),(Y),150)
+#define get_csv2_string_pos150(X,Y) get_csv2_string((X),(Y),150)
+#define get_csv2_v_str_pos150(X,Y) get_csv2_string((X),(Y),150)
+#define get_csv2_bool_pos150(X,Y) get_csv2_bool((X),(Y),150)
+#define get_csv2_int_pos150(X,Y) get_csv2_int((X),(Y),150)
+#define get_csv2_llong_pos150(X,Y) get_csv2_llong((X),(Y),150)
+#define get_csv2_float_pos150(X,Y) get_csv2_float((X),(Y),150)
+#define get_csv2_uint_pos151(X,Y) get_csv2_uint((X),(Y),151)
+#define get_csv2_ullong_pos151(X,Y) get_csv2_ullong((X),(Y),151)
+#define get_csv2_ip_pos151(X,Y) get_csv2_ip((X),(Y),151)
+#define get_csv2_ipv6_pos151(X,Y) get_csv2_ipv6((X),(Y),151)
+#define get_csv2_string_pos151(X,Y) get_csv2_string((X),(Y),151)
+#define get_csv2_v_str_pos151(X,Y) get_csv2_string((X),(Y),151)
+#define get_csv2_bool_pos151(X,Y) get_csv2_bool((X),(Y),151)
+#define get_csv2_int_pos151(X,Y) get_csv2_int((X),(Y),151)
+#define get_csv2_llong_pos151(X,Y) get_csv2_llong((X),(Y),151)
+#define get_csv2_float_pos151(X,Y) get_csv2_float((X),(Y),151)
+#define get_csv2_uint_pos152(X,Y) get_csv2_uint((X),(Y),152)
+#define get_csv2_ullong_pos152(X,Y) get_csv2_ullong((X),(Y),152)
+#define get_csv2_ip_pos152(X,Y) get_csv2_ip((X),(Y),152)
+#define get_csv2_ipv6_pos152(X,Y) get_csv2_ipv6((X),(Y),152)
+#define get_csv2_string_pos152(X,Y) get_csv2_string((X),(Y),152)
+#define get_csv2_v_str_pos152(X,Y) get_csv2_string((X),(Y),152)
+#define get_csv2_bool_pos152(X,Y) get_csv2_bool((X),(Y),152)
+#define get_csv2_int_pos152(X,Y) get_csv2_int((X),(Y),152)
+#define get_csv2_llong_pos152(X,Y) get_csv2_llong((X),(Y),152)
+#define get_csv2_float_pos152(X,Y) get_csv2_float((X),(Y),152)
+#define get_csv2_uint_pos153(X,Y) get_csv2_uint((X),(Y),153)
+#define get_csv2_ullong_pos153(X,Y) get_csv2_ullong((X),(Y),153)
+#define get_csv2_ip_pos153(X,Y) get_csv2_ip((X),(Y),153)
+#define get_csv2_ipv6_pos153(X,Y) get_csv2_ipv6((X),(Y),153)
+#define get_csv2_string_pos153(X,Y) get_csv2_string((X),(Y),153)
+#define get_csv2_v_str_pos153(X,Y) get_csv2_string((X),(Y),153)
+#define get_csv2_bool_pos153(X,Y) get_csv2_bool((X),(Y),153)
+#define get_csv2_int_pos153(X,Y) get_csv2_int((X),(Y),153)
+#define get_csv2_llong_pos153(X,Y) get_csv2_llong((X),(Y),153)
+#define get_csv2_float_pos153(X,Y) get_csv2_float((X),(Y),153)
+#define get_csv2_uint_pos154(X,Y) get_csv2_uint((X),(Y),154)
+#define get_csv2_ullong_pos154(X,Y) get_csv2_ullong((X),(Y),154)
+#define get_csv2_ip_pos154(X,Y) get_csv2_ip((X),(Y),154)
+#define get_csv2_ipv6_pos154(X,Y) get_csv2_ipv6((X),(Y),154)
+#define get_csv2_string_pos154(X,Y) get_csv2_string((X),(Y),154)
+#define get_csv2_v_str_pos154(X,Y) get_csv2_string((X),(Y),154)
+#define get_csv2_bool_pos154(X,Y) get_csv2_bool((X),(Y),154)
+#define get_csv2_int_pos154(X,Y) get_csv2_int((X),(Y),154)
+#define get_csv2_llong_pos154(X,Y) get_csv2_llong((X),(Y),154)
+#define get_csv2_float_pos154(X,Y) get_csv2_float((X),(Y),154)
+#define get_csv2_uint_pos155(X,Y) get_csv2_uint((X),(Y),155)
+#define get_csv2_ullong_pos155(X,Y) get_csv2_ullong((X),(Y),155)
+#define get_csv2_ip_pos155(X,Y) get_csv2_ip((X),(Y),155)
+#define get_csv2_ipv6_pos155(X,Y) get_csv2_ipv6((X),(Y),155)
+#define get_csv2_string_pos155(X,Y) get_csv2_string((X),(Y),155)
+#define get_csv2_v_str_pos155(X,Y) get_csv2_string((X),(Y),155)
+#define get_csv2_bool_pos155(X,Y) get_csv2_bool((X),(Y),155)
+#define get_csv2_int_pos155(X,Y) get_csv2_int((X),(Y),155)
+#define get_csv2_llong_pos155(X,Y) get_csv2_llong((X),(Y),155)
+#define get_csv2_float_pos155(X,Y) get_csv2_float((X),(Y),155)
+#define get_csv2_uint_pos156(X,Y) get_csv2_uint((X),(Y),156)
+#define get_csv2_ullong_pos156(X,Y) get_csv2_ullong((X),(Y),156)
+#define get_csv2_ip_pos156(X,Y) get_csv2_ip((X),(Y),156)
+#define get_csv2_ipv6_pos156(X,Y) get_csv2_ipv6((X),(Y),156)
+#define get_csv2_string_pos156(X,Y) get_csv2_string((X),(Y),156)
+#define get_csv2_v_str_pos156(X,Y) get_csv2_string((X),(Y),156)
+#define get_csv2_bool_pos156(X,Y) get_csv2_bool((X),(Y),156)
+#define get_csv2_int_pos156(X,Y) get_csv2_int((X),(Y),156)
+#define get_csv2_llong_pos156(X,Y) get_csv2_llong((X),(Y),156)
+#define get_csv2_float_pos156(X,Y) get_csv2_float((X),(Y),156)
+#define get_csv2_uint_pos157(X,Y) get_csv2_uint((X),(Y),157)
+#define get_csv2_ullong_pos157(X,Y) get_csv2_ullong((X),(Y),157)
+#define get_csv2_ip_pos157(X,Y) get_csv2_ip((X),(Y),157)
+#define get_csv2_ipv6_pos157(X,Y) get_csv2_ipv6((X),(Y),157)
+#define get_csv2_string_pos157(X,Y) get_csv2_string((X),(Y),157)
+#define get_csv2_v_str_pos157(X,Y) get_csv2_string((X),(Y),157)
+#define get_csv2_bool_pos157(X,Y) get_csv2_bool((X),(Y),157)
+#define get_csv2_int_pos157(X,Y) get_csv2_int((X),(Y),157)
+#define get_csv2_llong_pos157(X,Y) get_csv2_llong((X),(Y),157)
+#define get_csv2_float_pos157(X,Y) get_csv2_float((X),(Y),157)
+#define get_csv2_uint_pos158(X,Y) get_csv2_uint((X),(Y),158)
+#define get_csv2_ullong_pos158(X,Y) get_csv2_ullong((X),(Y),158)
+#define get_csv2_ip_pos158(X,Y) get_csv2_ip((X),(Y),158)
+#define get_csv2_ipv6_pos158(X,Y) get_csv2_ipv6((X),(Y),158)
+#define get_csv2_string_pos158(X,Y) get_csv2_string((X),(Y),158)
+#define get_csv2_v_str_pos158(X,Y) get_csv2_string((X),(Y),158)
+#define get_csv2_bool_pos158(X,Y) get_csv2_bool((X),(Y),158)
+#define get_csv2_int_pos158(X,Y) get_csv2_int((X),(Y),158)
+#define get_csv2_llong_pos158(X,Y) get_csv2_llong((X),(Y),158)
+#define get_csv2_float_pos158(X,Y) get_csv2_float((X),(Y),158)
+#define get_csv2_uint_pos159(X,Y) get_csv2_uint((X),(Y),159)
+#define get_csv2_ullong_pos159(X,Y) get_csv2_ullong((X),(Y),159)
+#define get_csv2_ip_pos159(X,Y) get_csv2_ip((X),(Y),159)
+#define get_csv2_ipv6_pos159(X,Y) get_csv2_ipv6((X),(Y),159)
+#define get_csv2_string_pos159(X,Y) get_csv2_string((X),(Y),159)
+#define get_csv2_v_str_pos159(X,Y) get_csv2_string((X),(Y),159)
+#define get_csv2_bool_pos159(X,Y) get_csv2_bool((X),(Y),159)
+#define get_csv2_int_pos159(X,Y) get_csv2_int((X),(Y),159)
+#define get_csv2_llong_pos159(X,Y) get_csv2_llong((X),(Y),159)
+#define get_csv2_float_pos159(X,Y) get_csv2_float((X),(Y),159)
+#define get_csv2_uint_pos160(X,Y) get_csv2_uint((X),(Y),160)
+#define get_csv2_ullong_pos160(X,Y) get_csv2_ullong((X),(Y),160)
+#define get_csv2_ip_pos160(X,Y) get_csv2_ip((X),(Y),160)
+#define get_csv2_ipv6_pos160(X,Y) get_csv2_ipv6((X),(Y),160)
+#define get_csv2_string_pos160(X,Y) get_csv2_string((X),(Y),160)
+#define get_csv2_v_str_pos160(X,Y) get_csv2_string((X),(Y),160)
+#define get_csv2_bool_pos160(X,Y) get_csv2_bool((X),(Y),160)
+#define get_csv2_int_pos160(X,Y) get_csv2_int((X),(Y),160)
+#define get_csv2_llong_pos160(X,Y) get_csv2_llong((X),(Y),160)
+#define get_csv2_float_pos160(X,Y) get_csv2_float((X),(Y),160)
+#define get_csv2_uint_pos161(X,Y) get_csv2_uint((X),(Y),161)
+#define get_csv2_ullong_pos161(X,Y) get_csv2_ullong((X),(Y),161)
+#define get_csv2_ip_pos161(X,Y) get_csv2_ip((X),(Y),161)
+#define get_csv2_ipv6_pos161(X,Y) get_csv2_ipv6((X),(Y),161)
+#define get_csv2_string_pos161(X,Y) get_csv2_string((X),(Y),161)
+#define get_csv2_v_str_pos161(X,Y) get_csv2_string((X),(Y),161)
+#define get_csv2_bool_pos161(X,Y) get_csv2_bool((X),(Y),161)
+#define get_csv2_int_pos161(X,Y) get_csv2_int((X),(Y),161)
+#define get_csv2_llong_pos161(X,Y) get_csv2_llong((X),(Y),161)
+#define get_csv2_float_pos161(X,Y) get_csv2_float((X),(Y),161)
+#define get_csv2_uint_pos162(X,Y) get_csv2_uint((X),(Y),162)
+#define get_csv2_ullong_pos162(X,Y) get_csv2_ullong((X),(Y),162)
+#define get_csv2_ip_pos162(X,Y) get_csv2_ip((X),(Y),162)
+#define get_csv2_ipv6_pos162(X,Y) get_csv2_ipv6((X),(Y),162)
+#define get_csv2_string_pos162(X,Y) get_csv2_string((X),(Y),162)
+#define get_csv2_v_str_pos162(X,Y) get_csv2_string((X),(Y),162)
+#define get_csv2_bool_pos162(X,Y) get_csv2_bool((X),(Y),162)
+#define get_csv2_int_pos162(X,Y) get_csv2_int((X),(Y),162)
+#define get_csv2_llong_pos162(X,Y) get_csv2_llong((X),(Y),162)
+#define get_csv2_float_pos162(X,Y) get_csv2_float((X),(Y),162)
+#define get_csv2_uint_pos163(X,Y) get_csv2_uint((X),(Y),163)
+#define get_csv2_ullong_pos163(X,Y) get_csv2_ullong((X),(Y),163)
+#define get_csv2_ip_pos163(X,Y) get_csv2_ip((X),(Y),163)
+#define get_csv2_ipv6_pos163(X,Y) get_csv2_ipv6((X),(Y),163)
+#define get_csv2_string_pos163(X,Y) get_csv2_string((X),(Y),163)
+#define get_csv2_v_str_pos163(X,Y) get_csv2_string((X),(Y),163)
+#define get_csv2_bool_pos163(X,Y) get_csv2_bool((X),(Y),163)
+#define get_csv2_int_pos163(X,Y) get_csv2_int((X),(Y),163)
+#define get_csv2_llong_pos163(X,Y) get_csv2_llong((X),(Y),163)
+#define get_csv2_float_pos163(X,Y) get_csv2_float((X),(Y),163)
+#define get_csv2_uint_pos164(X,Y) get_csv2_uint((X),(Y),164)
+#define get_csv2_ullong_pos164(X,Y) get_csv2_ullong((X),(Y),164)
+#define get_csv2_ip_pos164(X,Y) get_csv2_ip((X),(Y),164)
+#define get_csv2_ipv6_pos164(X,Y) get_csv2_ipv6((X),(Y),164)
+#define get_csv2_string_pos164(X,Y) get_csv2_string((X),(Y),164)
+#define get_csv2_v_str_pos164(X,Y) get_csv2_string((X),(Y),164)
+#define get_csv2_bool_pos164(X,Y) get_csv2_bool((X),(Y),164)
+#define get_csv2_int_pos164(X,Y) get_csv2_int((X),(Y),164)
+#define get_csv2_llong_pos164(X,Y) get_csv2_llong((X),(Y),164)
+#define get_csv2_float_pos164(X,Y) get_csv2_float((X),(Y),164)
+#define get_csv2_uint_pos165(X,Y) get_csv2_uint((X),(Y),165)
+#define get_csv2_ullong_pos165(X,Y) get_csv2_ullong((X),(Y),165)
+#define get_csv2_ip_pos165(X,Y) get_csv2_ip((X),(Y),165)
+#define get_csv2_ipv6_pos165(X,Y) get_csv2_ipv6((X),(Y),165)
+#define get_csv2_string_pos165(X,Y) get_csv2_string((X),(Y),165)
+#define get_csv2_v_str_pos165(X,Y) get_csv2_string((X),(Y),165)
+#define get_csv2_bool_pos165(X,Y) get_csv2_bool((X),(Y),165)
+#define get_csv2_int_pos165(X,Y) get_csv2_int((X),(Y),165)
+#define get_csv2_llong_pos165(X,Y) get_csv2_llong((X),(Y),165)
+#define get_csv2_float_pos165(X,Y) get_csv2_float((X),(Y),165)
+#define get_csv2_uint_pos166(X,Y) get_csv2_uint((X),(Y),166)
+#define get_csv2_ullong_pos166(X,Y) get_csv2_ullong((X),(Y),166)
+#define get_csv2_ip_pos166(X,Y) get_csv2_ip((X),(Y),166)
+#define get_csv2_ipv6_pos166(X,Y) get_csv2_ipv6((X),(Y),166)
+#define get_csv2_string_pos166(X,Y) get_csv2_string((X),(Y),166)
+#define get_csv2_v_str_pos166(X,Y) get_csv2_string((X),(Y),166)
+#define get_csv2_bool_pos166(X,Y) get_csv2_bool((X),(Y),166)
+#define get_csv2_int_pos166(X,Y) get_csv2_int((X),(Y),166)
+#define get_csv2_llong_pos166(X,Y) get_csv2_llong((X),(Y),166)
+#define get_csv2_float_pos166(X,Y) get_csv2_float((X),(Y),166)
+#define get_csv2_uint_pos167(X,Y) get_csv2_uint((X),(Y),167)
+#define get_csv2_ullong_pos167(X,Y) get_csv2_ullong((X),(Y),167)
+#define get_csv2_ip_pos167(X,Y) get_csv2_ip((X),(Y),167)
+#define get_csv2_ipv6_pos167(X,Y) get_csv2_ipv6((X),(Y),167)
+#define get_csv2_string_pos167(X,Y) get_csv2_string((X),(Y),167)
+#define get_csv2_v_str_pos167(X,Y) get_csv2_string((X),(Y),167)
+#define get_csv2_bool_pos167(X,Y) get_csv2_bool((X),(Y),167)
+#define get_csv2_int_pos167(X,Y) get_csv2_int((X),(Y),167)
+#define get_csv2_llong_pos167(X,Y) get_csv2_llong((X),(Y),167)
+#define get_csv2_float_pos167(X,Y) get_csv2_float((X),(Y),167)
+#define get_csv2_uint_pos168(X,Y) get_csv2_uint((X),(Y),168)
+#define get_csv2_ullong_pos168(X,Y) get_csv2_ullong((X),(Y),168)
+#define get_csv2_ip_pos168(X,Y) get_csv2_ip((X),(Y),168)
+#define get_csv2_ipv6_pos168(X,Y) get_csv2_ipv6((X),(Y),168)
+#define get_csv2_string_pos168(X,Y) get_csv2_string((X),(Y),168)
+#define get_csv2_v_str_pos168(X,Y) get_csv2_string((X),(Y),168)
+#define get_csv2_bool_pos168(X,Y) get_csv2_bool((X),(Y),168)
+#define get_csv2_int_pos168(X,Y) get_csv2_int((X),(Y),168)
+#define get_csv2_llong_pos168(X,Y) get_csv2_llong((X),(Y),168)
+#define get_csv2_float_pos168(X,Y) get_csv2_float((X),(Y),168)
+#define get_csv2_uint_pos169(X,Y) get_csv2_uint((X),(Y),169)
+#define get_csv2_ullong_pos169(X,Y) get_csv2_ullong((X),(Y),169)
+#define get_csv2_ip_pos169(X,Y) get_csv2_ip((X),(Y),169)
+#define get_csv2_ipv6_pos169(X,Y) get_csv2_ipv6((X),(Y),169)
+#define get_csv2_string_pos169(X,Y) get_csv2_string((X),(Y),169)
+#define get_csv2_v_str_pos169(X,Y) get_csv2_string((X),(Y),169)
+#define get_csv2_bool_pos169(X,Y) get_csv2_bool((X),(Y),169)
+#define get_csv2_int_pos169(X,Y) get_csv2_int((X),(Y),169)
+#define get_csv2_llong_pos169(X,Y) get_csv2_llong((X),(Y),169)
+#define get_csv2_float_pos169(X,Y) get_csv2_float((X),(Y),169)
+#define get_csv2_uint_pos170(X,Y) get_csv2_uint((X),(Y),170)
+#define get_csv2_ullong_pos170(X,Y) get_csv2_ullong((X),(Y),170)
+#define get_csv2_ip_pos170(X,Y) get_csv2_ip((X),(Y),170)
+#define get_csv2_ipv6_pos170(X,Y) get_csv2_ipv6((X),(Y),170)
+#define get_csv2_string_pos170(X,Y) get_csv2_string((X),(Y),170)
+#define get_csv2_v_str_pos170(X,Y) get_csv2_string((X),(Y),170)
+#define get_csv2_bool_pos170(X,Y) get_csv2_bool((X),(Y),170)
+#define get_csv2_int_pos170(X,Y) get_csv2_int((X),(Y),170)
+#define get_csv2_llong_pos170(X,Y) get_csv2_llong((X),(Y),170)
+#define get_csv2_float_pos170(X,Y) get_csv2_float((X),(Y),170)
+#define get_csv2_uint_pos171(X,Y) get_csv2_uint((X),(Y),171)
+#define get_csv2_ullong_pos171(X,Y) get_csv2_ullong((X),(Y),171)
+#define get_csv2_ip_pos171(X,Y) get_csv2_ip((X),(Y),171)
+#define get_csv2_ipv6_pos171(X,Y) get_csv2_ipv6((X),(Y),171)
+#define get_csv2_string_pos171(X,Y) get_csv2_string((X),(Y),171)
+#define get_csv2_v_str_pos171(X,Y) get_csv2_string((X),(Y),171)
+#define get_csv2_bool_pos171(X,Y) get_csv2_bool((X),(Y),171)
+#define get_csv2_int_pos171(X,Y) get_csv2_int((X),(Y),171)
+#define get_csv2_llong_pos171(X,Y) get_csv2_llong((X),(Y),171)
+#define get_csv2_float_pos171(X,Y) get_csv2_float((X),(Y),171)
+#define get_csv2_uint_pos172(X,Y) get_csv2_uint((X),(Y),172)
+#define get_csv2_ullong_pos172(X,Y) get_csv2_ullong((X),(Y),172)
+#define get_csv2_ip_pos172(X,Y) get_csv2_ip((X),(Y),172)
+#define get_csv2_ipv6_pos172(X,Y) get_csv2_ipv6((X),(Y),172)
+#define get_csv2_string_pos172(X,Y) get_csv2_string((X),(Y),172)
+#define get_csv2_v_str_pos172(X,Y) get_csv2_string((X),(Y),172)
+#define get_csv2_bool_pos172(X,Y) get_csv2_bool((X),(Y),172)
+#define get_csv2_int_pos172(X,Y) get_csv2_int((X),(Y),172)
+#define get_csv2_llong_pos172(X,Y) get_csv2_llong((X),(Y),172)
+#define get_csv2_float_pos172(X,Y) get_csv2_float((X),(Y),172)
+#define get_csv2_uint_pos173(X,Y) get_csv2_uint((X),(Y),173)
+#define get_csv2_ullong_pos173(X,Y) get_csv2_ullong((X),(Y),173)
+#define get_csv2_ip_pos173(X,Y) get_csv2_ip((X),(Y),173)
+#define get_csv2_ipv6_pos173(X,Y) get_csv2_ipv6((X),(Y),173)
+#define get_csv2_string_pos173(X,Y) get_csv2_string((X),(Y),173)
+#define get_csv2_v_str_pos173(X,Y) get_csv2_string((X),(Y),173)
+#define get_csv2_bool_pos173(X,Y) get_csv2_bool((X),(Y),173)
+#define get_csv2_int_pos173(X,Y) get_csv2_int((X),(Y),173)
+#define get_csv2_llong_pos173(X,Y) get_csv2_llong((X),(Y),173)
+#define get_csv2_float_pos173(X,Y) get_csv2_float((X),(Y),173)
+#define get_csv2_uint_pos174(X,Y) get_csv2_uint((X),(Y),174)
+#define get_csv2_ullong_pos174(X,Y) get_csv2_ullong((X),(Y),174)
+#define get_csv2_ip_pos174(X,Y) get_csv2_ip((X),(Y),174)
+#define get_csv2_ipv6_pos174(X,Y) get_csv2_ipv6((X),(Y),174)
+#define get_csv2_string_pos174(X,Y) get_csv2_string((X),(Y),174)
+#define get_csv2_v_str_pos174(X,Y) get_csv2_string((X),(Y),174)
+#define get_csv2_bool_pos174(X,Y) get_csv2_bool((X),(Y),174)
+#define get_csv2_int_pos174(X,Y) get_csv2_int((X),(Y),174)
+#define get_csv2_llong_pos174(X,Y) get_csv2_llong((X),(Y),174)
+#define get_csv2_float_pos174(X,Y) get_csv2_float((X),(Y),174)
+#define get_csv2_uint_pos175(X,Y) get_csv2_uint((X),(Y),175)
+#define get_csv2_ullong_pos175(X,Y) get_csv2_ullong((X),(Y),175)
+#define get_csv2_ip_pos175(X,Y) get_csv2_ip((X),(Y),175)
+#define get_csv2_ipv6_pos175(X,Y) get_csv2_ipv6((X),(Y),175)
+#define get_csv2_string_pos175(X,Y) get_csv2_string((X),(Y),175)
+#define get_csv2_v_str_pos175(X,Y) get_csv2_string((X),(Y),175)
+#define get_csv2_bool_pos175(X,Y) get_csv2_bool((X),(Y),175)
+#define get_csv2_int_pos175(X,Y) get_csv2_int((X),(Y),175)
+#define get_csv2_llong_pos175(X,Y) get_csv2_llong((X),(Y),175)
+#define get_csv2_float_pos175(X,Y) get_csv2_float((X),(Y),175)
+#define get_csv2_uint_pos176(X,Y) get_csv2_uint((X),(Y),176)
+#define get_csv2_ullong_pos176(X,Y) get_csv2_ullong((X),(Y),176)
+#define get_csv2_ip_pos176(X,Y) get_csv2_ip((X),(Y),176)
+#define get_csv2_ipv6_pos176(X,Y) get_csv2_ipv6((X),(Y),176)
+#define get_csv2_string_pos176(X,Y) get_csv2_string((X),(Y),176)
+#define get_csv2_v_str_pos176(X,Y) get_csv2_string((X),(Y),176)
+#define get_csv2_bool_pos176(X,Y) get_csv2_bool((X),(Y),176)
+#define get_csv2_int_pos176(X,Y) get_csv2_int((X),(Y),176)
+#define get_csv2_llong_pos176(X,Y) get_csv2_llong((X),(Y),176)
+#define get_csv2_float_pos176(X,Y) get_csv2_float((X),(Y),176)
+#define get_csv2_uint_pos177(X,Y) get_csv2_uint((X),(Y),177)
+#define get_csv2_ullong_pos177(X,Y) get_csv2_ullong((X),(Y),177)
+#define get_csv2_ip_pos177(X,Y) get_csv2_ip((X),(Y),177)
+#define get_csv2_ipv6_pos177(X,Y) get_csv2_ipv6((X),(Y),177)
+#define get_csv2_string_pos177(X,Y) get_csv2_string((X),(Y),177)
+#define get_csv2_v_str_pos177(X,Y) get_csv2_string((X),(Y),177)
+#define get_csv2_bool_pos177(X,Y) get_csv2_bool((X),(Y),177)
+#define get_csv2_int_pos177(X,Y) get_csv2_int((X),(Y),177)
+#define get_csv2_llong_pos177(X,Y) get_csv2_llong((X),(Y),177)
+#define get_csv2_float_pos177(X,Y) get_csv2_float((X),(Y),177)
+#define get_csv2_uint_pos178(X,Y) get_csv2_uint((X),(Y),178)
+#define get_csv2_ullong_pos178(X,Y) get_csv2_ullong((X),(Y),178)
+#define get_csv2_ip_pos178(X,Y) get_csv2_ip((X),(Y),178)
+#define get_csv2_ipv6_pos178(X,Y) get_csv2_ipv6((X),(Y),178)
+#define get_csv2_string_pos178(X,Y) get_csv2_string((X),(Y),178)
+#define get_csv2_v_str_pos178(X,Y) get_csv2_string((X),(Y),178)
+#define get_csv2_bool_pos178(X,Y) get_csv2_bool((X),(Y),178)
+#define get_csv2_int_pos178(X,Y) get_csv2_int((X),(Y),178)
+#define get_csv2_llong_pos178(X,Y) get_csv2_llong((X),(Y),178)
+#define get_csv2_float_pos178(X,Y) get_csv2_float((X),(Y),178)
+#define get_csv2_uint_pos179(X,Y) get_csv2_uint((X),(Y),179)
+#define get_csv2_ullong_pos179(X,Y) get_csv2_ullong((X),(Y),179)
+#define get_csv2_ip_pos179(X,Y) get_csv2_ip((X),(Y),179)
+#define get_csv2_ipv6_pos179(X,Y) get_csv2_ipv6((X),(Y),179)
+#define get_csv2_string_pos179(X,Y) get_csv2_string((X),(Y),179)
+#define get_csv2_v_str_pos179(X,Y) get_csv2_string((X),(Y),179)
+#define get_csv2_bool_pos179(X,Y) get_csv2_bool((X),(Y),179)
+#define get_csv2_int_pos179(X,Y) get_csv2_int((X),(Y),179)
+#define get_csv2_llong_pos179(X,Y) get_csv2_llong((X),(Y),179)
+#define get_csv2_float_pos179(X,Y) get_csv2_float((X),(Y),179)
+#define get_csv2_uint_pos180(X,Y) get_csv2_uint((X),(Y),180)
+#define get_csv2_ullong_pos180(X,Y) get_csv2_ullong((X),(Y),180)
+#define get_csv2_ip_pos180(X,Y) get_csv2_ip((X),(Y),180)
+#define get_csv2_ipv6_pos180(X,Y) get_csv2_ipv6((X),(Y),180)
+#define get_csv2_string_pos180(X,Y) get_csv2_string((X),(Y),180)
+#define get_csv2_v_str_pos180(X,Y) get_csv2_string((X),(Y),180)
+#define get_csv2_bool_pos180(X,Y) get_csv2_bool((X),(Y),180)
+#define get_csv2_int_pos180(X,Y) get_csv2_int((X),(Y),180)
+#define get_csv2_llong_pos180(X,Y) get_csv2_llong((X),(Y),180)
+#define get_csv2_float_pos180(X,Y) get_csv2_float((X),(Y),180)
+#define get_csv2_uint_pos181(X,Y) get_csv2_uint((X),(Y),181)
+#define get_csv2_ullong_pos181(X,Y) get_csv2_ullong((X),(Y),181)
+#define get_csv2_ip_pos181(X,Y) get_csv2_ip((X),(Y),181)
+#define get_csv2_ipv6_pos181(X,Y) get_csv2_ipv6((X),(Y),181)
+#define get_csv2_string_pos181(X,Y) get_csv2_string((X),(Y),181)
+#define get_csv2_v_str_pos181(X,Y) get_csv2_string((X),(Y),181)
+#define get_csv2_bool_pos181(X,Y) get_csv2_bool((X),(Y),181)
+#define get_csv2_int_pos181(X,Y) get_csv2_int((X),(Y),181)
+#define get_csv2_llong_pos181(X,Y) get_csv2_llong((X),(Y),181)
+#define get_csv2_float_pos181(X,Y) get_csv2_float((X),(Y),181)
+#define get_csv2_uint_pos182(X,Y) get_csv2_uint((X),(Y),182)
+#define get_csv2_ullong_pos182(X,Y) get_csv2_ullong((X),(Y),182)
+#define get_csv2_ip_pos182(X,Y) get_csv2_ip((X),(Y),182)
+#define get_csv2_ipv6_pos182(X,Y) get_csv2_ipv6((X),(Y),182)
+#define get_csv2_string_pos182(X,Y) get_csv2_string((X),(Y),182)
+#define get_csv2_v_str_pos182(X,Y) get_csv2_string((X),(Y),182)
+#define get_csv2_bool_pos182(X,Y) get_csv2_bool((X),(Y),182)
+#define get_csv2_int_pos182(X,Y) get_csv2_int((X),(Y),182)
+#define get_csv2_llong_pos182(X,Y) get_csv2_llong((X),(Y),182)
+#define get_csv2_float_pos182(X,Y) get_csv2_float((X),(Y),182)
+#define get_csv2_uint_pos183(X,Y) get_csv2_uint((X),(Y),183)
+#define get_csv2_ullong_pos183(X,Y) get_csv2_ullong((X),(Y),183)
+#define get_csv2_ip_pos183(X,Y) get_csv2_ip((X),(Y),183)
+#define get_csv2_ipv6_pos183(X,Y) get_csv2_ipv6((X),(Y),183)
+#define get_csv2_string_pos183(X,Y) get_csv2_string((X),(Y),183)
+#define get_csv2_v_str_pos183(X,Y) get_csv2_string((X),(Y),183)
+#define get_csv2_bool_pos183(X,Y) get_csv2_bool((X),(Y),183)
+#define get_csv2_int_pos183(X,Y) get_csv2_int((X),(Y),183)
+#define get_csv2_llong_pos183(X,Y) get_csv2_llong((X),(Y),183)
+#define get_csv2_float_pos183(X,Y) get_csv2_float((X),(Y),183)
+#define get_csv2_uint_pos184(X,Y) get_csv2_uint((X),(Y),184)
+#define get_csv2_ullong_pos184(X,Y) get_csv2_ullong((X),(Y),184)
+#define get_csv2_ip_pos184(X,Y) get_csv2_ip((X),(Y),184)
+#define get_csv2_ipv6_pos184(X,Y) get_csv2_ipv6((X),(Y),184)
+#define get_csv2_string_pos184(X,Y) get_csv2_string((X),(Y),184)
+#define get_csv2_v_str_pos184(X,Y) get_csv2_string((X),(Y),184)
+#define get_csv2_bool_pos184(X,Y) get_csv2_bool((X),(Y),184)
+#define get_csv2_int_pos184(X,Y) get_csv2_int((X),(Y),184)
+#define get_csv2_llong_pos184(X,Y) get_csv2_llong((X),(Y),184)
+#define get_csv2_float_pos184(X,Y) get_csv2_float((X),(Y),184)
+#define get_csv2_uint_pos185(X,Y) get_csv2_uint((X),(Y),185)
+#define get_csv2_ullong_pos185(X,Y) get_csv2_ullong((X),(Y),185)
+#define get_csv2_ip_pos185(X,Y) get_csv2_ip((X),(Y),185)
+#define get_csv2_ipv6_pos185(X,Y) get_csv2_ipv6((X),(Y),185)
+#define get_csv2_string_pos185(X,Y) get_csv2_string((X),(Y),185)
+#define get_csv2_v_str_pos185(X,Y) get_csv2_string((X),(Y),185)
+#define get_csv2_bool_pos185(X,Y) get_csv2_bool((X),(Y),185)
+#define get_csv2_int_pos185(X,Y) get_csv2_int((X),(Y),185)
+#define get_csv2_llong_pos185(X,Y) get_csv2_llong((X),(Y),185)
+#define get_csv2_float_pos185(X,Y) get_csv2_float((X),(Y),185)
+#define get_csv2_uint_pos186(X,Y) get_csv2_uint((X),(Y),186)
+#define get_csv2_ullong_pos186(X,Y) get_csv2_ullong((X),(Y),186)
+#define get_csv2_ip_pos186(X,Y) get_csv2_ip((X),(Y),186)
+#define get_csv2_ipv6_pos186(X,Y) get_csv2_ipv6((X),(Y),186)
+#define get_csv2_string_pos186(X,Y) get_csv2_string((X),(Y),186)
+#define get_csv2_v_str_pos186(X,Y) get_csv2_string((X),(Y),186)
+#define get_csv2_bool_pos186(X,Y) get_csv2_bool((X),(Y),186)
+#define get_csv2_int_pos186(X,Y) get_csv2_int((X),(Y),186)
+#define get_csv2_llong_pos186(X,Y) get_csv2_llong((X),(Y),186)
+#define get_csv2_float_pos186(X,Y) get_csv2_float((X),(Y),186)
+#define get_csv2_uint_pos187(X,Y) get_csv2_uint((X),(Y),187)
+#define get_csv2_ullong_pos187(X,Y) get_csv2_ullong((X),(Y),187)
+#define get_csv2_ip_pos187(X,Y) get_csv2_ip((X),(Y),187)
+#define get_csv2_ipv6_pos187(X,Y) get_csv2_ipv6((X),(Y),187)
+#define get_csv2_string_pos187(X,Y) get_csv2_string((X),(Y),187)
+#define get_csv2_v_str_pos187(X,Y) get_csv2_string((X),(Y),187)
+#define get_csv2_bool_pos187(X,Y) get_csv2_bool((X),(Y),187)
+#define get_csv2_int_pos187(X,Y) get_csv2_int((X),(Y),187)
+#define get_csv2_llong_pos187(X,Y) get_csv2_llong((X),(Y),187)
+#define get_csv2_float_pos187(X,Y) get_csv2_float((X),(Y),187)
+#define get_csv2_uint_pos188(X,Y) get_csv2_uint((X),(Y),188)
+#define get_csv2_ullong_pos188(X,Y) get_csv2_ullong((X),(Y),188)
+#define get_csv2_ip_pos188(X,Y) get_csv2_ip((X),(Y),188)
+#define get_csv2_ipv6_pos188(X,Y) get_csv2_ipv6((X),(Y),188)
+#define get_csv2_string_pos188(X,Y) get_csv2_string((X),(Y),188)
+#define get_csv2_v_str_pos188(X,Y) get_csv2_string((X),(Y),188)
+#define get_csv2_bool_pos188(X,Y) get_csv2_bool((X),(Y),188)
+#define get_csv2_int_pos188(X,Y) get_csv2_int((X),(Y),188)
+#define get_csv2_llong_pos188(X,Y) get_csv2_llong((X),(Y),188)
+#define get_csv2_float_pos188(X,Y) get_csv2_float((X),(Y),188)
+#define get_csv2_uint_pos189(X,Y) get_csv2_uint((X),(Y),189)
+#define get_csv2_ullong_pos189(X,Y) get_csv2_ullong((X),(Y),189)
+#define get_csv2_ip_pos189(X,Y) get_csv2_ip((X),(Y),189)
+#define get_csv2_ipv6_pos189(X,Y) get_csv2_ipv6((X),(Y),189)
+#define get_csv2_string_pos189(X,Y) get_csv2_string((X),(Y),189)
+#define get_csv2_v_str_pos189(X,Y) get_csv2_string((X),(Y),189)
+#define get_csv2_bool_pos189(X,Y) get_csv2_bool((X),(Y),189)
+#define get_csv2_int_pos189(X,Y) get_csv2_int((X),(Y),189)
+#define get_csv2_llong_pos189(X,Y) get_csv2_llong((X),(Y),189)
+#define get_csv2_float_pos189(X,Y) get_csv2_float((X),(Y),189)
+#define get_csv2_uint_pos190(X,Y) get_csv2_uint((X),(Y),190)
+#define get_csv2_ullong_pos190(X,Y) get_csv2_ullong((X),(Y),190)
+#define get_csv2_ip_pos190(X,Y) get_csv2_ip((X),(Y),190)
+#define get_csv2_ipv6_pos190(X,Y) get_csv2_ipv6((X),(Y),190)
+#define get_csv2_string_pos190(X,Y) get_csv2_string((X),(Y),190)
+#define get_csv2_v_str_pos190(X,Y) get_csv2_string((X),(Y),190)
+#define get_csv2_bool_pos190(X,Y) get_csv2_bool((X),(Y),190)
+#define get_csv2_int_pos190(X,Y) get_csv2_int((X),(Y),190)
+#define get_csv2_llong_pos190(X,Y) get_csv2_llong((X),(Y),190)
+#define get_csv2_float_pos190(X,Y) get_csv2_float((X),(Y),190)
+#define get_csv2_uint_pos191(X,Y) get_csv2_uint((X),(Y),191)
+#define get_csv2_ullong_pos191(X,Y) get_csv2_ullong((X),(Y),191)
+#define get_csv2_ip_pos191(X,Y) get_csv2_ip((X),(Y),191)
+#define get_csv2_ipv6_pos191(X,Y) get_csv2_ipv6((X),(Y),191)
+#define get_csv2_string_pos191(X,Y) get_csv2_string((X),(Y),191)
+#define get_csv2_v_str_pos191(X,Y) get_csv2_string((X),(Y),191)
+#define get_csv2_bool_pos191(X,Y) get_csv2_bool((X),(Y),191)
+#define get_csv2_int_pos191(X,Y) get_csv2_int((X),(Y),191)
+#define get_csv2_llong_pos191(X,Y) get_csv2_llong((X),(Y),191)
+#define get_csv2_float_pos191(X,Y) get_csv2_float((X),(Y),191)
+#define get_csv2_uint_pos192(X,Y) get_csv2_uint((X),(Y),192)
+#define get_csv2_ullong_pos192(X,Y) get_csv2_ullong((X),(Y),192)
+#define get_csv2_ip_pos192(X,Y) get_csv2_ip((X),(Y),192)
+#define get_csv2_ipv6_pos192(X,Y) get_csv2_ipv6((X),(Y),192)
+#define get_csv2_string_pos192(X,Y) get_csv2_string((X),(Y),192)
+#define get_csv2_v_str_pos192(X,Y) get_csv2_string((X),(Y),192)
+#define get_csv2_bool_pos192(X,Y) get_csv2_bool((X),(Y),192)
+#define get_csv2_int_pos192(X,Y) get_csv2_int((X),(Y),192)
+#define get_csv2_llong_pos192(X,Y) get_csv2_llong((X),(Y),192)
+#define get_csv2_float_pos192(X,Y) get_csv2_float((X),(Y),192)
+#define get_csv2_uint_pos193(X,Y) get_csv2_uint((X),(Y),193)
+#define get_csv2_ullong_pos193(X,Y) get_csv2_ullong((X),(Y),193)
+#define get_csv2_ip_pos193(X,Y) get_csv2_ip((X),(Y),193)
+#define get_csv2_ipv6_pos193(X,Y) get_csv2_ipv6((X),(Y),193)
+#define get_csv2_string_pos193(X,Y) get_csv2_string((X),(Y),193)
+#define get_csv2_v_str_pos193(X,Y) get_csv2_string((X),(Y),193)
+#define get_csv2_bool_pos193(X,Y) get_csv2_bool((X),(Y),193)
+#define get_csv2_int_pos193(X,Y) get_csv2_int((X),(Y),193)
+#define get_csv2_llong_pos193(X,Y) get_csv2_llong((X),(Y),193)
+#define get_csv2_float_pos193(X,Y) get_csv2_float((X),(Y),193)
+#define get_csv2_uint_pos194(X,Y) get_csv2_uint((X),(Y),194)
+#define get_csv2_ullong_pos194(X,Y) get_csv2_ullong((X),(Y),194)
+#define get_csv2_ip_pos194(X,Y) get_csv2_ip((X),(Y),194)
+#define get_csv2_ipv6_pos194(X,Y) get_csv2_ipv6((X),(Y),194)
+#define get_csv2_string_pos194(X,Y) get_csv2_string((X),(Y),194)
+#define get_csv2_v_str_pos194(X,Y) get_csv2_string((X),(Y),194)
+#define get_csv2_bool_pos194(X,Y) get_csv2_bool((X),(Y),194)
+#define get_csv2_int_pos194(X,Y) get_csv2_int((X),(Y),194)
+#define get_csv2_llong_pos194(X,Y) get_csv2_llong((X),(Y),194)
+#define get_csv2_float_pos194(X,Y) get_csv2_float((X),(Y),194)
+#define get_csv2_uint_pos195(X,Y) get_csv2_uint((X),(Y),195)
+#define get_csv2_ullong_pos195(X,Y) get_csv2_ullong((X),(Y),195)
+#define get_csv2_ip_pos195(X,Y) get_csv2_ip((X),(Y),195)
+#define get_csv2_ipv6_pos195(X,Y) get_csv2_ipv6((X),(Y),195)
+#define get_csv2_string_pos195(X,Y) get_csv2_string((X),(Y),195)
+#define get_csv2_v_str_pos195(X,Y) get_csv2_string((X),(Y),195)
+#define get_csv2_bool_pos195(X,Y) get_csv2_bool((X),(Y),195)
+#define get_csv2_int_pos195(X,Y) get_csv2_int((X),(Y),195)
+#define get_csv2_llong_pos195(X,Y) get_csv2_llong((X),(Y),195)
+#define get_csv2_float_pos195(X,Y) get_csv2_float((X),(Y),195)
+#define get_csv2_uint_pos196(X,Y) get_csv2_uint((X),(Y),196)
+#define get_csv2_ullong_pos196(X,Y) get_csv2_ullong((X),(Y),196)
+#define get_csv2_ip_pos196(X,Y) get_csv2_ip((X),(Y),196)
+#define get_csv2_ipv6_pos196(X,Y) get_csv2_ipv6((X),(Y),196)
+#define get_csv2_string_pos196(X,Y) get_csv2_string((X),(Y),196)
+#define get_csv2_v_str_pos196(X,Y) get_csv2_string((X),(Y),196)
+#define get_csv2_bool_pos196(X,Y) get_csv2_bool((X),(Y),196)
+#define get_csv2_int_pos196(X,Y) get_csv2_int((X),(Y),196)
+#define get_csv2_llong_pos196(X,Y) get_csv2_llong((X),(Y),196)
+#define get_csv2_float_pos196(X,Y) get_csv2_float((X),(Y),196)
+#define get_csv2_uint_pos197(X,Y) get_csv2_uint((X),(Y),197)
+#define get_csv2_ullong_pos197(X,Y) get_csv2_ullong((X),(Y),197)
+#define get_csv2_ip_pos197(X,Y) get_csv2_ip((X),(Y),197)
+#define get_csv2_ipv6_pos197(X,Y) get_csv2_ipv6((X),(Y),197)
+#define get_csv2_string_pos197(X,Y) get_csv2_string((X),(Y),197)
+#define get_csv2_v_str_pos197(X,Y) get_csv2_string((X),(Y),197)
+#define get_csv2_bool_pos197(X,Y) get_csv2_bool((X),(Y),197)
+#define get_csv2_int_pos197(X,Y) get_csv2_int((X),(Y),197)
+#define get_csv2_llong_pos197(X,Y) get_csv2_llong((X),(Y),197)
+#define get_csv2_float_pos197(X,Y) get_csv2_float((X),(Y),197)
+#define get_csv2_uint_pos198(X,Y) get_csv2_uint((X),(Y),198)
+#define get_csv2_ullong_pos198(X,Y) get_csv2_ullong((X),(Y),198)
+#define get_csv2_ip_pos198(X,Y) get_csv2_ip((X),(Y),198)
+#define get_csv2_ipv6_pos198(X,Y) get_csv2_ipv6((X),(Y),198)
+#define get_csv2_string_pos198(X,Y) get_csv2_string((X),(Y),198)
+#define get_csv2_v_str_pos198(X,Y) get_csv2_string((X),(Y),198)
+#define get_csv2_bool_pos198(X,Y) get_csv2_bool((X),(Y),198)
+#define get_csv2_int_pos198(X,Y) get_csv2_int((X),(Y),198)
+#define get_csv2_llong_pos198(X,Y) get_csv2_llong((X),(Y),198)
+#define get_csv2_float_pos198(X,Y) get_csv2_float((X),(Y),198)
+#define get_csv2_uint_pos199(X,Y) get_csv2_uint((X),(Y),199)
+#define get_csv2_ullong_pos199(X,Y) get_csv2_ullong((X),(Y),199)
+#define get_csv2_ip_pos199(X,Y) get_csv2_ip((X),(Y),199)
+#define get_csv2_ipv6_pos199(X,Y) get_csv2_ipv6((X),(Y),199)
+#define get_csv2_string_pos199(X,Y) get_csv2_string((X),(Y),199)
+#define get_csv2_v_str_pos199(X,Y) get_csv2_string((X),(Y),199)
+#define get_csv2_bool_pos199(X,Y) get_csv2_bool((X),(Y),199)
+#define get_csv2_int_pos199(X,Y) get_csv2_int((X),(Y),199)
+#define get_csv2_llong_pos199(X,Y) get_csv2_llong((X),(Y),199)
+#define get_csv2_float_pos199(X,Y) get_csv2_float((X),(Y),199)
+#define get_csv2_uint_pos200(X,Y) get_csv2_uint((X),(Y),200)
+#define get_csv2_ullong_pos200(X,Y) get_csv2_ullong((X),(Y),200)
+#define get_csv2_ip_pos200(X,Y) get_csv2_ip((X),(Y),200)
+#define get_csv2_ipv6_pos200(X,Y) get_csv2_ipv6((X),(Y),200)
+#define get_csv2_string_pos200(X,Y) get_csv2_string((X),(Y),200)
+#define get_csv2_v_str_pos200(X,Y) get_csv2_string((X),(Y),200)
+#define get_csv2_bool_pos200(X,Y) get_csv2_bool((X),(Y),200)
+#define get_csv2_int_pos200(X,Y) get_csv2_int((X),(Y),200)
+#define get_csv2_llong_pos200(X,Y) get_csv2_llong((X),(Y),200)
+#define get_csv2_float_pos200(X,Y) get_csv2_float((X),(Y),200)
+#define get_csv2_uint_pos201(X,Y) get_csv2_uint((X),(Y),201)
+#define get_csv2_ullong_pos201(X,Y) get_csv2_ullong((X),(Y),201)
+#define get_csv2_ip_pos201(X,Y) get_csv2_ip((X),(Y),201)
+#define get_csv2_ipv6_pos201(X,Y) get_csv2_ipv6((X),(Y),201)
+#define get_csv2_string_pos201(X,Y) get_csv2_string((X),(Y),201)
+#define get_csv2_v_str_pos201(X,Y) get_csv2_string((X),(Y),201)
+#define get_csv2_bool_pos201(X,Y) get_csv2_bool((X),(Y),201)
+#define get_csv2_int_pos201(X,Y) get_csv2_int((X),(Y),201)
+#define get_csv2_llong_pos201(X,Y) get_csv2_llong((X),(Y),201)
+#define get_csv2_float_pos201(X,Y) get_csv2_float((X),(Y),201)
+#define get_csv2_uint_pos202(X,Y) get_csv2_uint((X),(Y),202)
+#define get_csv2_ullong_pos202(X,Y) get_csv2_ullong((X),(Y),202)
+#define get_csv2_ip_pos202(X,Y) get_csv2_ip((X),(Y),202)
+#define get_csv2_ipv6_pos202(X,Y) get_csv2_ipv6((X),(Y),202)
+#define get_csv2_string_pos202(X,Y) get_csv2_string((X),(Y),202)
+#define get_csv2_v_str_pos202(X,Y) get_csv2_string((X),(Y),202)
+#define get_csv2_bool_pos202(X,Y) get_csv2_bool((X),(Y),202)
+#define get_csv2_int_pos202(X,Y) get_csv2_int((X),(Y),202)
+#define get_csv2_llong_pos202(X,Y) get_csv2_llong((X),(Y),202)
+#define get_csv2_float_pos202(X,Y) get_csv2_float((X),(Y),202)
+#define get_csv2_uint_pos203(X,Y) get_csv2_uint((X),(Y),203)
+#define get_csv2_ullong_pos203(X,Y) get_csv2_ullong((X),(Y),203)
+#define get_csv2_ip_pos203(X,Y) get_csv2_ip((X),(Y),203)
+#define get_csv2_ipv6_pos203(X,Y) get_csv2_ipv6((X),(Y),203)
+#define get_csv2_string_pos203(X,Y) get_csv2_string((X),(Y),203)
+#define get_csv2_v_str_pos203(X,Y) get_csv2_string((X),(Y),203)
+#define get_csv2_bool_pos203(X,Y) get_csv2_bool((X),(Y),203)
+#define get_csv2_int_pos203(X,Y) get_csv2_int((X),(Y),203)
+#define get_csv2_llong_pos203(X,Y) get_csv2_llong((X),(Y),203)
+#define get_csv2_float_pos203(X,Y) get_csv2_float((X),(Y),203)
+#define get_csv2_uint_pos204(X,Y) get_csv2_uint((X),(Y),204)
+#define get_csv2_ullong_pos204(X,Y) get_csv2_ullong((X),(Y),204)
+#define get_csv2_ip_pos204(X,Y) get_csv2_ip((X),(Y),204)
+#define get_csv2_ipv6_pos204(X,Y) get_csv2_ipv6((X),(Y),204)
+#define get_csv2_string_pos204(X,Y) get_csv2_string((X),(Y),204)
+#define get_csv2_v_str_pos204(X,Y) get_csv2_string((X),(Y),204)
+#define get_csv2_bool_pos204(X,Y) get_csv2_bool((X),(Y),204)
+#define get_csv2_int_pos204(X,Y) get_csv2_int((X),(Y),204)
+#define get_csv2_llong_pos204(X,Y) get_csv2_llong((X),(Y),204)
+#define get_csv2_float_pos204(X,Y) get_csv2_float((X),(Y),204)
+#define get_csv2_uint_pos205(X,Y) get_csv2_uint((X),(Y),205)
+#define get_csv2_ullong_pos205(X,Y) get_csv2_ullong((X),(Y),205)
+#define get_csv2_ip_pos205(X,Y) get_csv2_ip((X),(Y),205)
+#define get_csv2_ipv6_pos205(X,Y) get_csv2_ipv6((X),(Y),205)
+#define get_csv2_string_pos205(X,Y) get_csv2_string((X),(Y),205)
+#define get_csv2_v_str_pos205(X,Y) get_csv2_string((X),(Y),205)
+#define get_csv2_bool_pos205(X,Y) get_csv2_bool((X),(Y),205)
+#define get_csv2_int_pos205(X,Y) get_csv2_int((X),(Y),205)
+#define get_csv2_llong_pos205(X,Y) get_csv2_llong((X),(Y),205)
+#define get_csv2_float_pos205(X,Y) get_csv2_float((X),(Y),205)
+#define get_csv2_uint_pos206(X,Y) get_csv2_uint((X),(Y),206)
+#define get_csv2_ullong_pos206(X,Y) get_csv2_ullong((X),(Y),206)
+#define get_csv2_ip_pos206(X,Y) get_csv2_ip((X),(Y),206)
+#define get_csv2_ipv6_pos206(X,Y) get_csv2_ipv6((X),(Y),206)
+#define get_csv2_string_pos206(X,Y) get_csv2_string((X),(Y),206)
+#define get_csv2_v_str_pos206(X,Y) get_csv2_string((X),(Y),206)
+#define get_csv2_bool_pos206(X,Y) get_csv2_bool((X),(Y),206)
+#define get_csv2_int_pos206(X,Y) get_csv2_int((X),(Y),206)
+#define get_csv2_llong_pos206(X,Y) get_csv2_llong((X),(Y),206)
+#define get_csv2_float_pos206(X,Y) get_csv2_float((X),(Y),206)
+#define get_csv2_uint_pos207(X,Y) get_csv2_uint((X),(Y),207)
+#define get_csv2_ullong_pos207(X,Y) get_csv2_ullong((X),(Y),207)
+#define get_csv2_ip_pos207(X,Y) get_csv2_ip((X),(Y),207)
+#define get_csv2_ipv6_pos207(X,Y) get_csv2_ipv6((X),(Y),207)
+#define get_csv2_string_pos207(X,Y) get_csv2_string((X),(Y),207)
+#define get_csv2_v_str_pos207(X,Y) get_csv2_string((X),(Y),207)
+#define get_csv2_bool_pos207(X,Y) get_csv2_bool((X),(Y),207)
+#define get_csv2_int_pos207(X,Y) get_csv2_int((X),(Y),207)
+#define get_csv2_llong_pos207(X,Y) get_csv2_llong((X),(Y),207)
+#define get_csv2_float_pos207(X,Y) get_csv2_float((X),(Y),207)
+#define get_csv2_uint_pos208(X,Y) get_csv2_uint((X),(Y),208)
+#define get_csv2_ullong_pos208(X,Y) get_csv2_ullong((X),(Y),208)
+#define get_csv2_ip_pos208(X,Y) get_csv2_ip((X),(Y),208)
+#define get_csv2_ipv6_pos208(X,Y) get_csv2_ipv6((X),(Y),208)
+#define get_csv2_string_pos208(X,Y) get_csv2_string((X),(Y),208)
+#define get_csv2_v_str_pos208(X,Y) get_csv2_string((X),(Y),208)
+#define get_csv2_bool_pos208(X,Y) get_csv2_bool((X),(Y),208)
+#define get_csv2_int_pos208(X,Y) get_csv2_int((X),(Y),208)
+#define get_csv2_llong_pos208(X,Y) get_csv2_llong((X),(Y),208)
+#define get_csv2_float_pos208(X,Y) get_csv2_float((X),(Y),208)
+#define get_csv2_uint_pos209(X,Y) get_csv2_uint((X),(Y),209)
+#define get_csv2_ullong_pos209(X,Y) get_csv2_ullong((X),(Y),209)
+#define get_csv2_ip_pos209(X,Y) get_csv2_ip((X),(Y),209)
+#define get_csv2_ipv6_pos209(X,Y) get_csv2_ipv6((X),(Y),209)
+#define get_csv2_string_pos209(X,Y) get_csv2_string((X),(Y),209)
+#define get_csv2_v_str_pos209(X,Y) get_csv2_string((X),(Y),209)
+#define get_csv2_bool_pos209(X,Y) get_csv2_bool((X),(Y),209)
+#define get_csv2_int_pos209(X,Y) get_csv2_int((X),(Y),209)
+#define get_csv2_llong_pos209(X,Y) get_csv2_llong((X),(Y),209)
+#define get_csv2_float_pos209(X,Y) get_csv2_float((X),(Y),209)
+#define get_csv2_uint_pos210(X,Y) get_csv2_uint((X),(Y),210)
+#define get_csv2_ullong_pos210(X,Y) get_csv2_ullong((X),(Y),210)
+#define get_csv2_ip_pos210(X,Y) get_csv2_ip((X),(Y),210)
+#define get_csv2_ipv6_pos210(X,Y) get_csv2_ipv6((X),(Y),210)
+#define get_csv2_string_pos210(X,Y) get_csv2_string((X),(Y),210)
+#define get_csv2_v_str_pos210(X,Y) get_csv2_string((X),(Y),210)
+#define get_csv2_bool_pos210(X,Y) get_csv2_bool((X),(Y),210)
+#define get_csv2_int_pos210(X,Y) get_csv2_int((X),(Y),210)
+#define get_csv2_llong_pos210(X,Y) get_csv2_llong((X),(Y),210)
+#define get_csv2_float_pos210(X,Y) get_csv2_float((X),(Y),210)
+#define get_csv2_uint_pos211(X,Y) get_csv2_uint((X),(Y),211)
+#define get_csv2_ullong_pos211(X,Y) get_csv2_ullong((X),(Y),211)
+#define get_csv2_ip_pos211(X,Y) get_csv2_ip((X),(Y),211)
+#define get_csv2_ipv6_pos211(X,Y) get_csv2_ipv6((X),(Y),211)
+#define get_csv2_string_pos211(X,Y) get_csv2_string((X),(Y),211)
+#define get_csv2_v_str_pos211(X,Y) get_csv2_string((X),(Y),211)
+#define get_csv2_bool_pos211(X,Y) get_csv2_bool((X),(Y),211)
+#define get_csv2_int_pos211(X,Y) get_csv2_int((X),(Y),211)
+#define get_csv2_llong_pos211(X,Y) get_csv2_llong((X),(Y),211)
+#define get_csv2_float_pos211(X,Y) get_csv2_float((X),(Y),211)
+#define get_csv2_uint_pos212(X,Y) get_csv2_uint((X),(Y),212)
+#define get_csv2_ullong_pos212(X,Y) get_csv2_ullong((X),(Y),212)
+#define get_csv2_ip_pos212(X,Y) get_csv2_ip((X),(Y),212)
+#define get_csv2_ipv6_pos212(X,Y) get_csv2_ipv6((X),(Y),212)
+#define get_csv2_string_pos212(X,Y) get_csv2_string((X),(Y),212)
+#define get_csv2_v_str_pos212(X,Y) get_csv2_string((X),(Y),212)
+#define get_csv2_bool_pos212(X,Y) get_csv2_bool((X),(Y),212)
+#define get_csv2_int_pos212(X,Y) get_csv2_int((X),(Y),212)
+#define get_csv2_llong_pos212(X,Y) get_csv2_llong((X),(Y),212)
+#define get_csv2_float_pos212(X,Y) get_csv2_float((X),(Y),212)
+#define get_csv2_uint_pos213(X,Y) get_csv2_uint((X),(Y),213)
+#define get_csv2_ullong_pos213(X,Y) get_csv2_ullong((X),(Y),213)
+#define get_csv2_ip_pos213(X,Y) get_csv2_ip((X),(Y),213)
+#define get_csv2_ipv6_pos213(X,Y) get_csv2_ipv6((X),(Y),213)
+#define get_csv2_string_pos213(X,Y) get_csv2_string((X),(Y),213)
+#define get_csv2_v_str_pos213(X,Y) get_csv2_string((X),(Y),213)
+#define get_csv2_bool_pos213(X,Y) get_csv2_bool((X),(Y),213)
+#define get_csv2_int_pos213(X,Y) get_csv2_int((X),(Y),213)
+#define get_csv2_llong_pos213(X,Y) get_csv2_llong((X),(Y),213)
+#define get_csv2_float_pos213(X,Y) get_csv2_float((X),(Y),213)
+#define get_csv2_uint_pos214(X,Y) get_csv2_uint((X),(Y),214)
+#define get_csv2_ullong_pos214(X,Y) get_csv2_ullong((X),(Y),214)
+#define get_csv2_ip_pos214(X,Y) get_csv2_ip((X),(Y),214)
+#define get_csv2_ipv6_pos214(X,Y) get_csv2_ipv6((X),(Y),214)
+#define get_csv2_string_pos214(X,Y) get_csv2_string((X),(Y),214)
+#define get_csv2_v_str_pos214(X,Y) get_csv2_string((X),(Y),214)
+#define get_csv2_bool_pos214(X,Y) get_csv2_bool((X),(Y),214)
+#define get_csv2_int_pos214(X,Y) get_csv2_int((X),(Y),214)
+#define get_csv2_llong_pos214(X,Y) get_csv2_llong((X),(Y),214)
+#define get_csv2_float_pos214(X,Y) get_csv2_float((X),(Y),214)
+#define get_csv2_uint_pos215(X,Y) get_csv2_uint((X),(Y),215)
+#define get_csv2_ullong_pos215(X,Y) get_csv2_ullong((X),(Y),215)
+#define get_csv2_ip_pos215(X,Y) get_csv2_ip((X),(Y),215)
+#define get_csv2_ipv6_pos215(X,Y) get_csv2_ipv6((X),(Y),215)
+#define get_csv2_string_pos215(X,Y) get_csv2_string((X),(Y),215)
+#define get_csv2_v_str_pos215(X,Y) get_csv2_string((X),(Y),215)
+#define get_csv2_bool_pos215(X,Y) get_csv2_bool((X),(Y),215)
+#define get_csv2_int_pos215(X,Y) get_csv2_int((X),(Y),215)
+#define get_csv2_llong_pos215(X,Y) get_csv2_llong((X),(Y),215)
+#define get_csv2_float_pos215(X,Y) get_csv2_float((X),(Y),215)
+#define get_csv2_uint_pos216(X,Y) get_csv2_uint((X),(Y),216)
+#define get_csv2_ullong_pos216(X,Y) get_csv2_ullong((X),(Y),216)
+#define get_csv2_ip_pos216(X,Y) get_csv2_ip((X),(Y),216)
+#define get_csv2_ipv6_pos216(X,Y) get_csv2_ipv6((X),(Y),216)
+#define get_csv2_string_pos216(X,Y) get_csv2_string((X),(Y),216)
+#define get_csv2_v_str_pos216(X,Y) get_csv2_string((X),(Y),216)
+#define get_csv2_bool_pos216(X,Y) get_csv2_bool((X),(Y),216)
+#define get_csv2_int_pos216(X,Y) get_csv2_int((X),(Y),216)
+#define get_csv2_llong_pos216(X,Y) get_csv2_llong((X),(Y),216)
+#define get_csv2_float_pos216(X,Y) get_csv2_float((X),(Y),216)
+#define get_csv2_uint_pos217(X,Y) get_csv2_uint((X),(Y),217)
+#define get_csv2_ullong_pos217(X,Y) get_csv2_ullong((X),(Y),217)
+#define get_csv2_ip_pos217(X,Y) get_csv2_ip((X),(Y),217)
+#define get_csv2_ipv6_pos217(X,Y) get_csv2_ipv6((X),(Y),217)
+#define get_csv2_string_pos217(X,Y) get_csv2_string((X),(Y),217)
+#define get_csv2_v_str_pos217(X,Y) get_csv2_string((X),(Y),217)
+#define get_csv2_bool_pos217(X,Y) get_csv2_bool((X),(Y),217)
+#define get_csv2_int_pos217(X,Y) get_csv2_int((X),(Y),217)
+#define get_csv2_llong_pos217(X,Y) get_csv2_llong((X),(Y),217)
+#define get_csv2_float_pos217(X,Y) get_csv2_float((X),(Y),217)
+#define get_csv2_uint_pos218(X,Y) get_csv2_uint((X),(Y),218)
+#define get_csv2_ullong_pos218(X,Y) get_csv2_ullong((X),(Y),218)
+#define get_csv2_ip_pos218(X,Y) get_csv2_ip((X),(Y),218)
+#define get_csv2_ipv6_pos218(X,Y) get_csv2_ipv6((X),(Y),218)
+#define get_csv2_string_pos218(X,Y) get_csv2_string((X),(Y),218)
+#define get_csv2_v_str_pos218(X,Y) get_csv2_string((X),(Y),218)
+#define get_csv2_bool_pos218(X,Y) get_csv2_bool((X),(Y),218)
+#define get_csv2_int_pos218(X,Y) get_csv2_int((X),(Y),218)
+#define get_csv2_llong_pos218(X,Y) get_csv2_llong((X),(Y),218)
+#define get_csv2_float_pos218(X,Y) get_csv2_float((X),(Y),218)
+#define get_csv2_uint_pos219(X,Y) get_csv2_uint((X),(Y),219)
+#define get_csv2_ullong_pos219(X,Y) get_csv2_ullong((X),(Y),219)
+#define get_csv2_ip_pos219(X,Y) get_csv2_ip((X),(Y),219)
+#define get_csv2_ipv6_pos219(X,Y) get_csv2_ipv6((X),(Y),219)
+#define get_csv2_string_pos219(X,Y) get_csv2_string((X),(Y),219)
+#define get_csv2_v_str_pos219(X,Y) get_csv2_string((X),(Y),219)
+#define get_csv2_bool_pos219(X,Y) get_csv2_bool((X),(Y),219)
+#define get_csv2_int_pos219(X,Y) get_csv2_int((X),(Y),219)
+#define get_csv2_llong_pos219(X,Y) get_csv2_llong((X),(Y),219)
+#define get_csv2_float_pos219(X,Y) get_csv2_float((X),(Y),219)
+#define get_csv2_uint_pos220(X,Y) get_csv2_uint((X),(Y),220)
+#define get_csv2_ullong_pos220(X,Y) get_csv2_ullong((X),(Y),220)
+#define get_csv2_ip_pos220(X,Y) get_csv2_ip((X),(Y),220)
+#define get_csv2_ipv6_pos220(X,Y) get_csv2_ipv6((X),(Y),220)
+#define get_csv2_string_pos220(X,Y) get_csv2_string((X),(Y),220)
+#define get_csv2_v_str_pos220(X,Y) get_csv2_string((X),(Y),220)
+#define get_csv2_bool_pos220(X,Y) get_csv2_bool((X),(Y),220)
+#define get_csv2_int_pos220(X,Y) get_csv2_int((X),(Y),220)
+#define get_csv2_llong_pos220(X,Y) get_csv2_llong((X),(Y),220)
+#define get_csv2_float_pos220(X,Y) get_csv2_float((X),(Y),220)
+#define get_csv2_uint_pos221(X,Y) get_csv2_uint((X),(Y),221)
+#define get_csv2_ullong_pos221(X,Y) get_csv2_ullong((X),(Y),221)
+#define get_csv2_ip_pos221(X,Y) get_csv2_ip((X),(Y),221)
+#define get_csv2_ipv6_pos221(X,Y) get_csv2_ipv6((X),(Y),221)
+#define get_csv2_string_pos221(X,Y) get_csv2_string((X),(Y),221)
+#define get_csv2_v_str_pos221(X,Y) get_csv2_string((X),(Y),221)
+#define get_csv2_bool_pos221(X,Y) get_csv2_bool((X),(Y),221)
+#define get_csv2_int_pos221(X,Y) get_csv2_int((X),(Y),221)
+#define get_csv2_llong_pos221(X,Y) get_csv2_llong((X),(Y),221)
+#define get_csv2_float_pos221(X,Y) get_csv2_float((X),(Y),221)
+#define get_csv2_uint_pos222(X,Y) get_csv2_uint((X),(Y),222)
+#define get_csv2_ullong_pos222(X,Y) get_csv2_ullong((X),(Y),222)
+#define get_csv2_ip_pos222(X,Y) get_csv2_ip((X),(Y),222)
+#define get_csv2_ipv6_pos222(X,Y) get_csv2_ipv6((X),(Y),222)
+#define get_csv2_string_pos222(X,Y) get_csv2_string((X),(Y),222)
+#define get_csv2_v_str_pos222(X,Y) get_csv2_string((X),(Y),222)
+#define get_csv2_bool_pos222(X,Y) get_csv2_bool((X),(Y),222)
+#define get_csv2_int_pos222(X,Y) get_csv2_int((X),(Y),222)
+#define get_csv2_llong_pos222(X,Y) get_csv2_llong((X),(Y),222)
+#define get_csv2_float_pos222(X,Y) get_csv2_float((X),(Y),222)
+#define get_csv2_uint_pos223(X,Y) get_csv2_uint((X),(Y),223)
+#define get_csv2_ullong_pos223(X,Y) get_csv2_ullong((X),(Y),223)
+#define get_csv2_ip_pos223(X,Y) get_csv2_ip((X),(Y),223)
+#define get_csv2_ipv6_pos223(X,Y) get_csv2_ipv6((X),(Y),223)
+#define get_csv2_string_pos223(X,Y) get_csv2_string((X),(Y),223)
+#define get_csv2_v_str_pos223(X,Y) get_csv2_string((X),(Y),223)
+#define get_csv2_bool_pos223(X,Y) get_csv2_bool((X),(Y),223)
+#define get_csv2_int_pos223(X,Y) get_csv2_int((X),(Y),223)
+#define get_csv2_llong_pos223(X,Y) get_csv2_llong((X),(Y),223)
+#define get_csv2_float_pos223(X,Y) get_csv2_float((X),(Y),223)
+#define get_csv2_uint_pos224(X,Y) get_csv2_uint((X),(Y),224)
+#define get_csv2_ullong_pos224(X,Y) get_csv2_ullong((X),(Y),224)
+#define get_csv2_ip_pos224(X,Y) get_csv2_ip((X),(Y),224)
+#define get_csv2_ipv6_pos224(X,Y) get_csv2_ipv6((X),(Y),224)
+#define get_csv2_string_pos224(X,Y) get_csv2_string((X),(Y),224)
+#define get_csv2_v_str_pos224(X,Y) get_csv2_string((X),(Y),224)
+#define get_csv2_bool_pos224(X,Y) get_csv2_bool((X),(Y),224)
+#define get_csv2_int_pos224(X,Y) get_csv2_int((X),(Y),224)
+#define get_csv2_llong_pos224(X,Y) get_csv2_llong((X),(Y),224)
+#define get_csv2_float_pos224(X,Y) get_csv2_float((X),(Y),224)
+#define get_csv2_uint_pos225(X,Y) get_csv2_uint((X),(Y),225)
+#define get_csv2_ullong_pos225(X,Y) get_csv2_ullong((X),(Y),225)
+#define get_csv2_ip_pos225(X,Y) get_csv2_ip((X),(Y),225)
+#define get_csv2_ipv6_pos225(X,Y) get_csv2_ipv6((X),(Y),225)
+#define get_csv2_string_pos225(X,Y) get_csv2_string((X),(Y),225)
+#define get_csv2_v_str_pos225(X,Y) get_csv2_string((X),(Y),225)
+#define get_csv2_bool_pos225(X,Y) get_csv2_bool((X),(Y),225)
+#define get_csv2_int_pos225(X,Y) get_csv2_int((X),(Y),225)
+#define get_csv2_llong_pos225(X,Y) get_csv2_llong((X),(Y),225)
+#define get_csv2_float_pos225(X,Y) get_csv2_float((X),(Y),225)
+#define get_csv2_uint_pos226(X,Y) get_csv2_uint((X),(Y),226)
+#define get_csv2_ullong_pos226(X,Y) get_csv2_ullong((X),(Y),226)
+#define get_csv2_ip_pos226(X,Y) get_csv2_ip((X),(Y),226)
+#define get_csv2_ipv6_pos226(X,Y) get_csv2_ipv6((X),(Y),226)
+#define get_csv2_string_pos226(X,Y) get_csv2_string((X),(Y),226)
+#define get_csv2_v_str_pos226(X,Y) get_csv2_string((X),(Y),226)
+#define get_csv2_bool_pos226(X,Y) get_csv2_bool((X),(Y),226)
+#define get_csv2_int_pos226(X,Y) get_csv2_int((X),(Y),226)
+#define get_csv2_llong_pos226(X,Y) get_csv2_llong((X),(Y),226)
+#define get_csv2_float_pos226(X,Y) get_csv2_float((X),(Y),226)
+#define get_csv2_uint_pos227(X,Y) get_csv2_uint((X),(Y),227)
+#define get_csv2_ullong_pos227(X,Y) get_csv2_ullong((X),(Y),227)
+#define get_csv2_ip_pos227(X,Y) get_csv2_ip((X),(Y),227)
+#define get_csv2_ipv6_pos227(X,Y) get_csv2_ipv6((X),(Y),227)
+#define get_csv2_string_pos227(X,Y) get_csv2_string((X),(Y),227)
+#define get_csv2_v_str_pos227(X,Y) get_csv2_string((X),(Y),227)
+#define get_csv2_bool_pos227(X,Y) get_csv2_bool((X),(Y),227)
+#define get_csv2_int_pos227(X,Y) get_csv2_int((X),(Y),227)
+#define get_csv2_llong_pos227(X,Y) get_csv2_llong((X),(Y),227)
+#define get_csv2_float_pos227(X,Y) get_csv2_float((X),(Y),227)
+#define get_csv2_uint_pos228(X,Y) get_csv2_uint((X),(Y),228)
+#define get_csv2_ullong_pos228(X,Y) get_csv2_ullong((X),(Y),228)
+#define get_csv2_ip_pos228(X,Y) get_csv2_ip((X),(Y),228)
+#define get_csv2_ipv6_pos228(X,Y) get_csv2_ipv6((X),(Y),228)
+#define get_csv2_string_pos228(X,Y) get_csv2_string((X),(Y),228)
+#define get_csv2_v_str_pos228(X,Y) get_csv2_string((X),(Y),228)
+#define get_csv2_bool_pos228(X,Y) get_csv2_bool((X),(Y),228)
+#define get_csv2_int_pos228(X,Y) get_csv2_int((X),(Y),228)
+#define get_csv2_llong_pos228(X,Y) get_csv2_llong((X),(Y),228)
+#define get_csv2_float_pos228(X,Y) get_csv2_float((X),(Y),228)
+#define get_csv2_uint_pos229(X,Y) get_csv2_uint((X),(Y),229)
+#define get_csv2_ullong_pos229(X,Y) get_csv2_ullong((X),(Y),229)
+#define get_csv2_ip_pos229(X,Y) get_csv2_ip((X),(Y),229)
+#define get_csv2_ipv6_pos229(X,Y) get_csv2_ipv6((X),(Y),229)
+#define get_csv2_string_pos229(X,Y) get_csv2_string((X),(Y),229)
+#define get_csv2_v_str_pos229(X,Y) get_csv2_string((X),(Y),229)
+#define get_csv2_bool_pos229(X,Y) get_csv2_bool((X),(Y),229)
+#define get_csv2_int_pos229(X,Y) get_csv2_int((X),(Y),229)
+#define get_csv2_llong_pos229(X,Y) get_csv2_llong((X),(Y),229)
+#define get_csv2_float_pos229(X,Y) get_csv2_float((X),(Y),229)
+#define get_csv2_uint_pos230(X,Y) get_csv2_uint((X),(Y),230)
+#define get_csv2_ullong_pos230(X,Y) get_csv2_ullong((X),(Y),230)
+#define get_csv2_ip_pos230(X,Y) get_csv2_ip((X),(Y),230)
+#define get_csv2_ipv6_pos230(X,Y) get_csv2_ipv6((X),(Y),230)
+#define get_csv2_string_pos230(X,Y) get_csv2_string((X),(Y),230)
+#define get_csv2_v_str_pos230(X,Y) get_csv2_string((X),(Y),230)
+#define get_csv2_bool_pos230(X,Y) get_csv2_bool((X),(Y),230)
+#define get_csv2_int_pos230(X,Y) get_csv2_int((X),(Y),230)
+#define get_csv2_llong_pos230(X,Y) get_csv2_llong((X),(Y),230)
+#define get_csv2_float_pos230(X,Y) get_csv2_float((X),(Y),230)
+#define get_csv2_uint_pos231(X,Y) get_csv2_uint((X),(Y),231)
+#define get_csv2_ullong_pos231(X,Y) get_csv2_ullong((X),(Y),231)
+#define get_csv2_ip_pos231(X,Y) get_csv2_ip((X),(Y),231)
+#define get_csv2_ipv6_pos231(X,Y) get_csv2_ipv6((X),(Y),231)
+#define get_csv2_string_pos231(X,Y) get_csv2_string((X),(Y),231)
+#define get_csv2_v_str_pos231(X,Y) get_csv2_string((X),(Y),231)
+#define get_csv2_bool_pos231(X,Y) get_csv2_bool((X),(Y),231)
+#define get_csv2_int_pos231(X,Y) get_csv2_int((X),(Y),231)
+#define get_csv2_llong_pos231(X,Y) get_csv2_llong((X),(Y),231)
+#define get_csv2_float_pos231(X,Y) get_csv2_float((X),(Y),231)
+#define get_csv2_uint_pos232(X,Y) get_csv2_uint((X),(Y),232)
+#define get_csv2_ullong_pos232(X,Y) get_csv2_ullong((X),(Y),232)
+#define get_csv2_ip_pos232(X,Y) get_csv2_ip((X),(Y),232)
+#define get_csv2_ipv6_pos232(X,Y) get_csv2_ipv6((X),(Y),232)
+#define get_csv2_string_pos232(X,Y) get_csv2_string((X),(Y),232)
+#define get_csv2_v_str_pos232(X,Y) get_csv2_string((X),(Y),232)
+#define get_csv2_bool_pos232(X,Y) get_csv2_bool((X),(Y),232)
+#define get_csv2_int_pos232(X,Y) get_csv2_int((X),(Y),232)
+#define get_csv2_llong_pos232(X,Y) get_csv2_llong((X),(Y),232)
+#define get_csv2_float_pos232(X,Y) get_csv2_float((X),(Y),232)
+#define get_csv2_uint_pos233(X,Y) get_csv2_uint((X),(Y),233)
+#define get_csv2_ullong_pos233(X,Y) get_csv2_ullong((X),(Y),233)
+#define get_csv2_ip_pos233(X,Y) get_csv2_ip((X),(Y),233)
+#define get_csv2_ipv6_pos233(X,Y) get_csv2_ipv6((X),(Y),233)
+#define get_csv2_string_pos233(X,Y) get_csv2_string((X),(Y),233)
+#define get_csv2_v_str_pos233(X,Y) get_csv2_string((X),(Y),233)
+#define get_csv2_bool_pos233(X,Y) get_csv2_bool((X),(Y),233)
+#define get_csv2_int_pos233(X,Y) get_csv2_int((X),(Y),233)
+#define get_csv2_llong_pos233(X,Y) get_csv2_llong((X),(Y),233)
+#define get_csv2_float_pos233(X,Y) get_csv2_float((X),(Y),233)
+#define get_csv2_uint_pos234(X,Y) get_csv2_uint((X),(Y),234)
+#define get_csv2_ullong_pos234(X,Y) get_csv2_ullong((X),(Y),234)
+#define get_csv2_ip_pos234(X,Y) get_csv2_ip((X),(Y),234)
+#define get_csv2_ipv6_pos234(X,Y) get_csv2_ipv6((X),(Y),234)
+#define get_csv2_string_pos234(X,Y) get_csv2_string((X),(Y),234)
+#define get_csv2_v_str_pos234(X,Y) get_csv2_string((X),(Y),234)
+#define get_csv2_bool_pos234(X,Y) get_csv2_bool((X),(Y),234)
+#define get_csv2_int_pos234(X,Y) get_csv2_int((X),(Y),234)
+#define get_csv2_llong_pos234(X,Y) get_csv2_llong((X),(Y),234)
+#define get_csv2_float_pos234(X,Y) get_csv2_float((X),(Y),234)
+#define get_csv2_uint_pos235(X,Y) get_csv2_uint((X),(Y),235)
+#define get_csv2_ullong_pos235(X,Y) get_csv2_ullong((X),(Y),235)
+#define get_csv2_ip_pos235(X,Y) get_csv2_ip((X),(Y),235)
+#define get_csv2_ipv6_pos235(X,Y) get_csv2_ipv6((X),(Y),235)
+#define get_csv2_string_pos235(X,Y) get_csv2_string((X),(Y),235)
+#define get_csv2_v_str_pos235(X,Y) get_csv2_string((X),(Y),235)
+#define get_csv2_bool_pos235(X,Y) get_csv2_bool((X),(Y),235)
+#define get_csv2_int_pos235(X,Y) get_csv2_int((X),(Y),235)
+#define get_csv2_llong_pos235(X,Y) get_csv2_llong((X),(Y),235)
+#define get_csv2_float_pos235(X,Y) get_csv2_float((X),(Y),235)
+#define get_csv2_uint_pos236(X,Y) get_csv2_uint((X),(Y),236)
+#define get_csv2_ullong_pos236(X,Y) get_csv2_ullong((X),(Y),236)
+#define get_csv2_ip_pos236(X,Y) get_csv2_ip((X),(Y),236)
+#define get_csv2_ipv6_pos236(X,Y) get_csv2_ipv6((X),(Y),236)
+#define get_csv2_string_pos236(X,Y) get_csv2_string((X),(Y),236)
+#define get_csv2_v_str_pos236(X,Y) get_csv2_string((X),(Y),236)
+#define get_csv2_bool_pos236(X,Y) get_csv2_bool((X),(Y),236)
+#define get_csv2_int_pos236(X,Y) get_csv2_int((X),(Y),236)
+#define get_csv2_llong_pos236(X,Y) get_csv2_llong((X),(Y),236)
+#define get_csv2_float_pos236(X,Y) get_csv2_float((X),(Y),236)
+#define get_csv2_uint_pos237(X,Y) get_csv2_uint((X),(Y),237)
+#define get_csv2_ullong_pos237(X,Y) get_csv2_ullong((X),(Y),237)
+#define get_csv2_ip_pos237(X,Y) get_csv2_ip((X),(Y),237)
+#define get_csv2_ipv6_pos237(X,Y) get_csv2_ipv6((X),(Y),237)
+#define get_csv2_string_pos237(X,Y) get_csv2_string((X),(Y),237)
+#define get_csv2_v_str_pos237(X,Y) get_csv2_string((X),(Y),237)
+#define get_csv2_bool_pos237(X,Y) get_csv2_bool((X),(Y),237)
+#define get_csv2_int_pos237(X,Y) get_csv2_int((X),(Y),237)
+#define get_csv2_llong_pos237(X,Y) get_csv2_llong((X),(Y),237)
+#define get_csv2_float_pos237(X,Y) get_csv2_float((X),(Y),237)
+#define get_csv2_uint_pos238(X,Y) get_csv2_uint((X),(Y),238)
+#define get_csv2_ullong_pos238(X,Y) get_csv2_ullong((X),(Y),238)
+#define get_csv2_ip_pos238(X,Y) get_csv2_ip((X),(Y),238)
+#define get_csv2_ipv6_pos238(X,Y) get_csv2_ipv6((X),(Y),238)
+#define get_csv2_string_pos238(X,Y) get_csv2_string((X),(Y),238)
+#define get_csv2_v_str_pos238(X,Y) get_csv2_string((X),(Y),238)
+#define get_csv2_bool_pos238(X,Y) get_csv2_bool((X),(Y),238)
+#define get_csv2_int_pos238(X,Y) get_csv2_int((X),(Y),238)
+#define get_csv2_llong_pos238(X,Y) get_csv2_llong((X),(Y),238)
+#define get_csv2_float_pos238(X,Y) get_csv2_float((X),(Y),238)
+#define get_csv2_uint_pos239(X,Y) get_csv2_uint((X),(Y),239)
+#define get_csv2_ullong_pos239(X,Y) get_csv2_ullong((X),(Y),239)
+#define get_csv2_ip_pos239(X,Y) get_csv2_ip((X),(Y),239)
+#define get_csv2_ipv6_pos239(X,Y) get_csv2_ipv6((X),(Y),239)
+#define get_csv2_string_pos239(X,Y) get_csv2_string((X),(Y),239)
+#define get_csv2_v_str_pos239(X,Y) get_csv2_string((X),(Y),239)
+#define get_csv2_bool_pos239(X,Y) get_csv2_bool((X),(Y),239)
+#define get_csv2_int_pos239(X,Y) get_csv2_int((X),(Y),239)
+#define get_csv2_llong_pos239(X,Y) get_csv2_llong((X),(Y),239)
+#define get_csv2_float_pos239(X,Y) get_csv2_float((X),(Y),239)
+#define get_csv2_uint_pos240(X,Y) get_csv2_uint((X),(Y),240)
+#define get_csv2_ullong_pos240(X,Y) get_csv2_ullong((X),(Y),240)
+#define get_csv2_ip_pos240(X,Y) get_csv2_ip((X),(Y),240)
+#define get_csv2_ipv6_pos240(X,Y) get_csv2_ipv6((X),(Y),240)
+#define get_csv2_string_pos240(X,Y) get_csv2_string((X),(Y),240)
+#define get_csv2_v_str_pos240(X,Y) get_csv2_string((X),(Y),240)
+#define get_csv2_bool_pos240(X,Y) get_csv2_bool((X),(Y),240)
+#define get_csv2_int_pos240(X,Y) get_csv2_int((X),(Y),240)
+#define get_csv2_llong_pos240(X,Y) get_csv2_llong((X),(Y),240)
+#define get_csv2_float_pos240(X,Y) get_csv2_float((X),(Y),240)
+#define get_csv2_uint_pos241(X,Y) get_csv2_uint((X),(Y),241)
+#define get_csv2_ullong_pos241(X,Y) get_csv2_ullong((X),(Y),241)
+#define get_csv2_ip_pos241(X,Y) get_csv2_ip((X),(Y),241)
+#define get_csv2_ipv6_pos241(X,Y) get_csv2_ipv6((X),(Y),241)
+#define get_csv2_string_pos241(X,Y) get_csv2_string((X),(Y),241)
+#define get_csv2_v_str_pos241(X,Y) get_csv2_string((X),(Y),241)
+#define get_csv2_bool_pos241(X,Y) get_csv2_bool((X),(Y),241)
+#define get_csv2_int_pos241(X,Y) get_csv2_int((X),(Y),241)
+#define get_csv2_llong_pos241(X,Y) get_csv2_llong((X),(Y),241)
+#define get_csv2_float_pos241(X,Y) get_csv2_float((X),(Y),241)
+#define get_csv2_uint_pos242(X,Y) get_csv2_uint((X),(Y),242)
+#define get_csv2_ullong_pos242(X,Y) get_csv2_ullong((X),(Y),242)
+#define get_csv2_ip_pos242(X,Y) get_csv2_ip((X),(Y),242)
+#define get_csv2_ipv6_pos242(X,Y) get_csv2_ipv6((X),(Y),242)
+#define get_csv2_string_pos242(X,Y) get_csv2_string((X),(Y),242)
+#define get_csv2_v_str_pos242(X,Y) get_csv2_string((X),(Y),242)
+#define get_csv2_bool_pos242(X,Y) get_csv2_bool((X),(Y),242)
+#define get_csv2_int_pos242(X,Y) get_csv2_int((X),(Y),242)
+#define get_csv2_llong_pos242(X,Y) get_csv2_llong((X),(Y),242)
+#define get_csv2_float_pos242(X,Y) get_csv2_float((X),(Y),242)
+#define get_csv2_uint_pos243(X,Y) get_csv2_uint((X),(Y),243)
+#define get_csv2_ullong_pos243(X,Y) get_csv2_ullong((X),(Y),243)
+#define get_csv2_ip_pos243(X,Y) get_csv2_ip((X),(Y),243)
+#define get_csv2_ipv6_pos243(X,Y) get_csv2_ipv6((X),(Y),243)
+#define get_csv2_string_pos243(X,Y) get_csv2_string((X),(Y),243)
+#define get_csv2_v_str_pos243(X,Y) get_csv2_string((X),(Y),243)
+#define get_csv2_bool_pos243(X,Y) get_csv2_bool((X),(Y),243)
+#define get_csv2_int_pos243(X,Y) get_csv2_int((X),(Y),243)
+#define get_csv2_llong_pos243(X,Y) get_csv2_llong((X),(Y),243)
+#define get_csv2_float_pos243(X,Y) get_csv2_float((X),(Y),243)
+#define get_csv2_uint_pos244(X,Y) get_csv2_uint((X),(Y),244)
+#define get_csv2_ullong_pos244(X,Y) get_csv2_ullong((X),(Y),244)
+#define get_csv2_ip_pos244(X,Y) get_csv2_ip((X),(Y),244)
+#define get_csv2_ipv6_pos244(X,Y) get_csv2_ipv6((X),(Y),244)
+#define get_csv2_string_pos244(X,Y) get_csv2_string((X),(Y),244)
+#define get_csv2_v_str_pos244(X,Y) get_csv2_string((X),(Y),244)
+#define get_csv2_bool_pos244(X,Y) get_csv2_bool((X),(Y),244)
+#define get_csv2_int_pos244(X,Y) get_csv2_int((X),(Y),244)
+#define get_csv2_llong_pos244(X,Y) get_csv2_llong((X),(Y),244)
+#define get_csv2_float_pos244(X,Y) get_csv2_float((X),(Y),244)
+#define get_csv2_uint_pos245(X,Y) get_csv2_uint((X),(Y),245)
+#define get_csv2_ullong_pos245(X,Y) get_csv2_ullong((X),(Y),245)
+#define get_csv2_ip_pos245(X,Y) get_csv2_ip((X),(Y),245)
+#define get_csv2_ipv6_pos245(X,Y) get_csv2_ipv6((X),(Y),245)
+#define get_csv2_string_pos245(X,Y) get_csv2_string((X),(Y),245)
+#define get_csv2_v_str_pos245(X,Y) get_csv2_string((X),(Y),245)
+#define get_csv2_bool_pos245(X,Y) get_csv2_bool((X),(Y),245)
+#define get_csv2_int_pos245(X,Y) get_csv2_int((X),(Y),245)
+#define get_csv2_llong_pos245(X,Y) get_csv2_llong((X),(Y),245)
+#define get_csv2_float_pos245(X,Y) get_csv2_float((X),(Y),245)
+#define get_csv2_uint_pos246(X,Y) get_csv2_uint((X),(Y),246)
+#define get_csv2_ullong_pos246(X,Y) get_csv2_ullong((X),(Y),246)
+#define get_csv2_ip_pos246(X,Y) get_csv2_ip((X),(Y),246)
+#define get_csv2_ipv6_pos246(X,Y) get_csv2_ipv6((X),(Y),246)
+#define get_csv2_string_pos246(X,Y) get_csv2_string((X),(Y),246)
+#define get_csv2_v_str_pos246(X,Y) get_csv2_string((X),(Y),246)
+#define get_csv2_bool_pos246(X,Y) get_csv2_bool((X),(Y),246)
+#define get_csv2_int_pos246(X,Y) get_csv2_int((X),(Y),246)
+#define get_csv2_llong_pos246(X,Y) get_csv2_llong((X),(Y),246)
+#define get_csv2_float_pos246(X,Y) get_csv2_float((X),(Y),246)
+#define get_csv2_uint_pos247(X,Y) get_csv2_uint((X),(Y),247)
+#define get_csv2_ullong_pos247(X,Y) get_csv2_ullong((X),(Y),247)
+#define get_csv2_ip_pos247(X,Y) get_csv2_ip((X),(Y),247)
+#define get_csv2_ipv6_pos247(X,Y) get_csv2_ipv6((X),(Y),247)
+#define get_csv2_string_pos247(X,Y) get_csv2_string((X),(Y),247)
+#define get_csv2_v_str_pos247(X,Y) get_csv2_string((X),(Y),247)
+#define get_csv2_bool_pos247(X,Y) get_csv2_bool((X),(Y),247)
+#define get_csv2_int_pos247(X,Y) get_csv2_int((X),(Y),247)
+#define get_csv2_llong_pos247(X,Y) get_csv2_llong((X),(Y),247)
+#define get_csv2_float_pos247(X,Y) get_csv2_float((X),(Y),247)
+#define get_csv2_uint_pos248(X,Y) get_csv2_uint((X),(Y),248)
+#define get_csv2_ullong_pos248(X,Y) get_csv2_ullong((X),(Y),248)
+#define get_csv2_ip_pos248(X,Y) get_csv2_ip((X),(Y),248)
+#define get_csv2_ipv6_pos248(X,Y) get_csv2_ipv6((X),(Y),248)
+#define get_csv2_string_pos248(X,Y) get_csv2_string((X),(Y),248)
+#define get_csv2_v_str_pos248(X,Y) get_csv2_string((X),(Y),248)
+#define get_csv2_bool_pos248(X,Y) get_csv2_bool((X),(Y),248)
+#define get_csv2_int_pos248(X,Y) get_csv2_int((X),(Y),248)
+#define get_csv2_llong_pos248(X,Y) get_csv2_llong((X),(Y),248)
+#define get_csv2_float_pos248(X,Y) get_csv2_float((X),(Y),248)
+#define get_csv2_uint_pos249(X,Y) get_csv2_uint((X),(Y),249)
+#define get_csv2_ullong_pos249(X,Y) get_csv2_ullong((X),(Y),249)
+#define get_csv2_ip_pos249(X,Y) get_csv2_ip((X),(Y),249)
+#define get_csv2_ipv6_pos249(X,Y) get_csv2_ipv6((X),(Y),249)
+#define get_csv2_string_pos249(X,Y) get_csv2_string((X),(Y),249)
+#define get_csv2_v_str_pos249(X,Y) get_csv2_string((X),(Y),249)
+#define get_csv2_bool_pos249(X,Y) get_csv2_bool((X),(Y),249)
+#define get_csv2_int_pos249(X,Y) get_csv2_int((X),(Y),249)
+#define get_csv2_llong_pos249(X,Y) get_csv2_llong((X),(Y),249)
+#define get_csv2_float_pos249(X,Y) get_csv2_float((X),(Y),249)
+#define get_csv2_uint_pos250(X,Y) get_csv2_uint((X),(Y),250)
+#define get_csv2_ullong_pos250(X,Y) get_csv2_ullong((X),(Y),250)
+#define get_csv2_ip_pos250(X,Y) get_csv2_ip((X),(Y),250)
+#define get_csv2_ipv6_pos250(X,Y) get_csv2_ipv6((X),(Y),250)
+#define get_csv2_string_pos250(X,Y) get_csv2_string((X),(Y),250)
+#define get_csv2_v_str_pos250(X,Y) get_csv2_string((X),(Y),250)
+#define get_csv2_bool_pos250(X,Y) get_csv2_bool((X),(Y),250)
+#define get_csv2_int_pos250(X,Y) get_csv2_int((X),(Y),250)
+#define get_csv2_llong_pos250(X,Y) get_csv2_llong((X),(Y),250)
+#define get_csv2_float_pos250(X,Y) get_csv2_float((X),(Y),250)
+#define get_csv2_uint_pos251(X,Y) get_csv2_uint((X),(Y),251)
+#define get_csv2_ullong_pos251(X,Y) get_csv2_ullong((X),(Y),251)
+#define get_csv2_ip_pos251(X,Y) get_csv2_ip((X),(Y),251)
+#define get_csv2_ipv6_pos251(X,Y) get_csv2_ipv6((X),(Y),251)
+#define get_csv2_string_pos251(X,Y) get_csv2_string((X),(Y),251)
+#define get_csv2_v_str_pos251(X,Y) get_csv2_string((X),(Y),251)
+#define get_csv2_bool_pos251(X,Y) get_csv2_bool((X),(Y),251)
+#define get_csv2_int_pos251(X,Y) get_csv2_int((X),(Y),251)
+#define get_csv2_llong_pos251(X,Y) get_csv2_llong((X),(Y),251)
+#define get_csv2_float_pos251(X,Y) get_csv2_float((X),(Y),251)
+#define get_csv2_uint_pos252(X,Y) get_csv2_uint((X),(Y),252)
+#define get_csv2_ullong_pos252(X,Y) get_csv2_ullong((X),(Y),252)
+#define get_csv2_ip_pos252(X,Y) get_csv2_ip((X),(Y),252)
+#define get_csv2_ipv6_pos252(X,Y) get_csv2_ipv6((X),(Y),252)
+#define get_csv2_string_pos252(X,Y) get_csv2_string((X),(Y),252)
+#define get_csv2_v_str_pos252(X,Y) get_csv2_string((X),(Y),252)
+#define get_csv2_bool_pos252(X,Y) get_csv2_bool((X),(Y),252)
+#define get_csv2_int_pos252(X,Y) get_csv2_int((X),(Y),252)
+#define get_csv2_llong_pos252(X,Y) get_csv2_llong((X),(Y),252)
+#define get_csv2_float_pos252(X,Y) get_csv2_float((X),(Y),252)
+#define get_csv2_uint_pos253(X,Y) get_csv2_uint((X),(Y),253)
+#define get_csv2_ullong_pos253(X,Y) get_csv2_ullong((X),(Y),253)
+#define get_csv2_ip_pos253(X,Y) get_csv2_ip((X),(Y),253)
+#define get_csv2_ipv6_pos253(X,Y) get_csv2_ipv6((X),(Y),253)
+#define get_csv2_string_pos253(X,Y) get_csv2_string((X),(Y),253)
+#define get_csv2_v_str_pos253(X,Y) get_csv2_string((X),(Y),253)
+#define get_csv2_bool_pos253(X,Y) get_csv2_bool((X),(Y),253)
+#define get_csv2_int_pos253(X,Y) get_csv2_int((X),(Y),253)
+#define get_csv2_llong_pos253(X,Y) get_csv2_llong((X),(Y),253)
+#define get_csv2_float_pos253(X,Y) get_csv2_float((X),(Y),253)
+#define get_csv2_uint_pos254(X,Y) get_csv2_uint((X),(Y),254)
+#define get_csv2_ullong_pos254(X,Y) get_csv2_ullong((X),(Y),254)
+#define get_csv2_ip_pos254(X,Y) get_csv2_ip((X),(Y),254)
+#define get_csv2_ipv6_pos254(X,Y) get_csv2_ipv6((X),(Y),254)
+#define get_csv2_string_pos254(X,Y) get_csv2_string((X),(Y),254)
+#define get_csv2_v_str_pos254(X,Y) get_csv2_string((X),(Y),254)
+#define get_csv2_bool_pos254(X,Y) get_csv2_bool((X),(Y),254)
+#define get_csv2_int_pos254(X,Y) get_csv2_int((X),(Y),254)
+#define get_csv2_llong_pos254(X,Y) get_csv2_llong((X),(Y),254)
+#define get_csv2_float_pos254(X,Y) get_csv2_float((X),(Y),254)
+#define get_csv2_uint_pos255(X,Y) get_csv2_uint((X),(Y),255)
+#define get_csv2_ullong_pos255(X,Y) get_csv2_ullong((X),(Y),255)
+#define get_csv2_ip_pos255(X,Y) get_csv2_ip((X),(Y),255)
+#define get_csv2_ipv6_pos255(X,Y) get_csv2_ipv6((X),(Y),255)
+#define get_csv2_string_pos255(X,Y) get_csv2_string((X),(Y),255)
+#define get_csv2_v_str_pos255(X,Y) get_csv2_string((X),(Y),255)
+#define get_csv2_bool_pos255(X,Y) get_csv2_bool((X),(Y),255)
+#define get_csv2_int_pos255(X,Y) get_csv2_int((X),(Y),255)
+#define get_csv2_llong_pos255(X,Y) get_csv2_llong((X),(Y),255)
+#define get_csv2_float_pos255(X,Y) get_csv2_float((X),(Y),255)
+#define get_csv2_uint_pos256(X,Y) get_csv2_uint((X),(Y),256)
+#define get_csv2_ullong_pos256(X,Y) get_csv2_ullong((X),(Y),256)
+#define get_csv2_ip_pos256(X,Y) get_csv2_ip((X),(Y),256)
+#define get_csv2_ipv6_pos256(X,Y) get_csv2_ipv6((X),(Y),256)
+#define get_csv2_string_pos256(X,Y) get_csv2_string((X),(Y),256)
+#define get_csv2_v_str_pos256(X,Y) get_csv2_string((X),(Y),256)
+#define get_csv2_bool_pos256(X,Y) get_csv2_bool((X),(Y),256)
+#define get_csv2_int_pos256(X,Y) get_csv2_int((X),(Y),256)
+#define get_csv2_llong_pos256(X,Y) get_csv2_llong((X),(Y),256)
+#define get_csv2_float_pos256(X,Y) get_csv2_float((X),(Y),256)
+#define get_csv2_uint_pos257(X,Y) get_csv2_uint((X),(Y),257)
+#define get_csv2_ullong_pos257(X,Y) get_csv2_ullong((X),(Y),257)
+#define get_csv2_ip_pos257(X,Y) get_csv2_ip((X),(Y),257)
+#define get_csv2_ipv6_pos257(X,Y) get_csv2_ipv6((X),(Y),257)
+#define get_csv2_string_pos257(X,Y) get_csv2_string((X),(Y),257)
+#define get_csv2_v_str_pos257(X,Y) get_csv2_string((X),(Y),257)
+#define get_csv2_bool_pos257(X,Y) get_csv2_bool((X),(Y),257)
+#define get_csv2_int_pos257(X,Y) get_csv2_int((X),(Y),257)
+#define get_csv2_llong_pos257(X,Y) get_csv2_llong((X),(Y),257)
+#define get_csv2_float_pos257(X,Y) get_csv2_float((X),(Y),257)
+#define get_csv2_uint_pos258(X,Y) get_csv2_uint((X),(Y),258)
+#define get_csv2_ullong_pos258(X,Y) get_csv2_ullong((X),(Y),258)
+#define get_csv2_ip_pos258(X,Y) get_csv2_ip((X),(Y),258)
+#define get_csv2_ipv6_pos258(X,Y) get_csv2_ipv6((X),(Y),258)
+#define get_csv2_string_pos258(X,Y) get_csv2_string((X),(Y),258)
+#define get_csv2_v_str_pos258(X,Y) get_csv2_string((X),(Y),258)
+#define get_csv2_bool_pos258(X,Y) get_csv2_bool((X),(Y),258)
+#define get_csv2_int_pos258(X,Y) get_csv2_int((X),(Y),258)
+#define get_csv2_llong_pos258(X,Y) get_csv2_llong((X),(Y),258)
+#define get_csv2_float_pos258(X,Y) get_csv2_float((X),(Y),258)
+#define get_csv2_uint_pos259(X,Y) get_csv2_uint((X),(Y),259)
+#define get_csv2_ullong_pos259(X,Y) get_csv2_ullong((X),(Y),259)
+#define get_csv2_ip_pos259(X,Y) get_csv2_ip((X),(Y),259)
+#define get_csv2_ipv6_pos259(X,Y) get_csv2_ipv6((X),(Y),259)
+#define get_csv2_string_pos259(X,Y) get_csv2_string((X),(Y),259)
+#define get_csv2_v_str_pos259(X,Y) get_csv2_string((X),(Y),259)
+#define get_csv2_bool_pos259(X,Y) get_csv2_bool((X),(Y),259)
+#define get_csv2_int_pos259(X,Y) get_csv2_int((X),(Y),259)
+#define get_csv2_llong_pos259(X,Y) get_csv2_llong((X),(Y),259)
+#define get_csv2_float_pos259(X,Y) get_csv2_float((X),(Y),259)
+#define get_csv2_uint_pos260(X,Y) get_csv2_uint((X),(Y),260)
+#define get_csv2_ullong_pos260(X,Y) get_csv2_ullong((X),(Y),260)
+#define get_csv2_ip_pos260(X,Y) get_csv2_ip((X),(Y),260)
+#define get_csv2_ipv6_pos260(X,Y) get_csv2_ipv6((X),(Y),260)
+#define get_csv2_string_pos260(X,Y) get_csv2_string((X),(Y),260)
+#define get_csv2_v_str_pos260(X,Y) get_csv2_string((X),(Y),260)
+#define get_csv2_bool_pos260(X,Y) get_csv2_bool((X),(Y),260)
+#define get_csv2_int_pos260(X,Y) get_csv2_int((X),(Y),260)
+#define get_csv2_llong_pos260(X,Y) get_csv2_llong((X),(Y),260)
+#define get_csv2_float_pos260(X,Y) get_csv2_float((X),(Y),260)
+#define get_csv2_uint_pos261(X,Y) get_csv2_uint((X),(Y),261)
+#define get_csv2_ullong_pos261(X,Y) get_csv2_ullong((X),(Y),261)
+#define get_csv2_ip_pos261(X,Y) get_csv2_ip((X),(Y),261)
+#define get_csv2_ipv6_pos261(X,Y) get_csv2_ipv6((X),(Y),261)
+#define get_csv2_string_pos261(X,Y) get_csv2_string((X),(Y),261)
+#define get_csv2_v_str_pos261(X,Y) get_csv2_string((X),(Y),261)
+#define get_csv2_bool_pos261(X,Y) get_csv2_bool((X),(Y),261)
+#define get_csv2_int_pos261(X,Y) get_csv2_int((X),(Y),261)
+#define get_csv2_llong_pos261(X,Y) get_csv2_llong((X),(Y),261)
+#define get_csv2_float_pos261(X,Y) get_csv2_float((X),(Y),261)
+#define get_csv2_uint_pos262(X,Y) get_csv2_uint((X),(Y),262)
+#define get_csv2_ullong_pos262(X,Y) get_csv2_ullong((X),(Y),262)
+#define get_csv2_ip_pos262(X,Y) get_csv2_ip((X),(Y),262)
+#define get_csv2_ipv6_pos262(X,Y) get_csv2_ipv6((X),(Y),262)
+#define get_csv2_string_pos262(X,Y) get_csv2_string((X),(Y),262)
+#define get_csv2_v_str_pos262(X,Y) get_csv2_string((X),(Y),262)
+#define get_csv2_bool_pos262(X,Y) get_csv2_bool((X),(Y),262)
+#define get_csv2_int_pos262(X,Y) get_csv2_int((X),(Y),262)
+#define get_csv2_llong_pos262(X,Y) get_csv2_llong((X),(Y),262)
+#define get_csv2_float_pos262(X,Y) get_csv2_float((X),(Y),262)
+#define get_csv2_uint_pos263(X,Y) get_csv2_uint((X),(Y),263)
+#define get_csv2_ullong_pos263(X,Y) get_csv2_ullong((X),(Y),263)
+#define get_csv2_ip_pos263(X,Y) get_csv2_ip((X),(Y),263)
+#define get_csv2_ipv6_pos263(X,Y) get_csv2_ipv6((X),(Y),263)
+#define get_csv2_string_pos263(X,Y) get_csv2_string((X),(Y),263)
+#define get_csv2_v_str_pos263(X,Y) get_csv2_string((X),(Y),263)
+#define get_csv2_bool_pos263(X,Y) get_csv2_bool((X),(Y),263)
+#define get_csv2_int_pos263(X,Y) get_csv2_int((X),(Y),263)
+#define get_csv2_llong_pos263(X,Y) get_csv2_llong((X),(Y),263)
+#define get_csv2_float_pos263(X,Y) get_csv2_float((X),(Y),263)
+#define get_csv2_uint_pos264(X,Y) get_csv2_uint((X),(Y),264)
+#define get_csv2_ullong_pos264(X,Y) get_csv2_ullong((X),(Y),264)
+#define get_csv2_ip_pos264(X,Y) get_csv2_ip((X),(Y),264)
+#define get_csv2_ipv6_pos264(X,Y) get_csv2_ipv6((X),(Y),264)
+#define get_csv2_string_pos264(X,Y) get_csv2_string((X),(Y),264)
+#define get_csv2_v_str_pos264(X,Y) get_csv2_string((X),(Y),264)
+#define get_csv2_bool_pos264(X,Y) get_csv2_bool((X),(Y),264)
+#define get_csv2_int_pos264(X,Y) get_csv2_int((X),(Y),264)
+#define get_csv2_llong_pos264(X,Y) get_csv2_llong((X),(Y),264)
+#define get_csv2_float_pos264(X,Y) get_csv2_float((X),(Y),264)
+#define get_csv2_uint_pos265(X,Y) get_csv2_uint((X),(Y),265)
+#define get_csv2_ullong_pos265(X,Y) get_csv2_ullong((X),(Y),265)
+#define get_csv2_ip_pos265(X,Y) get_csv2_ip((X),(Y),265)
+#define get_csv2_ipv6_pos265(X,Y) get_csv2_ipv6((X),(Y),265)
+#define get_csv2_string_pos265(X,Y) get_csv2_string((X),(Y),265)
+#define get_csv2_v_str_pos265(X,Y) get_csv2_string((X),(Y),265)
+#define get_csv2_bool_pos265(X,Y) get_csv2_bool((X),(Y),265)
+#define get_csv2_int_pos265(X,Y) get_csv2_int((X),(Y),265)
+#define get_csv2_llong_pos265(X,Y) get_csv2_llong((X),(Y),265)
+#define get_csv2_float_pos265(X,Y) get_csv2_float((X),(Y),265)
+#define get_csv2_uint_pos266(X,Y) get_csv2_uint((X),(Y),266)
+#define get_csv2_ullong_pos266(X,Y) get_csv2_ullong((X),(Y),266)
+#define get_csv2_ip_pos266(X,Y) get_csv2_ip((X),(Y),266)
+#define get_csv2_ipv6_pos266(X,Y) get_csv2_ipv6((X),(Y),266)
+#define get_csv2_string_pos266(X,Y) get_csv2_string((X),(Y),266)
+#define get_csv2_v_str_pos266(X,Y) get_csv2_string((X),(Y),266)
+#define get_csv2_bool_pos266(X,Y) get_csv2_bool((X),(Y),266)
+#define get_csv2_int_pos266(X,Y) get_csv2_int((X),(Y),266)
+#define get_csv2_llong_pos266(X,Y) get_csv2_llong((X),(Y),266)
+#define get_csv2_float_pos266(X,Y) get_csv2_float((X),(Y),266)
+#define get_csv2_uint_pos267(X,Y) get_csv2_uint((X),(Y),267)
+#define get_csv2_ullong_pos267(X,Y) get_csv2_ullong((X),(Y),267)
+#define get_csv2_ip_pos267(X,Y) get_csv2_ip((X),(Y),267)
+#define get_csv2_ipv6_pos267(X,Y) get_csv2_ipv6((X),(Y),267)
+#define get_csv2_string_pos267(X,Y) get_csv2_string((X),(Y),267)
+#define get_csv2_v_str_pos267(X,Y) get_csv2_string((X),(Y),267)
+#define get_csv2_bool_pos267(X,Y) get_csv2_bool((X),(Y),267)
+#define get_csv2_int_pos267(X,Y) get_csv2_int((X),(Y),267)
+#define get_csv2_llong_pos267(X,Y) get_csv2_llong((X),(Y),267)
+#define get_csv2_float_pos267(X,Y) get_csv2_float((X),(Y),267)
+#define get_csv2_uint_pos268(X,Y) get_csv2_uint((X),(Y),268)
+#define get_csv2_ullong_pos268(X,Y) get_csv2_ullong((X),(Y),268)
+#define get_csv2_ip_pos268(X,Y) get_csv2_ip((X),(Y),268)
+#define get_csv2_ipv6_pos268(X,Y) get_csv2_ipv6((X),(Y),268)
+#define get_csv2_string_pos268(X,Y) get_csv2_string((X),(Y),268)
+#define get_csv2_v_str_pos268(X,Y) get_csv2_string((X),(Y),268)
+#define get_csv2_bool_pos268(X,Y) get_csv2_bool((X),(Y),268)
+#define get_csv2_int_pos268(X,Y) get_csv2_int((X),(Y),268)
+#define get_csv2_llong_pos268(X,Y) get_csv2_llong((X),(Y),268)
+#define get_csv2_float_pos268(X,Y) get_csv2_float((X),(Y),268)
+#define get_csv2_uint_pos269(X,Y) get_csv2_uint((X),(Y),269)
+#define get_csv2_ullong_pos269(X,Y) get_csv2_ullong((X),(Y),269)
+#define get_csv2_ip_pos269(X,Y) get_csv2_ip((X),(Y),269)
+#define get_csv2_ipv6_pos269(X,Y) get_csv2_ipv6((X),(Y),269)
+#define get_csv2_string_pos269(X,Y) get_csv2_string((X),(Y),269)
+#define get_csv2_v_str_pos269(X,Y) get_csv2_string((X),(Y),269)
+#define get_csv2_bool_pos269(X,Y) get_csv2_bool((X),(Y),269)
+#define get_csv2_int_pos269(X,Y) get_csv2_int((X),(Y),269)
+#define get_csv2_llong_pos269(X,Y) get_csv2_llong((X),(Y),269)
+#define get_csv2_float_pos269(X,Y) get_csv2_float((X),(Y),269)
+#define get_csv2_uint_pos270(X,Y) get_csv2_uint((X),(Y),270)
+#define get_csv2_ullong_pos270(X,Y) get_csv2_ullong((X),(Y),270)
+#define get_csv2_ip_pos270(X,Y) get_csv2_ip((X),(Y),270)
+#define get_csv2_ipv6_pos270(X,Y) get_csv2_ipv6((X),(Y),270)
+#define get_csv2_string_pos270(X,Y) get_csv2_string((X),(Y),270)
+#define get_csv2_v_str_pos270(X,Y) get_csv2_string((X),(Y),270)
+#define get_csv2_bool_pos270(X,Y) get_csv2_bool((X),(Y),270)
+#define get_csv2_int_pos270(X,Y) get_csv2_int((X),(Y),270)
+#define get_csv2_llong_pos270(X,Y) get_csv2_llong((X),(Y),270)
+#define get_csv2_float_pos270(X,Y) get_csv2_float((X),(Y),270)
+#define get_csv2_uint_pos271(X,Y) get_csv2_uint((X),(Y),271)
+#define get_csv2_ullong_pos271(X,Y) get_csv2_ullong((X),(Y),271)
+#define get_csv2_ip_pos271(X,Y) get_csv2_ip((X),(Y),271)
+#define get_csv2_ipv6_pos271(X,Y) get_csv2_ipv6((X),(Y),271)
+#define get_csv2_string_pos271(X,Y) get_csv2_string((X),(Y),271)
+#define get_csv2_v_str_pos271(X,Y) get_csv2_string((X),(Y),271)
+#define get_csv2_bool_pos271(X,Y) get_csv2_bool((X),(Y),271)
+#define get_csv2_int_pos271(X,Y) get_csv2_int((X),(Y),271)
+#define get_csv2_llong_pos271(X,Y) get_csv2_llong((X),(Y),271)
+#define get_csv2_float_pos271(X,Y) get_csv2_float((X),(Y),271)
+#define get_csv2_uint_pos272(X,Y) get_csv2_uint((X),(Y),272)
+#define get_csv2_ullong_pos272(X,Y) get_csv2_ullong((X),(Y),272)
+#define get_csv2_ip_pos272(X,Y) get_csv2_ip((X),(Y),272)
+#define get_csv2_ipv6_pos272(X,Y) get_csv2_ipv6((X),(Y),272)
+#define get_csv2_string_pos272(X,Y) get_csv2_string((X),(Y),272)
+#define get_csv2_v_str_pos272(X,Y) get_csv2_string((X),(Y),272)
+#define get_csv2_bool_pos272(X,Y) get_csv2_bool((X),(Y),272)
+#define get_csv2_int_pos272(X,Y) get_csv2_int((X),(Y),272)
+#define get_csv2_llong_pos272(X,Y) get_csv2_llong((X),(Y),272)
+#define get_csv2_float_pos272(X,Y) get_csv2_float((X),(Y),272)
+#define get_csv2_uint_pos273(X,Y) get_csv2_uint((X),(Y),273)
+#define get_csv2_ullong_pos273(X,Y) get_csv2_ullong((X),(Y),273)
+#define get_csv2_ip_pos273(X,Y) get_csv2_ip((X),(Y),273)
+#define get_csv2_ipv6_pos273(X,Y) get_csv2_ipv6((X),(Y),273)
+#define get_csv2_string_pos273(X,Y) get_csv2_string((X),(Y),273)
+#define get_csv2_v_str_pos273(X,Y) get_csv2_string((X),(Y),273)
+#define get_csv2_bool_pos273(X,Y) get_csv2_bool((X),(Y),273)
+#define get_csv2_int_pos273(X,Y) get_csv2_int((X),(Y),273)
+#define get_csv2_llong_pos273(X,Y) get_csv2_llong((X),(Y),273)
+#define get_csv2_float_pos273(X,Y) get_csv2_float((X),(Y),273)
+#define get_csv2_uint_pos274(X,Y) get_csv2_uint((X),(Y),274)
+#define get_csv2_ullong_pos274(X,Y) get_csv2_ullong((X),(Y),274)
+#define get_csv2_ip_pos274(X,Y) get_csv2_ip((X),(Y),274)
+#define get_csv2_ipv6_pos274(X,Y) get_csv2_ipv6((X),(Y),274)
+#define get_csv2_string_pos274(X,Y) get_csv2_string((X),(Y),274)
+#define get_csv2_v_str_pos274(X,Y) get_csv2_string((X),(Y),274)
+#define get_csv2_bool_pos274(X,Y) get_csv2_bool((X),(Y),274)
+#define get_csv2_int_pos274(X,Y) get_csv2_int((X),(Y),274)
+#define get_csv2_llong_pos274(X,Y) get_csv2_llong((X),(Y),274)
+#define get_csv2_float_pos274(X,Y) get_csv2_float((X),(Y),274)
+#define get_csv2_uint_pos275(X,Y) get_csv2_uint((X),(Y),275)
+#define get_csv2_ullong_pos275(X,Y) get_csv2_ullong((X),(Y),275)
+#define get_csv2_ip_pos275(X,Y) get_csv2_ip((X),(Y),275)
+#define get_csv2_ipv6_pos275(X,Y) get_csv2_ipv6((X),(Y),275)
+#define get_csv2_string_pos275(X,Y) get_csv2_string((X),(Y),275)
+#define get_csv2_v_str_pos275(X,Y) get_csv2_string((X),(Y),275)
+#define get_csv2_bool_pos275(X,Y) get_csv2_bool((X),(Y),275)
+#define get_csv2_int_pos275(X,Y) get_csv2_int((X),(Y),275)
+#define get_csv2_llong_pos275(X,Y) get_csv2_llong((X),(Y),275)
+#define get_csv2_float_pos275(X,Y) get_csv2_float((X),(Y),275)
+#define get_csv2_uint_pos276(X,Y) get_csv2_uint((X),(Y),276)
+#define get_csv2_ullong_pos276(X,Y) get_csv2_ullong((X),(Y),276)
+#define get_csv2_ip_pos276(X,Y) get_csv2_ip((X),(Y),276)
+#define get_csv2_ipv6_pos276(X,Y) get_csv2_ipv6((X),(Y),276)
+#define get_csv2_string_pos276(X,Y) get_csv2_string((X),(Y),276)
+#define get_csv2_v_str_pos276(X,Y) get_csv2_string((X),(Y),276)
+#define get_csv2_bool_pos276(X,Y) get_csv2_bool((X),(Y),276)
+#define get_csv2_int_pos276(X,Y) get_csv2_int((X),(Y),276)
+#define get_csv2_llong_pos276(X,Y) get_csv2_llong((X),(Y),276)
+#define get_csv2_float_pos276(X,Y) get_csv2_float((X),(Y),276)
+#define get_csv2_uint_pos277(X,Y) get_csv2_uint((X),(Y),277)
+#define get_csv2_ullong_pos277(X,Y) get_csv2_ullong((X),(Y),277)
+#define get_csv2_ip_pos277(X,Y) get_csv2_ip((X),(Y),277)
+#define get_csv2_ipv6_pos277(X,Y) get_csv2_ipv6((X),(Y),277)
+#define get_csv2_string_pos277(X,Y) get_csv2_string((X),(Y),277)
+#define get_csv2_v_str_pos277(X,Y) get_csv2_string((X),(Y),277)
+#define get_csv2_bool_pos277(X,Y) get_csv2_bool((X),(Y),277)
+#define get_csv2_int_pos277(X,Y) get_csv2_int((X),(Y),277)
+#define get_csv2_llong_pos277(X,Y) get_csv2_llong((X),(Y),277)
+#define get_csv2_float_pos277(X,Y) get_csv2_float((X),(Y),277)
+#define get_csv2_uint_pos278(X,Y) get_csv2_uint((X),(Y),278)
+#define get_csv2_ullong_pos278(X,Y) get_csv2_ullong((X),(Y),278)
+#define get_csv2_ip_pos278(X,Y) get_csv2_ip((X),(Y),278)
+#define get_csv2_ipv6_pos278(X,Y) get_csv2_ipv6((X),(Y),278)
+#define get_csv2_string_pos278(X,Y) get_csv2_string((X),(Y),278)
+#define get_csv2_v_str_pos278(X,Y) get_csv2_string((X),(Y),278)
+#define get_csv2_bool_pos278(X,Y) get_csv2_bool((X),(Y),278)
+#define get_csv2_int_pos278(X,Y) get_csv2_int((X),(Y),278)
+#define get_csv2_llong_pos278(X,Y) get_csv2_llong((X),(Y),278)
+#define get_csv2_float_pos278(X,Y) get_csv2_float((X),(Y),278)
+#define get_csv2_uint_pos279(X,Y) get_csv2_uint((X),(Y),279)
+#define get_csv2_ullong_pos279(X,Y) get_csv2_ullong((X),(Y),279)
+#define get_csv2_ip_pos279(X,Y) get_csv2_ip((X),(Y),279)
+#define get_csv2_ipv6_pos279(X,Y) get_csv2_ipv6((X),(Y),279)
+#define get_csv2_string_pos279(X,Y) get_csv2_string((X),(Y),279)
+#define get_csv2_v_str_pos279(X,Y) get_csv2_string((X),(Y),279)
+#define get_csv2_bool_pos279(X,Y) get_csv2_bool((X),(Y),279)
+#define get_csv2_int_pos279(X,Y) get_csv2_int((X),(Y),279)
+#define get_csv2_llong_pos279(X,Y) get_csv2_llong((X),(Y),279)
+#define get_csv2_float_pos279(X,Y) get_csv2_float((X),(Y),279)
+#define get_csv2_uint_pos280(X,Y) get_csv2_uint((X),(Y),280)
+#define get_csv2_ullong_pos280(X,Y) get_csv2_ullong((X),(Y),280)
+#define get_csv2_ip_pos280(X,Y) get_csv2_ip((X),(Y),280)
+#define get_csv2_ipv6_pos280(X,Y) get_csv2_ipv6((X),(Y),280)
+#define get_csv2_string_pos280(X,Y) get_csv2_string((X),(Y),280)
+#define get_csv2_v_str_pos280(X,Y) get_csv2_string((X),(Y),280)
+#define get_csv2_bool_pos280(X,Y) get_csv2_bool((X),(Y),280)
+#define get_csv2_int_pos280(X,Y) get_csv2_int((X),(Y),280)
+#define get_csv2_llong_pos280(X,Y) get_csv2_llong((X),(Y),280)
+#define get_csv2_float_pos280(X,Y) get_csv2_float((X),(Y),280)
+#define get_csv2_uint_pos281(X,Y) get_csv2_uint((X),(Y),281)
+#define get_csv2_ullong_pos281(X,Y) get_csv2_ullong((X),(Y),281)
+#define get_csv2_ip_pos281(X,Y) get_csv2_ip((X),(Y),281)
+#define get_csv2_ipv6_pos281(X,Y) get_csv2_ipv6((X),(Y),281)
+#define get_csv2_string_pos281(X,Y) get_csv2_string((X),(Y),281)
+#define get_csv2_v_str_pos281(X,Y) get_csv2_string((X),(Y),281)
+#define get_csv2_bool_pos281(X,Y) get_csv2_bool((X),(Y),281)
+#define get_csv2_int_pos281(X,Y) get_csv2_int((X),(Y),281)
+#define get_csv2_llong_pos281(X,Y) get_csv2_llong((X),(Y),281)
+#define get_csv2_float_pos281(X,Y) get_csv2_float((X),(Y),281)
+#define get_csv2_uint_pos282(X,Y) get_csv2_uint((X),(Y),282)
+#define get_csv2_ullong_pos282(X,Y) get_csv2_ullong((X),(Y),282)
+#define get_csv2_ip_pos282(X,Y) get_csv2_ip((X),(Y),282)
+#define get_csv2_ipv6_pos282(X,Y) get_csv2_ipv6((X),(Y),282)
+#define get_csv2_string_pos282(X,Y) get_csv2_string((X),(Y),282)
+#define get_csv2_v_str_pos282(X,Y) get_csv2_string((X),(Y),282)
+#define get_csv2_bool_pos282(X,Y) get_csv2_bool((X),(Y),282)
+#define get_csv2_int_pos282(X,Y) get_csv2_int((X),(Y),282)
+#define get_csv2_llong_pos282(X,Y) get_csv2_llong((X),(Y),282)
+#define get_csv2_float_pos282(X,Y) get_csv2_float((X),(Y),282)
+#define get_csv2_uint_pos283(X,Y) get_csv2_uint((X),(Y),283)
+#define get_csv2_ullong_pos283(X,Y) get_csv2_ullong((X),(Y),283)
+#define get_csv2_ip_pos283(X,Y) get_csv2_ip((X),(Y),283)
+#define get_csv2_ipv6_pos283(X,Y) get_csv2_ipv6((X),(Y),283)
+#define get_csv2_string_pos283(X,Y) get_csv2_string((X),(Y),283)
+#define get_csv2_v_str_pos283(X,Y) get_csv2_string((X),(Y),283)
+#define get_csv2_bool_pos283(X,Y) get_csv2_bool((X),(Y),283)
+#define get_csv2_int_pos283(X,Y) get_csv2_int((X),(Y),283)
+#define get_csv2_llong_pos283(X,Y) get_csv2_llong((X),(Y),283)
+#define get_csv2_float_pos283(X,Y) get_csv2_float((X),(Y),283)
+#define get_csv2_uint_pos284(X,Y) get_csv2_uint((X),(Y),284)
+#define get_csv2_ullong_pos284(X,Y) get_csv2_ullong((X),(Y),284)
+#define get_csv2_ip_pos284(X,Y) get_csv2_ip((X),(Y),284)
+#define get_csv2_ipv6_pos284(X,Y) get_csv2_ipv6((X),(Y),284)
+#define get_csv2_string_pos284(X,Y) get_csv2_string((X),(Y),284)
+#define get_csv2_v_str_pos284(X,Y) get_csv2_string((X),(Y),284)
+#define get_csv2_bool_pos284(X,Y) get_csv2_bool((X),(Y),284)
+#define get_csv2_int_pos284(X,Y) get_csv2_int((X),(Y),284)
+#define get_csv2_llong_pos284(X,Y) get_csv2_llong((X),(Y),284)
+#define get_csv2_float_pos284(X,Y) get_csv2_float((X),(Y),284)
+#define get_csv2_uint_pos285(X,Y) get_csv2_uint((X),(Y),285)
+#define get_csv2_ullong_pos285(X,Y) get_csv2_ullong((X),(Y),285)
+#define get_csv2_ip_pos285(X,Y) get_csv2_ip((X),(Y),285)
+#define get_csv2_ipv6_pos285(X,Y) get_csv2_ipv6((X),(Y),285)
+#define get_csv2_string_pos285(X,Y) get_csv2_string((X),(Y),285)
+#define get_csv2_v_str_pos285(X,Y) get_csv2_string((X),(Y),285)
+#define get_csv2_bool_pos285(X,Y) get_csv2_bool((X),(Y),285)
+#define get_csv2_int_pos285(X,Y) get_csv2_int((X),(Y),285)
+#define get_csv2_llong_pos285(X,Y) get_csv2_llong((X),(Y),285)
+#define get_csv2_float_pos285(X,Y) get_csv2_float((X),(Y),285)
+#define get_csv2_uint_pos286(X,Y) get_csv2_uint((X),(Y),286)
+#define get_csv2_ullong_pos286(X,Y) get_csv2_ullong((X),(Y),286)
+#define get_csv2_ip_pos286(X,Y) get_csv2_ip((X),(Y),286)
+#define get_csv2_ipv6_pos286(X,Y) get_csv2_ipv6((X),(Y),286)
+#define get_csv2_string_pos286(X,Y) get_csv2_string((X),(Y),286)
+#define get_csv2_v_str_pos286(X,Y) get_csv2_string((X),(Y),286)
+#define get_csv2_bool_pos286(X,Y) get_csv2_bool((X),(Y),286)
+#define get_csv2_int_pos286(X,Y) get_csv2_int((X),(Y),286)
+#define get_csv2_llong_pos286(X,Y) get_csv2_llong((X),(Y),286)
+#define get_csv2_float_pos286(X,Y) get_csv2_float((X),(Y),286)
+#define get_csv2_uint_pos287(X,Y) get_csv2_uint((X),(Y),287)
+#define get_csv2_ullong_pos287(X,Y) get_csv2_ullong((X),(Y),287)
+#define get_csv2_ip_pos287(X,Y) get_csv2_ip((X),(Y),287)
+#define get_csv2_ipv6_pos287(X,Y) get_csv2_ipv6((X),(Y),287)
+#define get_csv2_string_pos287(X,Y) get_csv2_string((X),(Y),287)
+#define get_csv2_v_str_pos287(X,Y) get_csv2_string((X),(Y),287)
+#define get_csv2_bool_pos287(X,Y) get_csv2_bool((X),(Y),287)
+#define get_csv2_int_pos287(X,Y) get_csv2_int((X),(Y),287)
+#define get_csv2_llong_pos287(X,Y) get_csv2_llong((X),(Y),287)
+#define get_csv2_float_pos287(X,Y) get_csv2_float((X),(Y),287)
+#define get_csv2_uint_pos288(X,Y) get_csv2_uint((X),(Y),288)
+#define get_csv2_ullong_pos288(X,Y) get_csv2_ullong((X),(Y),288)
+#define get_csv2_ip_pos288(X,Y) get_csv2_ip((X),(Y),288)
+#define get_csv2_ipv6_pos288(X,Y) get_csv2_ipv6((X),(Y),288)
+#define get_csv2_string_pos288(X,Y) get_csv2_string((X),(Y),288)
+#define get_csv2_v_str_pos288(X,Y) get_csv2_string((X),(Y),288)
+#define get_csv2_bool_pos288(X,Y) get_csv2_bool((X),(Y),288)
+#define get_csv2_int_pos288(X,Y) get_csv2_int((X),(Y),288)
+#define get_csv2_llong_pos288(X,Y) get_csv2_llong((X),(Y),288)
+#define get_csv2_float_pos288(X,Y) get_csv2_float((X),(Y),288)
+#define get_csv2_uint_pos289(X,Y) get_csv2_uint((X),(Y),289)
+#define get_csv2_ullong_pos289(X,Y) get_csv2_ullong((X),(Y),289)
+#define get_csv2_ip_pos289(X,Y) get_csv2_ip((X),(Y),289)
+#define get_csv2_ipv6_pos289(X,Y) get_csv2_ipv6((X),(Y),289)
+#define get_csv2_string_pos289(X,Y) get_csv2_string((X),(Y),289)
+#define get_csv2_v_str_pos289(X,Y) get_csv2_string((X),(Y),289)
+#define get_csv2_bool_pos289(X,Y) get_csv2_bool((X),(Y),289)
+#define get_csv2_int_pos289(X,Y) get_csv2_int((X),(Y),289)
+#define get_csv2_llong_pos289(X,Y) get_csv2_llong((X),(Y),289)
+#define get_csv2_float_pos289(X,Y) get_csv2_float((X),(Y),289)
+#define get_csv2_uint_pos290(X,Y) get_csv2_uint((X),(Y),290)
+#define get_csv2_ullong_pos290(X,Y) get_csv2_ullong((X),(Y),290)
+#define get_csv2_ip_pos290(X,Y) get_csv2_ip((X),(Y),290)
+#define get_csv2_ipv6_pos290(X,Y) get_csv2_ipv6((X),(Y),290)
+#define get_csv2_string_pos290(X,Y) get_csv2_string((X),(Y),290)
+#define get_csv2_v_str_pos290(X,Y) get_csv2_string((X),(Y),290)
+#define get_csv2_bool_pos290(X,Y) get_csv2_bool((X),(Y),290)
+#define get_csv2_int_pos290(X,Y) get_csv2_int((X),(Y),290)
+#define get_csv2_llong_pos290(X,Y) get_csv2_llong((X),(Y),290)
+#define get_csv2_float_pos290(X,Y) get_csv2_float((X),(Y),290)
+#define get_csv2_uint_pos291(X,Y) get_csv2_uint((X),(Y),291)
+#define get_csv2_ullong_pos291(X,Y) get_csv2_ullong((X),(Y),291)
+#define get_csv2_ip_pos291(X,Y) get_csv2_ip((X),(Y),291)
+#define get_csv2_ipv6_pos291(X,Y) get_csv2_ipv6((X),(Y),291)
+#define get_csv2_string_pos291(X,Y) get_csv2_string((X),(Y),291)
+#define get_csv2_v_str_pos291(X,Y) get_csv2_string((X),(Y),291)
+#define get_csv2_bool_pos291(X,Y) get_csv2_bool((X),(Y),291)
+#define get_csv2_int_pos291(X,Y) get_csv2_int((X),(Y),291)
+#define get_csv2_llong_pos291(X,Y) get_csv2_llong((X),(Y),291)
+#define get_csv2_float_pos291(X,Y) get_csv2_float((X),(Y),291)
+#define get_csv2_uint_pos292(X,Y) get_csv2_uint((X),(Y),292)
+#define get_csv2_ullong_pos292(X,Y) get_csv2_ullong((X),(Y),292)
+#define get_csv2_ip_pos292(X,Y) get_csv2_ip((X),(Y),292)
+#define get_csv2_ipv6_pos292(X,Y) get_csv2_ipv6((X),(Y),292)
+#define get_csv2_string_pos292(X,Y) get_csv2_string((X),(Y),292)
+#define get_csv2_v_str_pos292(X,Y) get_csv2_string((X),(Y),292)
+#define get_csv2_bool_pos292(X,Y) get_csv2_bool((X),(Y),292)
+#define get_csv2_int_pos292(X,Y) get_csv2_int((X),(Y),292)
+#define get_csv2_llong_pos292(X,Y) get_csv2_llong((X),(Y),292)
+#define get_csv2_float_pos292(X,Y) get_csv2_float((X),(Y),292)
+#define get_csv2_uint_pos293(X,Y) get_csv2_uint((X),(Y),293)
+#define get_csv2_ullong_pos293(X,Y) get_csv2_ullong((X),(Y),293)
+#define get_csv2_ip_pos293(X,Y) get_csv2_ip((X),(Y),293)
+#define get_csv2_ipv6_pos293(X,Y) get_csv2_ipv6((X),(Y),293)
+#define get_csv2_string_pos293(X,Y) get_csv2_string((X),(Y),293)
+#define get_csv2_v_str_pos293(X,Y) get_csv2_string((X),(Y),293)
+#define get_csv2_bool_pos293(X,Y) get_csv2_bool((X),(Y),293)
+#define get_csv2_int_pos293(X,Y) get_csv2_int((X),(Y),293)
+#define get_csv2_llong_pos293(X,Y) get_csv2_llong((X),(Y),293)
+#define get_csv2_float_pos293(X,Y) get_csv2_float((X),(Y),293)
+#define get_csv2_uint_pos294(X,Y) get_csv2_uint((X),(Y),294)
+#define get_csv2_ullong_pos294(X,Y) get_csv2_ullong((X),(Y),294)
+#define get_csv2_ip_pos294(X,Y) get_csv2_ip((X),(Y),294)
+#define get_csv2_ipv6_pos294(X,Y) get_csv2_ipv6((X),(Y),294)
+#define get_csv2_string_pos294(X,Y) get_csv2_string((X),(Y),294)
+#define get_csv2_v_str_pos294(X,Y) get_csv2_string((X),(Y),294)
+#define get_csv2_bool_pos294(X,Y) get_csv2_bool((X),(Y),294)
+#define get_csv2_int_pos294(X,Y) get_csv2_int((X),(Y),294)
+#define get_csv2_llong_pos294(X,Y) get_csv2_llong((X),(Y),294)
+#define get_csv2_float_pos294(X,Y) get_csv2_float((X),(Y),294)
+#define get_csv2_uint_pos295(X,Y) get_csv2_uint((X),(Y),295)
+#define get_csv2_ullong_pos295(X,Y) get_csv2_ullong((X),(Y),295)
+#define get_csv2_ip_pos295(X,Y) get_csv2_ip((X),(Y),295)
+#define get_csv2_ipv6_pos295(X,Y) get_csv2_ipv6((X),(Y),295)
+#define get_csv2_string_pos295(X,Y) get_csv2_string((X),(Y),295)
+#define get_csv2_v_str_pos295(X,Y) get_csv2_string((X),(Y),295)
+#define get_csv2_bool_pos295(X,Y) get_csv2_bool((X),(Y),295)
+#define get_csv2_int_pos295(X,Y) get_csv2_int((X),(Y),295)
+#define get_csv2_llong_pos295(X,Y) get_csv2_llong((X),(Y),295)
+#define get_csv2_float_pos295(X,Y) get_csv2_float((X),(Y),295)
+#define get_csv2_uint_pos296(X,Y) get_csv2_uint((X),(Y),296)
+#define get_csv2_ullong_pos296(X,Y) get_csv2_ullong((X),(Y),296)
+#define get_csv2_ip_pos296(X,Y) get_csv2_ip((X),(Y),296)
+#define get_csv2_ipv6_pos296(X,Y) get_csv2_ipv6((X),(Y),296)
+#define get_csv2_string_pos296(X,Y) get_csv2_string((X),(Y),296)
+#define get_csv2_v_str_pos296(X,Y) get_csv2_string((X),(Y),296)
+#define get_csv2_bool_pos296(X,Y) get_csv2_bool((X),(Y),296)
+#define get_csv2_int_pos296(X,Y) get_csv2_int((X),(Y),296)
+#define get_csv2_llong_pos296(X,Y) get_csv2_llong((X),(Y),296)
+#define get_csv2_float_pos296(X,Y) get_csv2_float((X),(Y),296)
+#define get_csv2_uint_pos297(X,Y) get_csv2_uint((X),(Y),297)
+#define get_csv2_ullong_pos297(X,Y) get_csv2_ullong((X),(Y),297)
+#define get_csv2_ip_pos297(X,Y) get_csv2_ip((X),(Y),297)
+#define get_csv2_ipv6_pos297(X,Y) get_csv2_ipv6((X),(Y),297)
+#define get_csv2_string_pos297(X,Y) get_csv2_string((X),(Y),297)
+#define get_csv2_v_str_pos297(X,Y) get_csv2_string((X),(Y),297)
+#define get_csv2_bool_pos297(X,Y) get_csv2_bool((X),(Y),297)
+#define get_csv2_int_pos297(X,Y) get_csv2_int((X),(Y),297)
+#define get_csv2_llong_pos297(X,Y) get_csv2_llong((X),(Y),297)
+#define get_csv2_float_pos297(X,Y) get_csv2_float((X),(Y),297)
+#define get_csv2_uint_pos298(X,Y) get_csv2_uint((X),(Y),298)
+#define get_csv2_ullong_pos298(X,Y) get_csv2_ullong((X),(Y),298)
+#define get_csv2_ip_pos298(X,Y) get_csv2_ip((X),(Y),298)
+#define get_csv2_ipv6_pos298(X,Y) get_csv2_ipv6((X),(Y),298)
+#define get_csv2_string_pos298(X,Y) get_csv2_string((X),(Y),298)
+#define get_csv2_v_str_pos298(X,Y) get_csv2_string((X),(Y),298)
+#define get_csv2_bool_pos298(X,Y) get_csv2_bool((X),(Y),298)
+#define get_csv2_int_pos298(X,Y) get_csv2_int((X),(Y),298)
+#define get_csv2_llong_pos298(X,Y) get_csv2_llong((X),(Y),298)
+#define get_csv2_float_pos298(X,Y) get_csv2_float((X),(Y),298)
+#define get_csv2_uint_pos299(X,Y) get_csv2_uint((X),(Y),299)
+#define get_csv2_ullong_pos299(X,Y) get_csv2_ullong((X),(Y),299)
+#define get_csv2_ip_pos299(X,Y) get_csv2_ip((X),(Y),299)
+#define get_csv2_ipv6_pos299(X,Y) get_csv2_ipv6((X),(Y),299)
+#define get_csv2_string_pos299(X,Y) get_csv2_string((X),(Y),299)
+#define get_csv2_v_str_pos299(X,Y) get_csv2_string((X),(Y),299)
+#define get_csv2_bool_pos299(X,Y) get_csv2_bool((X),(Y),299)
+#define get_csv2_int_pos299(X,Y) get_csv2_int((X),(Y),299)
+#define get_csv2_llong_pos299(X,Y) get_csv2_llong((X),(Y),299)
+#define get_csv2_float_pos299(X,Y) get_csv2_float((X),(Y),299)
+#define get_csv2_uint_pos300(X,Y) get_csv2_uint((X),(Y),300)
+#define get_csv2_ullong_pos300(X,Y) get_csv2_ullong((X),(Y),300)
+#define get_csv2_ip_pos300(X,Y) get_csv2_ip((X),(Y),300)
+#define get_csv2_ipv6_pos300(X,Y) get_csv2_ipv6((X),(Y),300)
+#define get_csv2_string_pos300(X,Y) get_csv2_string((X),(Y),300)
+#define get_csv2_v_str_pos300(X,Y) get_csv2_string((X),(Y),300)
+#define get_csv2_bool_pos300(X,Y) get_csv2_bool((X),(Y),300)
+#define get_csv2_int_pos300(X,Y) get_csv2_int((X),(Y),300)
+#define get_csv2_llong_pos300(X,Y) get_csv2_llong((X),(Y),300)
+#define get_csv2_float_pos300(X,Y) get_csv2_float((X),(Y),300)
+#define get_csv2_uint_pos301(X,Y) get_csv2_uint((X),(Y),301)
+#define get_csv2_ullong_pos301(X,Y) get_csv2_ullong((X),(Y),301)
+#define get_csv2_ip_pos301(X,Y) get_csv2_ip((X),(Y),301)
+#define get_csv2_ipv6_pos301(X,Y) get_csv2_ipv6((X),(Y),301)
+#define get_csv2_string_pos301(X,Y) get_csv2_string((X),(Y),301)
+#define get_csv2_v_str_pos301(X,Y) get_csv2_string((X),(Y),301)
+#define get_csv2_bool_pos301(X,Y) get_csv2_bool((X),(Y),301)
+#define get_csv2_int_pos301(X,Y) get_csv2_int((X),(Y),301)
+#define get_csv2_llong_pos301(X,Y) get_csv2_llong((X),(Y),301)
+#define get_csv2_float_pos301(X,Y) get_csv2_float((X),(Y),301)
+#define get_csv2_uint_pos302(X,Y) get_csv2_uint((X),(Y),302)
+#define get_csv2_ullong_pos302(X,Y) get_csv2_ullong((X),(Y),302)
+#define get_csv2_ip_pos302(X,Y) get_csv2_ip((X),(Y),302)
+#define get_csv2_ipv6_pos302(X,Y) get_csv2_ipv6((X),(Y),302)
+#define get_csv2_string_pos302(X,Y) get_csv2_string((X),(Y),302)
+#define get_csv2_v_str_pos302(X,Y) get_csv2_string((X),(Y),302)
+#define get_csv2_bool_pos302(X,Y) get_csv2_bool((X),(Y),302)
+#define get_csv2_int_pos302(X,Y) get_csv2_int((X),(Y),302)
+#define get_csv2_llong_pos302(X,Y) get_csv2_llong((X),(Y),302)
+#define get_csv2_float_pos302(X,Y) get_csv2_float((X),(Y),302)
+#define get_csv2_uint_pos303(X,Y) get_csv2_uint((X),(Y),303)
+#define get_csv2_ullong_pos303(X,Y) get_csv2_ullong((X),(Y),303)
+#define get_csv2_ip_pos303(X,Y) get_csv2_ip((X),(Y),303)
+#define get_csv2_ipv6_pos303(X,Y) get_csv2_ipv6((X),(Y),303)
+#define get_csv2_string_pos303(X,Y) get_csv2_string((X),(Y),303)
+#define get_csv2_v_str_pos303(X,Y) get_csv2_string((X),(Y),303)
+#define get_csv2_bool_pos303(X,Y) get_csv2_bool((X),(Y),303)
+#define get_csv2_int_pos303(X,Y) get_csv2_int((X),(Y),303)
+#define get_csv2_llong_pos303(X,Y) get_csv2_llong((X),(Y),303)
+#define get_csv2_float_pos303(X,Y) get_csv2_float((X),(Y),303)
+#define get_csv2_uint_pos304(X,Y) get_csv2_uint((X),(Y),304)
+#define get_csv2_ullong_pos304(X,Y) get_csv2_ullong((X),(Y),304)
+#define get_csv2_ip_pos304(X,Y) get_csv2_ip((X),(Y),304)
+#define get_csv2_ipv6_pos304(X,Y) get_csv2_ipv6((X),(Y),304)
+#define get_csv2_string_pos304(X,Y) get_csv2_string((X),(Y),304)
+#define get_csv2_v_str_pos304(X,Y) get_csv2_string((X),(Y),304)
+#define get_csv2_bool_pos304(X,Y) get_csv2_bool((X),(Y),304)
+#define get_csv2_int_pos304(X,Y) get_csv2_int((X),(Y),304)
+#define get_csv2_llong_pos304(X,Y) get_csv2_llong((X),(Y),304)
+#define get_csv2_float_pos304(X,Y) get_csv2_float((X),(Y),304)
+#define get_csv2_uint_pos305(X,Y) get_csv2_uint((X),(Y),305)
+#define get_csv2_ullong_pos305(X,Y) get_csv2_ullong((X),(Y),305)
+#define get_csv2_ip_pos305(X,Y) get_csv2_ip((X),(Y),305)
+#define get_csv2_ipv6_pos305(X,Y) get_csv2_ipv6((X),(Y),305)
+#define get_csv2_string_pos305(X,Y) get_csv2_string((X),(Y),305)
+#define get_csv2_v_str_pos305(X,Y) get_csv2_string((X),(Y),305)
+#define get_csv2_bool_pos305(X,Y) get_csv2_bool((X),(Y),305)
+#define get_csv2_int_pos305(X,Y) get_csv2_int((X),(Y),305)
+#define get_csv2_llong_pos305(X,Y) get_csv2_llong((X),(Y),305)
+#define get_csv2_float_pos305(X,Y) get_csv2_float((X),(Y),305)
+#define get_csv2_uint_pos306(X,Y) get_csv2_uint((X),(Y),306)
+#define get_csv2_ullong_pos306(X,Y) get_csv2_ullong((X),(Y),306)
+#define get_csv2_ip_pos306(X,Y) get_csv2_ip((X),(Y),306)
+#define get_csv2_ipv6_pos306(X,Y) get_csv2_ipv6((X),(Y),306)
+#define get_csv2_string_pos306(X,Y) get_csv2_string((X),(Y),306)
+#define get_csv2_v_str_pos306(X,Y) get_csv2_string((X),(Y),306)
+#define get_csv2_bool_pos306(X,Y) get_csv2_bool((X),(Y),306)
+#define get_csv2_int_pos306(X,Y) get_csv2_int((X),(Y),306)
+#define get_csv2_llong_pos306(X,Y) get_csv2_llong((X),(Y),306)
+#define get_csv2_float_pos306(X,Y) get_csv2_float((X),(Y),306)
+#define get_csv2_uint_pos307(X,Y) get_csv2_uint((X),(Y),307)
+#define get_csv2_ullong_pos307(X,Y) get_csv2_ullong((X),(Y),307)
+#define get_csv2_ip_pos307(X,Y) get_csv2_ip((X),(Y),307)
+#define get_csv2_ipv6_pos307(X,Y) get_csv2_ipv6((X),(Y),307)
+#define get_csv2_string_pos307(X,Y) get_csv2_string((X),(Y),307)
+#define get_csv2_v_str_pos307(X,Y) get_csv2_string((X),(Y),307)
+#define get_csv2_bool_pos307(X,Y) get_csv2_bool((X),(Y),307)
+#define get_csv2_int_pos307(X,Y) get_csv2_int((X),(Y),307)
+#define get_csv2_llong_pos307(X,Y) get_csv2_llong((X),(Y),307)
+#define get_csv2_float_pos307(X,Y) get_csv2_float((X),(Y),307)
+#define get_csv2_uint_pos308(X,Y) get_csv2_uint((X),(Y),308)
+#define get_csv2_ullong_pos308(X,Y) get_csv2_ullong((X),(Y),308)
+#define get_csv2_ip_pos308(X,Y) get_csv2_ip((X),(Y),308)
+#define get_csv2_ipv6_pos308(X,Y) get_csv2_ipv6((X),(Y),308)
+#define get_csv2_string_pos308(X,Y) get_csv2_string((X),(Y),308)
+#define get_csv2_v_str_pos308(X,Y) get_csv2_string((X),(Y),308)
+#define get_csv2_bool_pos308(X,Y) get_csv2_bool((X),(Y),308)
+#define get_csv2_int_pos308(X,Y) get_csv2_int((X),(Y),308)
+#define get_csv2_llong_pos308(X,Y) get_csv2_llong((X),(Y),308)
+#define get_csv2_float_pos308(X,Y) get_csv2_float((X),(Y),308)
+#define get_csv2_uint_pos309(X,Y) get_csv2_uint((X),(Y),309)
+#define get_csv2_ullong_pos309(X,Y) get_csv2_ullong((X),(Y),309)
+#define get_csv2_ip_pos309(X,Y) get_csv2_ip((X),(Y),309)
+#define get_csv2_ipv6_pos309(X,Y) get_csv2_ipv6((X),(Y),309)
+#define get_csv2_string_pos309(X,Y) get_csv2_string((X),(Y),309)
+#define get_csv2_v_str_pos309(X,Y) get_csv2_string((X),(Y),309)
+#define get_csv2_bool_pos309(X,Y) get_csv2_bool((X),(Y),309)
+#define get_csv2_int_pos309(X,Y) get_csv2_int((X),(Y),309)
+#define get_csv2_llong_pos309(X,Y) get_csv2_llong((X),(Y),309)
+#define get_csv2_float_pos309(X,Y) get_csv2_float((X),(Y),309)
+#define get_csv2_uint_pos310(X,Y) get_csv2_uint((X),(Y),310)
+#define get_csv2_ullong_pos310(X,Y) get_csv2_ullong((X),(Y),310)
+#define get_csv2_ip_pos310(X,Y) get_csv2_ip((X),(Y),310)
+#define get_csv2_ipv6_pos310(X,Y) get_csv2_ipv6((X),(Y),310)
+#define get_csv2_string_pos310(X,Y) get_csv2_string((X),(Y),310)
+#define get_csv2_v_str_pos310(X,Y) get_csv2_string((X),(Y),310)
+#define get_csv2_bool_pos310(X,Y) get_csv2_bool((X),(Y),310)
+#define get_csv2_int_pos310(X,Y) get_csv2_int((X),(Y),310)
+#define get_csv2_llong_pos310(X,Y) get_csv2_llong((X),(Y),310)
+#define get_csv2_float_pos310(X,Y) get_csv2_float((X),(Y),310)
+#define get_csv2_uint_pos311(X,Y) get_csv2_uint((X),(Y),311)
+#define get_csv2_ullong_pos311(X,Y) get_csv2_ullong((X),(Y),311)
+#define get_csv2_ip_pos311(X,Y) get_csv2_ip((X),(Y),311)
+#define get_csv2_ipv6_pos311(X,Y) get_csv2_ipv6((X),(Y),311)
+#define get_csv2_string_pos311(X,Y) get_csv2_string((X),(Y),311)
+#define get_csv2_v_str_pos311(X,Y) get_csv2_string((X),(Y),311)
+#define get_csv2_bool_pos311(X,Y) get_csv2_bool((X),(Y),311)
+#define get_csv2_int_pos311(X,Y) get_csv2_int((X),(Y),311)
+#define get_csv2_llong_pos311(X,Y) get_csv2_llong((X),(Y),311)
+#define get_csv2_float_pos311(X,Y) get_csv2_float((X),(Y),311)
+#define get_csv2_uint_pos312(X,Y) get_csv2_uint((X),(Y),312)
+#define get_csv2_ullong_pos312(X,Y) get_csv2_ullong((X),(Y),312)
+#define get_csv2_ip_pos312(X,Y) get_csv2_ip((X),(Y),312)
+#define get_csv2_ipv6_pos312(X,Y) get_csv2_ipv6((X),(Y),312)
+#define get_csv2_string_pos312(X,Y) get_csv2_string((X),(Y),312)
+#define get_csv2_v_str_pos312(X,Y) get_csv2_string((X),(Y),312)
+#define get_csv2_bool_pos312(X,Y) get_csv2_bool((X),(Y),312)
+#define get_csv2_int_pos312(X,Y) get_csv2_int((X),(Y),312)
+#define get_csv2_llong_pos312(X,Y) get_csv2_llong((X),(Y),312)
+#define get_csv2_float_pos312(X,Y) get_csv2_float((X),(Y),312)
+#define get_csv2_uint_pos313(X,Y) get_csv2_uint((X),(Y),313)
+#define get_csv2_ullong_pos313(X,Y) get_csv2_ullong((X),(Y),313)
+#define get_csv2_ip_pos313(X,Y) get_csv2_ip((X),(Y),313)
+#define get_csv2_ipv6_pos313(X,Y) get_csv2_ipv6((X),(Y),313)
+#define get_csv2_string_pos313(X,Y) get_csv2_string((X),(Y),313)
+#define get_csv2_v_str_pos313(X,Y) get_csv2_string((X),(Y),313)
+#define get_csv2_bool_pos313(X,Y) get_csv2_bool((X),(Y),313)
+#define get_csv2_int_pos313(X,Y) get_csv2_int((X),(Y),313)
+#define get_csv2_llong_pos313(X,Y) get_csv2_llong((X),(Y),313)
+#define get_csv2_float_pos313(X,Y) get_csv2_float((X),(Y),313)
+#define get_csv2_uint_pos314(X,Y) get_csv2_uint((X),(Y),314)
+#define get_csv2_ullong_pos314(X,Y) get_csv2_ullong((X),(Y),314)
+#define get_csv2_ip_pos314(X,Y) get_csv2_ip((X),(Y),314)
+#define get_csv2_ipv6_pos314(X,Y) get_csv2_ipv6((X),(Y),314)
+#define get_csv2_string_pos314(X,Y) get_csv2_string((X),(Y),314)
+#define get_csv2_v_str_pos314(X,Y) get_csv2_string((X),(Y),314)
+#define get_csv2_bool_pos314(X,Y) get_csv2_bool((X),(Y),314)
+#define get_csv2_int_pos314(X,Y) get_csv2_int((X),(Y),314)
+#define get_csv2_llong_pos314(X,Y) get_csv2_llong((X),(Y),314)
+#define get_csv2_float_pos314(X,Y) get_csv2_float((X),(Y),314)
+#define get_csv2_uint_pos315(X,Y) get_csv2_uint((X),(Y),315)
+#define get_csv2_ullong_pos315(X,Y) get_csv2_ullong((X),(Y),315)
+#define get_csv2_ip_pos315(X,Y) get_csv2_ip((X),(Y),315)
+#define get_csv2_ipv6_pos315(X,Y) get_csv2_ipv6((X),(Y),315)
+#define get_csv2_string_pos315(X,Y) get_csv2_string((X),(Y),315)
+#define get_csv2_v_str_pos315(X,Y) get_csv2_string((X),(Y),315)
+#define get_csv2_bool_pos315(X,Y) get_csv2_bool((X),(Y),315)
+#define get_csv2_int_pos315(X,Y) get_csv2_int((X),(Y),315)
+#define get_csv2_llong_pos315(X,Y) get_csv2_llong((X),(Y),315)
+#define get_csv2_float_pos315(X,Y) get_csv2_float((X),(Y),315)
+#define get_csv2_uint_pos316(X,Y) get_csv2_uint((X),(Y),316)
+#define get_csv2_ullong_pos316(X,Y) get_csv2_ullong((X),(Y),316)
+#define get_csv2_ip_pos316(X,Y) get_csv2_ip((X),(Y),316)
+#define get_csv2_ipv6_pos316(X,Y) get_csv2_ipv6((X),(Y),316)
+#define get_csv2_string_pos316(X,Y) get_csv2_string((X),(Y),316)
+#define get_csv2_v_str_pos316(X,Y) get_csv2_string((X),(Y),316)
+#define get_csv2_bool_pos316(X,Y) get_csv2_bool((X),(Y),316)
+#define get_csv2_int_pos316(X,Y) get_csv2_int((X),(Y),316)
+#define get_csv2_llong_pos316(X,Y) get_csv2_llong((X),(Y),316)
+#define get_csv2_float_pos316(X,Y) get_csv2_float((X),(Y),316)
+#define get_csv2_uint_pos317(X,Y) get_csv2_uint((X),(Y),317)
+#define get_csv2_ullong_pos317(X,Y) get_csv2_ullong((X),(Y),317)
+#define get_csv2_ip_pos317(X,Y) get_csv2_ip((X),(Y),317)
+#define get_csv2_ipv6_pos317(X,Y) get_csv2_ipv6((X),(Y),317)
+#define get_csv2_string_pos317(X,Y) get_csv2_string((X),(Y),317)
+#define get_csv2_v_str_pos317(X,Y) get_csv2_string((X),(Y),317)
+#define get_csv2_bool_pos317(X,Y) get_csv2_bool((X),(Y),317)
+#define get_csv2_int_pos317(X,Y) get_csv2_int((X),(Y),317)
+#define get_csv2_llong_pos317(X,Y) get_csv2_llong((X),(Y),317)
+#define get_csv2_float_pos317(X,Y) get_csv2_float((X),(Y),317)
+#define get_csv2_uint_pos318(X,Y) get_csv2_uint((X),(Y),318)
+#define get_csv2_ullong_pos318(X,Y) get_csv2_ullong((X),(Y),318)
+#define get_csv2_ip_pos318(X,Y) get_csv2_ip((X),(Y),318)
+#define get_csv2_ipv6_pos318(X,Y) get_csv2_ipv6((X),(Y),318)
+#define get_csv2_string_pos318(X,Y) get_csv2_string((X),(Y),318)
+#define get_csv2_v_str_pos318(X,Y) get_csv2_string((X),(Y),318)
+#define get_csv2_bool_pos318(X,Y) get_csv2_bool((X),(Y),318)
+#define get_csv2_int_pos318(X,Y) get_csv2_int((X),(Y),318)
+#define get_csv2_llong_pos318(X,Y) get_csv2_llong((X),(Y),318)
+#define get_csv2_float_pos318(X,Y) get_csv2_float((X),(Y),318)
+#define get_csv2_uint_pos319(X,Y) get_csv2_uint((X),(Y),319)
+#define get_csv2_ullong_pos319(X,Y) get_csv2_ullong((X),(Y),319)
+#define get_csv2_ip_pos319(X,Y) get_csv2_ip((X),(Y),319)
+#define get_csv2_ipv6_pos319(X,Y) get_csv2_ipv6((X),(Y),319)
+#define get_csv2_string_pos319(X,Y) get_csv2_string((X),(Y),319)
+#define get_csv2_v_str_pos319(X,Y) get_csv2_string((X),(Y),319)
+#define get_csv2_bool_pos319(X,Y) get_csv2_bool((X),(Y),319)
+#define get_csv2_int_pos319(X,Y) get_csv2_int((X),(Y),319)
+#define get_csv2_llong_pos319(X,Y) get_csv2_llong((X),(Y),319)
+#define get_csv2_float_pos319(X,Y) get_csv2_float((X),(Y),319)
+#define get_csv2_uint_pos320(X,Y) get_csv2_uint((X),(Y),320)
+#define get_csv2_ullong_pos320(X,Y) get_csv2_ullong((X),(Y),320)
+#define get_csv2_ip_pos320(X,Y) get_csv2_ip((X),(Y),320)
+#define get_csv2_ipv6_pos320(X,Y) get_csv2_ipv6((X),(Y),320)
+#define get_csv2_string_pos320(X,Y) get_csv2_string((X),(Y),320)
+#define get_csv2_v_str_pos320(X,Y) get_csv2_string((X),(Y),320)
+#define get_csv2_bool_pos320(X,Y) get_csv2_bool((X),(Y),320)
+#define get_csv2_int_pos320(X,Y) get_csv2_int((X),(Y),320)
+#define get_csv2_llong_pos320(X,Y) get_csv2_llong((X),(Y),320)
+#define get_csv2_float_pos320(X,Y) get_csv2_float((X),(Y),320)
+#define get_csv2_uint_pos321(X,Y) get_csv2_uint((X),(Y),321)
+#define get_csv2_ullong_pos321(X,Y) get_csv2_ullong((X),(Y),321)
+#define get_csv2_ip_pos321(X,Y) get_csv2_ip((X),(Y),321)
+#define get_csv2_ipv6_pos321(X,Y) get_csv2_ipv6((X),(Y),321)
+#define get_csv2_string_pos321(X,Y) get_csv2_string((X),(Y),321)
+#define get_csv2_v_str_pos321(X,Y) get_csv2_string((X),(Y),321)
+#define get_csv2_bool_pos321(X,Y) get_csv2_bool((X),(Y),321)
+#define get_csv2_int_pos321(X,Y) get_csv2_int((X),(Y),321)
+#define get_csv2_llong_pos321(X,Y) get_csv2_llong((X),(Y),321)
+#define get_csv2_float_pos321(X,Y) get_csv2_float((X),(Y),321)
+#define get_csv2_uint_pos322(X,Y) get_csv2_uint((X),(Y),322)
+#define get_csv2_ullong_pos322(X,Y) get_csv2_ullong((X),(Y),322)
+#define get_csv2_ip_pos322(X,Y) get_csv2_ip((X),(Y),322)
+#define get_csv2_ipv6_pos322(X,Y) get_csv2_ipv6((X),(Y),322)
+#define get_csv2_string_pos322(X,Y) get_csv2_string((X),(Y),322)
+#define get_csv2_v_str_pos322(X,Y) get_csv2_string((X),(Y),322)
+#define get_csv2_bool_pos322(X,Y) get_csv2_bool((X),(Y),322)
+#define get_csv2_int_pos322(X,Y) get_csv2_int((X),(Y),322)
+#define get_csv2_llong_pos322(X,Y) get_csv2_llong((X),(Y),322)
+#define get_csv2_float_pos322(X,Y) get_csv2_float((X),(Y),322)
+#define get_csv2_uint_pos323(X,Y) get_csv2_uint((X),(Y),323)
+#define get_csv2_ullong_pos323(X,Y) get_csv2_ullong((X),(Y),323)
+#define get_csv2_ip_pos323(X,Y) get_csv2_ip((X),(Y),323)
+#define get_csv2_ipv6_pos323(X,Y) get_csv2_ipv6((X),(Y),323)
+#define get_csv2_string_pos323(X,Y) get_csv2_string((X),(Y),323)
+#define get_csv2_v_str_pos323(X,Y) get_csv2_string((X),(Y),323)
+#define get_csv2_bool_pos323(X,Y) get_csv2_bool((X),(Y),323)
+#define get_csv2_int_pos323(X,Y) get_csv2_int((X),(Y),323)
+#define get_csv2_llong_pos323(X,Y) get_csv2_llong((X),(Y),323)
+#define get_csv2_float_pos323(X,Y) get_csv2_float((X),(Y),323)
+#define get_csv2_uint_pos324(X,Y) get_csv2_uint((X),(Y),324)
+#define get_csv2_ullong_pos324(X,Y) get_csv2_ullong((X),(Y),324)
+#define get_csv2_ip_pos324(X,Y) get_csv2_ip((X),(Y),324)
+#define get_csv2_ipv6_pos324(X,Y) get_csv2_ipv6((X),(Y),324)
+#define get_csv2_string_pos324(X,Y) get_csv2_string((X),(Y),324)
+#define get_csv2_v_str_pos324(X,Y) get_csv2_string((X),(Y),324)
+#define get_csv2_bool_pos324(X,Y) get_csv2_bool((X),(Y),324)
+#define get_csv2_int_pos324(X,Y) get_csv2_int((X),(Y),324)
+#define get_csv2_llong_pos324(X,Y) get_csv2_llong((X),(Y),324)
+#define get_csv2_float_pos324(X,Y) get_csv2_float((X),(Y),324)
+#define get_csv2_uint_pos325(X,Y) get_csv2_uint((X),(Y),325)
+#define get_csv2_ullong_pos325(X,Y) get_csv2_ullong((X),(Y),325)
+#define get_csv2_ip_pos325(X,Y) get_csv2_ip((X),(Y),325)
+#define get_csv2_ipv6_pos325(X,Y) get_csv2_ipv6((X),(Y),325)
+#define get_csv2_string_pos325(X,Y) get_csv2_string((X),(Y),325)
+#define get_csv2_v_str_pos325(X,Y) get_csv2_string((X),(Y),325)
+#define get_csv2_bool_pos325(X,Y) get_csv2_bool((X),(Y),325)
+#define get_csv2_int_pos325(X,Y) get_csv2_int((X),(Y),325)
+#define get_csv2_llong_pos325(X,Y) get_csv2_llong((X),(Y),325)
+#define get_csv2_float_pos325(X,Y) get_csv2_float((X),(Y),325)
+#define get_csv2_uint_pos326(X,Y) get_csv2_uint((X),(Y),326)
+#define get_csv2_ullong_pos326(X,Y) get_csv2_ullong((X),(Y),326)
+#define get_csv2_ip_pos326(X,Y) get_csv2_ip((X),(Y),326)
+#define get_csv2_ipv6_pos326(X,Y) get_csv2_ipv6((X),(Y),326)
+#define get_csv2_string_pos326(X,Y) get_csv2_string((X),(Y),326)
+#define get_csv2_v_str_pos326(X,Y) get_csv2_string((X),(Y),326)
+#define get_csv2_bool_pos326(X,Y) get_csv2_bool((X),(Y),326)
+#define get_csv2_int_pos326(X,Y) get_csv2_int((X),(Y),326)
+#define get_csv2_llong_pos326(X,Y) get_csv2_llong((X),(Y),326)
+#define get_csv2_float_pos326(X,Y) get_csv2_float((X),(Y),326)
+#define get_csv2_uint_pos327(X,Y) get_csv2_uint((X),(Y),327)
+#define get_csv2_ullong_pos327(X,Y) get_csv2_ullong((X),(Y),327)
+#define get_csv2_ip_pos327(X,Y) get_csv2_ip((X),(Y),327)
+#define get_csv2_ipv6_pos327(X,Y) get_csv2_ipv6((X),(Y),327)
+#define get_csv2_string_pos327(X,Y) get_csv2_string((X),(Y),327)
+#define get_csv2_v_str_pos327(X,Y) get_csv2_string((X),(Y),327)
+#define get_csv2_bool_pos327(X,Y) get_csv2_bool((X),(Y),327)
+#define get_csv2_int_pos327(X,Y) get_csv2_int((X),(Y),327)
+#define get_csv2_llong_pos327(X,Y) get_csv2_llong((X),(Y),327)
+#define get_csv2_float_pos327(X,Y) get_csv2_float((X),(Y),327)
+#define get_csv2_uint_pos328(X,Y) get_csv2_uint((X),(Y),328)
+#define get_csv2_ullong_pos328(X,Y) get_csv2_ullong((X),(Y),328)
+#define get_csv2_ip_pos328(X,Y) get_csv2_ip((X),(Y),328)
+#define get_csv2_ipv6_pos328(X,Y) get_csv2_ipv6((X),(Y),328)
+#define get_csv2_string_pos328(X,Y) get_csv2_string((X),(Y),328)
+#define get_csv2_v_str_pos328(X,Y) get_csv2_string((X),(Y),328)
+#define get_csv2_bool_pos328(X,Y) get_csv2_bool((X),(Y),328)
+#define get_csv2_int_pos328(X,Y) get_csv2_int((X),(Y),328)
+#define get_csv2_llong_pos328(X,Y) get_csv2_llong((X),(Y),328)
+#define get_csv2_float_pos328(X,Y) get_csv2_float((X),(Y),328)
+#define get_csv2_uint_pos329(X,Y) get_csv2_uint((X),(Y),329)
+#define get_csv2_ullong_pos329(X,Y) get_csv2_ullong((X),(Y),329)
+#define get_csv2_ip_pos329(X,Y) get_csv2_ip((X),(Y),329)
+#define get_csv2_ipv6_pos329(X,Y) get_csv2_ipv6((X),(Y),329)
+#define get_csv2_string_pos329(X,Y) get_csv2_string((X),(Y),329)
+#define get_csv2_v_str_pos329(X,Y) get_csv2_string((X),(Y),329)
+#define get_csv2_bool_pos329(X,Y) get_csv2_bool((X),(Y),329)
+#define get_csv2_int_pos329(X,Y) get_csv2_int((X),(Y),329)
+#define get_csv2_llong_pos329(X,Y) get_csv2_llong((X),(Y),329)
+#define get_csv2_float_pos329(X,Y) get_csv2_float((X),(Y),329)
+#define get_csv2_uint_pos330(X,Y) get_csv2_uint((X),(Y),330)
+#define get_csv2_ullong_pos330(X,Y) get_csv2_ullong((X),(Y),330)
+#define get_csv2_ip_pos330(X,Y) get_csv2_ip((X),(Y),330)
+#define get_csv2_ipv6_pos330(X,Y) get_csv2_ipv6((X),(Y),330)
+#define get_csv2_string_pos330(X,Y) get_csv2_string((X),(Y),330)
+#define get_csv2_v_str_pos330(X,Y) get_csv2_string((X),(Y),330)
+#define get_csv2_bool_pos330(X,Y) get_csv2_bool((X),(Y),330)
+#define get_csv2_int_pos330(X,Y) get_csv2_int((X),(Y),330)
+#define get_csv2_llong_pos330(X,Y) get_csv2_llong((X),(Y),330)
+#define get_csv2_float_pos330(X,Y) get_csv2_float((X),(Y),330)
+#define get_csv2_uint_pos331(X,Y) get_csv2_uint((X),(Y),331)
+#define get_csv2_ullong_pos331(X,Y) get_csv2_ullong((X),(Y),331)
+#define get_csv2_ip_pos331(X,Y) get_csv2_ip((X),(Y),331)
+#define get_csv2_ipv6_pos331(X,Y) get_csv2_ipv6((X),(Y),331)
+#define get_csv2_string_pos331(X,Y) get_csv2_string((X),(Y),331)
+#define get_csv2_v_str_pos331(X,Y) get_csv2_string((X),(Y),331)
+#define get_csv2_bool_pos331(X,Y) get_csv2_bool((X),(Y),331)
+#define get_csv2_int_pos331(X,Y) get_csv2_int((X),(Y),331)
+#define get_csv2_llong_pos331(X,Y) get_csv2_llong((X),(Y),331)
+#define get_csv2_float_pos331(X,Y) get_csv2_float((X),(Y),331)
+#define get_csv2_uint_pos332(X,Y) get_csv2_uint((X),(Y),332)
+#define get_csv2_ullong_pos332(X,Y) get_csv2_ullong((X),(Y),332)
+#define get_csv2_ip_pos332(X,Y) get_csv2_ip((X),(Y),332)
+#define get_csv2_ipv6_pos332(X,Y) get_csv2_ipv6((X),(Y),332)
+#define get_csv2_string_pos332(X,Y) get_csv2_string((X),(Y),332)
+#define get_csv2_v_str_pos332(X,Y) get_csv2_string((X),(Y),332)
+#define get_csv2_bool_pos332(X,Y) get_csv2_bool((X),(Y),332)
+#define get_csv2_int_pos332(X,Y) get_csv2_int((X),(Y),332)
+#define get_csv2_llong_pos332(X,Y) get_csv2_llong((X),(Y),332)
+#define get_csv2_float_pos332(X,Y) get_csv2_float((X),(Y),332)
+#define get_csv2_uint_pos333(X,Y) get_csv2_uint((X),(Y),333)
+#define get_csv2_ullong_pos333(X,Y) get_csv2_ullong((X),(Y),333)
+#define get_csv2_ip_pos333(X,Y) get_csv2_ip((X),(Y),333)
+#define get_csv2_ipv6_pos333(X,Y) get_csv2_ipv6((X),(Y),333)
+#define get_csv2_string_pos333(X,Y) get_csv2_string((X),(Y),333)
+#define get_csv2_v_str_pos333(X,Y) get_csv2_string((X),(Y),333)
+#define get_csv2_bool_pos333(X,Y) get_csv2_bool((X),(Y),333)
+#define get_csv2_int_pos333(X,Y) get_csv2_int((X),(Y),333)
+#define get_csv2_llong_pos333(X,Y) get_csv2_llong((X),(Y),333)
+#define get_csv2_float_pos333(X,Y) get_csv2_float((X),(Y),333)
+#define get_csv2_uint_pos334(X,Y) get_csv2_uint((X),(Y),334)
+#define get_csv2_ullong_pos334(X,Y) get_csv2_ullong((X),(Y),334)
+#define get_csv2_ip_pos334(X,Y) get_csv2_ip((X),(Y),334)
+#define get_csv2_ipv6_pos334(X,Y) get_csv2_ipv6((X),(Y),334)
+#define get_csv2_string_pos334(X,Y) get_csv2_string((X),(Y),334)
+#define get_csv2_v_str_pos334(X,Y) get_csv2_string((X),(Y),334)
+#define get_csv2_bool_pos334(X,Y) get_csv2_bool((X),(Y),334)
+#define get_csv2_int_pos334(X,Y) get_csv2_int((X),(Y),334)
+#define get_csv2_llong_pos334(X,Y) get_csv2_llong((X),(Y),334)
+#define get_csv2_float_pos334(X,Y) get_csv2_float((X),(Y),334)
+#define get_csv2_uint_pos335(X,Y) get_csv2_uint((X),(Y),335)
+#define get_csv2_ullong_pos335(X,Y) get_csv2_ullong((X),(Y),335)
+#define get_csv2_ip_pos335(X,Y) get_csv2_ip((X),(Y),335)
+#define get_csv2_ipv6_pos335(X,Y) get_csv2_ipv6((X),(Y),335)
+#define get_csv2_string_pos335(X,Y) get_csv2_string((X),(Y),335)
+#define get_csv2_v_str_pos335(X,Y) get_csv2_string((X),(Y),335)
+#define get_csv2_bool_pos335(X,Y) get_csv2_bool((X),(Y),335)
+#define get_csv2_int_pos335(X,Y) get_csv2_int((X),(Y),335)
+#define get_csv2_llong_pos335(X,Y) get_csv2_llong((X),(Y),335)
+#define get_csv2_float_pos335(X,Y) get_csv2_float((X),(Y),335)
+#define get_csv2_uint_pos336(X,Y) get_csv2_uint((X),(Y),336)
+#define get_csv2_ullong_pos336(X,Y) get_csv2_ullong((X),(Y),336)
+#define get_csv2_ip_pos336(X,Y) get_csv2_ip((X),(Y),336)
+#define get_csv2_ipv6_pos336(X,Y) get_csv2_ipv6((X),(Y),336)
+#define get_csv2_string_pos336(X,Y) get_csv2_string((X),(Y),336)
+#define get_csv2_v_str_pos336(X,Y) get_csv2_string((X),(Y),336)
+#define get_csv2_bool_pos336(X,Y) get_csv2_bool((X),(Y),336)
+#define get_csv2_int_pos336(X,Y) get_csv2_int((X),(Y),336)
+#define get_csv2_llong_pos336(X,Y) get_csv2_llong((X),(Y),336)
+#define get_csv2_float_pos336(X,Y) get_csv2_float((X),(Y),336)
+#define get_csv2_uint_pos337(X,Y) get_csv2_uint((X),(Y),337)
+#define get_csv2_ullong_pos337(X,Y) get_csv2_ullong((X),(Y),337)
+#define get_csv2_ip_pos337(X,Y) get_csv2_ip((X),(Y),337)
+#define get_csv2_ipv6_pos337(X,Y) get_csv2_ipv6((X),(Y),337)
+#define get_csv2_string_pos337(X,Y) get_csv2_string((X),(Y),337)
+#define get_csv2_v_str_pos337(X,Y) get_csv2_string((X),(Y),337)
+#define get_csv2_bool_pos337(X,Y) get_csv2_bool((X),(Y),337)
+#define get_csv2_int_pos337(X,Y) get_csv2_int((X),(Y),337)
+#define get_csv2_llong_pos337(X,Y) get_csv2_llong((X),(Y),337)
+#define get_csv2_float_pos337(X,Y) get_csv2_float((X),(Y),337)
+#define get_csv2_uint_pos338(X,Y) get_csv2_uint((X),(Y),338)
+#define get_csv2_ullong_pos338(X,Y) get_csv2_ullong((X),(Y),338)
+#define get_csv2_ip_pos338(X,Y) get_csv2_ip((X),(Y),338)
+#define get_csv2_ipv6_pos338(X,Y) get_csv2_ipv6((X),(Y),338)
+#define get_csv2_string_pos338(X,Y) get_csv2_string((X),(Y),338)
+#define get_csv2_v_str_pos338(X,Y) get_csv2_string((X),(Y),338)
+#define get_csv2_bool_pos338(X,Y) get_csv2_bool((X),(Y),338)
+#define get_csv2_int_pos338(X,Y) get_csv2_int((X),(Y),338)
+#define get_csv2_llong_pos338(X,Y) get_csv2_llong((X),(Y),338)
+#define get_csv2_float_pos338(X,Y) get_csv2_float((X),(Y),338)
+#define get_csv2_uint_pos339(X,Y) get_csv2_uint((X),(Y),339)
+#define get_csv2_ullong_pos339(X,Y) get_csv2_ullong((X),(Y),339)
+#define get_csv2_ip_pos339(X,Y) get_csv2_ip((X),(Y),339)
+#define get_csv2_ipv6_pos339(X,Y) get_csv2_ipv6((X),(Y),339)
+#define get_csv2_string_pos339(X,Y) get_csv2_string((X),(Y),339)
+#define get_csv2_v_str_pos339(X,Y) get_csv2_string((X),(Y),339)
+#define get_csv2_bool_pos339(X,Y) get_csv2_bool((X),(Y),339)
+#define get_csv2_int_pos339(X,Y) get_csv2_int((X),(Y),339)
+#define get_csv2_llong_pos339(X,Y) get_csv2_llong((X),(Y),339)
+#define get_csv2_float_pos339(X,Y) get_csv2_float((X),(Y),339)
+#define get_csv2_uint_pos340(X,Y) get_csv2_uint((X),(Y),340)
+#define get_csv2_ullong_pos340(X,Y) get_csv2_ullong((X),(Y),340)
+#define get_csv2_ip_pos340(X,Y) get_csv2_ip((X),(Y),340)
+#define get_csv2_ipv6_pos340(X,Y) get_csv2_ipv6((X),(Y),340)
+#define get_csv2_string_pos340(X,Y) get_csv2_string((X),(Y),340)
+#define get_csv2_v_str_pos340(X,Y) get_csv2_string((X),(Y),340)
+#define get_csv2_bool_pos340(X,Y) get_csv2_bool((X),(Y),340)
+#define get_csv2_int_pos340(X,Y) get_csv2_int((X),(Y),340)
+#define get_csv2_llong_pos340(X,Y) get_csv2_llong((X),(Y),340)
+#define get_csv2_float_pos340(X,Y) get_csv2_float((X),(Y),340)
+#define get_csv2_uint_pos341(X,Y) get_csv2_uint((X),(Y),341)
+#define get_csv2_ullong_pos341(X,Y) get_csv2_ullong((X),(Y),341)
+#define get_csv2_ip_pos341(X,Y) get_csv2_ip((X),(Y),341)
+#define get_csv2_ipv6_pos341(X,Y) get_csv2_ipv6((X),(Y),341)
+#define get_csv2_string_pos341(X,Y) get_csv2_string((X),(Y),341)
+#define get_csv2_v_str_pos341(X,Y) get_csv2_string((X),(Y),341)
+#define get_csv2_bool_pos341(X,Y) get_csv2_bool((X),(Y),341)
+#define get_csv2_int_pos341(X,Y) get_csv2_int((X),(Y),341)
+#define get_csv2_llong_pos341(X,Y) get_csv2_llong((X),(Y),341)
+#define get_csv2_float_pos341(X,Y) get_csv2_float((X),(Y),341)
+#define get_csv2_uint_pos342(X,Y) get_csv2_uint((X),(Y),342)
+#define get_csv2_ullong_pos342(X,Y) get_csv2_ullong((X),(Y),342)
+#define get_csv2_ip_pos342(X,Y) get_csv2_ip((X),(Y),342)
+#define get_csv2_ipv6_pos342(X,Y) get_csv2_ipv6((X),(Y),342)
+#define get_csv2_string_pos342(X,Y) get_csv2_string((X),(Y),342)
+#define get_csv2_v_str_pos342(X,Y) get_csv2_string((X),(Y),342)
+#define get_csv2_bool_pos342(X,Y) get_csv2_bool((X),(Y),342)
+#define get_csv2_int_pos342(X,Y) get_csv2_int((X),(Y),342)
+#define get_csv2_llong_pos342(X,Y) get_csv2_llong((X),(Y),342)
+#define get_csv2_float_pos342(X,Y) get_csv2_float((X),(Y),342)
+#define get_csv2_uint_pos343(X,Y) get_csv2_uint((X),(Y),343)
+#define get_csv2_ullong_pos343(X,Y) get_csv2_ullong((X),(Y),343)
+#define get_csv2_ip_pos343(X,Y) get_csv2_ip((X),(Y),343)
+#define get_csv2_ipv6_pos343(X,Y) get_csv2_ipv6((X),(Y),343)
+#define get_csv2_string_pos343(X,Y) get_csv2_string((X),(Y),343)
+#define get_csv2_v_str_pos343(X,Y) get_csv2_string((X),(Y),343)
+#define get_csv2_bool_pos343(X,Y) get_csv2_bool((X),(Y),343)
+#define get_csv2_int_pos343(X,Y) get_csv2_int((X),(Y),343)
+#define get_csv2_llong_pos343(X,Y) get_csv2_llong((X),(Y),343)
+#define get_csv2_float_pos343(X,Y) get_csv2_float((X),(Y),343)
+#define get_csv2_uint_pos344(X,Y) get_csv2_uint((X),(Y),344)
+#define get_csv2_ullong_pos344(X,Y) get_csv2_ullong((X),(Y),344)
+#define get_csv2_ip_pos344(X,Y) get_csv2_ip((X),(Y),344)
+#define get_csv2_ipv6_pos344(X,Y) get_csv2_ipv6((X),(Y),344)
+#define get_csv2_string_pos344(X,Y) get_csv2_string((X),(Y),344)
+#define get_csv2_v_str_pos344(X,Y) get_csv2_string((X),(Y),344)
+#define get_csv2_bool_pos344(X,Y) get_csv2_bool((X),(Y),344)
+#define get_csv2_int_pos344(X,Y) get_csv2_int((X),(Y),344)
+#define get_csv2_llong_pos344(X,Y) get_csv2_llong((X),(Y),344)
+#define get_csv2_float_pos344(X,Y) get_csv2_float((X),(Y),344)
+#define get_csv2_uint_pos345(X,Y) get_csv2_uint((X),(Y),345)
+#define get_csv2_ullong_pos345(X,Y) get_csv2_ullong((X),(Y),345)
+#define get_csv2_ip_pos345(X,Y) get_csv2_ip((X),(Y),345)
+#define get_csv2_ipv6_pos345(X,Y) get_csv2_ipv6((X),(Y),345)
+#define get_csv2_string_pos345(X,Y) get_csv2_string((X),(Y),345)
+#define get_csv2_v_str_pos345(X,Y) get_csv2_string((X),(Y),345)
+#define get_csv2_bool_pos345(X,Y) get_csv2_bool((X),(Y),345)
+#define get_csv2_int_pos345(X,Y) get_csv2_int((X),(Y),345)
+#define get_csv2_llong_pos345(X,Y) get_csv2_llong((X),(Y),345)
+#define get_csv2_float_pos345(X,Y) get_csv2_float((X),(Y),345)
+#define get_csv2_uint_pos346(X,Y) get_csv2_uint((X),(Y),346)
+#define get_csv2_ullong_pos346(X,Y) get_csv2_ullong((X),(Y),346)
+#define get_csv2_ip_pos346(X,Y) get_csv2_ip((X),(Y),346)
+#define get_csv2_ipv6_pos346(X,Y) get_csv2_ipv6((X),(Y),346)
+#define get_csv2_string_pos346(X,Y) get_csv2_string((X),(Y),346)
+#define get_csv2_v_str_pos346(X,Y) get_csv2_string((X),(Y),346)
+#define get_csv2_bool_pos346(X,Y) get_csv2_bool((X),(Y),346)
+#define get_csv2_int_pos346(X,Y) get_csv2_int((X),(Y),346)
+#define get_csv2_llong_pos346(X,Y) get_csv2_llong((X),(Y),346)
+#define get_csv2_float_pos346(X,Y) get_csv2_float((X),(Y),346)
+#define get_csv2_uint_pos347(X,Y) get_csv2_uint((X),(Y),347)
+#define get_csv2_ullong_pos347(X,Y) get_csv2_ullong((X),(Y),347)
+#define get_csv2_ip_pos347(X,Y) get_csv2_ip((X),(Y),347)
+#define get_csv2_ipv6_pos347(X,Y) get_csv2_ipv6((X),(Y),347)
+#define get_csv2_string_pos347(X,Y) get_csv2_string((X),(Y),347)
+#define get_csv2_v_str_pos347(X,Y) get_csv2_string((X),(Y),347)
+#define get_csv2_bool_pos347(X,Y) get_csv2_bool((X),(Y),347)
+#define get_csv2_int_pos347(X,Y) get_csv2_int((X),(Y),347)
+#define get_csv2_llong_pos347(X,Y) get_csv2_llong((X),(Y),347)
+#define get_csv2_float_pos347(X,Y) get_csv2_float((X),(Y),347)
+#define get_csv2_uint_pos348(X,Y) get_csv2_uint((X),(Y),348)
+#define get_csv2_ullong_pos348(X,Y) get_csv2_ullong((X),(Y),348)
+#define get_csv2_ip_pos348(X,Y) get_csv2_ip((X),(Y),348)
+#define get_csv2_ipv6_pos348(X,Y) get_csv2_ipv6((X),(Y),348)
+#define get_csv2_string_pos348(X,Y) get_csv2_string((X),(Y),348)
+#define get_csv2_v_str_pos348(X,Y) get_csv2_string((X),(Y),348)
+#define get_csv2_bool_pos348(X,Y) get_csv2_bool((X),(Y),348)
+#define get_csv2_int_pos348(X,Y) get_csv2_int((X),(Y),348)
+#define get_csv2_llong_pos348(X,Y) get_csv2_llong((X),(Y),348)
+#define get_csv2_float_pos348(X,Y) get_csv2_float((X),(Y),348)
+#define get_csv2_uint_pos349(X,Y) get_csv2_uint((X),(Y),349)
+#define get_csv2_ullong_pos349(X,Y) get_csv2_ullong((X),(Y),349)
+#define get_csv2_ip_pos349(X,Y) get_csv2_ip((X),(Y),349)
+#define get_csv2_ipv6_pos349(X,Y) get_csv2_ipv6((X),(Y),349)
+#define get_csv2_string_pos349(X,Y) get_csv2_string((X),(Y),349)
+#define get_csv2_v_str_pos349(X,Y) get_csv2_string((X),(Y),349)
+#define get_csv2_bool_pos349(X,Y) get_csv2_bool((X),(Y),349)
+#define get_csv2_int_pos349(X,Y) get_csv2_int((X),(Y),349)
+#define get_csv2_llong_pos349(X,Y) get_csv2_llong((X),(Y),349)
+#define get_csv2_float_pos349(X,Y) get_csv2_float((X),(Y),349)
+#define get_csv2_uint_pos350(X,Y) get_csv2_uint((X),(Y),350)
+#define get_csv2_ullong_pos350(X,Y) get_csv2_ullong((X),(Y),350)
+#define get_csv2_ip_pos350(X,Y) get_csv2_ip((X),(Y),350)
+#define get_csv2_ipv6_pos350(X,Y) get_csv2_ipv6((X),(Y),350)
+#define get_csv2_string_pos350(X,Y) get_csv2_string((X),(Y),350)
+#define get_csv2_v_str_pos350(X,Y) get_csv2_string((X),(Y),350)
+#define get_csv2_bool_pos350(X,Y) get_csv2_bool((X),(Y),350)
+#define get_csv2_int_pos350(X,Y) get_csv2_int((X),(Y),350)
+#define get_csv2_llong_pos350(X,Y) get_csv2_llong((X),(Y),350)
+#define get_csv2_float_pos350(X,Y) get_csv2_float((X),(Y),350)
+#define get_csv2_uint_pos351(X,Y) get_csv2_uint((X),(Y),351)
+#define get_csv2_ullong_pos351(X,Y) get_csv2_ullong((X),(Y),351)
+#define get_csv2_ip_pos351(X,Y) get_csv2_ip((X),(Y),351)
+#define get_csv2_ipv6_pos351(X,Y) get_csv2_ipv6((X),(Y),351)
+#define get_csv2_string_pos351(X,Y) get_csv2_string((X),(Y),351)
+#define get_csv2_v_str_pos351(X,Y) get_csv2_string((X),(Y),351)
+#define get_csv2_bool_pos351(X,Y) get_csv2_bool((X),(Y),351)
+#define get_csv2_int_pos351(X,Y) get_csv2_int((X),(Y),351)
+#define get_csv2_llong_pos351(X,Y) get_csv2_llong((X),(Y),351)
+#define get_csv2_float_pos351(X,Y) get_csv2_float((X),(Y),351)
+#define get_csv2_uint_pos352(X,Y) get_csv2_uint((X),(Y),352)
+#define get_csv2_ullong_pos352(X,Y) get_csv2_ullong((X),(Y),352)
+#define get_csv2_ip_pos352(X,Y) get_csv2_ip((X),(Y),352)
+#define get_csv2_ipv6_pos352(X,Y) get_csv2_ipv6((X),(Y),352)
+#define get_csv2_string_pos352(X,Y) get_csv2_string((X),(Y),352)
+#define get_csv2_v_str_pos352(X,Y) get_csv2_string((X),(Y),352)
+#define get_csv2_bool_pos352(X,Y) get_csv2_bool((X),(Y),352)
+#define get_csv2_int_pos352(X,Y) get_csv2_int((X),(Y),352)
+#define get_csv2_llong_pos352(X,Y) get_csv2_llong((X),(Y),352)
+#define get_csv2_float_pos352(X,Y) get_csv2_float((X),(Y),352)
+#define get_csv2_uint_pos353(X,Y) get_csv2_uint((X),(Y),353)
+#define get_csv2_ullong_pos353(X,Y) get_csv2_ullong((X),(Y),353)
+#define get_csv2_ip_pos353(X,Y) get_csv2_ip((X),(Y),353)
+#define get_csv2_ipv6_pos353(X,Y) get_csv2_ipv6((X),(Y),353)
+#define get_csv2_string_pos353(X,Y) get_csv2_string((X),(Y),353)
+#define get_csv2_v_str_pos353(X,Y) get_csv2_string((X),(Y),353)
+#define get_csv2_bool_pos353(X,Y) get_csv2_bool((X),(Y),353)
+#define get_csv2_int_pos353(X,Y) get_csv2_int((X),(Y),353)
+#define get_csv2_llong_pos353(X,Y) get_csv2_llong((X),(Y),353)
+#define get_csv2_float_pos353(X,Y) get_csv2_float((X),(Y),353)
+#define get_csv2_uint_pos354(X,Y) get_csv2_uint((X),(Y),354)
+#define get_csv2_ullong_pos354(X,Y) get_csv2_ullong((X),(Y),354)
+#define get_csv2_ip_pos354(X,Y) get_csv2_ip((X),(Y),354)
+#define get_csv2_ipv6_pos354(X,Y) get_csv2_ipv6((X),(Y),354)
+#define get_csv2_string_pos354(X,Y) get_csv2_string((X),(Y),354)
+#define get_csv2_v_str_pos354(X,Y) get_csv2_string((X),(Y),354)
+#define get_csv2_bool_pos354(X,Y) get_csv2_bool((X),(Y),354)
+#define get_csv2_int_pos354(X,Y) get_csv2_int((X),(Y),354)
+#define get_csv2_llong_pos354(X,Y) get_csv2_llong((X),(Y),354)
+#define get_csv2_float_pos354(X,Y) get_csv2_float((X),(Y),354)
+#define get_csv2_uint_pos355(X,Y) get_csv2_uint((X),(Y),355)
+#define get_csv2_ullong_pos355(X,Y) get_csv2_ullong((X),(Y),355)
+#define get_csv2_ip_pos355(X,Y) get_csv2_ip((X),(Y),355)
+#define get_csv2_ipv6_pos355(X,Y) get_csv2_ipv6((X),(Y),355)
+#define get_csv2_string_pos355(X,Y) get_csv2_string((X),(Y),355)
+#define get_csv2_v_str_pos355(X,Y) get_csv2_string((X),(Y),355)
+#define get_csv2_bool_pos355(X,Y) get_csv2_bool((X),(Y),355)
+#define get_csv2_int_pos355(X,Y) get_csv2_int((X),(Y),355)
+#define get_csv2_llong_pos355(X,Y) get_csv2_llong((X),(Y),355)
+#define get_csv2_float_pos355(X,Y) get_csv2_float((X),(Y),355)
+#define get_csv2_uint_pos356(X,Y) get_csv2_uint((X),(Y),356)
+#define get_csv2_ullong_pos356(X,Y) get_csv2_ullong((X),(Y),356)
+#define get_csv2_ip_pos356(X,Y) get_csv2_ip((X),(Y),356)
+#define get_csv2_ipv6_pos356(X,Y) get_csv2_ipv6((X),(Y),356)
+#define get_csv2_string_pos356(X,Y) get_csv2_string((X),(Y),356)
+#define get_csv2_v_str_pos356(X,Y) get_csv2_string((X),(Y),356)
+#define get_csv2_bool_pos356(X,Y) get_csv2_bool((X),(Y),356)
+#define get_csv2_int_pos356(X,Y) get_csv2_int((X),(Y),356)
+#define get_csv2_llong_pos356(X,Y) get_csv2_llong((X),(Y),356)
+#define get_csv2_float_pos356(X,Y) get_csv2_float((X),(Y),356)
+#define get_csv2_uint_pos357(X,Y) get_csv2_uint((X),(Y),357)
+#define get_csv2_ullong_pos357(X,Y) get_csv2_ullong((X),(Y),357)
+#define get_csv2_ip_pos357(X,Y) get_csv2_ip((X),(Y),357)
+#define get_csv2_ipv6_pos357(X,Y) get_csv2_ipv6((X),(Y),357)
+#define get_csv2_string_pos357(X,Y) get_csv2_string((X),(Y),357)
+#define get_csv2_v_str_pos357(X,Y) get_csv2_string((X),(Y),357)
+#define get_csv2_bool_pos357(X,Y) get_csv2_bool((X),(Y),357)
+#define get_csv2_int_pos357(X,Y) get_csv2_int((X),(Y),357)
+#define get_csv2_llong_pos357(X,Y) get_csv2_llong((X),(Y),357)
+#define get_csv2_float_pos357(X,Y) get_csv2_float((X),(Y),357)
+#define get_csv2_uint_pos358(X,Y) get_csv2_uint((X),(Y),358)
+#define get_csv2_ullong_pos358(X,Y) get_csv2_ullong((X),(Y),358)
+#define get_csv2_ip_pos358(X,Y) get_csv2_ip((X),(Y),358)
+#define get_csv2_ipv6_pos358(X,Y) get_csv2_ipv6((X),(Y),358)
+#define get_csv2_string_pos358(X,Y) get_csv2_string((X),(Y),358)
+#define get_csv2_v_str_pos358(X,Y) get_csv2_string((X),(Y),358)
+#define get_csv2_bool_pos358(X,Y) get_csv2_bool((X),(Y),358)
+#define get_csv2_int_pos358(X,Y) get_csv2_int((X),(Y),358)
+#define get_csv2_llong_pos358(X,Y) get_csv2_llong((X),(Y),358)
+#define get_csv2_float_pos358(X,Y) get_csv2_float((X),(Y),358)
+#define get_csv2_uint_pos359(X,Y) get_csv2_uint((X),(Y),359)
+#define get_csv2_ullong_pos359(X,Y) get_csv2_ullong((X),(Y),359)
+#define get_csv2_ip_pos359(X,Y) get_csv2_ip((X),(Y),359)
+#define get_csv2_ipv6_pos359(X,Y) get_csv2_ipv6((X),(Y),359)
+#define get_csv2_string_pos359(X,Y) get_csv2_string((X),(Y),359)
+#define get_csv2_v_str_pos359(X,Y) get_csv2_string((X),(Y),359)
+#define get_csv2_bool_pos359(X,Y) get_csv2_bool((X),(Y),359)
+#define get_csv2_int_pos359(X,Y) get_csv2_int((X),(Y),359)
+#define get_csv2_llong_pos359(X,Y) get_csv2_llong((X),(Y),359)
+#define get_csv2_float_pos359(X,Y) get_csv2_float((X),(Y),359)
+#define get_csv2_uint_pos360(X,Y) get_csv2_uint((X),(Y),360)
+#define get_csv2_ullong_pos360(X,Y) get_csv2_ullong((X),(Y),360)
+#define get_csv2_ip_pos360(X,Y) get_csv2_ip((X),(Y),360)
+#define get_csv2_ipv6_pos360(X,Y) get_csv2_ipv6((X),(Y),360)
+#define get_csv2_string_pos360(X,Y) get_csv2_string((X),(Y),360)
+#define get_csv2_v_str_pos360(X,Y) get_csv2_string((X),(Y),360)
+#define get_csv2_bool_pos360(X,Y) get_csv2_bool((X),(Y),360)
+#define get_csv2_int_pos360(X,Y) get_csv2_int((X),(Y),360)
+#define get_csv2_llong_pos360(X,Y) get_csv2_llong((X),(Y),360)
+#define get_csv2_float_pos360(X,Y) get_csv2_float((X),(Y),360)
+#define get_csv2_uint_pos361(X,Y) get_csv2_uint((X),(Y),361)
+#define get_csv2_ullong_pos361(X,Y) get_csv2_ullong((X),(Y),361)
+#define get_csv2_ip_pos361(X,Y) get_csv2_ip((X),(Y),361)
+#define get_csv2_ipv6_pos361(X,Y) get_csv2_ipv6((X),(Y),361)
+#define get_csv2_string_pos361(X,Y) get_csv2_string((X),(Y),361)
+#define get_csv2_v_str_pos361(X,Y) get_csv2_string((X),(Y),361)
+#define get_csv2_bool_pos361(X,Y) get_csv2_bool((X),(Y),361)
+#define get_csv2_int_pos361(X,Y) get_csv2_int((X),(Y),361)
+#define get_csv2_llong_pos361(X,Y) get_csv2_llong((X),(Y),361)
+#define get_csv2_float_pos361(X,Y) get_csv2_float((X),(Y),361)
+#define get_csv2_uint_pos362(X,Y) get_csv2_uint((X),(Y),362)
+#define get_csv2_ullong_pos362(X,Y) get_csv2_ullong((X),(Y),362)
+#define get_csv2_ip_pos362(X,Y) get_csv2_ip((X),(Y),362)
+#define get_csv2_ipv6_pos362(X,Y) get_csv2_ipv6((X),(Y),362)
+#define get_csv2_string_pos362(X,Y) get_csv2_string((X),(Y),362)
+#define get_csv2_v_str_pos362(X,Y) get_csv2_string((X),(Y),362)
+#define get_csv2_bool_pos362(X,Y) get_csv2_bool((X),(Y),362)
+#define get_csv2_int_pos362(X,Y) get_csv2_int((X),(Y),362)
+#define get_csv2_llong_pos362(X,Y) get_csv2_llong((X),(Y),362)
+#define get_csv2_float_pos362(X,Y) get_csv2_float((X),(Y),362)
+#define get_csv2_uint_pos363(X,Y) get_csv2_uint((X),(Y),363)
+#define get_csv2_ullong_pos363(X,Y) get_csv2_ullong((X),(Y),363)
+#define get_csv2_ip_pos363(X,Y) get_csv2_ip((X),(Y),363)
+#define get_csv2_ipv6_pos363(X,Y) get_csv2_ipv6((X),(Y),363)
+#define get_csv2_string_pos363(X,Y) get_csv2_string((X),(Y),363)
+#define get_csv2_v_str_pos363(X,Y) get_csv2_string((X),(Y),363)
+#define get_csv2_bool_pos363(X,Y) get_csv2_bool((X),(Y),363)
+#define get_csv2_int_pos363(X,Y) get_csv2_int((X),(Y),363)
+#define get_csv2_llong_pos363(X,Y) get_csv2_llong((X),(Y),363)
+#define get_csv2_float_pos363(X,Y) get_csv2_float((X),(Y),363)
+#define get_csv2_uint_pos364(X,Y) get_csv2_uint((X),(Y),364)
+#define get_csv2_ullong_pos364(X,Y) get_csv2_ullong((X),(Y),364)
+#define get_csv2_ip_pos364(X,Y) get_csv2_ip((X),(Y),364)
+#define get_csv2_ipv6_pos364(X,Y) get_csv2_ipv6((X),(Y),364)
+#define get_csv2_string_pos364(X,Y) get_csv2_string((X),(Y),364)
+#define get_csv2_v_str_pos364(X,Y) get_csv2_string((X),(Y),364)
+#define get_csv2_bool_pos364(X,Y) get_csv2_bool((X),(Y),364)
+#define get_csv2_int_pos364(X,Y) get_csv2_int((X),(Y),364)
+#define get_csv2_llong_pos364(X,Y) get_csv2_llong((X),(Y),364)
+#define get_csv2_float_pos364(X,Y) get_csv2_float((X),(Y),364)
+#define get_csv2_uint_pos365(X,Y) get_csv2_uint((X),(Y),365)
+#define get_csv2_ullong_pos365(X,Y) get_csv2_ullong((X),(Y),365)
+#define get_csv2_ip_pos365(X,Y) get_csv2_ip((X),(Y),365)
+#define get_csv2_ipv6_pos365(X,Y) get_csv2_ipv6((X),(Y),365)
+#define get_csv2_string_pos365(X,Y) get_csv2_string((X),(Y),365)
+#define get_csv2_v_str_pos365(X,Y) get_csv2_string((X),(Y),365)
+#define get_csv2_bool_pos365(X,Y) get_csv2_bool((X),(Y),365)
+#define get_csv2_int_pos365(X,Y) get_csv2_int((X),(Y),365)
+#define get_csv2_llong_pos365(X,Y) get_csv2_llong((X),(Y),365)
+#define get_csv2_float_pos365(X,Y) get_csv2_float((X),(Y),365)
+#define get_csv2_uint_pos366(X,Y) get_csv2_uint((X),(Y),366)
+#define get_csv2_ullong_pos366(X,Y) get_csv2_ullong((X),(Y),366)
+#define get_csv2_ip_pos366(X,Y) get_csv2_ip((X),(Y),366)
+#define get_csv2_ipv6_pos366(X,Y) get_csv2_ipv6((X),(Y),366)
+#define get_csv2_string_pos366(X,Y) get_csv2_string((X),(Y),366)
+#define get_csv2_v_str_pos366(X,Y) get_csv2_string((X),(Y),366)
+#define get_csv2_bool_pos366(X,Y) get_csv2_bool((X),(Y),366)
+#define get_csv2_int_pos366(X,Y) get_csv2_int((X),(Y),366)
+#define get_csv2_llong_pos366(X,Y) get_csv2_llong((X),(Y),366)
+#define get_csv2_float_pos366(X,Y) get_csv2_float((X),(Y),366)
+#define get_csv2_uint_pos367(X,Y) get_csv2_uint((X),(Y),367)
+#define get_csv2_ullong_pos367(X,Y) get_csv2_ullong((X),(Y),367)
+#define get_csv2_ip_pos367(X,Y) get_csv2_ip((X),(Y),367)
+#define get_csv2_ipv6_pos367(X,Y) get_csv2_ipv6((X),(Y),367)
+#define get_csv2_string_pos367(X,Y) get_csv2_string((X),(Y),367)
+#define get_csv2_v_str_pos367(X,Y) get_csv2_string((X),(Y),367)
+#define get_csv2_bool_pos367(X,Y) get_csv2_bool((X),(Y),367)
+#define get_csv2_int_pos367(X,Y) get_csv2_int((X),(Y),367)
+#define get_csv2_llong_pos367(X,Y) get_csv2_llong((X),(Y),367)
+#define get_csv2_float_pos367(X,Y) get_csv2_float((X),(Y),367)
+#define get_csv2_uint_pos368(X,Y) get_csv2_uint((X),(Y),368)
+#define get_csv2_ullong_pos368(X,Y) get_csv2_ullong((X),(Y),368)
+#define get_csv2_ip_pos368(X,Y) get_csv2_ip((X),(Y),368)
+#define get_csv2_ipv6_pos368(X,Y) get_csv2_ipv6((X),(Y),368)
+#define get_csv2_string_pos368(X,Y) get_csv2_string((X),(Y),368)
+#define get_csv2_v_str_pos368(X,Y) get_csv2_string((X),(Y),368)
+#define get_csv2_bool_pos368(X,Y) get_csv2_bool((X),(Y),368)
+#define get_csv2_int_pos368(X,Y) get_csv2_int((X),(Y),368)
+#define get_csv2_llong_pos368(X,Y) get_csv2_llong((X),(Y),368)
+#define get_csv2_float_pos368(X,Y) get_csv2_float((X),(Y),368)
+#define get_csv2_uint_pos369(X,Y) get_csv2_uint((X),(Y),369)
+#define get_csv2_ullong_pos369(X,Y) get_csv2_ullong((X),(Y),369)
+#define get_csv2_ip_pos369(X,Y) get_csv2_ip((X),(Y),369)
+#define get_csv2_ipv6_pos369(X,Y) get_csv2_ipv6((X),(Y),369)
+#define get_csv2_string_pos369(X,Y) get_csv2_string((X),(Y),369)
+#define get_csv2_v_str_pos369(X,Y) get_csv2_string((X),(Y),369)
+#define get_csv2_bool_pos369(X,Y) get_csv2_bool((X),(Y),369)
+#define get_csv2_int_pos369(X,Y) get_csv2_int((X),(Y),369)
+#define get_csv2_llong_pos369(X,Y) get_csv2_llong((X),(Y),369)
+#define get_csv2_float_pos369(X,Y) get_csv2_float((X),(Y),369)
+#define get_csv2_uint_pos370(X,Y) get_csv2_uint((X),(Y),370)
+#define get_csv2_ullong_pos370(X,Y) get_csv2_ullong((X),(Y),370)
+#define get_csv2_ip_pos370(X,Y) get_csv2_ip((X),(Y),370)
+#define get_csv2_ipv6_pos370(X,Y) get_csv2_ipv6((X),(Y),370)
+#define get_csv2_string_pos370(X,Y) get_csv2_string((X),(Y),370)
+#define get_csv2_v_str_pos370(X,Y) get_csv2_string((X),(Y),370)
+#define get_csv2_bool_pos370(X,Y) get_csv2_bool((X),(Y),370)
+#define get_csv2_int_pos370(X,Y) get_csv2_int((X),(Y),370)
+#define get_csv2_llong_pos370(X,Y) get_csv2_llong((X),(Y),370)
+#define get_csv2_float_pos370(X,Y) get_csv2_float((X),(Y),370)
+#define get_csv2_uint_pos371(X,Y) get_csv2_uint((X),(Y),371)
+#define get_csv2_ullong_pos371(X,Y) get_csv2_ullong((X),(Y),371)
+#define get_csv2_ip_pos371(X,Y) get_csv2_ip((X),(Y),371)
+#define get_csv2_ipv6_pos371(X,Y) get_csv2_ipv6((X),(Y),371)
+#define get_csv2_string_pos371(X,Y) get_csv2_string((X),(Y),371)
+#define get_csv2_v_str_pos371(X,Y) get_csv2_string((X),(Y),371)
+#define get_csv2_bool_pos371(X,Y) get_csv2_bool((X),(Y),371)
+#define get_csv2_int_pos371(X,Y) get_csv2_int((X),(Y),371)
+#define get_csv2_llong_pos371(X,Y) get_csv2_llong((X),(Y),371)
+#define get_csv2_float_pos371(X,Y) get_csv2_float((X),(Y),371)
+#define get_csv2_uint_pos372(X,Y) get_csv2_uint((X),(Y),372)
+#define get_csv2_ullong_pos372(X,Y) get_csv2_ullong((X),(Y),372)
+#define get_csv2_ip_pos372(X,Y) get_csv2_ip((X),(Y),372)
+#define get_csv2_ipv6_pos372(X,Y) get_csv2_ipv6((X),(Y),372)
+#define get_csv2_string_pos372(X,Y) get_csv2_string((X),(Y),372)
+#define get_csv2_v_str_pos372(X,Y) get_csv2_string((X),(Y),372)
+#define get_csv2_bool_pos372(X,Y) get_csv2_bool((X),(Y),372)
+#define get_csv2_int_pos372(X,Y) get_csv2_int((X),(Y),372)
+#define get_csv2_llong_pos372(X,Y) get_csv2_llong((X),(Y),372)
+#define get_csv2_float_pos372(X,Y) get_csv2_float((X),(Y),372)
+#define get_csv2_uint_pos373(X,Y) get_csv2_uint((X),(Y),373)
+#define get_csv2_ullong_pos373(X,Y) get_csv2_ullong((X),(Y),373)
+#define get_csv2_ip_pos373(X,Y) get_csv2_ip((X),(Y),373)
+#define get_csv2_ipv6_pos373(X,Y) get_csv2_ipv6((X),(Y),373)
+#define get_csv2_string_pos373(X,Y) get_csv2_string((X),(Y),373)
+#define get_csv2_v_str_pos373(X,Y) get_csv2_string((X),(Y),373)
+#define get_csv2_bool_pos373(X,Y) get_csv2_bool((X),(Y),373)
+#define get_csv2_int_pos373(X,Y) get_csv2_int((X),(Y),373)
+#define get_csv2_llong_pos373(X,Y) get_csv2_llong((X),(Y),373)
+#define get_csv2_float_pos373(X,Y) get_csv2_float((X),(Y),373)
+#define get_csv2_uint_pos374(X,Y) get_csv2_uint((X),(Y),374)
+#define get_csv2_ullong_pos374(X,Y) get_csv2_ullong((X),(Y),374)
+#define get_csv2_ip_pos374(X,Y) get_csv2_ip((X),(Y),374)
+#define get_csv2_ipv6_pos374(X,Y) get_csv2_ipv6((X),(Y),374)
+#define get_csv2_string_pos374(X,Y) get_csv2_string((X),(Y),374)
+#define get_csv2_v_str_pos374(X,Y) get_csv2_string((X),(Y),374)
+#define get_csv2_bool_pos374(X,Y) get_csv2_bool((X),(Y),374)
+#define get_csv2_int_pos374(X,Y) get_csv2_int((X),(Y),374)
+#define get_csv2_llong_pos374(X,Y) get_csv2_llong((X),(Y),374)
+#define get_csv2_float_pos374(X,Y) get_csv2_float((X),(Y),374)
+#define get_csv2_uint_pos375(X,Y) get_csv2_uint((X),(Y),375)
+#define get_csv2_ullong_pos375(X,Y) get_csv2_ullong((X),(Y),375)
+#define get_csv2_ip_pos375(X,Y) get_csv2_ip((X),(Y),375)
+#define get_csv2_ipv6_pos375(X,Y) get_csv2_ipv6((X),(Y),375)
+#define get_csv2_string_pos375(X,Y) get_csv2_string((X),(Y),375)
+#define get_csv2_v_str_pos375(X,Y) get_csv2_string((X),(Y),375)
+#define get_csv2_bool_pos375(X,Y) get_csv2_bool((X),(Y),375)
+#define get_csv2_int_pos375(X,Y) get_csv2_int((X),(Y),375)
+#define get_csv2_llong_pos375(X,Y) get_csv2_llong((X),(Y),375)
+#define get_csv2_float_pos375(X,Y) get_csv2_float((X),(Y),375)
+#define get_csv2_uint_pos376(X,Y) get_csv2_uint((X),(Y),376)
+#define get_csv2_ullong_pos376(X,Y) get_csv2_ullong((X),(Y),376)
+#define get_csv2_ip_pos376(X,Y) get_csv2_ip((X),(Y),376)
+#define get_csv2_ipv6_pos376(X,Y) get_csv2_ipv6((X),(Y),376)
+#define get_csv2_string_pos376(X,Y) get_csv2_string((X),(Y),376)
+#define get_csv2_v_str_pos376(X,Y) get_csv2_string((X),(Y),376)
+#define get_csv2_bool_pos376(X,Y) get_csv2_bool((X),(Y),376)
+#define get_csv2_int_pos376(X,Y) get_csv2_int((X),(Y),376)
+#define get_csv2_llong_pos376(X,Y) get_csv2_llong((X),(Y),376)
+#define get_csv2_float_pos376(X,Y) get_csv2_float((X),(Y),376)
+#define get_csv2_uint_pos377(X,Y) get_csv2_uint((X),(Y),377)
+#define get_csv2_ullong_pos377(X,Y) get_csv2_ullong((X),(Y),377)
+#define get_csv2_ip_pos377(X,Y) get_csv2_ip((X),(Y),377)
+#define get_csv2_ipv6_pos377(X,Y) get_csv2_ipv6((X),(Y),377)
+#define get_csv2_string_pos377(X,Y) get_csv2_string((X),(Y),377)
+#define get_csv2_v_str_pos377(X,Y) get_csv2_string((X),(Y),377)
+#define get_csv2_bool_pos377(X,Y) get_csv2_bool((X),(Y),377)
+#define get_csv2_int_pos377(X,Y) get_csv2_int((X),(Y),377)
+#define get_csv2_llong_pos377(X,Y) get_csv2_llong((X),(Y),377)
+#define get_csv2_float_pos377(X,Y) get_csv2_float((X),(Y),377)
+#define get_csv2_uint_pos378(X,Y) get_csv2_uint((X),(Y),378)
+#define get_csv2_ullong_pos378(X,Y) get_csv2_ullong((X),(Y),378)
+#define get_csv2_ip_pos378(X,Y) get_csv2_ip((X),(Y),378)
+#define get_csv2_ipv6_pos378(X,Y) get_csv2_ipv6((X),(Y),378)
+#define get_csv2_string_pos378(X,Y) get_csv2_string((X),(Y),378)
+#define get_csv2_v_str_pos378(X,Y) get_csv2_string((X),(Y),378)
+#define get_csv2_bool_pos378(X,Y) get_csv2_bool((X),(Y),378)
+#define get_csv2_int_pos378(X,Y) get_csv2_int((X),(Y),378)
+#define get_csv2_llong_pos378(X,Y) get_csv2_llong((X),(Y),378)
+#define get_csv2_float_pos378(X,Y) get_csv2_float((X),(Y),378)
+#define get_csv2_uint_pos379(X,Y) get_csv2_uint((X),(Y),379)
+#define get_csv2_ullong_pos379(X,Y) get_csv2_ullong((X),(Y),379)
+#define get_csv2_ip_pos379(X,Y) get_csv2_ip((X),(Y),379)
+#define get_csv2_ipv6_pos379(X,Y) get_csv2_ipv6((X),(Y),379)
+#define get_csv2_string_pos379(X,Y) get_csv2_string((X),(Y),379)
+#define get_csv2_v_str_pos379(X,Y) get_csv2_string((X),(Y),379)
+#define get_csv2_bool_pos379(X,Y) get_csv2_bool((X),(Y),379)
+#define get_csv2_int_pos379(X,Y) get_csv2_int((X),(Y),379)
+#define get_csv2_llong_pos379(X,Y) get_csv2_llong((X),(Y),379)
+#define get_csv2_float_pos379(X,Y) get_csv2_float((X),(Y),379)
+#define get_csv2_uint_pos380(X,Y) get_csv2_uint((X),(Y),380)
+#define get_csv2_ullong_pos380(X,Y) get_csv2_ullong((X),(Y),380)
+#define get_csv2_ip_pos380(X,Y) get_csv2_ip((X),(Y),380)
+#define get_csv2_ipv6_pos380(X,Y) get_csv2_ipv6((X),(Y),380)
+#define get_csv2_string_pos380(X,Y) get_csv2_string((X),(Y),380)
+#define get_csv2_v_str_pos380(X,Y) get_csv2_string((X),(Y),380)
+#define get_csv2_bool_pos380(X,Y) get_csv2_bool((X),(Y),380)
+#define get_csv2_int_pos380(X,Y) get_csv2_int((X),(Y),380)
+#define get_csv2_llong_pos380(X,Y) get_csv2_llong((X),(Y),380)
+#define get_csv2_float_pos380(X,Y) get_csv2_float((X),(Y),380)
+#define get_csv2_uint_pos381(X,Y) get_csv2_uint((X),(Y),381)
+#define get_csv2_ullong_pos381(X,Y) get_csv2_ullong((X),(Y),381)
+#define get_csv2_ip_pos381(X,Y) get_csv2_ip((X),(Y),381)
+#define get_csv2_ipv6_pos381(X,Y) get_csv2_ipv6((X),(Y),381)
+#define get_csv2_string_pos381(X,Y) get_csv2_string((X),(Y),381)
+#define get_csv2_v_str_pos381(X,Y) get_csv2_string((X),(Y),381)
+#define get_csv2_bool_pos381(X,Y) get_csv2_bool((X),(Y),381)
+#define get_csv2_int_pos381(X,Y) get_csv2_int((X),(Y),381)
+#define get_csv2_llong_pos381(X,Y) get_csv2_llong((X),(Y),381)
+#define get_csv2_float_pos381(X,Y) get_csv2_float((X),(Y),381)
+#define get_csv2_uint_pos382(X,Y) get_csv2_uint((X),(Y),382)
+#define get_csv2_ullong_pos382(X,Y) get_csv2_ullong((X),(Y),382)
+#define get_csv2_ip_pos382(X,Y) get_csv2_ip((X),(Y),382)
+#define get_csv2_ipv6_pos382(X,Y) get_csv2_ipv6((X),(Y),382)
+#define get_csv2_string_pos382(X,Y) get_csv2_string((X),(Y),382)
+#define get_csv2_v_str_pos382(X,Y) get_csv2_string((X),(Y),382)
+#define get_csv2_bool_pos382(X,Y) get_csv2_bool((X),(Y),382)
+#define get_csv2_int_pos382(X,Y) get_csv2_int((X),(Y),382)
+#define get_csv2_llong_pos382(X,Y) get_csv2_llong((X),(Y),382)
+#define get_csv2_float_pos382(X,Y) get_csv2_float((X),(Y),382)
+#define get_csv2_uint_pos383(X,Y) get_csv2_uint((X),(Y),383)
+#define get_csv2_ullong_pos383(X,Y) get_csv2_ullong((X),(Y),383)
+#define get_csv2_ip_pos383(X,Y) get_csv2_ip((X),(Y),383)
+#define get_csv2_ipv6_pos383(X,Y) get_csv2_ipv6((X),(Y),383)
+#define get_csv2_string_pos383(X,Y) get_csv2_string((X),(Y),383)
+#define get_csv2_v_str_pos383(X,Y) get_csv2_string((X),(Y),383)
+#define get_csv2_bool_pos383(X,Y) get_csv2_bool((X),(Y),383)
+#define get_csv2_int_pos383(X,Y) get_csv2_int((X),(Y),383)
+#define get_csv2_llong_pos383(X,Y) get_csv2_llong((X),(Y),383)
+#define get_csv2_float_pos383(X,Y) get_csv2_float((X),(Y),383)
+#define get_csv2_uint_pos384(X,Y) get_csv2_uint((X),(Y),384)
+#define get_csv2_ullong_pos384(X,Y) get_csv2_ullong((X),(Y),384)
+#define get_csv2_ip_pos384(X,Y) get_csv2_ip((X),(Y),384)
+#define get_csv2_ipv6_pos384(X,Y) get_csv2_ipv6((X),(Y),384)
+#define get_csv2_string_pos384(X,Y) get_csv2_string((X),(Y),384)
+#define get_csv2_v_str_pos384(X,Y) get_csv2_string((X),(Y),384)
+#define get_csv2_bool_pos384(X,Y) get_csv2_bool((X),(Y),384)
+#define get_csv2_int_pos384(X,Y) get_csv2_int((X),(Y),384)
+#define get_csv2_llong_pos384(X,Y) get_csv2_llong((X),(Y),384)
+#define get_csv2_float_pos384(X,Y) get_csv2_float((X),(Y),384)
+#define get_csv2_uint_pos385(X,Y) get_csv2_uint((X),(Y),385)
+#define get_csv2_ullong_pos385(X,Y) get_csv2_ullong((X),(Y),385)
+#define get_csv2_ip_pos385(X,Y) get_csv2_ip((X),(Y),385)
+#define get_csv2_ipv6_pos385(X,Y) get_csv2_ipv6((X),(Y),385)
+#define get_csv2_string_pos385(X,Y) get_csv2_string((X),(Y),385)
+#define get_csv2_v_str_pos385(X,Y) get_csv2_string((X),(Y),385)
+#define get_csv2_bool_pos385(X,Y) get_csv2_bool((X),(Y),385)
+#define get_csv2_int_pos385(X,Y) get_csv2_int((X),(Y),385)
+#define get_csv2_llong_pos385(X,Y) get_csv2_llong((X),(Y),385)
+#define get_csv2_float_pos385(X,Y) get_csv2_float((X),(Y),385)
+#define get_csv2_uint_pos386(X,Y) get_csv2_uint((X),(Y),386)
+#define get_csv2_ullong_pos386(X,Y) get_csv2_ullong((X),(Y),386)
+#define get_csv2_ip_pos386(X,Y) get_csv2_ip((X),(Y),386)
+#define get_csv2_ipv6_pos386(X,Y) get_csv2_ipv6((X),(Y),386)
+#define get_csv2_string_pos386(X,Y) get_csv2_string((X),(Y),386)
+#define get_csv2_v_str_pos386(X,Y) get_csv2_string((X),(Y),386)
+#define get_csv2_bool_pos386(X,Y) get_csv2_bool((X),(Y),386)
+#define get_csv2_int_pos386(X,Y) get_csv2_int((X),(Y),386)
+#define get_csv2_llong_pos386(X,Y) get_csv2_llong((X),(Y),386)
+#define get_csv2_float_pos386(X,Y) get_csv2_float((X),(Y),386)
+#define get_csv2_uint_pos387(X,Y) get_csv2_uint((X),(Y),387)
+#define get_csv2_ullong_pos387(X,Y) get_csv2_ullong((X),(Y),387)
+#define get_csv2_ip_pos387(X,Y) get_csv2_ip((X),(Y),387)
+#define get_csv2_ipv6_pos387(X,Y) get_csv2_ipv6((X),(Y),387)
+#define get_csv2_string_pos387(X,Y) get_csv2_string((X),(Y),387)
+#define get_csv2_v_str_pos387(X,Y) get_csv2_string((X),(Y),387)
+#define get_csv2_bool_pos387(X,Y) get_csv2_bool((X),(Y),387)
+#define get_csv2_int_pos387(X,Y) get_csv2_int((X),(Y),387)
+#define get_csv2_llong_pos387(X,Y) get_csv2_llong((X),(Y),387)
+#define get_csv2_float_pos387(X,Y) get_csv2_float((X),(Y),387)
+#define get_csv2_uint_pos388(X,Y) get_csv2_uint((X),(Y),388)
+#define get_csv2_ullong_pos388(X,Y) get_csv2_ullong((X),(Y),388)
+#define get_csv2_ip_pos388(X,Y) get_csv2_ip((X),(Y),388)
+#define get_csv2_ipv6_pos388(X,Y) get_csv2_ipv6((X),(Y),388)
+#define get_csv2_string_pos388(X,Y) get_csv2_string((X),(Y),388)
+#define get_csv2_v_str_pos388(X,Y) get_csv2_string((X),(Y),388)
+#define get_csv2_bool_pos388(X,Y) get_csv2_bool((X),(Y),388)
+#define get_csv2_int_pos388(X,Y) get_csv2_int((X),(Y),388)
+#define get_csv2_llong_pos388(X,Y) get_csv2_llong((X),(Y),388)
+#define get_csv2_float_pos388(X,Y) get_csv2_float((X),(Y),388)
+#define get_csv2_uint_pos389(X,Y) get_csv2_uint((X),(Y),389)
+#define get_csv2_ullong_pos389(X,Y) get_csv2_ullong((X),(Y),389)
+#define get_csv2_ip_pos389(X,Y) get_csv2_ip((X),(Y),389)
+#define get_csv2_ipv6_pos389(X,Y) get_csv2_ipv6((X),(Y),389)
+#define get_csv2_string_pos389(X,Y) get_csv2_string((X),(Y),389)
+#define get_csv2_v_str_pos389(X,Y) get_csv2_string((X),(Y),389)
+#define get_csv2_bool_pos389(X,Y) get_csv2_bool((X),(Y),389)
+#define get_csv2_int_pos389(X,Y) get_csv2_int((X),(Y),389)
+#define get_csv2_llong_pos389(X,Y) get_csv2_llong((X),(Y),389)
+#define get_csv2_float_pos389(X,Y) get_csv2_float((X),(Y),389)
+#define get_csv2_uint_pos390(X,Y) get_csv2_uint((X),(Y),390)
+#define get_csv2_ullong_pos390(X,Y) get_csv2_ullong((X),(Y),390)
+#define get_csv2_ip_pos390(X,Y) get_csv2_ip((X),(Y),390)
+#define get_csv2_ipv6_pos390(X,Y) get_csv2_ipv6((X),(Y),390)
+#define get_csv2_string_pos390(X,Y) get_csv2_string((X),(Y),390)
+#define get_csv2_v_str_pos390(X,Y) get_csv2_string((X),(Y),390)
+#define get_csv2_bool_pos390(X,Y) get_csv2_bool((X),(Y),390)
+#define get_csv2_int_pos390(X,Y) get_csv2_int((X),(Y),390)
+#define get_csv2_llong_pos390(X,Y) get_csv2_llong((X),(Y),390)
+#define get_csv2_float_pos390(X,Y) get_csv2_float((X),(Y),390)
+#define get_csv2_uint_pos391(X,Y) get_csv2_uint((X),(Y),391)
+#define get_csv2_ullong_pos391(X,Y) get_csv2_ullong((X),(Y),391)
+#define get_csv2_ip_pos391(X,Y) get_csv2_ip((X),(Y),391)
+#define get_csv2_ipv6_pos391(X,Y) get_csv2_ipv6((X),(Y),391)
+#define get_csv2_string_pos391(X,Y) get_csv2_string((X),(Y),391)
+#define get_csv2_v_str_pos391(X,Y) get_csv2_string((X),(Y),391)
+#define get_csv2_bool_pos391(X,Y) get_csv2_bool((X),(Y),391)
+#define get_csv2_int_pos391(X,Y) get_csv2_int((X),(Y),391)
+#define get_csv2_llong_pos391(X,Y) get_csv2_llong((X),(Y),391)
+#define get_csv2_float_pos391(X,Y) get_csv2_float((X),(Y),391)
+#define get_csv2_uint_pos392(X,Y) get_csv2_uint((X),(Y),392)
+#define get_csv2_ullong_pos392(X,Y) get_csv2_ullong((X),(Y),392)
+#define get_csv2_ip_pos392(X,Y) get_csv2_ip((X),(Y),392)
+#define get_csv2_ipv6_pos392(X,Y) get_csv2_ipv6((X),(Y),392)
+#define get_csv2_string_pos392(X,Y) get_csv2_string((X),(Y),392)
+#define get_csv2_v_str_pos392(X,Y) get_csv2_string((X),(Y),392)
+#define get_csv2_bool_pos392(X,Y) get_csv2_bool((X),(Y),392)
+#define get_csv2_int_pos392(X,Y) get_csv2_int((X),(Y),392)
+#define get_csv2_llong_pos392(X,Y) get_csv2_llong((X),(Y),392)
+#define get_csv2_float_pos392(X,Y) get_csv2_float((X),(Y),392)
+#define get_csv2_uint_pos393(X,Y) get_csv2_uint((X),(Y),393)
+#define get_csv2_ullong_pos393(X,Y) get_csv2_ullong((X),(Y),393)
+#define get_csv2_ip_pos393(X,Y) get_csv2_ip((X),(Y),393)
+#define get_csv2_ipv6_pos393(X,Y) get_csv2_ipv6((X),(Y),393)
+#define get_csv2_string_pos393(X,Y) get_csv2_string((X),(Y),393)
+#define get_csv2_v_str_pos393(X,Y) get_csv2_string((X),(Y),393)
+#define get_csv2_bool_pos393(X,Y) get_csv2_bool((X),(Y),393)
+#define get_csv2_int_pos393(X,Y) get_csv2_int((X),(Y),393)
+#define get_csv2_llong_pos393(X,Y) get_csv2_llong((X),(Y),393)
+#define get_csv2_float_pos393(X,Y) get_csv2_float((X),(Y),393)
+#define get_csv2_uint_pos394(X,Y) get_csv2_uint((X),(Y),394)
+#define get_csv2_ullong_pos394(X,Y) get_csv2_ullong((X),(Y),394)
+#define get_csv2_ip_pos394(X,Y) get_csv2_ip((X),(Y),394)
+#define get_csv2_ipv6_pos394(X,Y) get_csv2_ipv6((X),(Y),394)
+#define get_csv2_string_pos394(X,Y) get_csv2_string((X),(Y),394)
+#define get_csv2_v_str_pos394(X,Y) get_csv2_string((X),(Y),394)
+#define get_csv2_bool_pos394(X,Y) get_csv2_bool((X),(Y),394)
+#define get_csv2_int_pos394(X,Y) get_csv2_int((X),(Y),394)
+#define get_csv2_llong_pos394(X,Y) get_csv2_llong((X),(Y),394)
+#define get_csv2_float_pos394(X,Y) get_csv2_float((X),(Y),394)
+#define get_csv2_uint_pos395(X,Y) get_csv2_uint((X),(Y),395)
+#define get_csv2_ullong_pos395(X,Y) get_csv2_ullong((X),(Y),395)
+#define get_csv2_ip_pos395(X,Y) get_csv2_ip((X),(Y),395)
+#define get_csv2_ipv6_pos395(X,Y) get_csv2_ipv6((X),(Y),395)
+#define get_csv2_string_pos395(X,Y) get_csv2_string((X),(Y),395)
+#define get_csv2_v_str_pos395(X,Y) get_csv2_string((X),(Y),395)
+#define get_csv2_bool_pos395(X,Y) get_csv2_bool((X),(Y),395)
+#define get_csv2_int_pos395(X,Y) get_csv2_int((X),(Y),395)
+#define get_csv2_llong_pos395(X,Y) get_csv2_llong((X),(Y),395)
+#define get_csv2_float_pos395(X,Y) get_csv2_float((X),(Y),395)
+#define get_csv2_uint_pos396(X,Y) get_csv2_uint((X),(Y),396)
+#define get_csv2_ullong_pos396(X,Y) get_csv2_ullong((X),(Y),396)
+#define get_csv2_ip_pos396(X,Y) get_csv2_ip((X),(Y),396)
+#define get_csv2_ipv6_pos396(X,Y) get_csv2_ipv6((X),(Y),396)
+#define get_csv2_string_pos396(X,Y) get_csv2_string((X),(Y),396)
+#define get_csv2_v_str_pos396(X,Y) get_csv2_string((X),(Y),396)
+#define get_csv2_bool_pos396(X,Y) get_csv2_bool((X),(Y),396)
+#define get_csv2_int_pos396(X,Y) get_csv2_int((X),(Y),396)
+#define get_csv2_llong_pos396(X,Y) get_csv2_llong((X),(Y),396)
+#define get_csv2_float_pos396(X,Y) get_csv2_float((X),(Y),396)
+#define get_csv2_uint_pos397(X,Y) get_csv2_uint((X),(Y),397)
+#define get_csv2_ullong_pos397(X,Y) get_csv2_ullong((X),(Y),397)
+#define get_csv2_ip_pos397(X,Y) get_csv2_ip((X),(Y),397)
+#define get_csv2_ipv6_pos397(X,Y) get_csv2_ipv6((X),(Y),397)
+#define get_csv2_string_pos397(X,Y) get_csv2_string((X),(Y),397)
+#define get_csv2_v_str_pos397(X,Y) get_csv2_string((X),(Y),397)
+#define get_csv2_bool_pos397(X,Y) get_csv2_bool((X),(Y),397)
+#define get_csv2_int_pos397(X,Y) get_csv2_int((X),(Y),397)
+#define get_csv2_llong_pos397(X,Y) get_csv2_llong((X),(Y),397)
+#define get_csv2_float_pos397(X,Y) get_csv2_float((X),(Y),397)
+#define get_csv2_uint_pos398(X,Y) get_csv2_uint((X),(Y),398)
+#define get_csv2_ullong_pos398(X,Y) get_csv2_ullong((X),(Y),398)
+#define get_csv2_ip_pos398(X,Y) get_csv2_ip((X),(Y),398)
+#define get_csv2_ipv6_pos398(X,Y) get_csv2_ipv6((X),(Y),398)
+#define get_csv2_string_pos398(X,Y) get_csv2_string((X),(Y),398)
+#define get_csv2_v_str_pos398(X,Y) get_csv2_string((X),(Y),398)
+#define get_csv2_bool_pos398(X,Y) get_csv2_bool((X),(Y),398)
+#define get_csv2_int_pos398(X,Y) get_csv2_int((X),(Y),398)
+#define get_csv2_llong_pos398(X,Y) get_csv2_llong((X),(Y),398)
+#define get_csv2_float_pos398(X,Y) get_csv2_float((X),(Y),398)
+#define get_csv2_uint_pos399(X,Y) get_csv2_uint((X),(Y),399)
+#define get_csv2_ullong_pos399(X,Y) get_csv2_ullong((X),(Y),399)
+#define get_csv2_ip_pos399(X,Y) get_csv2_ip((X),(Y),399)
+#define get_csv2_ipv6_pos399(X,Y) get_csv2_ipv6((X),(Y),399)
+#define get_csv2_string_pos399(X,Y) get_csv2_string((X),(Y),399)
+#define get_csv2_v_str_pos399(X,Y) get_csv2_string((X),(Y),399)
+#define get_csv2_bool_pos399(X,Y) get_csv2_bool((X),(Y),399)
+#define get_csv2_int_pos399(X,Y) get_csv2_int((X),(Y),399)
+#define get_csv2_llong_pos399(X,Y) get_csv2_llong((X),(Y),399)
+#define get_csv2_float_pos399(X,Y) get_csv2_float((X),(Y),399)
+#define get_csv2_uint_pos400(X,Y) get_csv2_uint((X),(Y),400)
+#define get_csv2_ullong_pos400(X,Y) get_csv2_ullong((X),(Y),400)
+#define get_csv2_ip_pos400(X,Y) get_csv2_ip((X),(Y),400)
+#define get_csv2_ipv6_pos400(X,Y) get_csv2_ipv6((X),(Y),400)
+#define get_csv2_string_pos400(X,Y) get_csv2_string((X),(Y),400)
+#define get_csv2_v_str_pos400(X,Y) get_csv2_string((X),(Y),400)
+#define get_csv2_bool_pos400(X,Y) get_csv2_bool((X),(Y),400)
+#define get_csv2_int_pos400(X,Y) get_csv2_int((X),(Y),400)
+#define get_csv2_llong_pos400(X,Y) get_csv2_llong((X),(Y),400)
+#define get_csv2_float_pos400(X,Y) get_csv2_float((X),(Y),400)
+#define get_csv2_uint_pos401(X,Y) get_csv2_uint((X),(Y),401)
+#define get_csv2_ullong_pos401(X,Y) get_csv2_ullong((X),(Y),401)
+#define get_csv2_ip_pos401(X,Y) get_csv2_ip((X),(Y),401)
+#define get_csv2_ipv6_pos401(X,Y) get_csv2_ipv6((X),(Y),401)
+#define get_csv2_string_pos401(X,Y) get_csv2_string((X),(Y),401)
+#define get_csv2_v_str_pos401(X,Y) get_csv2_string((X),(Y),401)
+#define get_csv2_bool_pos401(X,Y) get_csv2_bool((X),(Y),401)
+#define get_csv2_int_pos401(X,Y) get_csv2_int((X),(Y),401)
+#define get_csv2_llong_pos401(X,Y) get_csv2_llong((X),(Y),401)
+#define get_csv2_float_pos401(X,Y) get_csv2_float((X),(Y),401)
+#define get_csv2_uint_pos402(X,Y) get_csv2_uint((X),(Y),402)
+#define get_csv2_ullong_pos402(X,Y) get_csv2_ullong((X),(Y),402)
+#define get_csv2_ip_pos402(X,Y) get_csv2_ip((X),(Y),402)
+#define get_csv2_ipv6_pos402(X,Y) get_csv2_ipv6((X),(Y),402)
+#define get_csv2_string_pos402(X,Y) get_csv2_string((X),(Y),402)
+#define get_csv2_v_str_pos402(X,Y) get_csv2_string((X),(Y),402)
+#define get_csv2_bool_pos402(X,Y) get_csv2_bool((X),(Y),402)
+#define get_csv2_int_pos402(X,Y) get_csv2_int((X),(Y),402)
+#define get_csv2_llong_pos402(X,Y) get_csv2_llong((X),(Y),402)
+#define get_csv2_float_pos402(X,Y) get_csv2_float((X),(Y),402)
+#define get_csv2_uint_pos403(X,Y) get_csv2_uint((X),(Y),403)
+#define get_csv2_ullong_pos403(X,Y) get_csv2_ullong((X),(Y),403)
+#define get_csv2_ip_pos403(X,Y) get_csv2_ip((X),(Y),403)
+#define get_csv2_ipv6_pos403(X,Y) get_csv2_ipv6((X),(Y),403)
+#define get_csv2_string_pos403(X,Y) get_csv2_string((X),(Y),403)
+#define get_csv2_v_str_pos403(X,Y) get_csv2_string((X),(Y),403)
+#define get_csv2_bool_pos403(X,Y) get_csv2_bool((X),(Y),403)
+#define get_csv2_int_pos403(X,Y) get_csv2_int((X),(Y),403)
+#define get_csv2_llong_pos403(X,Y) get_csv2_llong((X),(Y),403)
+#define get_csv2_float_pos403(X,Y) get_csv2_float((X),(Y),403)
+#define get_csv2_uint_pos404(X,Y) get_csv2_uint((X),(Y),404)
+#define get_csv2_ullong_pos404(X,Y) get_csv2_ullong((X),(Y),404)
+#define get_csv2_ip_pos404(X,Y) get_csv2_ip((X),(Y),404)
+#define get_csv2_ipv6_pos404(X,Y) get_csv2_ipv6((X),(Y),404)
+#define get_csv2_string_pos404(X,Y) get_csv2_string((X),(Y),404)
+#define get_csv2_v_str_pos404(X,Y) get_csv2_string((X),(Y),404)
+#define get_csv2_bool_pos404(X,Y) get_csv2_bool((X),(Y),404)
+#define get_csv2_int_pos404(X,Y) get_csv2_int((X),(Y),404)
+#define get_csv2_llong_pos404(X,Y) get_csv2_llong((X),(Y),404)
+#define get_csv2_float_pos404(X,Y) get_csv2_float((X),(Y),404)
+#define get_csv2_uint_pos405(X,Y) get_csv2_uint((X),(Y),405)
+#define get_csv2_ullong_pos405(X,Y) get_csv2_ullong((X),(Y),405)
+#define get_csv2_ip_pos405(X,Y) get_csv2_ip((X),(Y),405)
+#define get_csv2_ipv6_pos405(X,Y) get_csv2_ipv6((X),(Y),405)
+#define get_csv2_string_pos405(X,Y) get_csv2_string((X),(Y),405)
+#define get_csv2_v_str_pos405(X,Y) get_csv2_string((X),(Y),405)
+#define get_csv2_bool_pos405(X,Y) get_csv2_bool((X),(Y),405)
+#define get_csv2_int_pos405(X,Y) get_csv2_int((X),(Y),405)
+#define get_csv2_llong_pos405(X,Y) get_csv2_llong((X),(Y),405)
+#define get_csv2_float_pos405(X,Y) get_csv2_float((X),(Y),405)
+#define get_csv2_uint_pos406(X,Y) get_csv2_uint((X),(Y),406)
+#define get_csv2_ullong_pos406(X,Y) get_csv2_ullong((X),(Y),406)
+#define get_csv2_ip_pos406(X,Y) get_csv2_ip((X),(Y),406)
+#define get_csv2_ipv6_pos406(X,Y) get_csv2_ipv6((X),(Y),406)
+#define get_csv2_string_pos406(X,Y) get_csv2_string((X),(Y),406)
+#define get_csv2_v_str_pos406(X,Y) get_csv2_string((X),(Y),406)
+#define get_csv2_bool_pos406(X,Y) get_csv2_bool((X),(Y),406)
+#define get_csv2_int_pos406(X,Y) get_csv2_int((X),(Y),406)
+#define get_csv2_llong_pos406(X,Y) get_csv2_llong((X),(Y),406)
+#define get_csv2_float_pos406(X,Y) get_csv2_float((X),(Y),406)
+#define get_csv2_uint_pos407(X,Y) get_csv2_uint((X),(Y),407)
+#define get_csv2_ullong_pos407(X,Y) get_csv2_ullong((X),(Y),407)
+#define get_csv2_ip_pos407(X,Y) get_csv2_ip((X),(Y),407)
+#define get_csv2_ipv6_pos407(X,Y) get_csv2_ipv6((X),(Y),407)
+#define get_csv2_string_pos407(X,Y) get_csv2_string((X),(Y),407)
+#define get_csv2_v_str_pos407(X,Y) get_csv2_string((X),(Y),407)
+#define get_csv2_bool_pos407(X,Y) get_csv2_bool((X),(Y),407)
+#define get_csv2_int_pos407(X,Y) get_csv2_int((X),(Y),407)
+#define get_csv2_llong_pos407(X,Y) get_csv2_llong((X),(Y),407)
+#define get_csv2_float_pos407(X,Y) get_csv2_float((X),(Y),407)
+#define get_csv2_uint_pos408(X,Y) get_csv2_uint((X),(Y),408)
+#define get_csv2_ullong_pos408(X,Y) get_csv2_ullong((X),(Y),408)
+#define get_csv2_ip_pos408(X,Y) get_csv2_ip((X),(Y),408)
+#define get_csv2_ipv6_pos408(X,Y) get_csv2_ipv6((X),(Y),408)
+#define get_csv2_string_pos408(X,Y) get_csv2_string((X),(Y),408)
+#define get_csv2_v_str_pos408(X,Y) get_csv2_string((X),(Y),408)
+#define get_csv2_bool_pos408(X,Y) get_csv2_bool((X),(Y),408)
+#define get_csv2_int_pos408(X,Y) get_csv2_int((X),(Y),408)
+#define get_csv2_llong_pos408(X,Y) get_csv2_llong((X),(Y),408)
+#define get_csv2_float_pos408(X,Y) get_csv2_float((X),(Y),408)
+#define get_csv2_uint_pos409(X,Y) get_csv2_uint((X),(Y),409)
+#define get_csv2_ullong_pos409(X,Y) get_csv2_ullong((X),(Y),409)
+#define get_csv2_ip_pos409(X,Y) get_csv2_ip((X),(Y),409)
+#define get_csv2_ipv6_pos409(X,Y) get_csv2_ipv6((X),(Y),409)
+#define get_csv2_string_pos409(X,Y) get_csv2_string((X),(Y),409)
+#define get_csv2_v_str_pos409(X,Y) get_csv2_string((X),(Y),409)
+#define get_csv2_bool_pos409(X,Y) get_csv2_bool((X),(Y),409)
+#define get_csv2_int_pos409(X,Y) get_csv2_int((X),(Y),409)
+#define get_csv2_llong_pos409(X,Y) get_csv2_llong((X),(Y),409)
+#define get_csv2_float_pos409(X,Y) get_csv2_float((X),(Y),409)
+#define get_csv2_uint_pos410(X,Y) get_csv2_uint((X),(Y),410)
+#define get_csv2_ullong_pos410(X,Y) get_csv2_ullong((X),(Y),410)
+#define get_csv2_ip_pos410(X,Y) get_csv2_ip((X),(Y),410)
+#define get_csv2_ipv6_pos410(X,Y) get_csv2_ipv6((X),(Y),410)
+#define get_csv2_string_pos410(X,Y) get_csv2_string((X),(Y),410)
+#define get_csv2_v_str_pos410(X,Y) get_csv2_string((X),(Y),410)
+#define get_csv2_bool_pos410(X,Y) get_csv2_bool((X),(Y),410)
+#define get_csv2_int_pos410(X,Y) get_csv2_int((X),(Y),410)
+#define get_csv2_llong_pos410(X,Y) get_csv2_llong((X),(Y),410)
+#define get_csv2_float_pos410(X,Y) get_csv2_float((X),(Y),410)
+#define get_csv2_uint_pos411(X,Y) get_csv2_uint((X),(Y),411)
+#define get_csv2_ullong_pos411(X,Y) get_csv2_ullong((X),(Y),411)
+#define get_csv2_ip_pos411(X,Y) get_csv2_ip((X),(Y),411)
+#define get_csv2_ipv6_pos411(X,Y) get_csv2_ipv6((X),(Y),411)
+#define get_csv2_string_pos411(X,Y) get_csv2_string((X),(Y),411)
+#define get_csv2_v_str_pos411(X,Y) get_csv2_string((X),(Y),411)
+#define get_csv2_bool_pos411(X,Y) get_csv2_bool((X),(Y),411)
+#define get_csv2_int_pos411(X,Y) get_csv2_int((X),(Y),411)
+#define get_csv2_llong_pos411(X,Y) get_csv2_llong((X),(Y),411)
+#define get_csv2_float_pos411(X,Y) get_csv2_float((X),(Y),411)
+#define get_csv2_uint_pos412(X,Y) get_csv2_uint((X),(Y),412)
+#define get_csv2_ullong_pos412(X,Y) get_csv2_ullong((X),(Y),412)
+#define get_csv2_ip_pos412(X,Y) get_csv2_ip((X),(Y),412)
+#define get_csv2_ipv6_pos412(X,Y) get_csv2_ipv6((X),(Y),412)
+#define get_csv2_string_pos412(X,Y) get_csv2_string((X),(Y),412)
+#define get_csv2_v_str_pos412(X,Y) get_csv2_string((X),(Y),412)
+#define get_csv2_bool_pos412(X,Y) get_csv2_bool((X),(Y),412)
+#define get_csv2_int_pos412(X,Y) get_csv2_int((X),(Y),412)
+#define get_csv2_llong_pos412(X,Y) get_csv2_llong((X),(Y),412)
+#define get_csv2_float_pos412(X,Y) get_csv2_float((X),(Y),412)
+#define get_csv2_uint_pos413(X,Y) get_csv2_uint((X),(Y),413)
+#define get_csv2_ullong_pos413(X,Y) get_csv2_ullong((X),(Y),413)
+#define get_csv2_ip_pos413(X,Y) get_csv2_ip((X),(Y),413)
+#define get_csv2_ipv6_pos413(X,Y) get_csv2_ipv6((X),(Y),413)
+#define get_csv2_string_pos413(X,Y) get_csv2_string((X),(Y),413)
+#define get_csv2_v_str_pos413(X,Y) get_csv2_string((X),(Y),413)
+#define get_csv2_bool_pos413(X,Y) get_csv2_bool((X),(Y),413)
+#define get_csv2_int_pos413(X,Y) get_csv2_int((X),(Y),413)
+#define get_csv2_llong_pos413(X,Y) get_csv2_llong((X),(Y),413)
+#define get_csv2_float_pos413(X,Y) get_csv2_float((X),(Y),413)
+#define get_csv2_uint_pos414(X,Y) get_csv2_uint((X),(Y),414)
+#define get_csv2_ullong_pos414(X,Y) get_csv2_ullong((X),(Y),414)
+#define get_csv2_ip_pos414(X,Y) get_csv2_ip((X),(Y),414)
+#define get_csv2_ipv6_pos414(X,Y) get_csv2_ipv6((X),(Y),414)
+#define get_csv2_string_pos414(X,Y) get_csv2_string((X),(Y),414)
+#define get_csv2_v_str_pos414(X,Y) get_csv2_string((X),(Y),414)
+#define get_csv2_bool_pos414(X,Y) get_csv2_bool((X),(Y),414)
+#define get_csv2_int_pos414(X,Y) get_csv2_int((X),(Y),414)
+#define get_csv2_llong_pos414(X,Y) get_csv2_llong((X),(Y),414)
+#define get_csv2_float_pos414(X,Y) get_csv2_float((X),(Y),414)
+#define get_csv2_uint_pos415(X,Y) get_csv2_uint((X),(Y),415)
+#define get_csv2_ullong_pos415(X,Y) get_csv2_ullong((X),(Y),415)
+#define get_csv2_ip_pos415(X,Y) get_csv2_ip((X),(Y),415)
+#define get_csv2_ipv6_pos415(X,Y) get_csv2_ipv6((X),(Y),415)
+#define get_csv2_string_pos415(X,Y) get_csv2_string((X),(Y),415)
+#define get_csv2_v_str_pos415(X,Y) get_csv2_string((X),(Y),415)
+#define get_csv2_bool_pos415(X,Y) get_csv2_bool((X),(Y),415)
+#define get_csv2_int_pos415(X,Y) get_csv2_int((X),(Y),415)
+#define get_csv2_llong_pos415(X,Y) get_csv2_llong((X),(Y),415)
+#define get_csv2_float_pos415(X,Y) get_csv2_float((X),(Y),415)
+#define get_csv2_uint_pos416(X,Y) get_csv2_uint((X),(Y),416)
+#define get_csv2_ullong_pos416(X,Y) get_csv2_ullong((X),(Y),416)
+#define get_csv2_ip_pos416(X,Y) get_csv2_ip((X),(Y),416)
+#define get_csv2_ipv6_pos416(X,Y) get_csv2_ipv6((X),(Y),416)
+#define get_csv2_string_pos416(X,Y) get_csv2_string((X),(Y),416)
+#define get_csv2_v_str_pos416(X,Y) get_csv2_string((X),(Y),416)
+#define get_csv2_bool_pos416(X,Y) get_csv2_bool((X),(Y),416)
+#define get_csv2_int_pos416(X,Y) get_csv2_int((X),(Y),416)
+#define get_csv2_llong_pos416(X,Y) get_csv2_llong((X),(Y),416)
+#define get_csv2_float_pos416(X,Y) get_csv2_float((X),(Y),416)
+#define get_csv2_uint_pos417(X,Y) get_csv2_uint((X),(Y),417)
+#define get_csv2_ullong_pos417(X,Y) get_csv2_ullong((X),(Y),417)
+#define get_csv2_ip_pos417(X,Y) get_csv2_ip((X),(Y),417)
+#define get_csv2_ipv6_pos417(X,Y) get_csv2_ipv6((X),(Y),417)
+#define get_csv2_string_pos417(X,Y) get_csv2_string((X),(Y),417)
+#define get_csv2_v_str_pos417(X,Y) get_csv2_string((X),(Y),417)
+#define get_csv2_bool_pos417(X,Y) get_csv2_bool((X),(Y),417)
+#define get_csv2_int_pos417(X,Y) get_csv2_int((X),(Y),417)
+#define get_csv2_llong_pos417(X,Y) get_csv2_llong((X),(Y),417)
+#define get_csv2_float_pos417(X,Y) get_csv2_float((X),(Y),417)
+#define get_csv2_uint_pos418(X,Y) get_csv2_uint((X),(Y),418)
+#define get_csv2_ullong_pos418(X,Y) get_csv2_ullong((X),(Y),418)
+#define get_csv2_ip_pos418(X,Y) get_csv2_ip((X),(Y),418)
+#define get_csv2_ipv6_pos418(X,Y) get_csv2_ipv6((X),(Y),418)
+#define get_csv2_string_pos418(X,Y) get_csv2_string((X),(Y),418)
+#define get_csv2_v_str_pos418(X,Y) get_csv2_string((X),(Y),418)
+#define get_csv2_bool_pos418(X,Y) get_csv2_bool((X),(Y),418)
+#define get_csv2_int_pos418(X,Y) get_csv2_int((X),(Y),418)
+#define get_csv2_llong_pos418(X,Y) get_csv2_llong((X),(Y),418)
+#define get_csv2_float_pos418(X,Y) get_csv2_float((X),(Y),418)
+#define get_csv2_uint_pos419(X,Y) get_csv2_uint((X),(Y),419)
+#define get_csv2_ullong_pos419(X,Y) get_csv2_ullong((X),(Y),419)
+#define get_csv2_ip_pos419(X,Y) get_csv2_ip((X),(Y),419)
+#define get_csv2_ipv6_pos419(X,Y) get_csv2_ipv6((X),(Y),419)
+#define get_csv2_string_pos419(X,Y) get_csv2_string((X),(Y),419)
+#define get_csv2_v_str_pos419(X,Y) get_csv2_string((X),(Y),419)
+#define get_csv2_bool_pos419(X,Y) get_csv2_bool((X),(Y),419)
+#define get_csv2_int_pos419(X,Y) get_csv2_int((X),(Y),419)
+#define get_csv2_llong_pos419(X,Y) get_csv2_llong((X),(Y),419)
+#define get_csv2_float_pos419(X,Y) get_csv2_float((X),(Y),419)
+#define get_csv2_uint_pos420(X,Y) get_csv2_uint((X),(Y),420)
+#define get_csv2_ullong_pos420(X,Y) get_csv2_ullong((X),(Y),420)
+#define get_csv2_ip_pos420(X,Y) get_csv2_ip((X),(Y),420)
+#define get_csv2_ipv6_pos420(X,Y) get_csv2_ipv6((X),(Y),420)
+#define get_csv2_string_pos420(X,Y) get_csv2_string((X),(Y),420)
+#define get_csv2_v_str_pos420(X,Y) get_csv2_string((X),(Y),420)
+#define get_csv2_bool_pos420(X,Y) get_csv2_bool((X),(Y),420)
+#define get_csv2_int_pos420(X,Y) get_csv2_int((X),(Y),420)
+#define get_csv2_llong_pos420(X,Y) get_csv2_llong((X),(Y),420)
+#define get_csv2_float_pos420(X,Y) get_csv2_float((X),(Y),420)
+#define get_csv2_uint_pos421(X,Y) get_csv2_uint((X),(Y),421)
+#define get_csv2_ullong_pos421(X,Y) get_csv2_ullong((X),(Y),421)
+#define get_csv2_ip_pos421(X,Y) get_csv2_ip((X),(Y),421)
+#define get_csv2_ipv6_pos421(X,Y) get_csv2_ipv6((X),(Y),421)
+#define get_csv2_string_pos421(X,Y) get_csv2_string((X),(Y),421)
+#define get_csv2_v_str_pos421(X,Y) get_csv2_string((X),(Y),421)
+#define get_csv2_bool_pos421(X,Y) get_csv2_bool((X),(Y),421)
+#define get_csv2_int_pos421(X,Y) get_csv2_int((X),(Y),421)
+#define get_csv2_llong_pos421(X,Y) get_csv2_llong((X),(Y),421)
+#define get_csv2_float_pos421(X,Y) get_csv2_float((X),(Y),421)
+#define get_csv2_uint_pos422(X,Y) get_csv2_uint((X),(Y),422)
+#define get_csv2_ullong_pos422(X,Y) get_csv2_ullong((X),(Y),422)
+#define get_csv2_ip_pos422(X,Y) get_csv2_ip((X),(Y),422)
+#define get_csv2_ipv6_pos422(X,Y) get_csv2_ipv6((X),(Y),422)
+#define get_csv2_string_pos422(X,Y) get_csv2_string((X),(Y),422)
+#define get_csv2_v_str_pos422(X,Y) get_csv2_string((X),(Y),422)
+#define get_csv2_bool_pos422(X,Y) get_csv2_bool((X),(Y),422)
+#define get_csv2_int_pos422(X,Y) get_csv2_int((X),(Y),422)
+#define get_csv2_llong_pos422(X,Y) get_csv2_llong((X),(Y),422)
+#define get_csv2_float_pos422(X,Y) get_csv2_float((X),(Y),422)
+#define get_csv2_uint_pos423(X,Y) get_csv2_uint((X),(Y),423)
+#define get_csv2_ullong_pos423(X,Y) get_csv2_ullong((X),(Y),423)
+#define get_csv2_ip_pos423(X,Y) get_csv2_ip((X),(Y),423)
+#define get_csv2_ipv6_pos423(X,Y) get_csv2_ipv6((X),(Y),423)
+#define get_csv2_string_pos423(X,Y) get_csv2_string((X),(Y),423)
+#define get_csv2_v_str_pos423(X,Y) get_csv2_string((X),(Y),423)
+#define get_csv2_bool_pos423(X,Y) get_csv2_bool((X),(Y),423)
+#define get_csv2_int_pos423(X,Y) get_csv2_int((X),(Y),423)
+#define get_csv2_llong_pos423(X,Y) get_csv2_llong((X),(Y),423)
+#define get_csv2_float_pos423(X,Y) get_csv2_float((X),(Y),423)
+#define get_csv2_uint_pos424(X,Y) get_csv2_uint((X),(Y),424)
+#define get_csv2_ullong_pos424(X,Y) get_csv2_ullong((X),(Y),424)
+#define get_csv2_ip_pos424(X,Y) get_csv2_ip((X),(Y),424)
+#define get_csv2_ipv6_pos424(X,Y) get_csv2_ipv6((X),(Y),424)
+#define get_csv2_string_pos424(X,Y) get_csv2_string((X),(Y),424)
+#define get_csv2_v_str_pos424(X,Y) get_csv2_string((X),(Y),424)
+#define get_csv2_bool_pos424(X,Y) get_csv2_bool((X),(Y),424)
+#define get_csv2_int_pos424(X,Y) get_csv2_int((X),(Y),424)
+#define get_csv2_llong_pos424(X,Y) get_csv2_llong((X),(Y),424)
+#define get_csv2_float_pos424(X,Y) get_csv2_float((X),(Y),424)
+#define get_csv2_uint_pos425(X,Y) get_csv2_uint((X),(Y),425)
+#define get_csv2_ullong_pos425(X,Y) get_csv2_ullong((X),(Y),425)
+#define get_csv2_ip_pos425(X,Y) get_csv2_ip((X),(Y),425)
+#define get_csv2_ipv6_pos425(X,Y) get_csv2_ipv6((X),(Y),425)
+#define get_csv2_string_pos425(X,Y) get_csv2_string((X),(Y),425)
+#define get_csv2_v_str_pos425(X,Y) get_csv2_string((X),(Y),425)
+#define get_csv2_bool_pos425(X,Y) get_csv2_bool((X),(Y),425)
+#define get_csv2_int_pos425(X,Y) get_csv2_int((X),(Y),425)
+#define get_csv2_llong_pos425(X,Y) get_csv2_llong((X),(Y),425)
+#define get_csv2_float_pos425(X,Y) get_csv2_float((X),(Y),425)
+#define get_csv2_uint_pos426(X,Y) get_csv2_uint((X),(Y),426)
+#define get_csv2_ullong_pos426(X,Y) get_csv2_ullong((X),(Y),426)
+#define get_csv2_ip_pos426(X,Y) get_csv2_ip((X),(Y),426)
+#define get_csv2_ipv6_pos426(X,Y) get_csv2_ipv6((X),(Y),426)
+#define get_csv2_string_pos426(X,Y) get_csv2_string((X),(Y),426)
+#define get_csv2_v_str_pos426(X,Y) get_csv2_string((X),(Y),426)
+#define get_csv2_bool_pos426(X,Y) get_csv2_bool((X),(Y),426)
+#define get_csv2_int_pos426(X,Y) get_csv2_int((X),(Y),426)
+#define get_csv2_llong_pos426(X,Y) get_csv2_llong((X),(Y),426)
+#define get_csv2_float_pos426(X,Y) get_csv2_float((X),(Y),426)
+#define get_csv2_uint_pos427(X,Y) get_csv2_uint((X),(Y),427)
+#define get_csv2_ullong_pos427(X,Y) get_csv2_ullong((X),(Y),427)
+#define get_csv2_ip_pos427(X,Y) get_csv2_ip((X),(Y),427)
+#define get_csv2_ipv6_pos427(X,Y) get_csv2_ipv6((X),(Y),427)
+#define get_csv2_string_pos427(X,Y) get_csv2_string((X),(Y),427)
+#define get_csv2_v_str_pos427(X,Y) get_csv2_string((X),(Y),427)
+#define get_csv2_bool_pos427(X,Y) get_csv2_bool((X),(Y),427)
+#define get_csv2_int_pos427(X,Y) get_csv2_int((X),(Y),427)
+#define get_csv2_llong_pos427(X,Y) get_csv2_llong((X),(Y),427)
+#define get_csv2_float_pos427(X,Y) get_csv2_float((X),(Y),427)
+#define get_csv2_uint_pos428(X,Y) get_csv2_uint((X),(Y),428)
+#define get_csv2_ullong_pos428(X,Y) get_csv2_ullong((X),(Y),428)
+#define get_csv2_ip_pos428(X,Y) get_csv2_ip((X),(Y),428)
+#define get_csv2_ipv6_pos428(X,Y) get_csv2_ipv6((X),(Y),428)
+#define get_csv2_string_pos428(X,Y) get_csv2_string((X),(Y),428)
+#define get_csv2_v_str_pos428(X,Y) get_csv2_string((X),(Y),428)
+#define get_csv2_bool_pos428(X,Y) get_csv2_bool((X),(Y),428)
+#define get_csv2_int_pos428(X,Y) get_csv2_int((X),(Y),428)
+#define get_csv2_llong_pos428(X,Y) get_csv2_llong((X),(Y),428)
+#define get_csv2_float_pos428(X,Y) get_csv2_float((X),(Y),428)
+#define get_csv2_uint_pos429(X,Y) get_csv2_uint((X),(Y),429)
+#define get_csv2_ullong_pos429(X,Y) get_csv2_ullong((X),(Y),429)
+#define get_csv2_ip_pos429(X,Y) get_csv2_ip((X),(Y),429)
+#define get_csv2_ipv6_pos429(X,Y) get_csv2_ipv6((X),(Y),429)
+#define get_csv2_string_pos429(X,Y) get_csv2_string((X),(Y),429)
+#define get_csv2_v_str_pos429(X,Y) get_csv2_string((X),(Y),429)
+#define get_csv2_bool_pos429(X,Y) get_csv2_bool((X),(Y),429)
+#define get_csv2_int_pos429(X,Y) get_csv2_int((X),(Y),429)
+#define get_csv2_llong_pos429(X,Y) get_csv2_llong((X),(Y),429)
+#define get_csv2_float_pos429(X,Y) get_csv2_float((X),(Y),429)
+#define get_csv2_uint_pos430(X,Y) get_csv2_uint((X),(Y),430)
+#define get_csv2_ullong_pos430(X,Y) get_csv2_ullong((X),(Y),430)
+#define get_csv2_ip_pos430(X,Y) get_csv2_ip((X),(Y),430)
+#define get_csv2_ipv6_pos430(X,Y) get_csv2_ipv6((X),(Y),430)
+#define get_csv2_string_pos430(X,Y) get_csv2_string((X),(Y),430)
+#define get_csv2_v_str_pos430(X,Y) get_csv2_string((X),(Y),430)
+#define get_csv2_bool_pos430(X,Y) get_csv2_bool((X),(Y),430)
+#define get_csv2_int_pos430(X,Y) get_csv2_int((X),(Y),430)
+#define get_csv2_llong_pos430(X,Y) get_csv2_llong((X),(Y),430)
+#define get_csv2_float_pos430(X,Y) get_csv2_float((X),(Y),430)
+#define get_csv2_uint_pos431(X,Y) get_csv2_uint((X),(Y),431)
+#define get_csv2_ullong_pos431(X,Y) get_csv2_ullong((X),(Y),431)
+#define get_csv2_ip_pos431(X,Y) get_csv2_ip((X),(Y),431)
+#define get_csv2_ipv6_pos431(X,Y) get_csv2_ipv6((X),(Y),431)
+#define get_csv2_string_pos431(X,Y) get_csv2_string((X),(Y),431)
+#define get_csv2_v_str_pos431(X,Y) get_csv2_string((X),(Y),431)
+#define get_csv2_bool_pos431(X,Y) get_csv2_bool((X),(Y),431)
+#define get_csv2_int_pos431(X,Y) get_csv2_int((X),(Y),431)
+#define get_csv2_llong_pos431(X,Y) get_csv2_llong((X),(Y),431)
+#define get_csv2_float_pos431(X,Y) get_csv2_float((X),(Y),431)
+#define get_csv2_uint_pos432(X,Y) get_csv2_uint((X),(Y),432)
+#define get_csv2_ullong_pos432(X,Y) get_csv2_ullong((X),(Y),432)
+#define get_csv2_ip_pos432(X,Y) get_csv2_ip((X),(Y),432)
+#define get_csv2_ipv6_pos432(X,Y) get_csv2_ipv6((X),(Y),432)
+#define get_csv2_string_pos432(X,Y) get_csv2_string((X),(Y),432)
+#define get_csv2_v_str_pos432(X,Y) get_csv2_string((X),(Y),432)
+#define get_csv2_bool_pos432(X,Y) get_csv2_bool((X),(Y),432)
+#define get_csv2_int_pos432(X,Y) get_csv2_int((X),(Y),432)
+#define get_csv2_llong_pos432(X,Y) get_csv2_llong((X),(Y),432)
+#define get_csv2_float_pos432(X,Y) get_csv2_float((X),(Y),432)
+#define get_csv2_uint_pos433(X,Y) get_csv2_uint((X),(Y),433)
+#define get_csv2_ullong_pos433(X,Y) get_csv2_ullong((X),(Y),433)
+#define get_csv2_ip_pos433(X,Y) get_csv2_ip((X),(Y),433)
+#define get_csv2_ipv6_pos433(X,Y) get_csv2_ipv6((X),(Y),433)
+#define get_csv2_string_pos433(X,Y) get_csv2_string((X),(Y),433)
+#define get_csv2_v_str_pos433(X,Y) get_csv2_string((X),(Y),433)
+#define get_csv2_bool_pos433(X,Y) get_csv2_bool((X),(Y),433)
+#define get_csv2_int_pos433(X,Y) get_csv2_int((X),(Y),433)
+#define get_csv2_llong_pos433(X,Y) get_csv2_llong((X),(Y),433)
+#define get_csv2_float_pos433(X,Y) get_csv2_float((X),(Y),433)
+#define get_csv2_uint_pos434(X,Y) get_csv2_uint((X),(Y),434)
+#define get_csv2_ullong_pos434(X,Y) get_csv2_ullong((X),(Y),434)
+#define get_csv2_ip_pos434(X,Y) get_csv2_ip((X),(Y),434)
+#define get_csv2_ipv6_pos434(X,Y) get_csv2_ipv6((X),(Y),434)
+#define get_csv2_string_pos434(X,Y) get_csv2_string((X),(Y),434)
+#define get_csv2_v_str_pos434(X,Y) get_csv2_string((X),(Y),434)
+#define get_csv2_bool_pos434(X,Y) get_csv2_bool((X),(Y),434)
+#define get_csv2_int_pos434(X,Y) get_csv2_int((X),(Y),434)
+#define get_csv2_llong_pos434(X,Y) get_csv2_llong((X),(Y),434)
+#define get_csv2_float_pos434(X,Y) get_csv2_float((X),(Y),434)
+#define get_csv2_uint_pos435(X,Y) get_csv2_uint((X),(Y),435)
+#define get_csv2_ullong_pos435(X,Y) get_csv2_ullong((X),(Y),435)
+#define get_csv2_ip_pos435(X,Y) get_csv2_ip((X),(Y),435)
+#define get_csv2_ipv6_pos435(X,Y) get_csv2_ipv6((X),(Y),435)
+#define get_csv2_string_pos435(X,Y) get_csv2_string((X),(Y),435)
+#define get_csv2_v_str_pos435(X,Y) get_csv2_string((X),(Y),435)
+#define get_csv2_bool_pos435(X,Y) get_csv2_bool((X),(Y),435)
+#define get_csv2_int_pos435(X,Y) get_csv2_int((X),(Y),435)
+#define get_csv2_llong_pos435(X,Y) get_csv2_llong((X),(Y),435)
+#define get_csv2_float_pos435(X,Y) get_csv2_float((X),(Y),435)
+#define get_csv2_uint_pos436(X,Y) get_csv2_uint((X),(Y),436)
+#define get_csv2_ullong_pos436(X,Y) get_csv2_ullong((X),(Y),436)
+#define get_csv2_ip_pos436(X,Y) get_csv2_ip((X),(Y),436)
+#define get_csv2_ipv6_pos436(X,Y) get_csv2_ipv6((X),(Y),436)
+#define get_csv2_string_pos436(X,Y) get_csv2_string((X),(Y),436)
+#define get_csv2_v_str_pos436(X,Y) get_csv2_string((X),(Y),436)
+#define get_csv2_bool_pos436(X,Y) get_csv2_bool((X),(Y),436)
+#define get_csv2_int_pos436(X,Y) get_csv2_int((X),(Y),436)
+#define get_csv2_llong_pos436(X,Y) get_csv2_llong((X),(Y),436)
+#define get_csv2_float_pos436(X,Y) get_csv2_float((X),(Y),436)
+#define get_csv2_uint_pos437(X,Y) get_csv2_uint((X),(Y),437)
+#define get_csv2_ullong_pos437(X,Y) get_csv2_ullong((X),(Y),437)
+#define get_csv2_ip_pos437(X,Y) get_csv2_ip((X),(Y),437)
+#define get_csv2_ipv6_pos437(X,Y) get_csv2_ipv6((X),(Y),437)
+#define get_csv2_string_pos437(X,Y) get_csv2_string((X),(Y),437)
+#define get_csv2_v_str_pos437(X,Y) get_csv2_string((X),(Y),437)
+#define get_csv2_bool_pos437(X,Y) get_csv2_bool((X),(Y),437)
+#define get_csv2_int_pos437(X,Y) get_csv2_int((X),(Y),437)
+#define get_csv2_llong_pos437(X,Y) get_csv2_llong((X),(Y),437)
+#define get_csv2_float_pos437(X,Y) get_csv2_float((X),(Y),437)
+#define get_csv2_uint_pos438(X,Y) get_csv2_uint((X),(Y),438)
+#define get_csv2_ullong_pos438(X,Y) get_csv2_ullong((X),(Y),438)
+#define get_csv2_ip_pos438(X,Y) get_csv2_ip((X),(Y),438)
+#define get_csv2_ipv6_pos438(X,Y) get_csv2_ipv6((X),(Y),438)
+#define get_csv2_string_pos438(X,Y) get_csv2_string((X),(Y),438)
+#define get_csv2_v_str_pos438(X,Y) get_csv2_string((X),(Y),438)
+#define get_csv2_bool_pos438(X,Y) get_csv2_bool((X),(Y),438)
+#define get_csv2_int_pos438(X,Y) get_csv2_int((X),(Y),438)
+#define get_csv2_llong_pos438(X,Y) get_csv2_llong((X),(Y),438)
+#define get_csv2_float_pos438(X,Y) get_csv2_float((X),(Y),438)
+#define get_csv2_uint_pos439(X,Y) get_csv2_uint((X),(Y),439)
+#define get_csv2_ullong_pos439(X,Y) get_csv2_ullong((X),(Y),439)
+#define get_csv2_ip_pos439(X,Y) get_csv2_ip((X),(Y),439)
+#define get_csv2_ipv6_pos439(X,Y) get_csv2_ipv6((X),(Y),439)
+#define get_csv2_string_pos439(X,Y) get_csv2_string((X),(Y),439)
+#define get_csv2_v_str_pos439(X,Y) get_csv2_string((X),(Y),439)
+#define get_csv2_bool_pos439(X,Y) get_csv2_bool((X),(Y),439)
+#define get_csv2_int_pos439(X,Y) get_csv2_int((X),(Y),439)
+#define get_csv2_llong_pos439(X,Y) get_csv2_llong((X),(Y),439)
+#define get_csv2_float_pos439(X,Y) get_csv2_float((X),(Y),439)
+#define get_csv2_uint_pos440(X,Y) get_csv2_uint((X),(Y),440)
+#define get_csv2_ullong_pos440(X,Y) get_csv2_ullong((X),(Y),440)
+#define get_csv2_ip_pos440(X,Y) get_csv2_ip((X),(Y),440)
+#define get_csv2_ipv6_pos440(X,Y) get_csv2_ipv6((X),(Y),440)
+#define get_csv2_string_pos440(X,Y) get_csv2_string((X),(Y),440)
+#define get_csv2_v_str_pos440(X,Y) get_csv2_string((X),(Y),440)
+#define get_csv2_bool_pos440(X,Y) get_csv2_bool((X),(Y),440)
+#define get_csv2_int_pos440(X,Y) get_csv2_int((X),(Y),440)
+#define get_csv2_llong_pos440(X,Y) get_csv2_llong((X),(Y),440)
+#define get_csv2_float_pos440(X,Y) get_csv2_float((X),(Y),440)
+#define get_csv2_uint_pos441(X,Y) get_csv2_uint((X),(Y),441)
+#define get_csv2_ullong_pos441(X,Y) get_csv2_ullong((X),(Y),441)
+#define get_csv2_ip_pos441(X,Y) get_csv2_ip((X),(Y),441)
+#define get_csv2_ipv6_pos441(X,Y) get_csv2_ipv6((X),(Y),441)
+#define get_csv2_string_pos441(X,Y) get_csv2_string((X),(Y),441)
+#define get_csv2_v_str_pos441(X,Y) get_csv2_string((X),(Y),441)
+#define get_csv2_bool_pos441(X,Y) get_csv2_bool((X),(Y),441)
+#define get_csv2_int_pos441(X,Y) get_csv2_int((X),(Y),441)
+#define get_csv2_llong_pos441(X,Y) get_csv2_llong((X),(Y),441)
+#define get_csv2_float_pos441(X,Y) get_csv2_float((X),(Y),441)
+#define get_csv2_uint_pos442(X,Y) get_csv2_uint((X),(Y),442)
+#define get_csv2_ullong_pos442(X,Y) get_csv2_ullong((X),(Y),442)
+#define get_csv2_ip_pos442(X,Y) get_csv2_ip((X),(Y),442)
+#define get_csv2_ipv6_pos442(X,Y) get_csv2_ipv6((X),(Y),442)
+#define get_csv2_string_pos442(X,Y) get_csv2_string((X),(Y),442)
+#define get_csv2_v_str_pos442(X,Y) get_csv2_string((X),(Y),442)
+#define get_csv2_bool_pos442(X,Y) get_csv2_bool((X),(Y),442)
+#define get_csv2_int_pos442(X,Y) get_csv2_int((X),(Y),442)
+#define get_csv2_llong_pos442(X,Y) get_csv2_llong((X),(Y),442)
+#define get_csv2_float_pos442(X,Y) get_csv2_float((X),(Y),442)
+#define get_csv2_uint_pos443(X,Y) get_csv2_uint((X),(Y),443)
+#define get_csv2_ullong_pos443(X,Y) get_csv2_ullong((X),(Y),443)
+#define get_csv2_ip_pos443(X,Y) get_csv2_ip((X),(Y),443)
+#define get_csv2_ipv6_pos443(X,Y) get_csv2_ipv6((X),(Y),443)
+#define get_csv2_string_pos443(X,Y) get_csv2_string((X),(Y),443)
+#define get_csv2_v_str_pos443(X,Y) get_csv2_string((X),(Y),443)
+#define get_csv2_bool_pos443(X,Y) get_csv2_bool((X),(Y),443)
+#define get_csv2_int_pos443(X,Y) get_csv2_int((X),(Y),443)
+#define get_csv2_llong_pos443(X,Y) get_csv2_llong((X),(Y),443)
+#define get_csv2_float_pos443(X,Y) get_csv2_float((X),(Y),443)
+#define get_csv2_uint_pos444(X,Y) get_csv2_uint((X),(Y),444)
+#define get_csv2_ullong_pos444(X,Y) get_csv2_ullong((X),(Y),444)
+#define get_csv2_ip_pos444(X,Y) get_csv2_ip((X),(Y),444)
+#define get_csv2_ipv6_pos444(X,Y) get_csv2_ipv6((X),(Y),444)
+#define get_csv2_string_pos444(X,Y) get_csv2_string((X),(Y),444)
+#define get_csv2_v_str_pos444(X,Y) get_csv2_string((X),(Y),444)
+#define get_csv2_bool_pos444(X,Y) get_csv2_bool((X),(Y),444)
+#define get_csv2_int_pos444(X,Y) get_csv2_int((X),(Y),444)
+#define get_csv2_llong_pos444(X,Y) get_csv2_llong((X),(Y),444)
+#define get_csv2_float_pos444(X,Y) get_csv2_float((X),(Y),444)
+#define get_csv2_uint_pos445(X,Y) get_csv2_uint((X),(Y),445)
+#define get_csv2_ullong_pos445(X,Y) get_csv2_ullong((X),(Y),445)
+#define get_csv2_ip_pos445(X,Y) get_csv2_ip((X),(Y),445)
+#define get_csv2_ipv6_pos445(X,Y) get_csv2_ipv6((X),(Y),445)
+#define get_csv2_string_pos445(X,Y) get_csv2_string((X),(Y),445)
+#define get_csv2_v_str_pos445(X,Y) get_csv2_string((X),(Y),445)
+#define get_csv2_bool_pos445(X,Y) get_csv2_bool((X),(Y),445)
+#define get_csv2_int_pos445(X,Y) get_csv2_int((X),(Y),445)
+#define get_csv2_llong_pos445(X,Y) get_csv2_llong((X),(Y),445)
+#define get_csv2_float_pos445(X,Y) get_csv2_float((X),(Y),445)
+#define get_csv2_uint_pos446(X,Y) get_csv2_uint((X),(Y),446)
+#define get_csv2_ullong_pos446(X,Y) get_csv2_ullong((X),(Y),446)
+#define get_csv2_ip_pos446(X,Y) get_csv2_ip((X),(Y),446)
+#define get_csv2_ipv6_pos446(X,Y) get_csv2_ipv6((X),(Y),446)
+#define get_csv2_string_pos446(X,Y) get_csv2_string((X),(Y),446)
+#define get_csv2_v_str_pos446(X,Y) get_csv2_string((X),(Y),446)
+#define get_csv2_bool_pos446(X,Y) get_csv2_bool((X),(Y),446)
+#define get_csv2_int_pos446(X,Y) get_csv2_int((X),(Y),446)
+#define get_csv2_llong_pos446(X,Y) get_csv2_llong((X),(Y),446)
+#define get_csv2_float_pos446(X,Y) get_csv2_float((X),(Y),446)
+#define get_csv2_uint_pos447(X,Y) get_csv2_uint((X),(Y),447)
+#define get_csv2_ullong_pos447(X,Y) get_csv2_ullong((X),(Y),447)
+#define get_csv2_ip_pos447(X,Y) get_csv2_ip((X),(Y),447)
+#define get_csv2_ipv6_pos447(X,Y) get_csv2_ipv6((X),(Y),447)
+#define get_csv2_string_pos447(X,Y) get_csv2_string((X),(Y),447)
+#define get_csv2_v_str_pos447(X,Y) get_csv2_string((X),(Y),447)
+#define get_csv2_bool_pos447(X,Y) get_csv2_bool((X),(Y),447)
+#define get_csv2_int_pos447(X,Y) get_csv2_int((X),(Y),447)
+#define get_csv2_llong_pos447(X,Y) get_csv2_llong((X),(Y),447)
+#define get_csv2_float_pos447(X,Y) get_csv2_float((X),(Y),447)
+#define get_csv2_uint_pos448(X,Y) get_csv2_uint((X),(Y),448)
+#define get_csv2_ullong_pos448(X,Y) get_csv2_ullong((X),(Y),448)
+#define get_csv2_ip_pos448(X,Y) get_csv2_ip((X),(Y),448)
+#define get_csv2_ipv6_pos448(X,Y) get_csv2_ipv6((X),(Y),448)
+#define get_csv2_string_pos448(X,Y) get_csv2_string((X),(Y),448)
+#define get_csv2_v_str_pos448(X,Y) get_csv2_string((X),(Y),448)
+#define get_csv2_bool_pos448(X,Y) get_csv2_bool((X),(Y),448)
+#define get_csv2_int_pos448(X,Y) get_csv2_int((X),(Y),448)
+#define get_csv2_llong_pos448(X,Y) get_csv2_llong((X),(Y),448)
+#define get_csv2_float_pos448(X,Y) get_csv2_float((X),(Y),448)
+#define get_csv2_uint_pos449(X,Y) get_csv2_uint((X),(Y),449)
+#define get_csv2_ullong_pos449(X,Y) get_csv2_ullong((X),(Y),449)
+#define get_csv2_ip_pos449(X,Y) get_csv2_ip((X),(Y),449)
+#define get_csv2_ipv6_pos449(X,Y) get_csv2_ipv6((X),(Y),449)
+#define get_csv2_string_pos449(X,Y) get_csv2_string((X),(Y),449)
+#define get_csv2_v_str_pos449(X,Y) get_csv2_string((X),(Y),449)
+#define get_csv2_bool_pos449(X,Y) get_csv2_bool((X),(Y),449)
+#define get_csv2_int_pos449(X,Y) get_csv2_int((X),(Y),449)
+#define get_csv2_llong_pos449(X,Y) get_csv2_llong((X),(Y),449)
+#define get_csv2_float_pos449(X,Y) get_csv2_float((X),(Y),449)
+#define get_csv2_uint_pos450(X,Y) get_csv2_uint((X),(Y),450)
+#define get_csv2_ullong_pos450(X,Y) get_csv2_ullong((X),(Y),450)
+#define get_csv2_ip_pos450(X,Y) get_csv2_ip((X),(Y),450)
+#define get_csv2_ipv6_pos450(X,Y) get_csv2_ipv6((X),(Y),450)
+#define get_csv2_string_pos450(X,Y) get_csv2_string((X),(Y),450)
+#define get_csv2_v_str_pos450(X,Y) get_csv2_string((X),(Y),450)
+#define get_csv2_bool_pos450(X,Y) get_csv2_bool((X),(Y),450)
+#define get_csv2_int_pos450(X,Y) get_csv2_int((X),(Y),450)
+#define get_csv2_llong_pos450(X,Y) get_csv2_llong((X),(Y),450)
+#define get_csv2_float_pos450(X,Y) get_csv2_float((X),(Y),450)
+#define get_csv2_uint_pos451(X,Y) get_csv2_uint((X),(Y),451)
+#define get_csv2_ullong_pos451(X,Y) get_csv2_ullong((X),(Y),451)
+#define get_csv2_ip_pos451(X,Y) get_csv2_ip((X),(Y),451)
+#define get_csv2_ipv6_pos451(X,Y) get_csv2_ipv6((X),(Y),451)
+#define get_csv2_string_pos451(X,Y) get_csv2_string((X),(Y),451)
+#define get_csv2_v_str_pos451(X,Y) get_csv2_string((X),(Y),451)
+#define get_csv2_bool_pos451(X,Y) get_csv2_bool((X),(Y),451)
+#define get_csv2_int_pos451(X,Y) get_csv2_int((X),(Y),451)
+#define get_csv2_llong_pos451(X,Y) get_csv2_llong((X),(Y),451)
+#define get_csv2_float_pos451(X,Y) get_csv2_float((X),(Y),451)
+#define get_csv2_uint_pos452(X,Y) get_csv2_uint((X),(Y),452)
+#define get_csv2_ullong_pos452(X,Y) get_csv2_ullong((X),(Y),452)
+#define get_csv2_ip_pos452(X,Y) get_csv2_ip((X),(Y),452)
+#define get_csv2_ipv6_pos452(X,Y) get_csv2_ipv6((X),(Y),452)
+#define get_csv2_string_pos452(X,Y) get_csv2_string((X),(Y),452)
+#define get_csv2_v_str_pos452(X,Y) get_csv2_string((X),(Y),452)
+#define get_csv2_bool_pos452(X,Y) get_csv2_bool((X),(Y),452)
+#define get_csv2_int_pos452(X,Y) get_csv2_int((X),(Y),452)
+#define get_csv2_llong_pos452(X,Y) get_csv2_llong((X),(Y),452)
+#define get_csv2_float_pos452(X,Y) get_csv2_float((X),(Y),452)
+#define get_csv2_uint_pos453(X,Y) get_csv2_uint((X),(Y),453)
+#define get_csv2_ullong_pos453(X,Y) get_csv2_ullong((X),(Y),453)
+#define get_csv2_ip_pos453(X,Y) get_csv2_ip((X),(Y),453)
+#define get_csv2_ipv6_pos453(X,Y) get_csv2_ipv6((X),(Y),453)
+#define get_csv2_string_pos453(X,Y) get_csv2_string((X),(Y),453)
+#define get_csv2_v_str_pos453(X,Y) get_csv2_string((X),(Y),453)
+#define get_csv2_bool_pos453(X,Y) get_csv2_bool((X),(Y),453)
+#define get_csv2_int_pos453(X,Y) get_csv2_int((X),(Y),453)
+#define get_csv2_llong_pos453(X,Y) get_csv2_llong((X),(Y),453)
+#define get_csv2_float_pos453(X,Y) get_csv2_float((X),(Y),453)
+#define get_csv2_uint_pos454(X,Y) get_csv2_uint((X),(Y),454)
+#define get_csv2_ullong_pos454(X,Y) get_csv2_ullong((X),(Y),454)
+#define get_csv2_ip_pos454(X,Y) get_csv2_ip((X),(Y),454)
+#define get_csv2_ipv6_pos454(X,Y) get_csv2_ipv6((X),(Y),454)
+#define get_csv2_string_pos454(X,Y) get_csv2_string((X),(Y),454)
+#define get_csv2_v_str_pos454(X,Y) get_csv2_string((X),(Y),454)
+#define get_csv2_bool_pos454(X,Y) get_csv2_bool((X),(Y),454)
+#define get_csv2_int_pos454(X,Y) get_csv2_int((X),(Y),454)
+#define get_csv2_llong_pos454(X,Y) get_csv2_llong((X),(Y),454)
+#define get_csv2_float_pos454(X,Y) get_csv2_float((X),(Y),454)
+#define get_csv2_uint_pos455(X,Y) get_csv2_uint((X),(Y),455)
+#define get_csv2_ullong_pos455(X,Y) get_csv2_ullong((X),(Y),455)
+#define get_csv2_ip_pos455(X,Y) get_csv2_ip((X),(Y),455)
+#define get_csv2_ipv6_pos455(X,Y) get_csv2_ipv6((X),(Y),455)
+#define get_csv2_string_pos455(X,Y) get_csv2_string((X),(Y),455)
+#define get_csv2_v_str_pos455(X,Y) get_csv2_string((X),(Y),455)
+#define get_csv2_bool_pos455(X,Y) get_csv2_bool((X),(Y),455)
+#define get_csv2_int_pos455(X,Y) get_csv2_int((X),(Y),455)
+#define get_csv2_llong_pos455(X,Y) get_csv2_llong((X),(Y),455)
+#define get_csv2_float_pos455(X,Y) get_csv2_float((X),(Y),455)
+#define get_csv2_uint_pos456(X,Y) get_csv2_uint((X),(Y),456)
+#define get_csv2_ullong_pos456(X,Y) get_csv2_ullong((X),(Y),456)
+#define get_csv2_ip_pos456(X,Y) get_csv2_ip((X),(Y),456)
+#define get_csv2_ipv6_pos456(X,Y) get_csv2_ipv6((X),(Y),456)
+#define get_csv2_string_pos456(X,Y) get_csv2_string((X),(Y),456)
+#define get_csv2_v_str_pos456(X,Y) get_csv2_string((X),(Y),456)
+#define get_csv2_bool_pos456(X,Y) get_csv2_bool((X),(Y),456)
+#define get_csv2_int_pos456(X,Y) get_csv2_int((X),(Y),456)
+#define get_csv2_llong_pos456(X,Y) get_csv2_llong((X),(Y),456)
+#define get_csv2_float_pos456(X,Y) get_csv2_float((X),(Y),456)
+#define get_csv2_uint_pos457(X,Y) get_csv2_uint((X),(Y),457)
+#define get_csv2_ullong_pos457(X,Y) get_csv2_ullong((X),(Y),457)
+#define get_csv2_ip_pos457(X,Y) get_csv2_ip((X),(Y),457)
+#define get_csv2_ipv6_pos457(X,Y) get_csv2_ipv6((X),(Y),457)
+#define get_csv2_string_pos457(X,Y) get_csv2_string((X),(Y),457)
+#define get_csv2_v_str_pos457(X,Y) get_csv2_string((X),(Y),457)
+#define get_csv2_bool_pos457(X,Y) get_csv2_bool((X),(Y),457)
+#define get_csv2_int_pos457(X,Y) get_csv2_int((X),(Y),457)
+#define get_csv2_llong_pos457(X,Y) get_csv2_llong((X),(Y),457)
+#define get_csv2_float_pos457(X,Y) get_csv2_float((X),(Y),457)
+#define get_csv2_uint_pos458(X,Y) get_csv2_uint((X),(Y),458)
+#define get_csv2_ullong_pos458(X,Y) get_csv2_ullong((X),(Y),458)
+#define get_csv2_ip_pos458(X,Y) get_csv2_ip((X),(Y),458)
+#define get_csv2_ipv6_pos458(X,Y) get_csv2_ipv6((X),(Y),458)
+#define get_csv2_string_pos458(X,Y) get_csv2_string((X),(Y),458)
+#define get_csv2_v_str_pos458(X,Y) get_csv2_string((X),(Y),458)
+#define get_csv2_bool_pos458(X,Y) get_csv2_bool((X),(Y),458)
+#define get_csv2_int_pos458(X,Y) get_csv2_int((X),(Y),458)
+#define get_csv2_llong_pos458(X,Y) get_csv2_llong((X),(Y),458)
+#define get_csv2_float_pos458(X,Y) get_csv2_float((X),(Y),458)
+#define get_csv2_uint_pos459(X,Y) get_csv2_uint((X),(Y),459)
+#define get_csv2_ullong_pos459(X,Y) get_csv2_ullong((X),(Y),459)
+#define get_csv2_ip_pos459(X,Y) get_csv2_ip((X),(Y),459)
+#define get_csv2_ipv6_pos459(X,Y) get_csv2_ipv6((X),(Y),459)
+#define get_csv2_string_pos459(X,Y) get_csv2_string((X),(Y),459)
+#define get_csv2_v_str_pos459(X,Y) get_csv2_string((X),(Y),459)
+#define get_csv2_bool_pos459(X,Y) get_csv2_bool((X),(Y),459)
+#define get_csv2_int_pos459(X,Y) get_csv2_int((X),(Y),459)
+#define get_csv2_llong_pos459(X,Y) get_csv2_llong((X),(Y),459)
+#define get_csv2_float_pos459(X,Y) get_csv2_float((X),(Y),459)
+#define get_csv2_uint_pos460(X,Y) get_csv2_uint((X),(Y),460)
+#define get_csv2_ullong_pos460(X,Y) get_csv2_ullong((X),(Y),460)
+#define get_csv2_ip_pos460(X,Y) get_csv2_ip((X),(Y),460)
+#define get_csv2_ipv6_pos460(X,Y) get_csv2_ipv6((X),(Y),460)
+#define get_csv2_string_pos460(X,Y) get_csv2_string((X),(Y),460)
+#define get_csv2_v_str_pos460(X,Y) get_csv2_string((X),(Y),460)
+#define get_csv2_bool_pos460(X,Y) get_csv2_bool((X),(Y),460)
+#define get_csv2_int_pos460(X,Y) get_csv2_int((X),(Y),460)
+#define get_csv2_llong_pos460(X,Y) get_csv2_llong((X),(Y),460)
+#define get_csv2_float_pos460(X,Y) get_csv2_float((X),(Y),460)
+#define get_csv2_uint_pos461(X,Y) get_csv2_uint((X),(Y),461)
+#define get_csv2_ullong_pos461(X,Y) get_csv2_ullong((X),(Y),461)
+#define get_csv2_ip_pos461(X,Y) get_csv2_ip((X),(Y),461)
+#define get_csv2_ipv6_pos461(X,Y) get_csv2_ipv6((X),(Y),461)
+#define get_csv2_string_pos461(X,Y) get_csv2_string((X),(Y),461)
+#define get_csv2_v_str_pos461(X,Y) get_csv2_string((X),(Y),461)
+#define get_csv2_bool_pos461(X,Y) get_csv2_bool((X),(Y),461)
+#define get_csv2_int_pos461(X,Y) get_csv2_int((X),(Y),461)
+#define get_csv2_llong_pos461(X,Y) get_csv2_llong((X),(Y),461)
+#define get_csv2_float_pos461(X,Y) get_csv2_float((X),(Y),461)
+#define get_csv2_uint_pos462(X,Y) get_csv2_uint((X),(Y),462)
+#define get_csv2_ullong_pos462(X,Y) get_csv2_ullong((X),(Y),462)
+#define get_csv2_ip_pos462(X,Y) get_csv2_ip((X),(Y),462)
+#define get_csv2_ipv6_pos462(X,Y) get_csv2_ipv6((X),(Y),462)
+#define get_csv2_string_pos462(X,Y) get_csv2_string((X),(Y),462)
+#define get_csv2_v_str_pos462(X,Y) get_csv2_string((X),(Y),462)
+#define get_csv2_bool_pos462(X,Y) get_csv2_bool((X),(Y),462)
+#define get_csv2_int_pos462(X,Y) get_csv2_int((X),(Y),462)
+#define get_csv2_llong_pos462(X,Y) get_csv2_llong((X),(Y),462)
+#define get_csv2_float_pos462(X,Y) get_csv2_float((X),(Y),462)
+#define get_csv2_uint_pos463(X,Y) get_csv2_uint((X),(Y),463)
+#define get_csv2_ullong_pos463(X,Y) get_csv2_ullong((X),(Y),463)
+#define get_csv2_ip_pos463(X,Y) get_csv2_ip((X),(Y),463)
+#define get_csv2_ipv6_pos463(X,Y) get_csv2_ipv6((X),(Y),463)
+#define get_csv2_string_pos463(X,Y) get_csv2_string((X),(Y),463)
+#define get_csv2_v_str_pos463(X,Y) get_csv2_string((X),(Y),463)
+#define get_csv2_bool_pos463(X,Y) get_csv2_bool((X),(Y),463)
+#define get_csv2_int_pos463(X,Y) get_csv2_int((X),(Y),463)
+#define get_csv2_llong_pos463(X,Y) get_csv2_llong((X),(Y),463)
+#define get_csv2_float_pos463(X,Y) get_csv2_float((X),(Y),463)
+#define get_csv2_uint_pos464(X,Y) get_csv2_uint((X),(Y),464)
+#define get_csv2_ullong_pos464(X,Y) get_csv2_ullong((X),(Y),464)
+#define get_csv2_ip_pos464(X,Y) get_csv2_ip((X),(Y),464)
+#define get_csv2_ipv6_pos464(X,Y) get_csv2_ipv6((X),(Y),464)
+#define get_csv2_string_pos464(X,Y) get_csv2_string((X),(Y),464)
+#define get_csv2_v_str_pos464(X,Y) get_csv2_string((X),(Y),464)
+#define get_csv2_bool_pos464(X,Y) get_csv2_bool((X),(Y),464)
+#define get_csv2_int_pos464(X,Y) get_csv2_int((X),(Y),464)
+#define get_csv2_llong_pos464(X,Y) get_csv2_llong((X),(Y),464)
+#define get_csv2_float_pos464(X,Y) get_csv2_float((X),(Y),464)
+#define get_csv2_uint_pos465(X,Y) get_csv2_uint((X),(Y),465)
+#define get_csv2_ullong_pos465(X,Y) get_csv2_ullong((X),(Y),465)
+#define get_csv2_ip_pos465(X,Y) get_csv2_ip((X),(Y),465)
+#define get_csv2_ipv6_pos465(X,Y) get_csv2_ipv6((X),(Y),465)
+#define get_csv2_string_pos465(X,Y) get_csv2_string((X),(Y),465)
+#define get_csv2_v_str_pos465(X,Y) get_csv2_string((X),(Y),465)
+#define get_csv2_bool_pos465(X,Y) get_csv2_bool((X),(Y),465)
+#define get_csv2_int_pos465(X,Y) get_csv2_int((X),(Y),465)
+#define get_csv2_llong_pos465(X,Y) get_csv2_llong((X),(Y),465)
+#define get_csv2_float_pos465(X,Y) get_csv2_float((X),(Y),465)
+#define get_csv2_uint_pos466(X,Y) get_csv2_uint((X),(Y),466)
+#define get_csv2_ullong_pos466(X,Y) get_csv2_ullong((X),(Y),466)
+#define get_csv2_ip_pos466(X,Y) get_csv2_ip((X),(Y),466)
+#define get_csv2_ipv6_pos466(X,Y) get_csv2_ipv6((X),(Y),466)
+#define get_csv2_string_pos466(X,Y) get_csv2_string((X),(Y),466)
+#define get_csv2_v_str_pos466(X,Y) get_csv2_string((X),(Y),466)
+#define get_csv2_bool_pos466(X,Y) get_csv2_bool((X),(Y),466)
+#define get_csv2_int_pos466(X,Y) get_csv2_int((X),(Y),466)
+#define get_csv2_llong_pos466(X,Y) get_csv2_llong((X),(Y),466)
+#define get_csv2_float_pos466(X,Y) get_csv2_float((X),(Y),466)
+#define get_csv2_uint_pos467(X,Y) get_csv2_uint((X),(Y),467)
+#define get_csv2_ullong_pos467(X,Y) get_csv2_ullong((X),(Y),467)
+#define get_csv2_ip_pos467(X,Y) get_csv2_ip((X),(Y),467)
+#define get_csv2_ipv6_pos467(X,Y) get_csv2_ipv6((X),(Y),467)
+#define get_csv2_string_pos467(X,Y) get_csv2_string((X),(Y),467)
+#define get_csv2_v_str_pos467(X,Y) get_csv2_string((X),(Y),467)
+#define get_csv2_bool_pos467(X,Y) get_csv2_bool((X),(Y),467)
+#define get_csv2_int_pos467(X,Y) get_csv2_int((X),(Y),467)
+#define get_csv2_llong_pos467(X,Y) get_csv2_llong((X),(Y),467)
+#define get_csv2_float_pos467(X,Y) get_csv2_float((X),(Y),467)
+#define get_csv2_uint_pos468(X,Y) get_csv2_uint((X),(Y),468)
+#define get_csv2_ullong_pos468(X,Y) get_csv2_ullong((X),(Y),468)
+#define get_csv2_ip_pos468(X,Y) get_csv2_ip((X),(Y),468)
+#define get_csv2_ipv6_pos468(X,Y) get_csv2_ipv6((X),(Y),468)
+#define get_csv2_string_pos468(X,Y) get_csv2_string((X),(Y),468)
+#define get_csv2_v_str_pos468(X,Y) get_csv2_string((X),(Y),468)
+#define get_csv2_bool_pos468(X,Y) get_csv2_bool((X),(Y),468)
+#define get_csv2_int_pos468(X,Y) get_csv2_int((X),(Y),468)
+#define get_csv2_llong_pos468(X,Y) get_csv2_llong((X),(Y),468)
+#define get_csv2_float_pos468(X,Y) get_csv2_float((X),(Y),468)
+#define get_csv2_uint_pos469(X,Y) get_csv2_uint((X),(Y),469)
+#define get_csv2_ullong_pos469(X,Y) get_csv2_ullong((X),(Y),469)
+#define get_csv2_ip_pos469(X,Y) get_csv2_ip((X),(Y),469)
+#define get_csv2_ipv6_pos469(X,Y) get_csv2_ipv6((X),(Y),469)
+#define get_csv2_string_pos469(X,Y) get_csv2_string((X),(Y),469)
+#define get_csv2_v_str_pos469(X,Y) get_csv2_string((X),(Y),469)
+#define get_csv2_bool_pos469(X,Y) get_csv2_bool((X),(Y),469)
+#define get_csv2_int_pos469(X,Y) get_csv2_int((X),(Y),469)
+#define get_csv2_llong_pos469(X,Y) get_csv2_llong((X),(Y),469)
+#define get_csv2_float_pos469(X,Y) get_csv2_float((X),(Y),469)
+#define get_csv2_uint_pos470(X,Y) get_csv2_uint((X),(Y),470)
+#define get_csv2_ullong_pos470(X,Y) get_csv2_ullong((X),(Y),470)
+#define get_csv2_ip_pos470(X,Y) get_csv2_ip((X),(Y),470)
+#define get_csv2_ipv6_pos470(X,Y) get_csv2_ipv6((X),(Y),470)
+#define get_csv2_string_pos470(X,Y) get_csv2_string((X),(Y),470)
+#define get_csv2_v_str_pos470(X,Y) get_csv2_string((X),(Y),470)
+#define get_csv2_bool_pos470(X,Y) get_csv2_bool((X),(Y),470)
+#define get_csv2_int_pos470(X,Y) get_csv2_int((X),(Y),470)
+#define get_csv2_llong_pos470(X,Y) get_csv2_llong((X),(Y),470)
+#define get_csv2_float_pos470(X,Y) get_csv2_float((X),(Y),470)
+#define get_csv2_uint_pos471(X,Y) get_csv2_uint((X),(Y),471)
+#define get_csv2_ullong_pos471(X,Y) get_csv2_ullong((X),(Y),471)
+#define get_csv2_ip_pos471(X,Y) get_csv2_ip((X),(Y),471)
+#define get_csv2_ipv6_pos471(X,Y) get_csv2_ipv6((X),(Y),471)
+#define get_csv2_string_pos471(X,Y) get_csv2_string((X),(Y),471)
+#define get_csv2_v_str_pos471(X,Y) get_csv2_string((X),(Y),471)
+#define get_csv2_bool_pos471(X,Y) get_csv2_bool((X),(Y),471)
+#define get_csv2_int_pos471(X,Y) get_csv2_int((X),(Y),471)
+#define get_csv2_llong_pos471(X,Y) get_csv2_llong((X),(Y),471)
+#define get_csv2_float_pos471(X,Y) get_csv2_float((X),(Y),471)
+#define get_csv2_uint_pos472(X,Y) get_csv2_uint((X),(Y),472)
+#define get_csv2_ullong_pos472(X,Y) get_csv2_ullong((X),(Y),472)
+#define get_csv2_ip_pos472(X,Y) get_csv2_ip((X),(Y),472)
+#define get_csv2_ipv6_pos472(X,Y) get_csv2_ipv6((X),(Y),472)
+#define get_csv2_string_pos472(X,Y) get_csv2_string((X),(Y),472)
+#define get_csv2_v_str_pos472(X,Y) get_csv2_string((X),(Y),472)
+#define get_csv2_bool_pos472(X,Y) get_csv2_bool((X),(Y),472)
+#define get_csv2_int_pos472(X,Y) get_csv2_int((X),(Y),472)
+#define get_csv2_llong_pos472(X,Y) get_csv2_llong((X),(Y),472)
+#define get_csv2_float_pos472(X,Y) get_csv2_float((X),(Y),472)
+#define get_csv2_uint_pos473(X,Y) get_csv2_uint((X),(Y),473)
+#define get_csv2_ullong_pos473(X,Y) get_csv2_ullong((X),(Y),473)
+#define get_csv2_ip_pos473(X,Y) get_csv2_ip((X),(Y),473)
+#define get_csv2_ipv6_pos473(X,Y) get_csv2_ipv6((X),(Y),473)
+#define get_csv2_string_pos473(X,Y) get_csv2_string((X),(Y),473)
+#define get_csv2_v_str_pos473(X,Y) get_csv2_string((X),(Y),473)
+#define get_csv2_bool_pos473(X,Y) get_csv2_bool((X),(Y),473)
+#define get_csv2_int_pos473(X,Y) get_csv2_int((X),(Y),473)
+#define get_csv2_llong_pos473(X,Y) get_csv2_llong((X),(Y),473)
+#define get_csv2_float_pos473(X,Y) get_csv2_float((X),(Y),473)
+#define get_csv2_uint_pos474(X,Y) get_csv2_uint((X),(Y),474)
+#define get_csv2_ullong_pos474(X,Y) get_csv2_ullong((X),(Y),474)
+#define get_csv2_ip_pos474(X,Y) get_csv2_ip((X),(Y),474)
+#define get_csv2_ipv6_pos474(X,Y) get_csv2_ipv6((X),(Y),474)
+#define get_csv2_string_pos474(X,Y) get_csv2_string((X),(Y),474)
+#define get_csv2_v_str_pos474(X,Y) get_csv2_string((X),(Y),474)
+#define get_csv2_bool_pos474(X,Y) get_csv2_bool((X),(Y),474)
+#define get_csv2_int_pos474(X,Y) get_csv2_int((X),(Y),474)
+#define get_csv2_llong_pos474(X,Y) get_csv2_llong((X),(Y),474)
+#define get_csv2_float_pos474(X,Y) get_csv2_float((X),(Y),474)
+#define get_csv2_uint_pos475(X,Y) get_csv2_uint((X),(Y),475)
+#define get_csv2_ullong_pos475(X,Y) get_csv2_ullong((X),(Y),475)
+#define get_csv2_ip_pos475(X,Y) get_csv2_ip((X),(Y),475)
+#define get_csv2_ipv6_pos475(X,Y) get_csv2_ipv6((X),(Y),475)
+#define get_csv2_string_pos475(X,Y) get_csv2_string((X),(Y),475)
+#define get_csv2_v_str_pos475(X,Y) get_csv2_string((X),(Y),475)
+#define get_csv2_bool_pos475(X,Y) get_csv2_bool((X),(Y),475)
+#define get_csv2_int_pos475(X,Y) get_csv2_int((X),(Y),475)
+#define get_csv2_llong_pos475(X,Y) get_csv2_llong((X),(Y),475)
+#define get_csv2_float_pos475(X,Y) get_csv2_float((X),(Y),475)
+#define get_csv2_uint_pos476(X,Y) get_csv2_uint((X),(Y),476)
+#define get_csv2_ullong_pos476(X,Y) get_csv2_ullong((X),(Y),476)
+#define get_csv2_ip_pos476(X,Y) get_csv2_ip((X),(Y),476)
+#define get_csv2_ipv6_pos476(X,Y) get_csv2_ipv6((X),(Y),476)
+#define get_csv2_string_pos476(X,Y) get_csv2_string((X),(Y),476)
+#define get_csv2_v_str_pos476(X,Y) get_csv2_string((X),(Y),476)
+#define get_csv2_bool_pos476(X,Y) get_csv2_bool((X),(Y),476)
+#define get_csv2_int_pos476(X,Y) get_csv2_int((X),(Y),476)
+#define get_csv2_llong_pos476(X,Y) get_csv2_llong((X),(Y),476)
+#define get_csv2_float_pos476(X,Y) get_csv2_float((X),(Y),476)
+#define get_csv2_uint_pos477(X,Y) get_csv2_uint((X),(Y),477)
+#define get_csv2_ullong_pos477(X,Y) get_csv2_ullong((X),(Y),477)
+#define get_csv2_ip_pos477(X,Y) get_csv2_ip((X),(Y),477)
+#define get_csv2_ipv6_pos477(X,Y) get_csv2_ipv6((X),(Y),477)
+#define get_csv2_string_pos477(X,Y) get_csv2_string((X),(Y),477)
+#define get_csv2_v_str_pos477(X,Y) get_csv2_string((X),(Y),477)
+#define get_csv2_bool_pos477(X,Y) get_csv2_bool((X),(Y),477)
+#define get_csv2_int_pos477(X,Y) get_csv2_int((X),(Y),477)
+#define get_csv2_llong_pos477(X,Y) get_csv2_llong((X),(Y),477)
+#define get_csv2_float_pos477(X,Y) get_csv2_float((X),(Y),477)
+#define get_csv2_uint_pos478(X,Y) get_csv2_uint((X),(Y),478)
+#define get_csv2_ullong_pos478(X,Y) get_csv2_ullong((X),(Y),478)
+#define get_csv2_ip_pos478(X,Y) get_csv2_ip((X),(Y),478)
+#define get_csv2_ipv6_pos478(X,Y) get_csv2_ipv6((X),(Y),478)
+#define get_csv2_string_pos478(X,Y) get_csv2_string((X),(Y),478)
+#define get_csv2_v_str_pos478(X,Y) get_csv2_string((X),(Y),478)
+#define get_csv2_bool_pos478(X,Y) get_csv2_bool((X),(Y),478)
+#define get_csv2_int_pos478(X,Y) get_csv2_int((X),(Y),478)
+#define get_csv2_llong_pos478(X,Y) get_csv2_llong((X),(Y),478)
+#define get_csv2_float_pos478(X,Y) get_csv2_float((X),(Y),478)
+#define get_csv2_uint_pos479(X,Y) get_csv2_uint((X),(Y),479)
+#define get_csv2_ullong_pos479(X,Y) get_csv2_ullong((X),(Y),479)
+#define get_csv2_ip_pos479(X,Y) get_csv2_ip((X),(Y),479)
+#define get_csv2_ipv6_pos479(X,Y) get_csv2_ipv6((X),(Y),479)
+#define get_csv2_string_pos479(X,Y) get_csv2_string((X),(Y),479)
+#define get_csv2_v_str_pos479(X,Y) get_csv2_string((X),(Y),479)
+#define get_csv2_bool_pos479(X,Y) get_csv2_bool((X),(Y),479)
+#define get_csv2_int_pos479(X,Y) get_csv2_int((X),(Y),479)
+#define get_csv2_llong_pos479(X,Y) get_csv2_llong((X),(Y),479)
+#define get_csv2_float_pos479(X,Y) get_csv2_float((X),(Y),479)
+#define get_csv2_uint_pos480(X,Y) get_csv2_uint((X),(Y),480)
+#define get_csv2_ullong_pos480(X,Y) get_csv2_ullong((X),(Y),480)
+#define get_csv2_ip_pos480(X,Y) get_csv2_ip((X),(Y),480)
+#define get_csv2_ipv6_pos480(X,Y) get_csv2_ipv6((X),(Y),480)
+#define get_csv2_string_pos480(X,Y) get_csv2_string((X),(Y),480)
+#define get_csv2_v_str_pos480(X,Y) get_csv2_string((X),(Y),480)
+#define get_csv2_bool_pos480(X,Y) get_csv2_bool((X),(Y),480)
+#define get_csv2_int_pos480(X,Y) get_csv2_int((X),(Y),480)
+#define get_csv2_llong_pos480(X,Y) get_csv2_llong((X),(Y),480)
+#define get_csv2_float_pos480(X,Y) get_csv2_float((X),(Y),480)
+#define get_csv2_uint_pos481(X,Y) get_csv2_uint((X),(Y),481)
+#define get_csv2_ullong_pos481(X,Y) get_csv2_ullong((X),(Y),481)
+#define get_csv2_ip_pos481(X,Y) get_csv2_ip((X),(Y),481)
+#define get_csv2_ipv6_pos481(X,Y) get_csv2_ipv6((X),(Y),481)
+#define get_csv2_string_pos481(X,Y) get_csv2_string((X),(Y),481)
+#define get_csv2_v_str_pos481(X,Y) get_csv2_string((X),(Y),481)
+#define get_csv2_bool_pos481(X,Y) get_csv2_bool((X),(Y),481)
+#define get_csv2_int_pos481(X,Y) get_csv2_int((X),(Y),481)
+#define get_csv2_llong_pos481(X,Y) get_csv2_llong((X),(Y),481)
+#define get_csv2_float_pos481(X,Y) get_csv2_float((X),(Y),481)
+#define get_csv2_uint_pos482(X,Y) get_csv2_uint((X),(Y),482)
+#define get_csv2_ullong_pos482(X,Y) get_csv2_ullong((X),(Y),482)
+#define get_csv2_ip_pos482(X,Y) get_csv2_ip((X),(Y),482)
+#define get_csv2_ipv6_pos482(X,Y) get_csv2_ipv6((X),(Y),482)
+#define get_csv2_string_pos482(X,Y) get_csv2_string((X),(Y),482)
+#define get_csv2_v_str_pos482(X,Y) get_csv2_string((X),(Y),482)
+#define get_csv2_bool_pos482(X,Y) get_csv2_bool((X),(Y),482)
+#define get_csv2_int_pos482(X,Y) get_csv2_int((X),(Y),482)
+#define get_csv2_llong_pos482(X,Y) get_csv2_llong((X),(Y),482)
+#define get_csv2_float_pos482(X,Y) get_csv2_float((X),(Y),482)
+#define get_csv2_uint_pos483(X,Y) get_csv2_uint((X),(Y),483)
+#define get_csv2_ullong_pos483(X,Y) get_csv2_ullong((X),(Y),483)
+#define get_csv2_ip_pos483(X,Y) get_csv2_ip((X),(Y),483)
+#define get_csv2_ipv6_pos483(X,Y) get_csv2_ipv6((X),(Y),483)
+#define get_csv2_string_pos483(X,Y) get_csv2_string((X),(Y),483)
+#define get_csv2_v_str_pos483(X,Y) get_csv2_string((X),(Y),483)
+#define get_csv2_bool_pos483(X,Y) get_csv2_bool((X),(Y),483)
+#define get_csv2_int_pos483(X,Y) get_csv2_int((X),(Y),483)
+#define get_csv2_llong_pos483(X,Y) get_csv2_llong((X),(Y),483)
+#define get_csv2_float_pos483(X,Y) get_csv2_float((X),(Y),483)
+#define get_csv2_uint_pos484(X,Y) get_csv2_uint((X),(Y),484)
+#define get_csv2_ullong_pos484(X,Y) get_csv2_ullong((X),(Y),484)
+#define get_csv2_ip_pos484(X,Y) get_csv2_ip((X),(Y),484)
+#define get_csv2_ipv6_pos484(X,Y) get_csv2_ipv6((X),(Y),484)
+#define get_csv2_string_pos484(X,Y) get_csv2_string((X),(Y),484)
+#define get_csv2_v_str_pos484(X,Y) get_csv2_string((X),(Y),484)
+#define get_csv2_bool_pos484(X,Y) get_csv2_bool((X),(Y),484)
+#define get_csv2_int_pos484(X,Y) get_csv2_int((X),(Y),484)
+#define get_csv2_llong_pos484(X,Y) get_csv2_llong((X),(Y),484)
+#define get_csv2_float_pos484(X,Y) get_csv2_float((X),(Y),484)
+#define get_csv2_uint_pos485(X,Y) get_csv2_uint((X),(Y),485)
+#define get_csv2_ullong_pos485(X,Y) get_csv2_ullong((X),(Y),485)
+#define get_csv2_ip_pos485(X,Y) get_csv2_ip((X),(Y),485)
+#define get_csv2_ipv6_pos485(X,Y) get_csv2_ipv6((X),(Y),485)
+#define get_csv2_string_pos485(X,Y) get_csv2_string((X),(Y),485)
+#define get_csv2_v_str_pos485(X,Y) get_csv2_string((X),(Y),485)
+#define get_csv2_bool_pos485(X,Y) get_csv2_bool((X),(Y),485)
+#define get_csv2_int_pos485(X,Y) get_csv2_int((X),(Y),485)
+#define get_csv2_llong_pos485(X,Y) get_csv2_llong((X),(Y),485)
+#define get_csv2_float_pos485(X,Y) get_csv2_float((X),(Y),485)
+#define get_csv2_uint_pos486(X,Y) get_csv2_uint((X),(Y),486)
+#define get_csv2_ullong_pos486(X,Y) get_csv2_ullong((X),(Y),486)
+#define get_csv2_ip_pos486(X,Y) get_csv2_ip((X),(Y),486)
+#define get_csv2_ipv6_pos486(X,Y) get_csv2_ipv6((X),(Y),486)
+#define get_csv2_string_pos486(X,Y) get_csv2_string((X),(Y),486)
+#define get_csv2_v_str_pos486(X,Y) get_csv2_string((X),(Y),486)
+#define get_csv2_bool_pos486(X,Y) get_csv2_bool((X),(Y),486)
+#define get_csv2_int_pos486(X,Y) get_csv2_int((X),(Y),486)
+#define get_csv2_llong_pos486(X,Y) get_csv2_llong((X),(Y),486)
+#define get_csv2_float_pos486(X,Y) get_csv2_float((X),(Y),486)
+#define get_csv2_uint_pos487(X,Y) get_csv2_uint((X),(Y),487)
+#define get_csv2_ullong_pos487(X,Y) get_csv2_ullong((X),(Y),487)
+#define get_csv2_ip_pos487(X,Y) get_csv2_ip((X),(Y),487)
+#define get_csv2_ipv6_pos487(X,Y) get_csv2_ipv6((X),(Y),487)
+#define get_csv2_string_pos487(X,Y) get_csv2_string((X),(Y),487)
+#define get_csv2_v_str_pos487(X,Y) get_csv2_string((X),(Y),487)
+#define get_csv2_bool_pos487(X,Y) get_csv2_bool((X),(Y),487)
+#define get_csv2_int_pos487(X,Y) get_csv2_int((X),(Y),487)
+#define get_csv2_llong_pos487(X,Y) get_csv2_llong((X),(Y),487)
+#define get_csv2_float_pos487(X,Y) get_csv2_float((X),(Y),487)
+#define get_csv2_uint_pos488(X,Y) get_csv2_uint((X),(Y),488)
+#define get_csv2_ullong_pos488(X,Y) get_csv2_ullong((X),(Y),488)
+#define get_csv2_ip_pos488(X,Y) get_csv2_ip((X),(Y),488)
+#define get_csv2_ipv6_pos488(X,Y) get_csv2_ipv6((X),(Y),488)
+#define get_csv2_string_pos488(X,Y) get_csv2_string((X),(Y),488)
+#define get_csv2_v_str_pos488(X,Y) get_csv2_string((X),(Y),488)
+#define get_csv2_bool_pos488(X,Y) get_csv2_bool((X),(Y),488)
+#define get_csv2_int_pos488(X,Y) get_csv2_int((X),(Y),488)
+#define get_csv2_llong_pos488(X,Y) get_csv2_llong((X),(Y),488)
+#define get_csv2_float_pos488(X,Y) get_csv2_float((X),(Y),488)
+#define get_csv2_uint_pos489(X,Y) get_csv2_uint((X),(Y),489)
+#define get_csv2_ullong_pos489(X,Y) get_csv2_ullong((X),(Y),489)
+#define get_csv2_ip_pos489(X,Y) get_csv2_ip((X),(Y),489)
+#define get_csv2_ipv6_pos489(X,Y) get_csv2_ipv6((X),(Y),489)
+#define get_csv2_string_pos489(X,Y) get_csv2_string((X),(Y),489)
+#define get_csv2_v_str_pos489(X,Y) get_csv2_string((X),(Y),489)
+#define get_csv2_bool_pos489(X,Y) get_csv2_bool((X),(Y),489)
+#define get_csv2_int_pos489(X,Y) get_csv2_int((X),(Y),489)
+#define get_csv2_llong_pos489(X,Y) get_csv2_llong((X),(Y),489)
+#define get_csv2_float_pos489(X,Y) get_csv2_float((X),(Y),489)
+#define get_csv2_uint_pos490(X,Y) get_csv2_uint((X),(Y),490)
+#define get_csv2_ullong_pos490(X,Y) get_csv2_ullong((X),(Y),490)
+#define get_csv2_ip_pos490(X,Y) get_csv2_ip((X),(Y),490)
+#define get_csv2_ipv6_pos490(X,Y) get_csv2_ipv6((X),(Y),490)
+#define get_csv2_string_pos490(X,Y) get_csv2_string((X),(Y),490)
+#define get_csv2_v_str_pos490(X,Y) get_csv2_string((X),(Y),490)
+#define get_csv2_bool_pos490(X,Y) get_csv2_bool((X),(Y),490)
+#define get_csv2_int_pos490(X,Y) get_csv2_int((X),(Y),490)
+#define get_csv2_llong_pos490(X,Y) get_csv2_llong((X),(Y),490)
+#define get_csv2_float_pos490(X,Y) get_csv2_float((X),(Y),490)
+#define get_csv2_uint_pos491(X,Y) get_csv2_uint((X),(Y),491)
+#define get_csv2_ullong_pos491(X,Y) get_csv2_ullong((X),(Y),491)
+#define get_csv2_ip_pos491(X,Y) get_csv2_ip((X),(Y),491)
+#define get_csv2_ipv6_pos491(X,Y) get_csv2_ipv6((X),(Y),491)
+#define get_csv2_string_pos491(X,Y) get_csv2_string((X),(Y),491)
+#define get_csv2_v_str_pos491(X,Y) get_csv2_string((X),(Y),491)
+#define get_csv2_bool_pos491(X,Y) get_csv2_bool((X),(Y),491)
+#define get_csv2_int_pos491(X,Y) get_csv2_int((X),(Y),491)
+#define get_csv2_llong_pos491(X,Y) get_csv2_llong((X),(Y),491)
+#define get_csv2_float_pos491(X,Y) get_csv2_float((X),(Y),491)
+#define get_csv2_uint_pos492(X,Y) get_csv2_uint((X),(Y),492)
+#define get_csv2_ullong_pos492(X,Y) get_csv2_ullong((X),(Y),492)
+#define get_csv2_ip_pos492(X,Y) get_csv2_ip((X),(Y),492)
+#define get_csv2_ipv6_pos492(X,Y) get_csv2_ipv6((X),(Y),492)
+#define get_csv2_string_pos492(X,Y) get_csv2_string((X),(Y),492)
+#define get_csv2_v_str_pos492(X,Y) get_csv2_string((X),(Y),492)
+#define get_csv2_bool_pos492(X,Y) get_csv2_bool((X),(Y),492)
+#define get_csv2_int_pos492(X,Y) get_csv2_int((X),(Y),492)
+#define get_csv2_llong_pos492(X,Y) get_csv2_llong((X),(Y),492)
+#define get_csv2_float_pos492(X,Y) get_csv2_float((X),(Y),492)
+#define get_csv2_uint_pos493(X,Y) get_csv2_uint((X),(Y),493)
+#define get_csv2_ullong_pos493(X,Y) get_csv2_ullong((X),(Y),493)
+#define get_csv2_ip_pos493(X,Y) get_csv2_ip((X),(Y),493)
+#define get_csv2_ipv6_pos493(X,Y) get_csv2_ipv6((X),(Y),493)
+#define get_csv2_string_pos493(X,Y) get_csv2_string((X),(Y),493)
+#define get_csv2_v_str_pos493(X,Y) get_csv2_string((X),(Y),493)
+#define get_csv2_bool_pos493(X,Y) get_csv2_bool((X),(Y),493)
+#define get_csv2_int_pos493(X,Y) get_csv2_int((X),(Y),493)
+#define get_csv2_llong_pos493(X,Y) get_csv2_llong((X),(Y),493)
+#define get_csv2_float_pos493(X,Y) get_csv2_float((X),(Y),493)
+#define get_csv2_uint_pos494(X,Y) get_csv2_uint((X),(Y),494)
+#define get_csv2_ullong_pos494(X,Y) get_csv2_ullong((X),(Y),494)
+#define get_csv2_ip_pos494(X,Y) get_csv2_ip((X),(Y),494)
+#define get_csv2_ipv6_pos494(X,Y) get_csv2_ipv6((X),(Y),494)
+#define get_csv2_string_pos494(X,Y) get_csv2_string((X),(Y),494)
+#define get_csv2_v_str_pos494(X,Y) get_csv2_string((X),(Y),494)
+#define get_csv2_bool_pos494(X,Y) get_csv2_bool((X),(Y),494)
+#define get_csv2_int_pos494(X,Y) get_csv2_int((X),(Y),494)
+#define get_csv2_llong_pos494(X,Y) get_csv2_llong((X),(Y),494)
+#define get_csv2_float_pos494(X,Y) get_csv2_float((X),(Y),494)
+#define get_csv2_uint_pos495(X,Y) get_csv2_uint((X),(Y),495)
+#define get_csv2_ullong_pos495(X,Y) get_csv2_ullong((X),(Y),495)
+#define get_csv2_ip_pos495(X,Y) get_csv2_ip((X),(Y),495)
+#define get_csv2_ipv6_pos495(X,Y) get_csv2_ipv6((X),(Y),495)
+#define get_csv2_string_pos495(X,Y) get_csv2_string((X),(Y),495)
+#define get_csv2_v_str_pos495(X,Y) get_csv2_string((X),(Y),495)
+#define get_csv2_bool_pos495(X,Y) get_csv2_bool((X),(Y),495)
+#define get_csv2_int_pos495(X,Y) get_csv2_int((X),(Y),495)
+#define get_csv2_llong_pos495(X,Y) get_csv2_llong((X),(Y),495)
+#define get_csv2_float_pos495(X,Y) get_csv2_float((X),(Y),495)
+#define get_csv2_uint_pos496(X,Y) get_csv2_uint((X),(Y),496)
+#define get_csv2_ullong_pos496(X,Y) get_csv2_ullong((X),(Y),496)
+#define get_csv2_ip_pos496(X,Y) get_csv2_ip((X),(Y),496)
+#define get_csv2_ipv6_pos496(X,Y) get_csv2_ipv6((X),(Y),496)
+#define get_csv2_string_pos496(X,Y) get_csv2_string((X),(Y),496)
+#define get_csv2_v_str_pos496(X,Y) get_csv2_string((X),(Y),496)
+#define get_csv2_bool_pos496(X,Y) get_csv2_bool((X),(Y),496)
+#define get_csv2_int_pos496(X,Y) get_csv2_int((X),(Y),496)
+#define get_csv2_llong_pos496(X,Y) get_csv2_llong((X),(Y),496)
+#define get_csv2_float_pos496(X,Y) get_csv2_float((X),(Y),496)
+#define get_csv2_uint_pos497(X,Y) get_csv2_uint((X),(Y),497)
+#define get_csv2_ullong_pos497(X,Y) get_csv2_ullong((X),(Y),497)
+#define get_csv2_ip_pos497(X,Y) get_csv2_ip((X),(Y),497)
+#define get_csv2_ipv6_pos497(X,Y) get_csv2_ipv6((X),(Y),497)
+#define get_csv2_string_pos497(X,Y) get_csv2_string((X),(Y),497)
+#define get_csv2_v_str_pos497(X,Y) get_csv2_string((X),(Y),497)
+#define get_csv2_bool_pos497(X,Y) get_csv2_bool((X),(Y),497)
+#define get_csv2_int_pos497(X,Y) get_csv2_int((X),(Y),497)
+#define get_csv2_llong_pos497(X,Y) get_csv2_llong((X),(Y),497)
+#define get_csv2_float_pos497(X,Y) get_csv2_float((X),(Y),497)
+#define get_csv2_uint_pos498(X,Y) get_csv2_uint((X),(Y),498)
+#define get_csv2_ullong_pos498(X,Y) get_csv2_ullong((X),(Y),498)
+#define get_csv2_ip_pos498(X,Y) get_csv2_ip((X),(Y),498)
+#define get_csv2_ipv6_pos498(X,Y) get_csv2_ipv6((X),(Y),498)
+#define get_csv2_string_pos498(X,Y) get_csv2_string((X),(Y),498)
+#define get_csv2_v_str_pos498(X,Y) get_csv2_string((X),(Y),498)
+#define get_csv2_bool_pos498(X,Y) get_csv2_bool((X),(Y),498)
+#define get_csv2_int_pos498(X,Y) get_csv2_int((X),(Y),498)
+#define get_csv2_llong_pos498(X,Y) get_csv2_llong((X),(Y),498)
+#define get_csv2_float_pos498(X,Y) get_csv2_float((X),(Y),498)
+#define get_csv2_uint_pos499(X,Y) get_csv2_uint((X),(Y),499)
+#define get_csv2_ullong_pos499(X,Y) get_csv2_ullong((X),(Y),499)
+#define get_csv2_ip_pos499(X,Y) get_csv2_ip((X),(Y),499)
+#define get_csv2_ipv6_pos499(X,Y) get_csv2_ipv6((X),(Y),499)
+#define get_csv2_string_pos499(X,Y) get_csv2_string((X),(Y),499)
+#define get_csv2_v_str_pos499(X,Y) get_csv2_string((X),(Y),499)
+#define get_csv2_bool_pos499(X,Y) get_csv2_bool((X),(Y),499)
+#define get_csv2_int_pos499(X,Y) get_csv2_int((X),(Y),499)
+#define get_csv2_llong_pos499(X,Y) get_csv2_llong((X),(Y),499)
+#define get_csv2_float_pos499(X,Y) get_csv2_float((X),(Y),499)
+#define get_csv2_uint_pos500(X,Y) get_csv2_uint((X),(Y),500)
+#define get_csv2_ullong_pos500(X,Y) get_csv2_ullong((X),(Y),500)
+#define get_csv2_ip_pos500(X,Y) get_csv2_ip((X),(Y),500)
+#define get_csv2_ipv6_pos500(X,Y) get_csv2_ipv6((X),(Y),500)
+#define get_csv2_string_pos500(X,Y) get_csv2_string((X),(Y),500)
+#define get_csv2_v_str_pos500(X,Y) get_csv2_string((X),(Y),500)
+#define get_csv2_bool_pos500(X,Y) get_csv2_bool((X),(Y),500)
+#define get_csv2_int_pos500(X,Y) get_csv2_int((X),(Y),500)
+#define get_csv2_llong_pos500(X,Y) get_csv2_llong((X),(Y),500)
+#define get_csv2_float_pos500(X,Y) get_csv2_float((X),(Y),500)
+#define get_csv2_uint_pos501(X,Y) get_csv2_uint((X),(Y),501)
+#define get_csv2_ullong_pos501(X,Y) get_csv2_ullong((X),(Y),501)
+#define get_csv2_ip_pos501(X,Y) get_csv2_ip((X),(Y),501)
+#define get_csv2_ipv6_pos501(X,Y) get_csv2_ipv6((X),(Y),501)
+#define get_csv2_string_pos501(X,Y) get_csv2_string((X),(Y),501)
+#define get_csv2_v_str_pos501(X,Y) get_csv2_string((X),(Y),501)
+#define get_csv2_bool_pos501(X,Y) get_csv2_bool((X),(Y),501)
+#define get_csv2_int_pos501(X,Y) get_csv2_int((X),(Y),501)
+#define get_csv2_llong_pos501(X,Y) get_csv2_llong((X),(Y),501)
+#define get_csv2_float_pos501(X,Y) get_csv2_float((X),(Y),501)
+#define get_csv2_uint_pos502(X,Y) get_csv2_uint((X),(Y),502)
+#define get_csv2_ullong_pos502(X,Y) get_csv2_ullong((X),(Y),502)
+#define get_csv2_ip_pos502(X,Y) get_csv2_ip((X),(Y),502)
+#define get_csv2_ipv6_pos502(X,Y) get_csv2_ipv6((X),(Y),502)
+#define get_csv2_string_pos502(X,Y) get_csv2_string((X),(Y),502)
+#define get_csv2_v_str_pos502(X,Y) get_csv2_string((X),(Y),502)
+#define get_csv2_bool_pos502(X,Y) get_csv2_bool((X),(Y),502)
+#define get_csv2_int_pos502(X,Y) get_csv2_int((X),(Y),502)
+#define get_csv2_llong_pos502(X,Y) get_csv2_llong((X),(Y),502)
+#define get_csv2_float_pos502(X,Y) get_csv2_float((X),(Y),502)
+#define get_csv2_uint_pos503(X,Y) get_csv2_uint((X),(Y),503)
+#define get_csv2_ullong_pos503(X,Y) get_csv2_ullong((X),(Y),503)
+#define get_csv2_ip_pos503(X,Y) get_csv2_ip((X),(Y),503)
+#define get_csv2_ipv6_pos503(X,Y) get_csv2_ipv6((X),(Y),503)
+#define get_csv2_string_pos503(X,Y) get_csv2_string((X),(Y),503)
+#define get_csv2_v_str_pos503(X,Y) get_csv2_string((X),(Y),503)
+#define get_csv2_bool_pos503(X,Y) get_csv2_bool((X),(Y),503)
+#define get_csv2_int_pos503(X,Y) get_csv2_int((X),(Y),503)
+#define get_csv2_llong_pos503(X,Y) get_csv2_llong((X),(Y),503)
+#define get_csv2_float_pos503(X,Y) get_csv2_float((X),(Y),503)
+#define get_csv2_uint_pos504(X,Y) get_csv2_uint((X),(Y),504)
+#define get_csv2_ullong_pos504(X,Y) get_csv2_ullong((X),(Y),504)
+#define get_csv2_ip_pos504(X,Y) get_csv2_ip((X),(Y),504)
+#define get_csv2_ipv6_pos504(X,Y) get_csv2_ipv6((X),(Y),504)
+#define get_csv2_string_pos504(X,Y) get_csv2_string((X),(Y),504)
+#define get_csv2_v_str_pos504(X,Y) get_csv2_string((X),(Y),504)
+#define get_csv2_bool_pos504(X,Y) get_csv2_bool((X),(Y),504)
+#define get_csv2_int_pos504(X,Y) get_csv2_int((X),(Y),504)
+#define get_csv2_llong_pos504(X,Y) get_csv2_llong((X),(Y),504)
+#define get_csv2_float_pos504(X,Y) get_csv2_float((X),(Y),504)
+#define get_csv2_uint_pos505(X,Y) get_csv2_uint((X),(Y),505)
+#define get_csv2_ullong_pos505(X,Y) get_csv2_ullong((X),(Y),505)
+#define get_csv2_ip_pos505(X,Y) get_csv2_ip((X),(Y),505)
+#define get_csv2_ipv6_pos505(X,Y) get_csv2_ipv6((X),(Y),505)
+#define get_csv2_string_pos505(X,Y) get_csv2_string((X),(Y),505)
+#define get_csv2_v_str_pos505(X,Y) get_csv2_string((X),(Y),505)
+#define get_csv2_bool_pos505(X,Y) get_csv2_bool((X),(Y),505)
+#define get_csv2_int_pos505(X,Y) get_csv2_int((X),(Y),505)
+#define get_csv2_llong_pos505(X,Y) get_csv2_llong((X),(Y),505)
+#define get_csv2_float_pos505(X,Y) get_csv2_float((X),(Y),505)
+#define get_csv2_uint_pos506(X,Y) get_csv2_uint((X),(Y),506)
+#define get_csv2_ullong_pos506(X,Y) get_csv2_ullong((X),(Y),506)
+#define get_csv2_ip_pos506(X,Y) get_csv2_ip((X),(Y),506)
+#define get_csv2_ipv6_pos506(X,Y) get_csv2_ipv6((X),(Y),506)
+#define get_csv2_string_pos506(X,Y) get_csv2_string((X),(Y),506)
+#define get_csv2_v_str_pos506(X,Y) get_csv2_string((X),(Y),506)
+#define get_csv2_bool_pos506(X,Y) get_csv2_bool((X),(Y),506)
+#define get_csv2_int_pos506(X,Y) get_csv2_int((X),(Y),506)
+#define get_csv2_llong_pos506(X,Y) get_csv2_llong((X),(Y),506)
+#define get_csv2_float_pos506(X,Y) get_csv2_float((X),(Y),506)
+#define get_csv2_uint_pos507(X,Y) get_csv2_uint((X),(Y),507)
+#define get_csv2_ullong_pos507(X,Y) get_csv2_ullong((X),(Y),507)
+#define get_csv2_ip_pos507(X,Y) get_csv2_ip((X),(Y),507)
+#define get_csv2_ipv6_pos507(X,Y) get_csv2_ipv6((X),(Y),507)
+#define get_csv2_string_pos507(X,Y) get_csv2_string((X),(Y),507)
+#define get_csv2_v_str_pos507(X,Y) get_csv2_string((X),(Y),507)
+#define get_csv2_bool_pos507(X,Y) get_csv2_bool((X),(Y),507)
+#define get_csv2_int_pos507(X,Y) get_csv2_int((X),(Y),507)
+#define get_csv2_llong_pos507(X,Y) get_csv2_llong((X),(Y),507)
+#define get_csv2_float_pos507(X,Y) get_csv2_float((X),(Y),507)
+#define get_csv2_uint_pos508(X,Y) get_csv2_uint((X),(Y),508)
+#define get_csv2_ullong_pos508(X,Y) get_csv2_ullong((X),(Y),508)
+#define get_csv2_ip_pos508(X,Y) get_csv2_ip((X),(Y),508)
+#define get_csv2_ipv6_pos508(X,Y) get_csv2_ipv6((X),(Y),508)
+#define get_csv2_string_pos508(X,Y) get_csv2_string((X),(Y),508)
+#define get_csv2_v_str_pos508(X,Y) get_csv2_string((X),(Y),508)
+#define get_csv2_bool_pos508(X,Y) get_csv2_bool((X),(Y),508)
+#define get_csv2_int_pos508(X,Y) get_csv2_int((X),(Y),508)
+#define get_csv2_llong_pos508(X,Y) get_csv2_llong((X),(Y),508)
+#define get_csv2_float_pos508(X,Y) get_csv2_float((X),(Y),508)
+#define get_csv2_uint_pos509(X,Y) get_csv2_uint((X),(Y),509)
+#define get_csv2_ullong_pos509(X,Y) get_csv2_ullong((X),(Y),509)
+#define get_csv2_ip_pos509(X,Y) get_csv2_ip((X),(Y),509)
+#define get_csv2_ipv6_pos509(X,Y) get_csv2_ipv6((X),(Y),509)
+#define get_csv2_string_pos509(X,Y) get_csv2_string((X),(Y),509)
+#define get_csv2_v_str_pos509(X,Y) get_csv2_string((X),(Y),509)
+#define get_csv2_bool_pos509(X,Y) get_csv2_bool((X),(Y),509)
+#define get_csv2_int_pos509(X,Y) get_csv2_int((X),(Y),509)
+#define get_csv2_llong_pos509(X,Y) get_csv2_llong((X),(Y),509)
+#define get_csv2_float_pos509(X,Y) get_csv2_float((X),(Y),509)
+#define get_csv2_uint_pos510(X,Y) get_csv2_uint((X),(Y),510)
+#define get_csv2_ullong_pos510(X,Y) get_csv2_ullong((X),(Y),510)
+#define get_csv2_ip_pos510(X,Y) get_csv2_ip((X),(Y),510)
+#define get_csv2_ipv6_pos510(X,Y) get_csv2_ipv6((X),(Y),510)
+#define get_csv2_string_pos510(X,Y) get_csv2_string((X),(Y),510)
+#define get_csv2_v_str_pos510(X,Y) get_csv2_string((X),(Y),510)
+#define get_csv2_bool_pos510(X,Y) get_csv2_bool((X),(Y),510)
+#define get_csv2_int_pos510(X,Y) get_csv2_int((X),(Y),510)
+#define get_csv2_llong_pos510(X,Y) get_csv2_llong((X),(Y),510)
+#define get_csv2_float_pos510(X,Y) get_csv2_float((X),(Y),510)
+#define get_csv2_uint_pos511(X,Y) get_csv2_uint((X),(Y),511)
+#define get_csv2_ullong_pos511(X,Y) get_csv2_ullong((X),(Y),511)
+#define get_csv2_ip_pos511(X,Y) get_csv2_ip((X),(Y),511)
+#define get_csv2_ipv6_pos511(X,Y) get_csv2_ipv6((X),(Y),511)
+#define get_csv2_string_pos511(X,Y) get_csv2_string((X),(Y),511)
+#define get_csv2_v_str_pos511(X,Y) get_csv2_string((X),(Y),511)
+#define get_csv2_bool_pos511(X,Y) get_csv2_bool((X),(Y),511)
+#define get_csv2_int_pos511(X,Y) get_csv2_int((X),(Y),511)
+#define get_csv2_llong_pos511(X,Y) get_csv2_llong((X),(Y),511)
+#define get_csv2_float_pos511(X,Y) get_csv2_float((X),(Y),511)
+#define get_csv2_uint_pos512(X,Y) get_csv2_uint((X),(Y),512)
+#define get_csv2_ullong_pos512(X,Y) get_csv2_ullong((X),(Y),512)
+#define get_csv2_ip_pos512(X,Y) get_csv2_ip((X),(Y),512)
+#define get_csv2_ipv6_pos512(X,Y) get_csv2_ipv6((X),(Y),512)
+#define get_csv2_string_pos512(X,Y) get_csv2_string((X),(Y),512)
+#define get_csv2_v_str_pos512(X,Y) get_csv2_string((X),(Y),512)
+#define get_csv2_bool_pos512(X,Y) get_csv2_bool((X),(Y),512)
+#define get_csv2_int_pos512(X,Y) get_csv2_int((X),(Y),512)
+#define get_csv2_llong_pos512(X,Y) get_csv2_llong((X),(Y),512)
+#define get_csv2_float_pos512(X,Y) get_csv2_float((X),(Y),512)
+#define get_csv2_uint_pos513(X,Y) get_csv2_uint((X),(Y),513)
+#define get_csv2_ullong_pos513(X,Y) get_csv2_ullong((X),(Y),513)
+#define get_csv2_ip_pos513(X,Y) get_csv2_ip((X),(Y),513)
+#define get_csv2_ipv6_pos513(X,Y) get_csv2_ipv6((X),(Y),513)
+#define get_csv2_string_pos513(X,Y) get_csv2_string((X),(Y),513)
+#define get_csv2_v_str_pos513(X,Y) get_csv2_string((X),(Y),513)
+#define get_csv2_bool_pos513(X,Y) get_csv2_bool((X),(Y),513)
+#define get_csv2_int_pos513(X,Y) get_csv2_int((X),(Y),513)
+#define get_csv2_llong_pos513(X,Y) get_csv2_llong((X),(Y),513)
+#define get_csv2_float_pos513(X,Y) get_csv2_float((X),(Y),513)
+#define get_csv2_uint_pos514(X,Y) get_csv2_uint((X),(Y),514)
+#define get_csv2_ullong_pos514(X,Y) get_csv2_ullong((X),(Y),514)
+#define get_csv2_ip_pos514(X,Y) get_csv2_ip((X),(Y),514)
+#define get_csv2_ipv6_pos514(X,Y) get_csv2_ipv6((X),(Y),514)
+#define get_csv2_string_pos514(X,Y) get_csv2_string((X),(Y),514)
+#define get_csv2_v_str_pos514(X,Y) get_csv2_string((X),(Y),514)
+#define get_csv2_bool_pos514(X,Y) get_csv2_bool((X),(Y),514)
+#define get_csv2_int_pos514(X,Y) get_csv2_int((X),(Y),514)
+#define get_csv2_llong_pos514(X,Y) get_csv2_llong((X),(Y),514)
+#define get_csv2_float_pos514(X,Y) get_csv2_float((X),(Y),514)
+#define get_csv2_uint_pos515(X,Y) get_csv2_uint((X),(Y),515)
+#define get_csv2_ullong_pos515(X,Y) get_csv2_ullong((X),(Y),515)
+#define get_csv2_ip_pos515(X,Y) get_csv2_ip((X),(Y),515)
+#define get_csv2_ipv6_pos515(X,Y) get_csv2_ipv6((X),(Y),515)
+#define get_csv2_string_pos515(X,Y) get_csv2_string((X),(Y),515)
+#define get_csv2_v_str_pos515(X,Y) get_csv2_string((X),(Y),515)
+#define get_csv2_bool_pos515(X,Y) get_csv2_bool((X),(Y),515)
+#define get_csv2_int_pos515(X,Y) get_csv2_int((X),(Y),515)
+#define get_csv2_llong_pos515(X,Y) get_csv2_llong((X),(Y),515)
+#define get_csv2_float_pos515(X,Y) get_csv2_float((X),(Y),515)
+#define get_csv2_uint_pos516(X,Y) get_csv2_uint((X),(Y),516)
+#define get_csv2_ullong_pos516(X,Y) get_csv2_ullong((X),(Y),516)
+#define get_csv2_ip_pos516(X,Y) get_csv2_ip((X),(Y),516)
+#define get_csv2_ipv6_pos516(X,Y) get_csv2_ipv6((X),(Y),516)
+#define get_csv2_string_pos516(X,Y) get_csv2_string((X),(Y),516)
+#define get_csv2_v_str_pos516(X,Y) get_csv2_string((X),(Y),516)
+#define get_csv2_bool_pos516(X,Y) get_csv2_bool((X),(Y),516)
+#define get_csv2_int_pos516(X,Y) get_csv2_int((X),(Y),516)
+#define get_csv2_llong_pos516(X,Y) get_csv2_llong((X),(Y),516)
+#define get_csv2_float_pos516(X,Y) get_csv2_float((X),(Y),516)
+#define get_csv2_uint_pos517(X,Y) get_csv2_uint((X),(Y),517)
+#define get_csv2_ullong_pos517(X,Y) get_csv2_ullong((X),(Y),517)
+#define get_csv2_ip_pos517(X,Y) get_csv2_ip((X),(Y),517)
+#define get_csv2_ipv6_pos517(X,Y) get_csv2_ipv6((X),(Y),517)
+#define get_csv2_string_pos517(X,Y) get_csv2_string((X),(Y),517)
+#define get_csv2_v_str_pos517(X,Y) get_csv2_string((X),(Y),517)
+#define get_csv2_bool_pos517(X,Y) get_csv2_bool((X),(Y),517)
+#define get_csv2_int_pos517(X,Y) get_csv2_int((X),(Y),517)
+#define get_csv2_llong_pos517(X,Y) get_csv2_llong((X),(Y),517)
+#define get_csv2_float_pos517(X,Y) get_csv2_float((X),(Y),517)
+#define get_csv2_uint_pos518(X,Y) get_csv2_uint((X),(Y),518)
+#define get_csv2_ullong_pos518(X,Y) get_csv2_ullong((X),(Y),518)
+#define get_csv2_ip_pos518(X,Y) get_csv2_ip((X),(Y),518)
+#define get_csv2_ipv6_pos518(X,Y) get_csv2_ipv6((X),(Y),518)
+#define get_csv2_string_pos518(X,Y) get_csv2_string((X),(Y),518)
+#define get_csv2_v_str_pos518(X,Y) get_csv2_string((X),(Y),518)
+#define get_csv2_bool_pos518(X,Y) get_csv2_bool((X),(Y),518)
+#define get_csv2_int_pos518(X,Y) get_csv2_int((X),(Y),518)
+#define get_csv2_llong_pos518(X,Y) get_csv2_llong((X),(Y),518)
+#define get_csv2_float_pos518(X,Y) get_csv2_float((X),(Y),518)
+#define get_csv2_uint_pos519(X,Y) get_csv2_uint((X),(Y),519)
+#define get_csv2_ullong_pos519(X,Y) get_csv2_ullong((X),(Y),519)
+#define get_csv2_ip_pos519(X,Y) get_csv2_ip((X),(Y),519)
+#define get_csv2_ipv6_pos519(X,Y) get_csv2_ipv6((X),(Y),519)
+#define get_csv2_string_pos519(X,Y) get_csv2_string((X),(Y),519)
+#define get_csv2_v_str_pos519(X,Y) get_csv2_string((X),(Y),519)
+#define get_csv2_bool_pos519(X,Y) get_csv2_bool((X),(Y),519)
+#define get_csv2_int_pos519(X,Y) get_csv2_int((X),(Y),519)
+#define get_csv2_llong_pos519(X,Y) get_csv2_llong((X),(Y),519)
+#define get_csv2_float_pos519(X,Y) get_csv2_float((X),(Y),519)
+#define get_csv2_uint_pos520(X,Y) get_csv2_uint((X),(Y),520)
+#define get_csv2_ullong_pos520(X,Y) get_csv2_ullong((X),(Y),520)
+#define get_csv2_ip_pos520(X,Y) get_csv2_ip((X),(Y),520)
+#define get_csv2_ipv6_pos520(X,Y) get_csv2_ipv6((X),(Y),520)
+#define get_csv2_string_pos520(X,Y) get_csv2_string((X),(Y),520)
+#define get_csv2_v_str_pos520(X,Y) get_csv2_string((X),(Y),520)
+#define get_csv2_bool_pos520(X,Y) get_csv2_bool((X),(Y),520)
+#define get_csv2_int_pos520(X,Y) get_csv2_int((X),(Y),520)
+#define get_csv2_llong_pos520(X,Y) get_csv2_llong((X),(Y),520)
+#define get_csv2_float_pos520(X,Y) get_csv2_float((X),(Y),520)
+#define get_csv2_uint_pos521(X,Y) get_csv2_uint((X),(Y),521)
+#define get_csv2_ullong_pos521(X,Y) get_csv2_ullong((X),(Y),521)
+#define get_csv2_ip_pos521(X,Y) get_csv2_ip((X),(Y),521)
+#define get_csv2_ipv6_pos521(X,Y) get_csv2_ipv6((X),(Y),521)
+#define get_csv2_string_pos521(X,Y) get_csv2_string((X),(Y),521)
+#define get_csv2_v_str_pos521(X,Y) get_csv2_string((X),(Y),521)
+#define get_csv2_bool_pos521(X,Y) get_csv2_bool((X),(Y),521)
+#define get_csv2_int_pos521(X,Y) get_csv2_int((X),(Y),521)
+#define get_csv2_llong_pos521(X,Y) get_csv2_llong((X),(Y),521)
+#define get_csv2_float_pos521(X,Y) get_csv2_float((X),(Y),521)
+#define get_csv2_uint_pos522(X,Y) get_csv2_uint((X),(Y),522)
+#define get_csv2_ullong_pos522(X,Y) get_csv2_ullong((X),(Y),522)
+#define get_csv2_ip_pos522(X,Y) get_csv2_ip((X),(Y),522)
+#define get_csv2_ipv6_pos522(X,Y) get_csv2_ipv6((X),(Y),522)
+#define get_csv2_string_pos522(X,Y) get_csv2_string((X),(Y),522)
+#define get_csv2_v_str_pos522(X,Y) get_csv2_string((X),(Y),522)
+#define get_csv2_bool_pos522(X,Y) get_csv2_bool((X),(Y),522)
+#define get_csv2_int_pos522(X,Y) get_csv2_int((X),(Y),522)
+#define get_csv2_llong_pos522(X,Y) get_csv2_llong((X),(Y),522)
+#define get_csv2_float_pos522(X,Y) get_csv2_float((X),(Y),522)
+#define get_csv2_uint_pos523(X,Y) get_csv2_uint((X),(Y),523)
+#define get_csv2_ullong_pos523(X,Y) get_csv2_ullong((X),(Y),523)
+#define get_csv2_ip_pos523(X,Y) get_csv2_ip((X),(Y),523)
+#define get_csv2_ipv6_pos523(X,Y) get_csv2_ipv6((X),(Y),523)
+#define get_csv2_string_pos523(X,Y) get_csv2_string((X),(Y),523)
+#define get_csv2_v_str_pos523(X,Y) get_csv2_string((X),(Y),523)
+#define get_csv2_bool_pos523(X,Y) get_csv2_bool((X),(Y),523)
+#define get_csv2_int_pos523(X,Y) get_csv2_int((X),(Y),523)
+#define get_csv2_llong_pos523(X,Y) get_csv2_llong((X),(Y),523)
+#define get_csv2_float_pos523(X,Y) get_csv2_float((X),(Y),523)
+#define get_csv2_uint_pos524(X,Y) get_csv2_uint((X),(Y),524)
+#define get_csv2_ullong_pos524(X,Y) get_csv2_ullong((X),(Y),524)
+#define get_csv2_ip_pos524(X,Y) get_csv2_ip((X),(Y),524)
+#define get_csv2_ipv6_pos524(X,Y) get_csv2_ipv6((X),(Y),524)
+#define get_csv2_string_pos524(X,Y) get_csv2_string((X),(Y),524)
+#define get_csv2_v_str_pos524(X,Y) get_csv2_string((X),(Y),524)
+#define get_csv2_bool_pos524(X,Y) get_csv2_bool((X),(Y),524)
+#define get_csv2_int_pos524(X,Y) get_csv2_int((X),(Y),524)
+#define get_csv2_llong_pos524(X,Y) get_csv2_llong((X),(Y),524)
+#define get_csv2_float_pos524(X,Y) get_csv2_float((X),(Y),524)
+#define get_csv2_uint_pos525(X,Y) get_csv2_uint((X),(Y),525)
+#define get_csv2_ullong_pos525(X,Y) get_csv2_ullong((X),(Y),525)
+#define get_csv2_ip_pos525(X,Y) get_csv2_ip((X),(Y),525)
+#define get_csv2_ipv6_pos525(X,Y) get_csv2_ipv6((X),(Y),525)
+#define get_csv2_string_pos525(X,Y) get_csv2_string((X),(Y),525)
+#define get_csv2_v_str_pos525(X,Y) get_csv2_string((X),(Y),525)
+#define get_csv2_bool_pos525(X,Y) get_csv2_bool((X),(Y),525)
+#define get_csv2_int_pos525(X,Y) get_csv2_int((X),(Y),525)
+#define get_csv2_llong_pos525(X,Y) get_csv2_llong((X),(Y),525)
+#define get_csv2_float_pos525(X,Y) get_csv2_float((X),(Y),525)
+#define get_csv2_uint_pos526(X,Y) get_csv2_uint((X),(Y),526)
+#define get_csv2_ullong_pos526(X,Y) get_csv2_ullong((X),(Y),526)
+#define get_csv2_ip_pos526(X,Y) get_csv2_ip((X),(Y),526)
+#define get_csv2_ipv6_pos526(X,Y) get_csv2_ipv6((X),(Y),526)
+#define get_csv2_string_pos526(X,Y) get_csv2_string((X),(Y),526)
+#define get_csv2_v_str_pos526(X,Y) get_csv2_string((X),(Y),526)
+#define get_csv2_bool_pos526(X,Y) get_csv2_bool((X),(Y),526)
+#define get_csv2_int_pos526(X,Y) get_csv2_int((X),(Y),526)
+#define get_csv2_llong_pos526(X,Y) get_csv2_llong((X),(Y),526)
+#define get_csv2_float_pos526(X,Y) get_csv2_float((X),(Y),526)
+#define get_csv2_uint_pos527(X,Y) get_csv2_uint((X),(Y),527)
+#define get_csv2_ullong_pos527(X,Y) get_csv2_ullong((X),(Y),527)
+#define get_csv2_ip_pos527(X,Y) get_csv2_ip((X),(Y),527)
+#define get_csv2_ipv6_pos527(X,Y) get_csv2_ipv6((X),(Y),527)
+#define get_csv2_string_pos527(X,Y) get_csv2_string((X),(Y),527)
+#define get_csv2_v_str_pos527(X,Y) get_csv2_string((X),(Y),527)
+#define get_csv2_bool_pos527(X,Y) get_csv2_bool((X),(Y),527)
+#define get_csv2_int_pos527(X,Y) get_csv2_int((X),(Y),527)
+#define get_csv2_llong_pos527(X,Y) get_csv2_llong((X),(Y),527)
+#define get_csv2_float_pos527(X,Y) get_csv2_float((X),(Y),527)
+#define get_csv2_uint_pos528(X,Y) get_csv2_uint((X),(Y),528)
+#define get_csv2_ullong_pos528(X,Y) get_csv2_ullong((X),(Y),528)
+#define get_csv2_ip_pos528(X,Y) get_csv2_ip((X),(Y),528)
+#define get_csv2_ipv6_pos528(X,Y) get_csv2_ipv6((X),(Y),528)
+#define get_csv2_string_pos528(X,Y) get_csv2_string((X),(Y),528)
+#define get_csv2_v_str_pos528(X,Y) get_csv2_string((X),(Y),528)
+#define get_csv2_bool_pos528(X,Y) get_csv2_bool((X),(Y),528)
+#define get_csv2_int_pos528(X,Y) get_csv2_int((X),(Y),528)
+#define get_csv2_llong_pos528(X,Y) get_csv2_llong((X),(Y),528)
+#define get_csv2_float_pos528(X,Y) get_csv2_float((X),(Y),528)
+#define get_csv2_uint_pos529(X,Y) get_csv2_uint((X),(Y),529)
+#define get_csv2_ullong_pos529(X,Y) get_csv2_ullong((X),(Y),529)
+#define get_csv2_ip_pos529(X,Y) get_csv2_ip((X),(Y),529)
+#define get_csv2_ipv6_pos529(X,Y) get_csv2_ipv6((X),(Y),529)
+#define get_csv2_string_pos529(X,Y) get_csv2_string((X),(Y),529)
+#define get_csv2_v_str_pos529(X,Y) get_csv2_string((X),(Y),529)
+#define get_csv2_bool_pos529(X,Y) get_csv2_bool((X),(Y),529)
+#define get_csv2_int_pos529(X,Y) get_csv2_int((X),(Y),529)
+#define get_csv2_llong_pos529(X,Y) get_csv2_llong((X),(Y),529)
+#define get_csv2_float_pos529(X,Y) get_csv2_float((X),(Y),529)
+#define get_csv2_uint_pos530(X,Y) get_csv2_uint((X),(Y),530)
+#define get_csv2_ullong_pos530(X,Y) get_csv2_ullong((X),(Y),530)
+#define get_csv2_ip_pos530(X,Y) get_csv2_ip((X),(Y),530)
+#define get_csv2_ipv6_pos530(X,Y) get_csv2_ipv6((X),(Y),530)
+#define get_csv2_string_pos530(X,Y) get_csv2_string((X),(Y),530)
+#define get_csv2_v_str_pos530(X,Y) get_csv2_string((X),(Y),530)
+#define get_csv2_bool_pos530(X,Y) get_csv2_bool((X),(Y),530)
+#define get_csv2_int_pos530(X,Y) get_csv2_int((X),(Y),530)
+#define get_csv2_llong_pos530(X,Y) get_csv2_llong((X),(Y),530)
+#define get_csv2_float_pos530(X,Y) get_csv2_float((X),(Y),530)
+#define get_csv2_uint_pos531(X,Y) get_csv2_uint((X),(Y),531)
+#define get_csv2_ullong_pos531(X,Y) get_csv2_ullong((X),(Y),531)
+#define get_csv2_ip_pos531(X,Y) get_csv2_ip((X),(Y),531)
+#define get_csv2_ipv6_pos531(X,Y) get_csv2_ipv6((X),(Y),531)
+#define get_csv2_string_pos531(X,Y) get_csv2_string((X),(Y),531)
+#define get_csv2_v_str_pos531(X,Y) get_csv2_string((X),(Y),531)
+#define get_csv2_bool_pos531(X,Y) get_csv2_bool((X),(Y),531)
+#define get_csv2_int_pos531(X,Y) get_csv2_int((X),(Y),531)
+#define get_csv2_llong_pos531(X,Y) get_csv2_llong((X),(Y),531)
+#define get_csv2_float_pos531(X,Y) get_csv2_float((X),(Y),531)
+#define get_csv2_uint_pos532(X,Y) get_csv2_uint((X),(Y),532)
+#define get_csv2_ullong_pos532(X,Y) get_csv2_ullong((X),(Y),532)
+#define get_csv2_ip_pos532(X,Y) get_csv2_ip((X),(Y),532)
+#define get_csv2_ipv6_pos532(X,Y) get_csv2_ipv6((X),(Y),532)
+#define get_csv2_string_pos532(X,Y) get_csv2_string((X),(Y),532)
+#define get_csv2_v_str_pos532(X,Y) get_csv2_string((X),(Y),532)
+#define get_csv2_bool_pos532(X,Y) get_csv2_bool((X),(Y),532)
+#define get_csv2_int_pos532(X,Y) get_csv2_int((X),(Y),532)
+#define get_csv2_llong_pos532(X,Y) get_csv2_llong((X),(Y),532)
+#define get_csv2_float_pos532(X,Y) get_csv2_float((X),(Y),532)
+#define get_csv2_uint_pos533(X,Y) get_csv2_uint((X),(Y),533)
+#define get_csv2_ullong_pos533(X,Y) get_csv2_ullong((X),(Y),533)
+#define get_csv2_ip_pos533(X,Y) get_csv2_ip((X),(Y),533)
+#define get_csv2_ipv6_pos533(X,Y) get_csv2_ipv6((X),(Y),533)
+#define get_csv2_string_pos533(X,Y) get_csv2_string((X),(Y),533)
+#define get_csv2_v_str_pos533(X,Y) get_csv2_string((X),(Y),533)
+#define get_csv2_bool_pos533(X,Y) get_csv2_bool((X),(Y),533)
+#define get_csv2_int_pos533(X,Y) get_csv2_int((X),(Y),533)
+#define get_csv2_llong_pos533(X,Y) get_csv2_llong((X),(Y),533)
+#define get_csv2_float_pos533(X,Y) get_csv2_float((X),(Y),533)
+#define get_csv2_uint_pos534(X,Y) get_csv2_uint((X),(Y),534)
+#define get_csv2_ullong_pos534(X,Y) get_csv2_ullong((X),(Y),534)
+#define get_csv2_ip_pos534(X,Y) get_csv2_ip((X),(Y),534)
+#define get_csv2_ipv6_pos534(X,Y) get_csv2_ipv6((X),(Y),534)
+#define get_csv2_string_pos534(X,Y) get_csv2_string((X),(Y),534)
+#define get_csv2_v_str_pos534(X,Y) get_csv2_string((X),(Y),534)
+#define get_csv2_bool_pos534(X,Y) get_csv2_bool((X),(Y),534)
+#define get_csv2_int_pos534(X,Y) get_csv2_int((X),(Y),534)
+#define get_csv2_llong_pos534(X,Y) get_csv2_llong((X),(Y),534)
+#define get_csv2_float_pos534(X,Y) get_csv2_float((X),(Y),534)
+#define get_csv2_uint_pos535(X,Y) get_csv2_uint((X),(Y),535)
+#define get_csv2_ullong_pos535(X,Y) get_csv2_ullong((X),(Y),535)
+#define get_csv2_ip_pos535(X,Y) get_csv2_ip((X),(Y),535)
+#define get_csv2_ipv6_pos535(X,Y) get_csv2_ipv6((X),(Y),535)
+#define get_csv2_string_pos535(X,Y) get_csv2_string((X),(Y),535)
+#define get_csv2_v_str_pos535(X,Y) get_csv2_string((X),(Y),535)
+#define get_csv2_bool_pos535(X,Y) get_csv2_bool((X),(Y),535)
+#define get_csv2_int_pos535(X,Y) get_csv2_int((X),(Y),535)
+#define get_csv2_llong_pos535(X,Y) get_csv2_llong((X),(Y),535)
+#define get_csv2_float_pos535(X,Y) get_csv2_float((X),(Y),535)
+#define get_csv2_uint_pos536(X,Y) get_csv2_uint((X),(Y),536)
+#define get_csv2_ullong_pos536(X,Y) get_csv2_ullong((X),(Y),536)
+#define get_csv2_ip_pos536(X,Y) get_csv2_ip((X),(Y),536)
+#define get_csv2_ipv6_pos536(X,Y) get_csv2_ipv6((X),(Y),536)
+#define get_csv2_string_pos536(X,Y) get_csv2_string((X),(Y),536)
+#define get_csv2_v_str_pos536(X,Y) get_csv2_string((X),(Y),536)
+#define get_csv2_bool_pos536(X,Y) get_csv2_bool((X),(Y),536)
+#define get_csv2_int_pos536(X,Y) get_csv2_int((X),(Y),536)
+#define get_csv2_llong_pos536(X,Y) get_csv2_llong((X),(Y),536)
+#define get_csv2_float_pos536(X,Y) get_csv2_float((X),(Y),536)
+#define get_csv2_uint_pos537(X,Y) get_csv2_uint((X),(Y),537)
+#define get_csv2_ullong_pos537(X,Y) get_csv2_ullong((X),(Y),537)
+#define get_csv2_ip_pos537(X,Y) get_csv2_ip((X),(Y),537)
+#define get_csv2_ipv6_pos537(X,Y) get_csv2_ipv6((X),(Y),537)
+#define get_csv2_string_pos537(X,Y) get_csv2_string((X),(Y),537)
+#define get_csv2_v_str_pos537(X,Y) get_csv2_string((X),(Y),537)
+#define get_csv2_bool_pos537(X,Y) get_csv2_bool((X),(Y),537)
+#define get_csv2_int_pos537(X,Y) get_csv2_int((X),(Y),537)
+#define get_csv2_llong_pos537(X,Y) get_csv2_llong((X),(Y),537)
+#define get_csv2_float_pos537(X,Y) get_csv2_float((X),(Y),537)
+#define get_csv2_uint_pos538(X,Y) get_csv2_uint((X),(Y),538)
+#define get_csv2_ullong_pos538(X,Y) get_csv2_ullong((X),(Y),538)
+#define get_csv2_ip_pos538(X,Y) get_csv2_ip((X),(Y),538)
+#define get_csv2_ipv6_pos538(X,Y) get_csv2_ipv6((X),(Y),538)
+#define get_csv2_string_pos538(X,Y) get_csv2_string((X),(Y),538)
+#define get_csv2_v_str_pos538(X,Y) get_csv2_string((X),(Y),538)
+#define get_csv2_bool_pos538(X,Y) get_csv2_bool((X),(Y),538)
+#define get_csv2_int_pos538(X,Y) get_csv2_int((X),(Y),538)
+#define get_csv2_llong_pos538(X,Y) get_csv2_llong((X),(Y),538)
+#define get_csv2_float_pos538(X,Y) get_csv2_float((X),(Y),538)
+#define get_csv2_uint_pos539(X,Y) get_csv2_uint((X),(Y),539)
+#define get_csv2_ullong_pos539(X,Y) get_csv2_ullong((X),(Y),539)
+#define get_csv2_ip_pos539(X,Y) get_csv2_ip((X),(Y),539)
+#define get_csv2_ipv6_pos539(X,Y) get_csv2_ipv6((X),(Y),539)
+#define get_csv2_string_pos539(X,Y) get_csv2_string((X),(Y),539)
+#define get_csv2_v_str_pos539(X,Y) get_csv2_string((X),(Y),539)
+#define get_csv2_bool_pos539(X,Y) get_csv2_bool((X),(Y),539)
+#define get_csv2_int_pos539(X,Y) get_csv2_int((X),(Y),539)
+#define get_csv2_llong_pos539(X,Y) get_csv2_llong((X),(Y),539)
+#define get_csv2_float_pos539(X,Y) get_csv2_float((X),(Y),539)
+#define get_csv2_uint_pos540(X,Y) get_csv2_uint((X),(Y),540)
+#define get_csv2_ullong_pos540(X,Y) get_csv2_ullong((X),(Y),540)
+#define get_csv2_ip_pos540(X,Y) get_csv2_ip((X),(Y),540)
+#define get_csv2_ipv6_pos540(X,Y) get_csv2_ipv6((X),(Y),540)
+#define get_csv2_string_pos540(X,Y) get_csv2_string((X),(Y),540)
+#define get_csv2_v_str_pos540(X,Y) get_csv2_string((X),(Y),540)
+#define get_csv2_bool_pos540(X,Y) get_csv2_bool((X),(Y),540)
+#define get_csv2_int_pos540(X,Y) get_csv2_int((X),(Y),540)
+#define get_csv2_llong_pos540(X,Y) get_csv2_llong((X),(Y),540)
+#define get_csv2_float_pos540(X,Y) get_csv2_float((X),(Y),540)
+#define get_csv2_uint_pos541(X,Y) get_csv2_uint((X),(Y),541)
+#define get_csv2_ullong_pos541(X,Y) get_csv2_ullong((X),(Y),541)
+#define get_csv2_ip_pos541(X,Y) get_csv2_ip((X),(Y),541)
+#define get_csv2_ipv6_pos541(X,Y) get_csv2_ipv6((X),(Y),541)
+#define get_csv2_string_pos541(X,Y) get_csv2_string((X),(Y),541)
+#define get_csv2_v_str_pos541(X,Y) get_csv2_string((X),(Y),541)
+#define get_csv2_bool_pos541(X,Y) get_csv2_bool((X),(Y),541)
+#define get_csv2_int_pos541(X,Y) get_csv2_int((X),(Y),541)
+#define get_csv2_llong_pos541(X,Y) get_csv2_llong((X),(Y),541)
+#define get_csv2_float_pos541(X,Y) get_csv2_float((X),(Y),541)
+#define get_csv2_uint_pos542(X,Y) get_csv2_uint((X),(Y),542)
+#define get_csv2_ullong_pos542(X,Y) get_csv2_ullong((X),(Y),542)
+#define get_csv2_ip_pos542(X,Y) get_csv2_ip((X),(Y),542)
+#define get_csv2_ipv6_pos542(X,Y) get_csv2_ipv6((X),(Y),542)
+#define get_csv2_string_pos542(X,Y) get_csv2_string((X),(Y),542)
+#define get_csv2_v_str_pos542(X,Y) get_csv2_string((X),(Y),542)
+#define get_csv2_bool_pos542(X,Y) get_csv2_bool((X),(Y),542)
+#define get_csv2_int_pos542(X,Y) get_csv2_int((X),(Y),542)
+#define get_csv2_llong_pos542(X,Y) get_csv2_llong((X),(Y),542)
+#define get_csv2_float_pos542(X,Y) get_csv2_float((X),(Y),542)
+#define get_csv2_uint_pos543(X,Y) get_csv2_uint((X),(Y),543)
+#define get_csv2_ullong_pos543(X,Y) get_csv2_ullong((X),(Y),543)
+#define get_csv2_ip_pos543(X,Y) get_csv2_ip((X),(Y),543)
+#define get_csv2_ipv6_pos543(X,Y) get_csv2_ipv6((X),(Y),543)
+#define get_csv2_string_pos543(X,Y) get_csv2_string((X),(Y),543)
+#define get_csv2_v_str_pos543(X,Y) get_csv2_string((X),(Y),543)
+#define get_csv2_bool_pos543(X,Y) get_csv2_bool((X),(Y),543)
+#define get_csv2_int_pos543(X,Y) get_csv2_int((X),(Y),543)
+#define get_csv2_llong_pos543(X,Y) get_csv2_llong((X),(Y),543)
+#define get_csv2_float_pos543(X,Y) get_csv2_float((X),(Y),543)
+#define get_csv2_uint_pos544(X,Y) get_csv2_uint((X),(Y),544)
+#define get_csv2_ullong_pos544(X,Y) get_csv2_ullong((X),(Y),544)
+#define get_csv2_ip_pos544(X,Y) get_csv2_ip((X),(Y),544)
+#define get_csv2_ipv6_pos544(X,Y) get_csv2_ipv6((X),(Y),544)
+#define get_csv2_string_pos544(X,Y) get_csv2_string((X),(Y),544)
+#define get_csv2_v_str_pos544(X,Y) get_csv2_string((X),(Y),544)
+#define get_csv2_bool_pos544(X,Y) get_csv2_bool((X),(Y),544)
+#define get_csv2_int_pos544(X,Y) get_csv2_int((X),(Y),544)
+#define get_csv2_llong_pos544(X,Y) get_csv2_llong((X),(Y),544)
+#define get_csv2_float_pos544(X,Y) get_csv2_float((X),(Y),544)
+#define get_csv2_uint_pos545(X,Y) get_csv2_uint((X),(Y),545)
+#define get_csv2_ullong_pos545(X,Y) get_csv2_ullong((X),(Y),545)
+#define get_csv2_ip_pos545(X,Y) get_csv2_ip((X),(Y),545)
+#define get_csv2_ipv6_pos545(X,Y) get_csv2_ipv6((X),(Y),545)
+#define get_csv2_string_pos545(X,Y) get_csv2_string((X),(Y),545)
+#define get_csv2_v_str_pos545(X,Y) get_csv2_string((X),(Y),545)
+#define get_csv2_bool_pos545(X,Y) get_csv2_bool((X),(Y),545)
+#define get_csv2_int_pos545(X,Y) get_csv2_int((X),(Y),545)
+#define get_csv2_llong_pos545(X,Y) get_csv2_llong((X),(Y),545)
+#define get_csv2_float_pos545(X,Y) get_csv2_float((X),(Y),545)
+#define get_csv2_uint_pos546(X,Y) get_csv2_uint((X),(Y),546)
+#define get_csv2_ullong_pos546(X,Y) get_csv2_ullong((X),(Y),546)
+#define get_csv2_ip_pos546(X,Y) get_csv2_ip((X),(Y),546)
+#define get_csv2_ipv6_pos546(X,Y) get_csv2_ipv6((X),(Y),546)
+#define get_csv2_string_pos546(X,Y) get_csv2_string((X),(Y),546)
+#define get_csv2_v_str_pos546(X,Y) get_csv2_string((X),(Y),546)
+#define get_csv2_bool_pos546(X,Y) get_csv2_bool((X),(Y),546)
+#define get_csv2_int_pos546(X,Y) get_csv2_int((X),(Y),546)
+#define get_csv2_llong_pos546(X,Y) get_csv2_llong((X),(Y),546)
+#define get_csv2_float_pos546(X,Y) get_csv2_float((X),(Y),546)
+#define get_csv2_uint_pos547(X,Y) get_csv2_uint((X),(Y),547)
+#define get_csv2_ullong_pos547(X,Y) get_csv2_ullong((X),(Y),547)
+#define get_csv2_ip_pos547(X,Y) get_csv2_ip((X),(Y),547)
+#define get_csv2_ipv6_pos547(X,Y) get_csv2_ipv6((X),(Y),547)
+#define get_csv2_string_pos547(X,Y) get_csv2_string((X),(Y),547)
+#define get_csv2_v_str_pos547(X,Y) get_csv2_string((X),(Y),547)
+#define get_csv2_bool_pos547(X,Y) get_csv2_bool((X),(Y),547)
+#define get_csv2_int_pos547(X,Y) get_csv2_int((X),(Y),547)
+#define get_csv2_llong_pos547(X,Y) get_csv2_llong((X),(Y),547)
+#define get_csv2_float_pos547(X,Y) get_csv2_float((X),(Y),547)
+#define get_csv2_uint_pos548(X,Y) get_csv2_uint((X),(Y),548)
+#define get_csv2_ullong_pos548(X,Y) get_csv2_ullong((X),(Y),548)
+#define get_csv2_ip_pos548(X,Y) get_csv2_ip((X),(Y),548)
+#define get_csv2_ipv6_pos548(X,Y) get_csv2_ipv6((X),(Y),548)
+#define get_csv2_string_pos548(X,Y) get_csv2_string((X),(Y),548)
+#define get_csv2_v_str_pos548(X,Y) get_csv2_string((X),(Y),548)
+#define get_csv2_bool_pos548(X,Y) get_csv2_bool((X),(Y),548)
+#define get_csv2_int_pos548(X,Y) get_csv2_int((X),(Y),548)
+#define get_csv2_llong_pos548(X,Y) get_csv2_llong((X),(Y),548)
+#define get_csv2_float_pos548(X,Y) get_csv2_float((X),(Y),548)
+#define get_csv2_uint_pos549(X,Y) get_csv2_uint((X),(Y),549)
+#define get_csv2_ullong_pos549(X,Y) get_csv2_ullong((X),(Y),549)
+#define get_csv2_ip_pos549(X,Y) get_csv2_ip((X),(Y),549)
+#define get_csv2_ipv6_pos549(X,Y) get_csv2_ipv6((X),(Y),549)
+#define get_csv2_string_pos549(X,Y) get_csv2_string((X),(Y),549)
+#define get_csv2_v_str_pos549(X,Y) get_csv2_string((X),(Y),549)
+#define get_csv2_bool_pos549(X,Y) get_csv2_bool((X),(Y),549)
+#define get_csv2_int_pos549(X,Y) get_csv2_int((X),(Y),549)
+#define get_csv2_llong_pos549(X,Y) get_csv2_llong((X),(Y),549)
+#define get_csv2_float_pos549(X,Y) get_csv2_float((X),(Y),549)
+#define get_csv2_uint_pos550(X,Y) get_csv2_uint((X),(Y),550)
+#define get_csv2_ullong_pos550(X,Y) get_csv2_ullong((X),(Y),550)
+#define get_csv2_ip_pos550(X,Y) get_csv2_ip((X),(Y),550)
+#define get_csv2_ipv6_pos550(X,Y) get_csv2_ipv6((X),(Y),550)
+#define get_csv2_string_pos550(X,Y) get_csv2_string((X),(Y),550)
+#define get_csv2_v_str_pos550(X,Y) get_csv2_string((X),(Y),550)
+#define get_csv2_bool_pos550(X,Y) get_csv2_bool((X),(Y),550)
+#define get_csv2_int_pos550(X,Y) get_csv2_int((X),(Y),550)
+#define get_csv2_llong_pos550(X,Y) get_csv2_llong((X),(Y),550)
+#define get_csv2_float_pos550(X,Y) get_csv2_float((X),(Y),550)
+#define get_csv2_uint_pos551(X,Y) get_csv2_uint((X),(Y),551)
+#define get_csv2_ullong_pos551(X,Y) get_csv2_ullong((X),(Y),551)
+#define get_csv2_ip_pos551(X,Y) get_csv2_ip((X),(Y),551)
+#define get_csv2_ipv6_pos551(X,Y) get_csv2_ipv6((X),(Y),551)
+#define get_csv2_string_pos551(X,Y) get_csv2_string((X),(Y),551)
+#define get_csv2_v_str_pos551(X,Y) get_csv2_string((X),(Y),551)
+#define get_csv2_bool_pos551(X,Y) get_csv2_bool((X),(Y),551)
+#define get_csv2_int_pos551(X,Y) get_csv2_int((X),(Y),551)
+#define get_csv2_llong_pos551(X,Y) get_csv2_llong((X),(Y),551)
+#define get_csv2_float_pos551(X,Y) get_csv2_float((X),(Y),551)
+#define get_csv2_uint_pos552(X,Y) get_csv2_uint((X),(Y),552)
+#define get_csv2_ullong_pos552(X,Y) get_csv2_ullong((X),(Y),552)
+#define get_csv2_ip_pos552(X,Y) get_csv2_ip((X),(Y),552)
+#define get_csv2_ipv6_pos552(X,Y) get_csv2_ipv6((X),(Y),552)
+#define get_csv2_string_pos552(X,Y) get_csv2_string((X),(Y),552)
+#define get_csv2_v_str_pos552(X,Y) get_csv2_string((X),(Y),552)
+#define get_csv2_bool_pos552(X,Y) get_csv2_bool((X),(Y),552)
+#define get_csv2_int_pos552(X,Y) get_csv2_int((X),(Y),552)
+#define get_csv2_llong_pos552(X,Y) get_csv2_llong((X),(Y),552)
+#define get_csv2_float_pos552(X,Y) get_csv2_float((X),(Y),552)
+#define get_csv2_uint_pos553(X,Y) get_csv2_uint((X),(Y),553)
+#define get_csv2_ullong_pos553(X,Y) get_csv2_ullong((X),(Y),553)
+#define get_csv2_ip_pos553(X,Y) get_csv2_ip((X),(Y),553)
+#define get_csv2_ipv6_pos553(X,Y) get_csv2_ipv6((X),(Y),553)
+#define get_csv2_string_pos553(X,Y) get_csv2_string((X),(Y),553)
+#define get_csv2_v_str_pos553(X,Y) get_csv2_string((X),(Y),553)
+#define get_csv2_bool_pos553(X,Y) get_csv2_bool((X),(Y),553)
+#define get_csv2_int_pos553(X,Y) get_csv2_int((X),(Y),553)
+#define get_csv2_llong_pos553(X,Y) get_csv2_llong((X),(Y),553)
+#define get_csv2_float_pos553(X,Y) get_csv2_float((X),(Y),553)
+#define get_csv2_uint_pos554(X,Y) get_csv2_uint((X),(Y),554)
+#define get_csv2_ullong_pos554(X,Y) get_csv2_ullong((X),(Y),554)
+#define get_csv2_ip_pos554(X,Y) get_csv2_ip((X),(Y),554)
+#define get_csv2_ipv6_pos554(X,Y) get_csv2_ipv6((X),(Y),554)
+#define get_csv2_string_pos554(X,Y) get_csv2_string((X),(Y),554)
+#define get_csv2_v_str_pos554(X,Y) get_csv2_string((X),(Y),554)
+#define get_csv2_bool_pos554(X,Y) get_csv2_bool((X),(Y),554)
+#define get_csv2_int_pos554(X,Y) get_csv2_int((X),(Y),554)
+#define get_csv2_llong_pos554(X,Y) get_csv2_llong((X),(Y),554)
+#define get_csv2_float_pos554(X,Y) get_csv2_float((X),(Y),554)
+#define get_csv2_uint_pos555(X,Y) get_csv2_uint((X),(Y),555)
+#define get_csv2_ullong_pos555(X,Y) get_csv2_ullong((X),(Y),555)
+#define get_csv2_ip_pos555(X,Y) get_csv2_ip((X),(Y),555)
+#define get_csv2_ipv6_pos555(X,Y) get_csv2_ipv6((X),(Y),555)
+#define get_csv2_string_pos555(X,Y) get_csv2_string((X),(Y),555)
+#define get_csv2_v_str_pos555(X,Y) get_csv2_string((X),(Y),555)
+#define get_csv2_bool_pos555(X,Y) get_csv2_bool((X),(Y),555)
+#define get_csv2_int_pos555(X,Y) get_csv2_int((X),(Y),555)
+#define get_csv2_llong_pos555(X,Y) get_csv2_llong((X),(Y),555)
+#define get_csv2_float_pos555(X,Y) get_csv2_float((X),(Y),555)
+#define get_csv2_uint_pos556(X,Y) get_csv2_uint((X),(Y),556)
+#define get_csv2_ullong_pos556(X,Y) get_csv2_ullong((X),(Y),556)
+#define get_csv2_ip_pos556(X,Y) get_csv2_ip((X),(Y),556)
+#define get_csv2_ipv6_pos556(X,Y) get_csv2_ipv6((X),(Y),556)
+#define get_csv2_string_pos556(X,Y) get_csv2_string((X),(Y),556)
+#define get_csv2_v_str_pos556(X,Y) get_csv2_string((X),(Y),556)
+#define get_csv2_bool_pos556(X,Y) get_csv2_bool((X),(Y),556)
+#define get_csv2_int_pos556(X,Y) get_csv2_int((X),(Y),556)
+#define get_csv2_llong_pos556(X,Y) get_csv2_llong((X),(Y),556)
+#define get_csv2_float_pos556(X,Y) get_csv2_float((X),(Y),556)
+#define get_csv2_uint_pos557(X,Y) get_csv2_uint((X),(Y),557)
+#define get_csv2_ullong_pos557(X,Y) get_csv2_ullong((X),(Y),557)
+#define get_csv2_ip_pos557(X,Y) get_csv2_ip((X),(Y),557)
+#define get_csv2_ipv6_pos557(X,Y) get_csv2_ipv6((X),(Y),557)
+#define get_csv2_string_pos557(X,Y) get_csv2_string((X),(Y),557)
+#define get_csv2_v_str_pos557(X,Y) get_csv2_string((X),(Y),557)
+#define get_csv2_bool_pos557(X,Y) get_csv2_bool((X),(Y),557)
+#define get_csv2_int_pos557(X,Y) get_csv2_int((X),(Y),557)
+#define get_csv2_llong_pos557(X,Y) get_csv2_llong((X),(Y),557)
+#define get_csv2_float_pos557(X,Y) get_csv2_float((X),(Y),557)
+#define get_csv2_uint_pos558(X,Y) get_csv2_uint((X),(Y),558)
+#define get_csv2_ullong_pos558(X,Y) get_csv2_ullong((X),(Y),558)
+#define get_csv2_ip_pos558(X,Y) get_csv2_ip((X),(Y),558)
+#define get_csv2_ipv6_pos558(X,Y) get_csv2_ipv6((X),(Y),558)
+#define get_csv2_string_pos558(X,Y) get_csv2_string((X),(Y),558)
+#define get_csv2_v_str_pos558(X,Y) get_csv2_string((X),(Y),558)
+#define get_csv2_bool_pos558(X,Y) get_csv2_bool((X),(Y),558)
+#define get_csv2_int_pos558(X,Y) get_csv2_int((X),(Y),558)
+#define get_csv2_llong_pos558(X,Y) get_csv2_llong((X),(Y),558)
+#define get_csv2_float_pos558(X,Y) get_csv2_float((X),(Y),558)
+#define get_csv2_uint_pos559(X,Y) get_csv2_uint((X),(Y),559)
+#define get_csv2_ullong_pos559(X,Y) get_csv2_ullong((X),(Y),559)
+#define get_csv2_ip_pos559(X,Y) get_csv2_ip((X),(Y),559)
+#define get_csv2_ipv6_pos559(X,Y) get_csv2_ipv6((X),(Y),559)
+#define get_csv2_string_pos559(X,Y) get_csv2_string((X),(Y),559)
+#define get_csv2_v_str_pos559(X,Y) get_csv2_string((X),(Y),559)
+#define get_csv2_bool_pos559(X,Y) get_csv2_bool((X),(Y),559)
+#define get_csv2_int_pos559(X,Y) get_csv2_int((X),(Y),559)
+#define get_csv2_llong_pos559(X,Y) get_csv2_llong((X),(Y),559)
+#define get_csv2_float_pos559(X,Y) get_csv2_float((X),(Y),559)
+#define get_csv2_uint_pos560(X,Y) get_csv2_uint((X),(Y),560)
+#define get_csv2_ullong_pos560(X,Y) get_csv2_ullong((X),(Y),560)
+#define get_csv2_ip_pos560(X,Y) get_csv2_ip((X),(Y),560)
+#define get_csv2_ipv6_pos560(X,Y) get_csv2_ipv6((X),(Y),560)
+#define get_csv2_string_pos560(X,Y) get_csv2_string((X),(Y),560)
+#define get_csv2_v_str_pos560(X,Y) get_csv2_string((X),(Y),560)
+#define get_csv2_bool_pos560(X,Y) get_csv2_bool((X),(Y),560)
+#define get_csv2_int_pos560(X,Y) get_csv2_int((X),(Y),560)
+#define get_csv2_llong_pos560(X,Y) get_csv2_llong((X),(Y),560)
+#define get_csv2_float_pos560(X,Y) get_csv2_float((X),(Y),560)
+#define get_csv2_uint_pos561(X,Y) get_csv2_uint((X),(Y),561)
+#define get_csv2_ullong_pos561(X,Y) get_csv2_ullong((X),(Y),561)
+#define get_csv2_ip_pos561(X,Y) get_csv2_ip((X),(Y),561)
+#define get_csv2_ipv6_pos561(X,Y) get_csv2_ipv6((X),(Y),561)
+#define get_csv2_string_pos561(X,Y) get_csv2_string((X),(Y),561)
+#define get_csv2_v_str_pos561(X,Y) get_csv2_string((X),(Y),561)
+#define get_csv2_bool_pos561(X,Y) get_csv2_bool((X),(Y),561)
+#define get_csv2_int_pos561(X,Y) get_csv2_int((X),(Y),561)
+#define get_csv2_llong_pos561(X,Y) get_csv2_llong((X),(Y),561)
+#define get_csv2_float_pos561(X,Y) get_csv2_float((X),(Y),561)
+#define get_csv2_uint_pos562(X,Y) get_csv2_uint((X),(Y),562)
+#define get_csv2_ullong_pos562(X,Y) get_csv2_ullong((X),(Y),562)
+#define get_csv2_ip_pos562(X,Y) get_csv2_ip((X),(Y),562)
+#define get_csv2_ipv6_pos562(X,Y) get_csv2_ipv6((X),(Y),562)
+#define get_csv2_string_pos562(X,Y) get_csv2_string((X),(Y),562)
+#define get_csv2_v_str_pos562(X,Y) get_csv2_string((X),(Y),562)
+#define get_csv2_bool_pos562(X,Y) get_csv2_bool((X),(Y),562)
+#define get_csv2_int_pos562(X,Y) get_csv2_int((X),(Y),562)
+#define get_csv2_llong_pos562(X,Y) get_csv2_llong((X),(Y),562)
+#define get_csv2_float_pos562(X,Y) get_csv2_float((X),(Y),562)
+#define get_csv2_uint_pos563(X,Y) get_csv2_uint((X),(Y),563)
+#define get_csv2_ullong_pos563(X,Y) get_csv2_ullong((X),(Y),563)
+#define get_csv2_ip_pos563(X,Y) get_csv2_ip((X),(Y),563)
+#define get_csv2_ipv6_pos563(X,Y) get_csv2_ipv6((X),(Y),563)
+#define get_csv2_string_pos563(X,Y) get_csv2_string((X),(Y),563)
+#define get_csv2_v_str_pos563(X,Y) get_csv2_string((X),(Y),563)
+#define get_csv2_bool_pos563(X,Y) get_csv2_bool((X),(Y),563)
+#define get_csv2_int_pos563(X,Y) get_csv2_int((X),(Y),563)
+#define get_csv2_llong_pos563(X,Y) get_csv2_llong((X),(Y),563)
+#define get_csv2_float_pos563(X,Y) get_csv2_float((X),(Y),563)
+#define get_csv2_uint_pos564(X,Y) get_csv2_uint((X),(Y),564)
+#define get_csv2_ullong_pos564(X,Y) get_csv2_ullong((X),(Y),564)
+#define get_csv2_ip_pos564(X,Y) get_csv2_ip((X),(Y),564)
+#define get_csv2_ipv6_pos564(X,Y) get_csv2_ipv6((X),(Y),564)
+#define get_csv2_string_pos564(X,Y) get_csv2_string((X),(Y),564)
+#define get_csv2_v_str_pos564(X,Y) get_csv2_string((X),(Y),564)
+#define get_csv2_bool_pos564(X,Y) get_csv2_bool((X),(Y),564)
+#define get_csv2_int_pos564(X,Y) get_csv2_int((X),(Y),564)
+#define get_csv2_llong_pos564(X,Y) get_csv2_llong((X),(Y),564)
+#define get_csv2_float_pos564(X,Y) get_csv2_float((X),(Y),564)
+#define get_csv2_uint_pos565(X,Y) get_csv2_uint((X),(Y),565)
+#define get_csv2_ullong_pos565(X,Y) get_csv2_ullong((X),(Y),565)
+#define get_csv2_ip_pos565(X,Y) get_csv2_ip((X),(Y),565)
+#define get_csv2_ipv6_pos565(X,Y) get_csv2_ipv6((X),(Y),565)
+#define get_csv2_string_pos565(X,Y) get_csv2_string((X),(Y),565)
+#define get_csv2_v_str_pos565(X,Y) get_csv2_string((X),(Y),565)
+#define get_csv2_bool_pos565(X,Y) get_csv2_bool((X),(Y),565)
+#define get_csv2_int_pos565(X,Y) get_csv2_int((X),(Y),565)
+#define get_csv2_llong_pos565(X,Y) get_csv2_llong((X),(Y),565)
+#define get_csv2_float_pos565(X,Y) get_csv2_float((X),(Y),565)
+#define get_csv2_uint_pos566(X,Y) get_csv2_uint((X),(Y),566)
+#define get_csv2_ullong_pos566(X,Y) get_csv2_ullong((X),(Y),566)
+#define get_csv2_ip_pos566(X,Y) get_csv2_ip((X),(Y),566)
+#define get_csv2_ipv6_pos566(X,Y) get_csv2_ipv6((X),(Y),566)
+#define get_csv2_string_pos566(X,Y) get_csv2_string((X),(Y),566)
+#define get_csv2_v_str_pos566(X,Y) get_csv2_string((X),(Y),566)
+#define get_csv2_bool_pos566(X,Y) get_csv2_bool((X),(Y),566)
+#define get_csv2_int_pos566(X,Y) get_csv2_int((X),(Y),566)
+#define get_csv2_llong_pos566(X,Y) get_csv2_llong((X),(Y),566)
+#define get_csv2_float_pos566(X,Y) get_csv2_float((X),(Y),566)
+#define get_csv2_uint_pos567(X,Y) get_csv2_uint((X),(Y),567)
+#define get_csv2_ullong_pos567(X,Y) get_csv2_ullong((X),(Y),567)
+#define get_csv2_ip_pos567(X,Y) get_csv2_ip((X),(Y),567)
+#define get_csv2_ipv6_pos567(X,Y) get_csv2_ipv6((X),(Y),567)
+#define get_csv2_string_pos567(X,Y) get_csv2_string((X),(Y),567)
+#define get_csv2_v_str_pos567(X,Y) get_csv2_string((X),(Y),567)
+#define get_csv2_bool_pos567(X,Y) get_csv2_bool((X),(Y),567)
+#define get_csv2_int_pos567(X,Y) get_csv2_int((X),(Y),567)
+#define get_csv2_llong_pos567(X,Y) get_csv2_llong((X),(Y),567)
+#define get_csv2_float_pos567(X,Y) get_csv2_float((X),(Y),567)
+#define get_csv2_uint_pos568(X,Y) get_csv2_uint((X),(Y),568)
+#define get_csv2_ullong_pos568(X,Y) get_csv2_ullong((X),(Y),568)
+#define get_csv2_ip_pos568(X,Y) get_csv2_ip((X),(Y),568)
+#define get_csv2_ipv6_pos568(X,Y) get_csv2_ipv6((X),(Y),568)
+#define get_csv2_string_pos568(X,Y) get_csv2_string((X),(Y),568)
+#define get_csv2_v_str_pos568(X,Y) get_csv2_string((X),(Y),568)
+#define get_csv2_bool_pos568(X,Y) get_csv2_bool((X),(Y),568)
+#define get_csv2_int_pos568(X,Y) get_csv2_int((X),(Y),568)
+#define get_csv2_llong_pos568(X,Y) get_csv2_llong((X),(Y),568)
+#define get_csv2_float_pos568(X,Y) get_csv2_float((X),(Y),568)
+#define get_csv2_uint_pos569(X,Y) get_csv2_uint((X),(Y),569)
+#define get_csv2_ullong_pos569(X,Y) get_csv2_ullong((X),(Y),569)
+#define get_csv2_ip_pos569(X,Y) get_csv2_ip((X),(Y),569)
+#define get_csv2_ipv6_pos569(X,Y) get_csv2_ipv6((X),(Y),569)
+#define get_csv2_string_pos569(X,Y) get_csv2_string((X),(Y),569)
+#define get_csv2_v_str_pos569(X,Y) get_csv2_string((X),(Y),569)
+#define get_csv2_bool_pos569(X,Y) get_csv2_bool((X),(Y),569)
+#define get_csv2_int_pos569(X,Y) get_csv2_int((X),(Y),569)
+#define get_csv2_llong_pos569(X,Y) get_csv2_llong((X),(Y),569)
+#define get_csv2_float_pos569(X,Y) get_csv2_float((X),(Y),569)
+#define get_csv2_uint_pos570(X,Y) get_csv2_uint((X),(Y),570)
+#define get_csv2_ullong_pos570(X,Y) get_csv2_ullong((X),(Y),570)
+#define get_csv2_ip_pos570(X,Y) get_csv2_ip((X),(Y),570)
+#define get_csv2_ipv6_pos570(X,Y) get_csv2_ipv6((X),(Y),570)
+#define get_csv2_string_pos570(X,Y) get_csv2_string((X),(Y),570)
+#define get_csv2_v_str_pos570(X,Y) get_csv2_string((X),(Y),570)
+#define get_csv2_bool_pos570(X,Y) get_csv2_bool((X),(Y),570)
+#define get_csv2_int_pos570(X,Y) get_csv2_int((X),(Y),570)
+#define get_csv2_llong_pos570(X,Y) get_csv2_llong((X),(Y),570)
+#define get_csv2_float_pos570(X,Y) get_csv2_float((X),(Y),570)
+#define get_csv2_uint_pos571(X,Y) get_csv2_uint((X),(Y),571)
+#define get_csv2_ullong_pos571(X,Y) get_csv2_ullong((X),(Y),571)
+#define get_csv2_ip_pos571(X,Y) get_csv2_ip((X),(Y),571)
+#define get_csv2_ipv6_pos571(X,Y) get_csv2_ipv6((X),(Y),571)
+#define get_csv2_string_pos571(X,Y) get_csv2_string((X),(Y),571)
+#define get_csv2_v_str_pos571(X,Y) get_csv2_string((X),(Y),571)
+#define get_csv2_bool_pos571(X,Y) get_csv2_bool((X),(Y),571)
+#define get_csv2_int_pos571(X,Y) get_csv2_int((X),(Y),571)
+#define get_csv2_llong_pos571(X,Y) get_csv2_llong((X),(Y),571)
+#define get_csv2_float_pos571(X,Y) get_csv2_float((X),(Y),571)
+#define get_csv2_uint_pos572(X,Y) get_csv2_uint((X),(Y),572)
+#define get_csv2_ullong_pos572(X,Y) get_csv2_ullong((X),(Y),572)
+#define get_csv2_ip_pos572(X,Y) get_csv2_ip((X),(Y),572)
+#define get_csv2_ipv6_pos572(X,Y) get_csv2_ipv6((X),(Y),572)
+#define get_csv2_string_pos572(X,Y) get_csv2_string((X),(Y),572)
+#define get_csv2_v_str_pos572(X,Y) get_csv2_string((X),(Y),572)
+#define get_csv2_bool_pos572(X,Y) get_csv2_bool((X),(Y),572)
+#define get_csv2_int_pos572(X,Y) get_csv2_int((X),(Y),572)
+#define get_csv2_llong_pos572(X,Y) get_csv2_llong((X),(Y),572)
+#define get_csv2_float_pos572(X,Y) get_csv2_float((X),(Y),572)
+#define get_csv2_uint_pos573(X,Y) get_csv2_uint((X),(Y),573)
+#define get_csv2_ullong_pos573(X,Y) get_csv2_ullong((X),(Y),573)
+#define get_csv2_ip_pos573(X,Y) get_csv2_ip((X),(Y),573)
+#define get_csv2_ipv6_pos573(X,Y) get_csv2_ipv6((X),(Y),573)
+#define get_csv2_string_pos573(X,Y) get_csv2_string((X),(Y),573)
+#define get_csv2_v_str_pos573(X,Y) get_csv2_string((X),(Y),573)
+#define get_csv2_bool_pos573(X,Y) get_csv2_bool((X),(Y),573)
+#define get_csv2_int_pos573(X,Y) get_csv2_int((X),(Y),573)
+#define get_csv2_llong_pos573(X,Y) get_csv2_llong((X),(Y),573)
+#define get_csv2_float_pos573(X,Y) get_csv2_float((X),(Y),573)
+#define get_csv2_uint_pos574(X,Y) get_csv2_uint((X),(Y),574)
+#define get_csv2_ullong_pos574(X,Y) get_csv2_ullong((X),(Y),574)
+#define get_csv2_ip_pos574(X,Y) get_csv2_ip((X),(Y),574)
+#define get_csv2_ipv6_pos574(X,Y) get_csv2_ipv6((X),(Y),574)
+#define get_csv2_string_pos574(X,Y) get_csv2_string((X),(Y),574)
+#define get_csv2_v_str_pos574(X,Y) get_csv2_string((X),(Y),574)
+#define get_csv2_bool_pos574(X,Y) get_csv2_bool((X),(Y),574)
+#define get_csv2_int_pos574(X,Y) get_csv2_int((X),(Y),574)
+#define get_csv2_llong_pos574(X,Y) get_csv2_llong((X),(Y),574)
+#define get_csv2_float_pos574(X,Y) get_csv2_float((X),(Y),574)
+#define get_csv2_uint_pos575(X,Y) get_csv2_uint((X),(Y),575)
+#define get_csv2_ullong_pos575(X,Y) get_csv2_ullong((X),(Y),575)
+#define get_csv2_ip_pos575(X,Y) get_csv2_ip((X),(Y),575)
+#define get_csv2_ipv6_pos575(X,Y) get_csv2_ipv6((X),(Y),575)
+#define get_csv2_string_pos575(X,Y) get_csv2_string((X),(Y),575)
+#define get_csv2_v_str_pos575(X,Y) get_csv2_string((X),(Y),575)
+#define get_csv2_bool_pos575(X,Y) get_csv2_bool((X),(Y),575)
+#define get_csv2_int_pos575(X,Y) get_csv2_int((X),(Y),575)
+#define get_csv2_llong_pos575(X,Y) get_csv2_llong((X),(Y),575)
+#define get_csv2_float_pos575(X,Y) get_csv2_float((X),(Y),575)
+#define get_csv2_uint_pos576(X,Y) get_csv2_uint((X),(Y),576)
+#define get_csv2_ullong_pos576(X,Y) get_csv2_ullong((X),(Y),576)
+#define get_csv2_ip_pos576(X,Y) get_csv2_ip((X),(Y),576)
+#define get_csv2_ipv6_pos576(X,Y) get_csv2_ipv6((X),(Y),576)
+#define get_csv2_string_pos576(X,Y) get_csv2_string((X),(Y),576)
+#define get_csv2_v_str_pos576(X,Y) get_csv2_string((X),(Y),576)
+#define get_csv2_bool_pos576(X,Y) get_csv2_bool((X),(Y),576)
+#define get_csv2_int_pos576(X,Y) get_csv2_int((X),(Y),576)
+#define get_csv2_llong_pos576(X,Y) get_csv2_llong((X),(Y),576)
+#define get_csv2_float_pos576(X,Y) get_csv2_float((X),(Y),576)
+#define get_csv2_uint_pos577(X,Y) get_csv2_uint((X),(Y),577)
+#define get_csv2_ullong_pos577(X,Y) get_csv2_ullong((X),(Y),577)
+#define get_csv2_ip_pos577(X,Y) get_csv2_ip((X),(Y),577)
+#define get_csv2_ipv6_pos577(X,Y) get_csv2_ipv6((X),(Y),577)
+#define get_csv2_string_pos577(X,Y) get_csv2_string((X),(Y),577)
+#define get_csv2_v_str_pos577(X,Y) get_csv2_string((X),(Y),577)
+#define get_csv2_bool_pos577(X,Y) get_csv2_bool((X),(Y),577)
+#define get_csv2_int_pos577(X,Y) get_csv2_int((X),(Y),577)
+#define get_csv2_llong_pos577(X,Y) get_csv2_llong((X),(Y),577)
+#define get_csv2_float_pos577(X,Y) get_csv2_float((X),(Y),577)
+#define get_csv2_uint_pos578(X,Y) get_csv2_uint((X),(Y),578)
+#define get_csv2_ullong_pos578(X,Y) get_csv2_ullong((X),(Y),578)
+#define get_csv2_ip_pos578(X,Y) get_csv2_ip((X),(Y),578)
+#define get_csv2_ipv6_pos578(X,Y) get_csv2_ipv6((X),(Y),578)
+#define get_csv2_string_pos578(X,Y) get_csv2_string((X),(Y),578)
+#define get_csv2_v_str_pos578(X,Y) get_csv2_string((X),(Y),578)
+#define get_csv2_bool_pos578(X,Y) get_csv2_bool((X),(Y),578)
+#define get_csv2_int_pos578(X,Y) get_csv2_int((X),(Y),578)
+#define get_csv2_llong_pos578(X,Y) get_csv2_llong((X),(Y),578)
+#define get_csv2_float_pos578(X,Y) get_csv2_float((X),(Y),578)
+#define get_csv2_uint_pos579(X,Y) get_csv2_uint((X),(Y),579)
+#define get_csv2_ullong_pos579(X,Y) get_csv2_ullong((X),(Y),579)
+#define get_csv2_ip_pos579(X,Y) get_csv2_ip((X),(Y),579)
+#define get_csv2_ipv6_pos579(X,Y) get_csv2_ipv6((X),(Y),579)
+#define get_csv2_string_pos579(X,Y) get_csv2_string((X),(Y),579)
+#define get_csv2_v_str_pos579(X,Y) get_csv2_string((X),(Y),579)
+#define get_csv2_bool_pos579(X,Y) get_csv2_bool((X),(Y),579)
+#define get_csv2_int_pos579(X,Y) get_csv2_int((X),(Y),579)
+#define get_csv2_llong_pos579(X,Y) get_csv2_llong((X),(Y),579)
+#define get_csv2_float_pos579(X,Y) get_csv2_float((X),(Y),579)
+#define get_csv2_uint_pos580(X,Y) get_csv2_uint((X),(Y),580)
+#define get_csv2_ullong_pos580(X,Y) get_csv2_ullong((X),(Y),580)
+#define get_csv2_ip_pos580(X,Y) get_csv2_ip((X),(Y),580)
+#define get_csv2_ipv6_pos580(X,Y) get_csv2_ipv6((X),(Y),580)
+#define get_csv2_string_pos580(X,Y) get_csv2_string((X),(Y),580)
+#define get_csv2_v_str_pos580(X,Y) get_csv2_string((X),(Y),580)
+#define get_csv2_bool_pos580(X,Y) get_csv2_bool((X),(Y),580)
+#define get_csv2_int_pos580(X,Y) get_csv2_int((X),(Y),580)
+#define get_csv2_llong_pos580(X,Y) get_csv2_llong((X),(Y),580)
+#define get_csv2_float_pos580(X,Y) get_csv2_float((X),(Y),580)
+#define get_csv2_uint_pos581(X,Y) get_csv2_uint((X),(Y),581)
+#define get_csv2_ullong_pos581(X,Y) get_csv2_ullong((X),(Y),581)
+#define get_csv2_ip_pos581(X,Y) get_csv2_ip((X),(Y),581)
+#define get_csv2_ipv6_pos581(X,Y) get_csv2_ipv6((X),(Y),581)
+#define get_csv2_string_pos581(X,Y) get_csv2_string((X),(Y),581)
+#define get_csv2_v_str_pos581(X,Y) get_csv2_string((X),(Y),581)
+#define get_csv2_bool_pos581(X,Y) get_csv2_bool((X),(Y),581)
+#define get_csv2_int_pos581(X,Y) get_csv2_int((X),(Y),581)
+#define get_csv2_llong_pos581(X,Y) get_csv2_llong((X),(Y),581)
+#define get_csv2_float_pos581(X,Y) get_csv2_float((X),(Y),581)
+#define get_csv2_uint_pos582(X,Y) get_csv2_uint((X),(Y),582)
+#define get_csv2_ullong_pos582(X,Y) get_csv2_ullong((X),(Y),582)
+#define get_csv2_ip_pos582(X,Y) get_csv2_ip((X),(Y),582)
+#define get_csv2_ipv6_pos582(X,Y) get_csv2_ipv6((X),(Y),582)
+#define get_csv2_string_pos582(X,Y) get_csv2_string((X),(Y),582)
+#define get_csv2_v_str_pos582(X,Y) get_csv2_string((X),(Y),582)
+#define get_csv2_bool_pos582(X,Y) get_csv2_bool((X),(Y),582)
+#define get_csv2_int_pos582(X,Y) get_csv2_int((X),(Y),582)
+#define get_csv2_llong_pos582(X,Y) get_csv2_llong((X),(Y),582)
+#define get_csv2_float_pos582(X,Y) get_csv2_float((X),(Y),582)
+#define get_csv2_uint_pos583(X,Y) get_csv2_uint((X),(Y),583)
+#define get_csv2_ullong_pos583(X,Y) get_csv2_ullong((X),(Y),583)
+#define get_csv2_ip_pos583(X,Y) get_csv2_ip((X),(Y),583)
+#define get_csv2_ipv6_pos583(X,Y) get_csv2_ipv6((X),(Y),583)
+#define get_csv2_string_pos583(X,Y) get_csv2_string((X),(Y),583)
+#define get_csv2_v_str_pos583(X,Y) get_csv2_string((X),(Y),583)
+#define get_csv2_bool_pos583(X,Y) get_csv2_bool((X),(Y),583)
+#define get_csv2_int_pos583(X,Y) get_csv2_int((X),(Y),583)
+#define get_csv2_llong_pos583(X,Y) get_csv2_llong((X),(Y),583)
+#define get_csv2_float_pos583(X,Y) get_csv2_float((X),(Y),583)
+#define get_csv2_uint_pos584(X,Y) get_csv2_uint((X),(Y),584)
+#define get_csv2_ullong_pos584(X,Y) get_csv2_ullong((X),(Y),584)
+#define get_csv2_ip_pos584(X,Y) get_csv2_ip((X),(Y),584)
+#define get_csv2_ipv6_pos584(X,Y) get_csv2_ipv6((X),(Y),584)
+#define get_csv2_string_pos584(X,Y) get_csv2_string((X),(Y),584)
+#define get_csv2_v_str_pos584(X,Y) get_csv2_string((X),(Y),584)
+#define get_csv2_bool_pos584(X,Y) get_csv2_bool((X),(Y),584)
+#define get_csv2_int_pos584(X,Y) get_csv2_int((X),(Y),584)
+#define get_csv2_llong_pos584(X,Y) get_csv2_llong((X),(Y),584)
+#define get_csv2_float_pos584(X,Y) get_csv2_float((X),(Y),584)
+#define get_csv2_uint_pos585(X,Y) get_csv2_uint((X),(Y),585)
+#define get_csv2_ullong_pos585(X,Y) get_csv2_ullong((X),(Y),585)
+#define get_csv2_ip_pos585(X,Y) get_csv2_ip((X),(Y),585)
+#define get_csv2_ipv6_pos585(X,Y) get_csv2_ipv6((X),(Y),585)
+#define get_csv2_string_pos585(X,Y) get_csv2_string((X),(Y),585)
+#define get_csv2_v_str_pos585(X,Y) get_csv2_string((X),(Y),585)
+#define get_csv2_bool_pos585(X,Y) get_csv2_bool((X),(Y),585)
+#define get_csv2_int_pos585(X,Y) get_csv2_int((X),(Y),585)
+#define get_csv2_llong_pos585(X,Y) get_csv2_llong((X),(Y),585)
+#define get_csv2_float_pos585(X,Y) get_csv2_float((X),(Y),585)
+#define get_csv2_uint_pos586(X,Y) get_csv2_uint((X),(Y),586)
+#define get_csv2_ullong_pos586(X,Y) get_csv2_ullong((X),(Y),586)
+#define get_csv2_ip_pos586(X,Y) get_csv2_ip((X),(Y),586)
+#define get_csv2_ipv6_pos586(X,Y) get_csv2_ipv6((X),(Y),586)
+#define get_csv2_string_pos586(X,Y) get_csv2_string((X),(Y),586)
+#define get_csv2_v_str_pos586(X,Y) get_csv2_string((X),(Y),586)
+#define get_csv2_bool_pos586(X,Y) get_csv2_bool((X),(Y),586)
+#define get_csv2_int_pos586(X,Y) get_csv2_int((X),(Y),586)
+#define get_csv2_llong_pos586(X,Y) get_csv2_llong((X),(Y),586)
+#define get_csv2_float_pos586(X,Y) get_csv2_float((X),(Y),586)
+#define get_csv2_uint_pos587(X,Y) get_csv2_uint((X),(Y),587)
+#define get_csv2_ullong_pos587(X,Y) get_csv2_ullong((X),(Y),587)
+#define get_csv2_ip_pos587(X,Y) get_csv2_ip((X),(Y),587)
+#define get_csv2_ipv6_pos587(X,Y) get_csv2_ipv6((X),(Y),587)
+#define get_csv2_string_pos587(X,Y) get_csv2_string((X),(Y),587)
+#define get_csv2_v_str_pos587(X,Y) get_csv2_string((X),(Y),587)
+#define get_csv2_bool_pos587(X,Y) get_csv2_bool((X),(Y),587)
+#define get_csv2_int_pos587(X,Y) get_csv2_int((X),(Y),587)
+#define get_csv2_llong_pos587(X,Y) get_csv2_llong((X),(Y),587)
+#define get_csv2_float_pos587(X,Y) get_csv2_float((X),(Y),587)
+#define get_csv2_uint_pos588(X,Y) get_csv2_uint((X),(Y),588)
+#define get_csv2_ullong_pos588(X,Y) get_csv2_ullong((X),(Y),588)
+#define get_csv2_ip_pos588(X,Y) get_csv2_ip((X),(Y),588)
+#define get_csv2_ipv6_pos588(X,Y) get_csv2_ipv6((X),(Y),588)
+#define get_csv2_string_pos588(X,Y) get_csv2_string((X),(Y),588)
+#define get_csv2_v_str_pos588(X,Y) get_csv2_string((X),(Y),588)
+#define get_csv2_bool_pos588(X,Y) get_csv2_bool((X),(Y),588)
+#define get_csv2_int_pos588(X,Y) get_csv2_int((X),(Y),588)
+#define get_csv2_llong_pos588(X,Y) get_csv2_llong((X),(Y),588)
+#define get_csv2_float_pos588(X,Y) get_csv2_float((X),(Y),588)
+#define get_csv2_uint_pos589(X,Y) get_csv2_uint((X),(Y),589)
+#define get_csv2_ullong_pos589(X,Y) get_csv2_ullong((X),(Y),589)
+#define get_csv2_ip_pos589(X,Y) get_csv2_ip((X),(Y),589)
+#define get_csv2_ipv6_pos589(X,Y) get_csv2_ipv6((X),(Y),589)
+#define get_csv2_string_pos589(X,Y) get_csv2_string((X),(Y),589)
+#define get_csv2_v_str_pos589(X,Y) get_csv2_string((X),(Y),589)
+#define get_csv2_bool_pos589(X,Y) get_csv2_bool((X),(Y),589)
+#define get_csv2_int_pos589(X,Y) get_csv2_int((X),(Y),589)
+#define get_csv2_llong_pos589(X,Y) get_csv2_llong((X),(Y),589)
+#define get_csv2_float_pos589(X,Y) get_csv2_float((X),(Y),589)
+#define get_csv2_uint_pos590(X,Y) get_csv2_uint((X),(Y),590)
+#define get_csv2_ullong_pos590(X,Y) get_csv2_ullong((X),(Y),590)
+#define get_csv2_ip_pos590(X,Y) get_csv2_ip((X),(Y),590)
+#define get_csv2_ipv6_pos590(X,Y) get_csv2_ipv6((X),(Y),590)
+#define get_csv2_string_pos590(X,Y) get_csv2_string((X),(Y),590)
+#define get_csv2_v_str_pos590(X,Y) get_csv2_string((X),(Y),590)
+#define get_csv2_bool_pos590(X,Y) get_csv2_bool((X),(Y),590)
+#define get_csv2_int_pos590(X,Y) get_csv2_int((X),(Y),590)
+#define get_csv2_llong_pos590(X,Y) get_csv2_llong((X),(Y),590)
+#define get_csv2_float_pos590(X,Y) get_csv2_float((X),(Y),590)
+#define get_csv2_uint_pos591(X,Y) get_csv2_uint((X),(Y),591)
+#define get_csv2_ullong_pos591(X,Y) get_csv2_ullong((X),(Y),591)
+#define get_csv2_ip_pos591(X,Y) get_csv2_ip((X),(Y),591)
+#define get_csv2_ipv6_pos591(X,Y) get_csv2_ipv6((X),(Y),591)
+#define get_csv2_string_pos591(X,Y) get_csv2_string((X),(Y),591)
+#define get_csv2_v_str_pos591(X,Y) get_csv2_string((X),(Y),591)
+#define get_csv2_bool_pos591(X,Y) get_csv2_bool((X),(Y),591)
+#define get_csv2_int_pos591(X,Y) get_csv2_int((X),(Y),591)
+#define get_csv2_llong_pos591(X,Y) get_csv2_llong((X),(Y),591)
+#define get_csv2_float_pos591(X,Y) get_csv2_float((X),(Y),591)
+#define get_csv2_uint_pos592(X,Y) get_csv2_uint((X),(Y),592)
+#define get_csv2_ullong_pos592(X,Y) get_csv2_ullong((X),(Y),592)
+#define get_csv2_ip_pos592(X,Y) get_csv2_ip((X),(Y),592)
+#define get_csv2_ipv6_pos592(X,Y) get_csv2_ipv6((X),(Y),592)
+#define get_csv2_string_pos592(X,Y) get_csv2_string((X),(Y),592)
+#define get_csv2_v_str_pos592(X,Y) get_csv2_string((X),(Y),592)
+#define get_csv2_bool_pos592(X,Y) get_csv2_bool((X),(Y),592)
+#define get_csv2_int_pos592(X,Y) get_csv2_int((X),(Y),592)
+#define get_csv2_llong_pos592(X,Y) get_csv2_llong((X),(Y),592)
+#define get_csv2_float_pos592(X,Y) get_csv2_float((X),(Y),592)
+#define get_csv2_uint_pos593(X,Y) get_csv2_uint((X),(Y),593)
+#define get_csv2_ullong_pos593(X,Y) get_csv2_ullong((X),(Y),593)
+#define get_csv2_ip_pos593(X,Y) get_csv2_ip((X),(Y),593)
+#define get_csv2_ipv6_pos593(X,Y) get_csv2_ipv6((X),(Y),593)
+#define get_csv2_string_pos593(X,Y) get_csv2_string((X),(Y),593)
+#define get_csv2_v_str_pos593(X,Y) get_csv2_string((X),(Y),593)
+#define get_csv2_bool_pos593(X,Y) get_csv2_bool((X),(Y),593)
+#define get_csv2_int_pos593(X,Y) get_csv2_int((X),(Y),593)
+#define get_csv2_llong_pos593(X,Y) get_csv2_llong((X),(Y),593)
+#define get_csv2_float_pos593(X,Y) get_csv2_float((X),(Y),593)
+#define get_csv2_uint_pos594(X,Y) get_csv2_uint((X),(Y),594)
+#define get_csv2_ullong_pos594(X,Y) get_csv2_ullong((X),(Y),594)
+#define get_csv2_ip_pos594(X,Y) get_csv2_ip((X),(Y),594)
+#define get_csv2_ipv6_pos594(X,Y) get_csv2_ipv6((X),(Y),594)
+#define get_csv2_string_pos594(X,Y) get_csv2_string((X),(Y),594)
+#define get_csv2_v_str_pos594(X,Y) get_csv2_string((X),(Y),594)
+#define get_csv2_bool_pos594(X,Y) get_csv2_bool((X),(Y),594)
+#define get_csv2_int_pos594(X,Y) get_csv2_int((X),(Y),594)
+#define get_csv2_llong_pos594(X,Y) get_csv2_llong((X),(Y),594)
+#define get_csv2_float_pos594(X,Y) get_csv2_float((X),(Y),594)
+#define get_csv2_uint_pos595(X,Y) get_csv2_uint((X),(Y),595)
+#define get_csv2_ullong_pos595(X,Y) get_csv2_ullong((X),(Y),595)
+#define get_csv2_ip_pos595(X,Y) get_csv2_ip((X),(Y),595)
+#define get_csv2_ipv6_pos595(X,Y) get_csv2_ipv6((X),(Y),595)
+#define get_csv2_string_pos595(X,Y) get_csv2_string((X),(Y),595)
+#define get_csv2_v_str_pos595(X,Y) get_csv2_string((X),(Y),595)
+#define get_csv2_bool_pos595(X,Y) get_csv2_bool((X),(Y),595)
+#define get_csv2_int_pos595(X,Y) get_csv2_int((X),(Y),595)
+#define get_csv2_llong_pos595(X,Y) get_csv2_llong((X),(Y),595)
+#define get_csv2_float_pos595(X,Y) get_csv2_float((X),(Y),595)
+#define get_csv2_uint_pos596(X,Y) get_csv2_uint((X),(Y),596)
+#define get_csv2_ullong_pos596(X,Y) get_csv2_ullong((X),(Y),596)
+#define get_csv2_ip_pos596(X,Y) get_csv2_ip((X),(Y),596)
+#define get_csv2_ipv6_pos596(X,Y) get_csv2_ipv6((X),(Y),596)
+#define get_csv2_string_pos596(X,Y) get_csv2_string((X),(Y),596)
+#define get_csv2_v_str_pos596(X,Y) get_csv2_string((X),(Y),596)
+#define get_csv2_bool_pos596(X,Y) get_csv2_bool((X),(Y),596)
+#define get_csv2_int_pos596(X,Y) get_csv2_int((X),(Y),596)
+#define get_csv2_llong_pos596(X,Y) get_csv2_llong((X),(Y),596)
+#define get_csv2_float_pos596(X,Y) get_csv2_float((X),(Y),596)
+#define get_csv2_uint_pos597(X,Y) get_csv2_uint((X),(Y),597)
+#define get_csv2_ullong_pos597(X,Y) get_csv2_ullong((X),(Y),597)
+#define get_csv2_ip_pos597(X,Y) get_csv2_ip((X),(Y),597)
+#define get_csv2_ipv6_pos597(X,Y) get_csv2_ipv6((X),(Y),597)
+#define get_csv2_string_pos597(X,Y) get_csv2_string((X),(Y),597)
+#define get_csv2_v_str_pos597(X,Y) get_csv2_string((X),(Y),597)
+#define get_csv2_bool_pos597(X,Y) get_csv2_bool((X),(Y),597)
+#define get_csv2_int_pos597(X,Y) get_csv2_int((X),(Y),597)
+#define get_csv2_llong_pos597(X,Y) get_csv2_llong((X),(Y),597)
+#define get_csv2_float_pos597(X,Y) get_csv2_float((X),(Y),597)
+#define get_csv2_uint_pos598(X,Y) get_csv2_uint((X),(Y),598)
+#define get_csv2_ullong_pos598(X,Y) get_csv2_ullong((X),(Y),598)
+#define get_csv2_ip_pos598(X,Y) get_csv2_ip((X),(Y),598)
+#define get_csv2_ipv6_pos598(X,Y) get_csv2_ipv6((X),(Y),598)
+#define get_csv2_string_pos598(X,Y) get_csv2_string((X),(Y),598)
+#define get_csv2_v_str_pos598(X,Y) get_csv2_string((X),(Y),598)
+#define get_csv2_bool_pos598(X,Y) get_csv2_bool((X),(Y),598)
+#define get_csv2_int_pos598(X,Y) get_csv2_int((X),(Y),598)
+#define get_csv2_llong_pos598(X,Y) get_csv2_llong((X),(Y),598)
+#define get_csv2_float_pos598(X,Y) get_csv2_float((X),(Y),598)
+#define get_csv2_uint_pos599(X,Y) get_csv2_uint((X),(Y),599)
+#define get_csv2_ullong_pos599(X,Y) get_csv2_ullong((X),(Y),599)
+#define get_csv2_ip_pos599(X,Y) get_csv2_ip((X),(Y),599)
+#define get_csv2_ipv6_pos599(X,Y) get_csv2_ipv6((X),(Y),599)
+#define get_csv2_string_pos599(X,Y) get_csv2_string((X),(Y),599)
+#define get_csv2_v_str_pos599(X,Y) get_csv2_string((X),(Y),599)
+#define get_csv2_bool_pos599(X,Y) get_csv2_bool((X),(Y),599)
+#define get_csv2_int_pos599(X,Y) get_csv2_int((X),(Y),599)
+#define get_csv2_llong_pos599(X,Y) get_csv2_llong((X),(Y),599)
+#define get_csv2_float_pos599(X,Y) get_csv2_float((X),(Y),599)
+#define get_csv2_uint_pos600(X,Y) get_csv2_uint((X),(Y),600)
+#define get_csv2_ullong_pos600(X,Y) get_csv2_ullong((X),(Y),600)
+#define get_csv2_ip_pos600(X,Y) get_csv2_ip((X),(Y),600)
+#define get_csv2_ipv6_pos600(X,Y) get_csv2_ipv6((X),(Y),600)
+#define get_csv2_string_pos600(X,Y) get_csv2_string((X),(Y),600)
+#define get_csv2_v_str_pos600(X,Y) get_csv2_string((X),(Y),600)
+#define get_csv2_bool_pos600(X,Y) get_csv2_bool((X),(Y),600)
+#define get_csv2_int_pos600(X,Y) get_csv2_int((X),(Y),600)
+#define get_csv2_llong_pos600(X,Y) get_csv2_llong((X),(Y),600)
+#define get_csv2_float_pos600(X,Y) get_csv2_float((X),(Y),600)
+#define get_csv2_uint_pos601(X,Y) get_csv2_uint((X),(Y),601)
+#define get_csv2_ullong_pos601(X,Y) get_csv2_ullong((X),(Y),601)
+#define get_csv2_ip_pos601(X,Y) get_csv2_ip((X),(Y),601)
+#define get_csv2_ipv6_pos601(X,Y) get_csv2_ipv6((X),(Y),601)
+#define get_csv2_string_pos601(X,Y) get_csv2_string((X),(Y),601)
+#define get_csv2_v_str_pos601(X,Y) get_csv2_string((X),(Y),601)
+#define get_csv2_bool_pos601(X,Y) get_csv2_bool((X),(Y),601)
+#define get_csv2_int_pos601(X,Y) get_csv2_int((X),(Y),601)
+#define get_csv2_llong_pos601(X,Y) get_csv2_llong((X),(Y),601)
+#define get_csv2_float_pos601(X,Y) get_csv2_float((X),(Y),601)
+#define get_csv2_uint_pos602(X,Y) get_csv2_uint((X),(Y),602)
+#define get_csv2_ullong_pos602(X,Y) get_csv2_ullong((X),(Y),602)
+#define get_csv2_ip_pos602(X,Y) get_csv2_ip((X),(Y),602)
+#define get_csv2_ipv6_pos602(X,Y) get_csv2_ipv6((X),(Y),602)
+#define get_csv2_string_pos602(X,Y) get_csv2_string((X),(Y),602)
+#define get_csv2_v_str_pos602(X,Y) get_csv2_string((X),(Y),602)
+#define get_csv2_bool_pos602(X,Y) get_csv2_bool((X),(Y),602)
+#define get_csv2_int_pos602(X,Y) get_csv2_int((X),(Y),602)
+#define get_csv2_llong_pos602(X,Y) get_csv2_llong((X),(Y),602)
+#define get_csv2_float_pos602(X,Y) get_csv2_float((X),(Y),602)
+#define get_csv2_uint_pos603(X,Y) get_csv2_uint((X),(Y),603)
+#define get_csv2_ullong_pos603(X,Y) get_csv2_ullong((X),(Y),603)
+#define get_csv2_ip_pos603(X,Y) get_csv2_ip((X),(Y),603)
+#define get_csv2_ipv6_pos603(X,Y) get_csv2_ipv6((X),(Y),603)
+#define get_csv2_string_pos603(X,Y) get_csv2_string((X),(Y),603)
+#define get_csv2_v_str_pos603(X,Y) get_csv2_string((X),(Y),603)
+#define get_csv2_bool_pos603(X,Y) get_csv2_bool((X),(Y),603)
+#define get_csv2_int_pos603(X,Y) get_csv2_int((X),(Y),603)
+#define get_csv2_llong_pos603(X,Y) get_csv2_llong((X),(Y),603)
+#define get_csv2_float_pos603(X,Y) get_csv2_float((X),(Y),603)
+#define get_csv2_uint_pos604(X,Y) get_csv2_uint((X),(Y),604)
+#define get_csv2_ullong_pos604(X,Y) get_csv2_ullong((X),(Y),604)
+#define get_csv2_ip_pos604(X,Y) get_csv2_ip((X),(Y),604)
+#define get_csv2_ipv6_pos604(X,Y) get_csv2_ipv6((X),(Y),604)
+#define get_csv2_string_pos604(X,Y) get_csv2_string((X),(Y),604)
+#define get_csv2_v_str_pos604(X,Y) get_csv2_string((X),(Y),604)
+#define get_csv2_bool_pos604(X,Y) get_csv2_bool((X),(Y),604)
+#define get_csv2_int_pos604(X,Y) get_csv2_int((X),(Y),604)
+#define get_csv2_llong_pos604(X,Y) get_csv2_llong((X),(Y),604)
+#define get_csv2_float_pos604(X,Y) get_csv2_float((X),(Y),604)
+#define get_csv2_uint_pos605(X,Y) get_csv2_uint((X),(Y),605)
+#define get_csv2_ullong_pos605(X,Y) get_csv2_ullong((X),(Y),605)
+#define get_csv2_ip_pos605(X,Y) get_csv2_ip((X),(Y),605)
+#define get_csv2_ipv6_pos605(X,Y) get_csv2_ipv6((X),(Y),605)
+#define get_csv2_string_pos605(X,Y) get_csv2_string((X),(Y),605)
+#define get_csv2_v_str_pos605(X,Y) get_csv2_string((X),(Y),605)
+#define get_csv2_bool_pos605(X,Y) get_csv2_bool((X),(Y),605)
+#define get_csv2_int_pos605(X,Y) get_csv2_int((X),(Y),605)
+#define get_csv2_llong_pos605(X,Y) get_csv2_llong((X),(Y),605)
+#define get_csv2_float_pos605(X,Y) get_csv2_float((X),(Y),605)
+#define get_csv2_uint_pos606(X,Y) get_csv2_uint((X),(Y),606)
+#define get_csv2_ullong_pos606(X,Y) get_csv2_ullong((X),(Y),606)
+#define get_csv2_ip_pos606(X,Y) get_csv2_ip((X),(Y),606)
+#define get_csv2_ipv6_pos606(X,Y) get_csv2_ipv6((X),(Y),606)
+#define get_csv2_string_pos606(X,Y) get_csv2_string((X),(Y),606)
+#define get_csv2_v_str_pos606(X,Y) get_csv2_string((X),(Y),606)
+#define get_csv2_bool_pos606(X,Y) get_csv2_bool((X),(Y),606)
+#define get_csv2_int_pos606(X,Y) get_csv2_int((X),(Y),606)
+#define get_csv2_llong_pos606(X,Y) get_csv2_llong((X),(Y),606)
+#define get_csv2_float_pos606(X,Y) get_csv2_float((X),(Y),606)
+#define get_csv2_uint_pos607(X,Y) get_csv2_uint((X),(Y),607)
+#define get_csv2_ullong_pos607(X,Y) get_csv2_ullong((X),(Y),607)
+#define get_csv2_ip_pos607(X,Y) get_csv2_ip((X),(Y),607)
+#define get_csv2_ipv6_pos607(X,Y) get_csv2_ipv6((X),(Y),607)
+#define get_csv2_string_pos607(X,Y) get_csv2_string((X),(Y),607)
+#define get_csv2_v_str_pos607(X,Y) get_csv2_string((X),(Y),607)
+#define get_csv2_bool_pos607(X,Y) get_csv2_bool((X),(Y),607)
+#define get_csv2_int_pos607(X,Y) get_csv2_int((X),(Y),607)
+#define get_csv2_llong_pos607(X,Y) get_csv2_llong((X),(Y),607)
+#define get_csv2_float_pos607(X,Y) get_csv2_float((X),(Y),607)
+#define get_csv2_uint_pos608(X,Y) get_csv2_uint((X),(Y),608)
+#define get_csv2_ullong_pos608(X,Y) get_csv2_ullong((X),(Y),608)
+#define get_csv2_ip_pos608(X,Y) get_csv2_ip((X),(Y),608)
+#define get_csv2_ipv6_pos608(X,Y) get_csv2_ipv6((X),(Y),608)
+#define get_csv2_string_pos608(X,Y) get_csv2_string((X),(Y),608)
+#define get_csv2_v_str_pos608(X,Y) get_csv2_string((X),(Y),608)
+#define get_csv2_bool_pos608(X,Y) get_csv2_bool((X),(Y),608)
+#define get_csv2_int_pos608(X,Y) get_csv2_int((X),(Y),608)
+#define get_csv2_llong_pos608(X,Y) get_csv2_llong((X),(Y),608)
+#define get_csv2_float_pos608(X,Y) get_csv2_float((X),(Y),608)
+#define get_csv2_uint_pos609(X,Y) get_csv2_uint((X),(Y),609)
+#define get_csv2_ullong_pos609(X,Y) get_csv2_ullong((X),(Y),609)
+#define get_csv2_ip_pos609(X,Y) get_csv2_ip((X),(Y),609)
+#define get_csv2_ipv6_pos609(X,Y) get_csv2_ipv6((X),(Y),609)
+#define get_csv2_string_pos609(X,Y) get_csv2_string((X),(Y),609)
+#define get_csv2_v_str_pos609(X,Y) get_csv2_string((X),(Y),609)
+#define get_csv2_bool_pos609(X,Y) get_csv2_bool((X),(Y),609)
+#define get_csv2_int_pos609(X,Y) get_csv2_int((X),(Y),609)
+#define get_csv2_llong_pos609(X,Y) get_csv2_llong((X),(Y),609)
+#define get_csv2_float_pos609(X,Y) get_csv2_float((X),(Y),609)
+#define get_csv2_uint_pos610(X,Y) get_csv2_uint((X),(Y),610)
+#define get_csv2_ullong_pos610(X,Y) get_csv2_ullong((X),(Y),610)
+#define get_csv2_ip_pos610(X,Y) get_csv2_ip((X),(Y),610)
+#define get_csv2_ipv6_pos610(X,Y) get_csv2_ipv6((X),(Y),610)
+#define get_csv2_string_pos610(X,Y) get_csv2_string((X),(Y),610)
+#define get_csv2_v_str_pos610(X,Y) get_csv2_string((X),(Y),610)
+#define get_csv2_bool_pos610(X,Y) get_csv2_bool((X),(Y),610)
+#define get_csv2_int_pos610(X,Y) get_csv2_int((X),(Y),610)
+#define get_csv2_llong_pos610(X,Y) get_csv2_llong((X),(Y),610)
+#define get_csv2_float_pos610(X,Y) get_csv2_float((X),(Y),610)
+#define get_csv2_uint_pos611(X,Y) get_csv2_uint((X),(Y),611)
+#define get_csv2_ullong_pos611(X,Y) get_csv2_ullong((X),(Y),611)
+#define get_csv2_ip_pos611(X,Y) get_csv2_ip((X),(Y),611)
+#define get_csv2_ipv6_pos611(X,Y) get_csv2_ipv6((X),(Y),611)
+#define get_csv2_string_pos611(X,Y) get_csv2_string((X),(Y),611)
+#define get_csv2_v_str_pos611(X,Y) get_csv2_string((X),(Y),611)
+#define get_csv2_bool_pos611(X,Y) get_csv2_bool((X),(Y),611)
+#define get_csv2_int_pos611(X,Y) get_csv2_int((X),(Y),611)
+#define get_csv2_llong_pos611(X,Y) get_csv2_llong((X),(Y),611)
+#define get_csv2_float_pos611(X,Y) get_csv2_float((X),(Y),611)
+#define get_csv2_uint_pos612(X,Y) get_csv2_uint((X),(Y),612)
+#define get_csv2_ullong_pos612(X,Y) get_csv2_ullong((X),(Y),612)
+#define get_csv2_ip_pos612(X,Y) get_csv2_ip((X),(Y),612)
+#define get_csv2_ipv6_pos612(X,Y) get_csv2_ipv6((X),(Y),612)
+#define get_csv2_string_pos612(X,Y) get_csv2_string((X),(Y),612)
+#define get_csv2_v_str_pos612(X,Y) get_csv2_string((X),(Y),612)
+#define get_csv2_bool_pos612(X,Y) get_csv2_bool((X),(Y),612)
+#define get_csv2_int_pos612(X,Y) get_csv2_int((X),(Y),612)
+#define get_csv2_llong_pos612(X,Y) get_csv2_llong((X),(Y),612)
+#define get_csv2_float_pos612(X,Y) get_csv2_float((X),(Y),612)
+#define get_csv2_uint_pos613(X,Y) get_csv2_uint((X),(Y),613)
+#define get_csv2_ullong_pos613(X,Y) get_csv2_ullong((X),(Y),613)
+#define get_csv2_ip_pos613(X,Y) get_csv2_ip((X),(Y),613)
+#define get_csv2_ipv6_pos613(X,Y) get_csv2_ipv6((X),(Y),613)
+#define get_csv2_string_pos613(X,Y) get_csv2_string((X),(Y),613)
+#define get_csv2_v_str_pos613(X,Y) get_csv2_string((X),(Y),613)
+#define get_csv2_bool_pos613(X,Y) get_csv2_bool((X),(Y),613)
+#define get_csv2_int_pos613(X,Y) get_csv2_int((X),(Y),613)
+#define get_csv2_llong_pos613(X,Y) get_csv2_llong((X),(Y),613)
+#define get_csv2_float_pos613(X,Y) get_csv2_float((X),(Y),613)
+#define get_csv2_uint_pos614(X,Y) get_csv2_uint((X),(Y),614)
+#define get_csv2_ullong_pos614(X,Y) get_csv2_ullong((X),(Y),614)
+#define get_csv2_ip_pos614(X,Y) get_csv2_ip((X),(Y),614)
+#define get_csv2_ipv6_pos614(X,Y) get_csv2_ipv6((X),(Y),614)
+#define get_csv2_string_pos614(X,Y) get_csv2_string((X),(Y),614)
+#define get_csv2_v_str_pos614(X,Y) get_csv2_string((X),(Y),614)
+#define get_csv2_bool_pos614(X,Y) get_csv2_bool((X),(Y),614)
+#define get_csv2_int_pos614(X,Y) get_csv2_int((X),(Y),614)
+#define get_csv2_llong_pos614(X,Y) get_csv2_llong((X),(Y),614)
+#define get_csv2_float_pos614(X,Y) get_csv2_float((X),(Y),614)
+#define get_csv2_uint_pos615(X,Y) get_csv2_uint((X),(Y),615)
+#define get_csv2_ullong_pos615(X,Y) get_csv2_ullong((X),(Y),615)
+#define get_csv2_ip_pos615(X,Y) get_csv2_ip((X),(Y),615)
+#define get_csv2_ipv6_pos615(X,Y) get_csv2_ipv6((X),(Y),615)
+#define get_csv2_string_pos615(X,Y) get_csv2_string((X),(Y),615)
+#define get_csv2_v_str_pos615(X,Y) get_csv2_string((X),(Y),615)
+#define get_csv2_bool_pos615(X,Y) get_csv2_bool((X),(Y),615)
+#define get_csv2_int_pos615(X,Y) get_csv2_int((X),(Y),615)
+#define get_csv2_llong_pos615(X,Y) get_csv2_llong((X),(Y),615)
+#define get_csv2_float_pos615(X,Y) get_csv2_float((X),(Y),615)
+#define get_csv2_uint_pos616(X,Y) get_csv2_uint((X),(Y),616)
+#define get_csv2_ullong_pos616(X,Y) get_csv2_ullong((X),(Y),616)
+#define get_csv2_ip_pos616(X,Y) get_csv2_ip((X),(Y),616)
+#define get_csv2_ipv6_pos616(X,Y) get_csv2_ipv6((X),(Y),616)
+#define get_csv2_string_pos616(X,Y) get_csv2_string((X),(Y),616)
+#define get_csv2_v_str_pos616(X,Y) get_csv2_string((X),(Y),616)
+#define get_csv2_bool_pos616(X,Y) get_csv2_bool((X),(Y),616)
+#define get_csv2_int_pos616(X,Y) get_csv2_int((X),(Y),616)
+#define get_csv2_llong_pos616(X,Y) get_csv2_llong((X),(Y),616)
+#define get_csv2_float_pos616(X,Y) get_csv2_float((X),(Y),616)
+#define get_csv2_uint_pos617(X,Y) get_csv2_uint((X),(Y),617)
+#define get_csv2_ullong_pos617(X,Y) get_csv2_ullong((X),(Y),617)
+#define get_csv2_ip_pos617(X,Y) get_csv2_ip((X),(Y),617)
+#define get_csv2_ipv6_pos617(X,Y) get_csv2_ipv6((X),(Y),617)
+#define get_csv2_string_pos617(X,Y) get_csv2_string((X),(Y),617)
+#define get_csv2_v_str_pos617(X,Y) get_csv2_string((X),(Y),617)
+#define get_csv2_bool_pos617(X,Y) get_csv2_bool((X),(Y),617)
+#define get_csv2_int_pos617(X,Y) get_csv2_int((X),(Y),617)
+#define get_csv2_llong_pos617(X,Y) get_csv2_llong((X),(Y),617)
+#define get_csv2_float_pos617(X,Y) get_csv2_float((X),(Y),617)
+#define get_csv2_uint_pos618(X,Y) get_csv2_uint((X),(Y),618)
+#define get_csv2_ullong_pos618(X,Y) get_csv2_ullong((X),(Y),618)
+#define get_csv2_ip_pos618(X,Y) get_csv2_ip((X),(Y),618)
+#define get_csv2_ipv6_pos618(X,Y) get_csv2_ipv6((X),(Y),618)
+#define get_csv2_string_pos618(X,Y) get_csv2_string((X),(Y),618)
+#define get_csv2_v_str_pos618(X,Y) get_csv2_string((X),(Y),618)
+#define get_csv2_bool_pos618(X,Y) get_csv2_bool((X),(Y),618)
+#define get_csv2_int_pos618(X,Y) get_csv2_int((X),(Y),618)
+#define get_csv2_llong_pos618(X,Y) get_csv2_llong((X),(Y),618)
+#define get_csv2_float_pos618(X,Y) get_csv2_float((X),(Y),618)
+#define get_csv2_uint_pos619(X,Y) get_csv2_uint((X),(Y),619)
+#define get_csv2_ullong_pos619(X,Y) get_csv2_ullong((X),(Y),619)
+#define get_csv2_ip_pos619(X,Y) get_csv2_ip((X),(Y),619)
+#define get_csv2_ipv6_pos619(X,Y) get_csv2_ipv6((X),(Y),619)
+#define get_csv2_string_pos619(X,Y) get_csv2_string((X),(Y),619)
+#define get_csv2_v_str_pos619(X,Y) get_csv2_string((X),(Y),619)
+#define get_csv2_bool_pos619(X,Y) get_csv2_bool((X),(Y),619)
+#define get_csv2_int_pos619(X,Y) get_csv2_int((X),(Y),619)
+#define get_csv2_llong_pos619(X,Y) get_csv2_llong((X),(Y),619)
+#define get_csv2_float_pos619(X,Y) get_csv2_float((X),(Y),619)
+#define get_csv2_uint_pos620(X,Y) get_csv2_uint((X),(Y),620)
+#define get_csv2_ullong_pos620(X,Y) get_csv2_ullong((X),(Y),620)
+#define get_csv2_ip_pos620(X,Y) get_csv2_ip((X),(Y),620)
+#define get_csv2_ipv6_pos620(X,Y) get_csv2_ipv6((X),(Y),620)
+#define get_csv2_string_pos620(X,Y) get_csv2_string((X),(Y),620)
+#define get_csv2_v_str_pos620(X,Y) get_csv2_string((X),(Y),620)
+#define get_csv2_bool_pos620(X,Y) get_csv2_bool((X),(Y),620)
+#define get_csv2_int_pos620(X,Y) get_csv2_int((X),(Y),620)
+#define get_csv2_llong_pos620(X,Y) get_csv2_llong((X),(Y),620)
+#define get_csv2_float_pos620(X,Y) get_csv2_float((X),(Y),620)
+#define get_csv2_uint_pos621(X,Y) get_csv2_uint((X),(Y),621)
+#define get_csv2_ullong_pos621(X,Y) get_csv2_ullong((X),(Y),621)
+#define get_csv2_ip_pos621(X,Y) get_csv2_ip((X),(Y),621)
+#define get_csv2_ipv6_pos621(X,Y) get_csv2_ipv6((X),(Y),621)
+#define get_csv2_string_pos621(X,Y) get_csv2_string((X),(Y),621)
+#define get_csv2_v_str_pos621(X,Y) get_csv2_string((X),(Y),621)
+#define get_csv2_bool_pos621(X,Y) get_csv2_bool((X),(Y),621)
+#define get_csv2_int_pos621(X,Y) get_csv2_int((X),(Y),621)
+#define get_csv2_llong_pos621(X,Y) get_csv2_llong((X),(Y),621)
+#define get_csv2_float_pos621(X,Y) get_csv2_float((X),(Y),621)
+#define get_csv2_uint_pos622(X,Y) get_csv2_uint((X),(Y),622)
+#define get_csv2_ullong_pos622(X,Y) get_csv2_ullong((X),(Y),622)
+#define get_csv2_ip_pos622(X,Y) get_csv2_ip((X),(Y),622)
+#define get_csv2_ipv6_pos622(X,Y) get_csv2_ipv6((X),(Y),622)
+#define get_csv2_string_pos622(X,Y) get_csv2_string((X),(Y),622)
+#define get_csv2_v_str_pos622(X,Y) get_csv2_string((X),(Y),622)
+#define get_csv2_bool_pos622(X,Y) get_csv2_bool((X),(Y),622)
+#define get_csv2_int_pos622(X,Y) get_csv2_int((X),(Y),622)
+#define get_csv2_llong_pos622(X,Y) get_csv2_llong((X),(Y),622)
+#define get_csv2_float_pos622(X,Y) get_csv2_float((X),(Y),622)
+#define get_csv2_uint_pos623(X,Y) get_csv2_uint((X),(Y),623)
+#define get_csv2_ullong_pos623(X,Y) get_csv2_ullong((X),(Y),623)
+#define get_csv2_ip_pos623(X,Y) get_csv2_ip((X),(Y),623)
+#define get_csv2_ipv6_pos623(X,Y) get_csv2_ipv6((X),(Y),623)
+#define get_csv2_string_pos623(X,Y) get_csv2_string((X),(Y),623)
+#define get_csv2_v_str_pos623(X,Y) get_csv2_string((X),(Y),623)
+#define get_csv2_bool_pos623(X,Y) get_csv2_bool((X),(Y),623)
+#define get_csv2_int_pos623(X,Y) get_csv2_int((X),(Y),623)
+#define get_csv2_llong_pos623(X,Y) get_csv2_llong((X),(Y),623)
+#define get_csv2_float_pos623(X,Y) get_csv2_float((X),(Y),623)
+#define get_csv2_uint_pos624(X,Y) get_csv2_uint((X),(Y),624)
+#define get_csv2_ullong_pos624(X,Y) get_csv2_ullong((X),(Y),624)
+#define get_csv2_ip_pos624(X,Y) get_csv2_ip((X),(Y),624)
+#define get_csv2_ipv6_pos624(X,Y) get_csv2_ipv6((X),(Y),624)
+#define get_csv2_string_pos624(X,Y) get_csv2_string((X),(Y),624)
+#define get_csv2_v_str_pos624(X,Y) get_csv2_string((X),(Y),624)
+#define get_csv2_bool_pos624(X,Y) get_csv2_bool((X),(Y),624)
+#define get_csv2_int_pos624(X,Y) get_csv2_int((X),(Y),624)
+#define get_csv2_llong_pos624(X,Y) get_csv2_llong((X),(Y),624)
+#define get_csv2_float_pos624(X,Y) get_csv2_float((X),(Y),624)
+#define get_csv2_uint_pos625(X,Y) get_csv2_uint((X),(Y),625)
+#define get_csv2_ullong_pos625(X,Y) get_csv2_ullong((X),(Y),625)
+#define get_csv2_ip_pos625(X,Y) get_csv2_ip((X),(Y),625)
+#define get_csv2_ipv6_pos625(X,Y) get_csv2_ipv6((X),(Y),625)
+#define get_csv2_string_pos625(X,Y) get_csv2_string((X),(Y),625)
+#define get_csv2_v_str_pos625(X,Y) get_csv2_string((X),(Y),625)
+#define get_csv2_bool_pos625(X,Y) get_csv2_bool((X),(Y),625)
+#define get_csv2_int_pos625(X,Y) get_csv2_int((X),(Y),625)
+#define get_csv2_llong_pos625(X,Y) get_csv2_llong((X),(Y),625)
+#define get_csv2_float_pos625(X,Y) get_csv2_float((X),(Y),625)
+#define get_csv2_uint_pos626(X,Y) get_csv2_uint((X),(Y),626)
+#define get_csv2_ullong_pos626(X,Y) get_csv2_ullong((X),(Y),626)
+#define get_csv2_ip_pos626(X,Y) get_csv2_ip((X),(Y),626)
+#define get_csv2_ipv6_pos626(X,Y) get_csv2_ipv6((X),(Y),626)
+#define get_csv2_string_pos626(X,Y) get_csv2_string((X),(Y),626)
+#define get_csv2_v_str_pos626(X,Y) get_csv2_string((X),(Y),626)
+#define get_csv2_bool_pos626(X,Y) get_csv2_bool((X),(Y),626)
+#define get_csv2_int_pos626(X,Y) get_csv2_int((X),(Y),626)
+#define get_csv2_llong_pos626(X,Y) get_csv2_llong((X),(Y),626)
+#define get_csv2_float_pos626(X,Y) get_csv2_float((X),(Y),626)
+#define get_csv2_uint_pos627(X,Y) get_csv2_uint((X),(Y),627)
+#define get_csv2_ullong_pos627(X,Y) get_csv2_ullong((X),(Y),627)
+#define get_csv2_ip_pos627(X,Y) get_csv2_ip((X),(Y),627)
+#define get_csv2_ipv6_pos627(X,Y) get_csv2_ipv6((X),(Y),627)
+#define get_csv2_string_pos627(X,Y) get_csv2_string((X),(Y),627)
+#define get_csv2_v_str_pos627(X,Y) get_csv2_string((X),(Y),627)
+#define get_csv2_bool_pos627(X,Y) get_csv2_bool((X),(Y),627)
+#define get_csv2_int_pos627(X,Y) get_csv2_int((X),(Y),627)
+#define get_csv2_llong_pos627(X,Y) get_csv2_llong((X),(Y),627)
+#define get_csv2_float_pos627(X,Y) get_csv2_float((X),(Y),627)
+#define get_csv2_uint_pos628(X,Y) get_csv2_uint((X),(Y),628)
+#define get_csv2_ullong_pos628(X,Y) get_csv2_ullong((X),(Y),628)
+#define get_csv2_ip_pos628(X,Y) get_csv2_ip((X),(Y),628)
+#define get_csv2_ipv6_pos628(X,Y) get_csv2_ipv6((X),(Y),628)
+#define get_csv2_string_pos628(X,Y) get_csv2_string((X),(Y),628)
+#define get_csv2_v_str_pos628(X,Y) get_csv2_string((X),(Y),628)
+#define get_csv2_bool_pos628(X,Y) get_csv2_bool((X),(Y),628)
+#define get_csv2_int_pos628(X,Y) get_csv2_int((X),(Y),628)
+#define get_csv2_llong_pos628(X,Y) get_csv2_llong((X),(Y),628)
+#define get_csv2_float_pos628(X,Y) get_csv2_float((X),(Y),628)
+#define get_csv2_uint_pos629(X,Y) get_csv2_uint((X),(Y),629)
+#define get_csv2_ullong_pos629(X,Y) get_csv2_ullong((X),(Y),629)
+#define get_csv2_ip_pos629(X,Y) get_csv2_ip((X),(Y),629)
+#define get_csv2_ipv6_pos629(X,Y) get_csv2_ipv6((X),(Y),629)
+#define get_csv2_string_pos629(X,Y) get_csv2_string((X),(Y),629)
+#define get_csv2_v_str_pos629(X,Y) get_csv2_string((X),(Y),629)
+#define get_csv2_bool_pos629(X,Y) get_csv2_bool((X),(Y),629)
+#define get_csv2_int_pos629(X,Y) get_csv2_int((X),(Y),629)
+#define get_csv2_llong_pos629(X,Y) get_csv2_llong((X),(Y),629)
+#define get_csv2_float_pos629(X,Y) get_csv2_float((X),(Y),629)
+#define get_csv2_uint_pos630(X,Y) get_csv2_uint((X),(Y),630)
+#define get_csv2_ullong_pos630(X,Y) get_csv2_ullong((X),(Y),630)
+#define get_csv2_ip_pos630(X,Y) get_csv2_ip((X),(Y),630)
+#define get_csv2_ipv6_pos630(X,Y) get_csv2_ipv6((X),(Y),630)
+#define get_csv2_string_pos630(X,Y) get_csv2_string((X),(Y),630)
+#define get_csv2_v_str_pos630(X,Y) get_csv2_string((X),(Y),630)
+#define get_csv2_bool_pos630(X,Y) get_csv2_bool((X),(Y),630)
+#define get_csv2_int_pos630(X,Y) get_csv2_int((X),(Y),630)
+#define get_csv2_llong_pos630(X,Y) get_csv2_llong((X),(Y),630)
+#define get_csv2_float_pos630(X,Y) get_csv2_float((X),(Y),630)
+#define get_csv2_uint_pos631(X,Y) get_csv2_uint((X),(Y),631)
+#define get_csv2_ullong_pos631(X,Y) get_csv2_ullong((X),(Y),631)
+#define get_csv2_ip_pos631(X,Y) get_csv2_ip((X),(Y),631)
+#define get_csv2_ipv6_pos631(X,Y) get_csv2_ipv6((X),(Y),631)
+#define get_csv2_string_pos631(X,Y) get_csv2_string((X),(Y),631)
+#define get_csv2_v_str_pos631(X,Y) get_csv2_string((X),(Y),631)
+#define get_csv2_bool_pos631(X,Y) get_csv2_bool((X),(Y),631)
+#define get_csv2_int_pos631(X,Y) get_csv2_int((X),(Y),631)
+#define get_csv2_llong_pos631(X,Y) get_csv2_llong((X),(Y),631)
+#define get_csv2_float_pos631(X,Y) get_csv2_float((X),(Y),631)
+#define get_csv2_uint_pos632(X,Y) get_csv2_uint((X),(Y),632)
+#define get_csv2_ullong_pos632(X,Y) get_csv2_ullong((X),(Y),632)
+#define get_csv2_ip_pos632(X,Y) get_csv2_ip((X),(Y),632)
+#define get_csv2_ipv6_pos632(X,Y) get_csv2_ipv6((X),(Y),632)
+#define get_csv2_string_pos632(X,Y) get_csv2_string((X),(Y),632)
+#define get_csv2_v_str_pos632(X,Y) get_csv2_string((X),(Y),632)
+#define get_csv2_bool_pos632(X,Y) get_csv2_bool((X),(Y),632)
+#define get_csv2_int_pos632(X,Y) get_csv2_int((X),(Y),632)
+#define get_csv2_llong_pos632(X,Y) get_csv2_llong((X),(Y),632)
+#define get_csv2_float_pos632(X,Y) get_csv2_float((X),(Y),632)
+#define get_csv2_uint_pos633(X,Y) get_csv2_uint((X),(Y),633)
+#define get_csv2_ullong_pos633(X,Y) get_csv2_ullong((X),(Y),633)
+#define get_csv2_ip_pos633(X,Y) get_csv2_ip((X),(Y),633)
+#define get_csv2_ipv6_pos633(X,Y) get_csv2_ipv6((X),(Y),633)
+#define get_csv2_string_pos633(X,Y) get_csv2_string((X),(Y),633)
+#define get_csv2_v_str_pos633(X,Y) get_csv2_string((X),(Y),633)
+#define get_csv2_bool_pos633(X,Y) get_csv2_bool((X),(Y),633)
+#define get_csv2_int_pos633(X,Y) get_csv2_int((X),(Y),633)
+#define get_csv2_llong_pos633(X,Y) get_csv2_llong((X),(Y),633)
+#define get_csv2_float_pos633(X,Y) get_csv2_float((X),(Y),633)
+#define get_csv2_uint_pos634(X,Y) get_csv2_uint((X),(Y),634)
+#define get_csv2_ullong_pos634(X,Y) get_csv2_ullong((X),(Y),634)
+#define get_csv2_ip_pos634(X,Y) get_csv2_ip((X),(Y),634)
+#define get_csv2_ipv6_pos634(X,Y) get_csv2_ipv6((X),(Y),634)
+#define get_csv2_string_pos634(X,Y) get_csv2_string((X),(Y),634)
+#define get_csv2_v_str_pos634(X,Y) get_csv2_string((X),(Y),634)
+#define get_csv2_bool_pos634(X,Y) get_csv2_bool((X),(Y),634)
+#define get_csv2_int_pos634(X,Y) get_csv2_int((X),(Y),634)
+#define get_csv2_llong_pos634(X,Y) get_csv2_llong((X),(Y),634)
+#define get_csv2_float_pos634(X,Y) get_csv2_float((X),(Y),634)
+#define get_csv2_uint_pos635(X,Y) get_csv2_uint((X),(Y),635)
+#define get_csv2_ullong_pos635(X,Y) get_csv2_ullong((X),(Y),635)
+#define get_csv2_ip_pos635(X,Y) get_csv2_ip((X),(Y),635)
+#define get_csv2_ipv6_pos635(X,Y) get_csv2_ipv6((X),(Y),635)
+#define get_csv2_string_pos635(X,Y) get_csv2_string((X),(Y),635)
+#define get_csv2_v_str_pos635(X,Y) get_csv2_string((X),(Y),635)
+#define get_csv2_bool_pos635(X,Y) get_csv2_bool((X),(Y),635)
+#define get_csv2_int_pos635(X,Y) get_csv2_int((X),(Y),635)
+#define get_csv2_llong_pos635(X,Y) get_csv2_llong((X),(Y),635)
+#define get_csv2_float_pos635(X,Y) get_csv2_float((X),(Y),635)
+#define get_csv2_uint_pos636(X,Y) get_csv2_uint((X),(Y),636)
+#define get_csv2_ullong_pos636(X,Y) get_csv2_ullong((X),(Y),636)
+#define get_csv2_ip_pos636(X,Y) get_csv2_ip((X),(Y),636)
+#define get_csv2_ipv6_pos636(X,Y) get_csv2_ipv6((X),(Y),636)
+#define get_csv2_string_pos636(X,Y) get_csv2_string((X),(Y),636)
+#define get_csv2_v_str_pos636(X,Y) get_csv2_string((X),(Y),636)
+#define get_csv2_bool_pos636(X,Y) get_csv2_bool((X),(Y),636)
+#define get_csv2_int_pos636(X,Y) get_csv2_int((X),(Y),636)
+#define get_csv2_llong_pos636(X,Y) get_csv2_llong((X),(Y),636)
+#define get_csv2_float_pos636(X,Y) get_csv2_float((X),(Y),636)
+#define get_csv2_uint_pos637(X,Y) get_csv2_uint((X),(Y),637)
+#define get_csv2_ullong_pos637(X,Y) get_csv2_ullong((X),(Y),637)
+#define get_csv2_ip_pos637(X,Y) get_csv2_ip((X),(Y),637)
+#define get_csv2_ipv6_pos637(X,Y) get_csv2_ipv6((X),(Y),637)
+#define get_csv2_string_pos637(X,Y) get_csv2_string((X),(Y),637)
+#define get_csv2_v_str_pos637(X,Y) get_csv2_string((X),(Y),637)
+#define get_csv2_bool_pos637(X,Y) get_csv2_bool((X),(Y),637)
+#define get_csv2_int_pos637(X,Y) get_csv2_int((X),(Y),637)
+#define get_csv2_llong_pos637(X,Y) get_csv2_llong((X),(Y),637)
+#define get_csv2_float_pos637(X,Y) get_csv2_float((X),(Y),637)
+#define get_csv2_uint_pos638(X,Y) get_csv2_uint((X),(Y),638)
+#define get_csv2_ullong_pos638(X,Y) get_csv2_ullong((X),(Y),638)
+#define get_csv2_ip_pos638(X,Y) get_csv2_ip((X),(Y),638)
+#define get_csv2_ipv6_pos638(X,Y) get_csv2_ipv6((X),(Y),638)
+#define get_csv2_string_pos638(X,Y) get_csv2_string((X),(Y),638)
+#define get_csv2_v_str_pos638(X,Y) get_csv2_string((X),(Y),638)
+#define get_csv2_bool_pos638(X,Y) get_csv2_bool((X),(Y),638)
+#define get_csv2_int_pos638(X,Y) get_csv2_int((X),(Y),638)
+#define get_csv2_llong_pos638(X,Y) get_csv2_llong((X),(Y),638)
+#define get_csv2_float_pos638(X,Y) get_csv2_float((X),(Y),638)
+#define get_csv2_uint_pos639(X,Y) get_csv2_uint((X),(Y),639)
+#define get_csv2_ullong_pos639(X,Y) get_csv2_ullong((X),(Y),639)
+#define get_csv2_ip_pos639(X,Y) get_csv2_ip((X),(Y),639)
+#define get_csv2_ipv6_pos639(X,Y) get_csv2_ipv6((X),(Y),639)
+#define get_csv2_string_pos639(X,Y) get_csv2_string((X),(Y),639)
+#define get_csv2_v_str_pos639(X,Y) get_csv2_string((X),(Y),639)
+#define get_csv2_bool_pos639(X,Y) get_csv2_bool((X),(Y),639)
+#define get_csv2_int_pos639(X,Y) get_csv2_int((X),(Y),639)
+#define get_csv2_llong_pos639(X,Y) get_csv2_llong((X),(Y),639)
+#define get_csv2_float_pos639(X,Y) get_csv2_float((X),(Y),639)
+#define get_csv2_uint_pos640(X,Y) get_csv2_uint((X),(Y),640)
+#define get_csv2_ullong_pos640(X,Y) get_csv2_ullong((X),(Y),640)
+#define get_csv2_ip_pos640(X,Y) get_csv2_ip((X),(Y),640)
+#define get_csv2_ipv6_pos640(X,Y) get_csv2_ipv6((X),(Y),640)
+#define get_csv2_string_pos640(X,Y) get_csv2_string((X),(Y),640)
+#define get_csv2_v_str_pos640(X,Y) get_csv2_string((X),(Y),640)
+#define get_csv2_bool_pos640(X,Y) get_csv2_bool((X),(Y),640)
+#define get_csv2_int_pos640(X,Y) get_csv2_int((X),(Y),640)
+#define get_csv2_llong_pos640(X,Y) get_csv2_llong((X),(Y),640)
+#define get_csv2_float_pos640(X,Y) get_csv2_float((X),(Y),640)
+#define get_csv2_uint_pos641(X,Y) get_csv2_uint((X),(Y),641)
+#define get_csv2_ullong_pos641(X,Y) get_csv2_ullong((X),(Y),641)
+#define get_csv2_ip_pos641(X,Y) get_csv2_ip((X),(Y),641)
+#define get_csv2_ipv6_pos641(X,Y) get_csv2_ipv6((X),(Y),641)
+#define get_csv2_string_pos641(X,Y) get_csv2_string((X),(Y),641)
+#define get_csv2_v_str_pos641(X,Y) get_csv2_string((X),(Y),641)
+#define get_csv2_bool_pos641(X,Y) get_csv2_bool((X),(Y),641)
+#define get_csv2_int_pos641(X,Y) get_csv2_int((X),(Y),641)
+#define get_csv2_llong_pos641(X,Y) get_csv2_llong((X),(Y),641)
+#define get_csv2_float_pos641(X,Y) get_csv2_float((X),(Y),641)
+#define get_csv2_uint_pos642(X,Y) get_csv2_uint((X),(Y),642)
+#define get_csv2_ullong_pos642(X,Y) get_csv2_ullong((X),(Y),642)
+#define get_csv2_ip_pos642(X,Y) get_csv2_ip((X),(Y),642)
+#define get_csv2_ipv6_pos642(X,Y) get_csv2_ipv6((X),(Y),642)
+#define get_csv2_string_pos642(X,Y) get_csv2_string((X),(Y),642)
+#define get_csv2_v_str_pos642(X,Y) get_csv2_string((X),(Y),642)
+#define get_csv2_bool_pos642(X,Y) get_csv2_bool((X),(Y),642)
+#define get_csv2_int_pos642(X,Y) get_csv2_int((X),(Y),642)
+#define get_csv2_llong_pos642(X,Y) get_csv2_llong((X),(Y),642)
+#define get_csv2_float_pos642(X,Y) get_csv2_float((X),(Y),642)
+#define get_csv2_uint_pos643(X,Y) get_csv2_uint((X),(Y),643)
+#define get_csv2_ullong_pos643(X,Y) get_csv2_ullong((X),(Y),643)
+#define get_csv2_ip_pos643(X,Y) get_csv2_ip((X),(Y),643)
+#define get_csv2_ipv6_pos643(X,Y) get_csv2_ipv6((X),(Y),643)
+#define get_csv2_string_pos643(X,Y) get_csv2_string((X),(Y),643)
+#define get_csv2_v_str_pos643(X,Y) get_csv2_string((X),(Y),643)
+#define get_csv2_bool_pos643(X,Y) get_csv2_bool((X),(Y),643)
+#define get_csv2_int_pos643(X,Y) get_csv2_int((X),(Y),643)
+#define get_csv2_llong_pos643(X,Y) get_csv2_llong((X),(Y),643)
+#define get_csv2_float_pos643(X,Y) get_csv2_float((X),(Y),643)
+#define get_csv2_uint_pos644(X,Y) get_csv2_uint((X),(Y),644)
+#define get_csv2_ullong_pos644(X,Y) get_csv2_ullong((X),(Y),644)
+#define get_csv2_ip_pos644(X,Y) get_csv2_ip((X),(Y),644)
+#define get_csv2_ipv6_pos644(X,Y) get_csv2_ipv6((X),(Y),644)
+#define get_csv2_string_pos644(X,Y) get_csv2_string((X),(Y),644)
+#define get_csv2_v_str_pos644(X,Y) get_csv2_string((X),(Y),644)
+#define get_csv2_bool_pos644(X,Y) get_csv2_bool((X),(Y),644)
+#define get_csv2_int_pos644(X,Y) get_csv2_int((X),(Y),644)
+#define get_csv2_llong_pos644(X,Y) get_csv2_llong((X),(Y),644)
+#define get_csv2_float_pos644(X,Y) get_csv2_float((X),(Y),644)
+#define get_csv2_uint_pos645(X,Y) get_csv2_uint((X),(Y),645)
+#define get_csv2_ullong_pos645(X,Y) get_csv2_ullong((X),(Y),645)
+#define get_csv2_ip_pos645(X,Y) get_csv2_ip((X),(Y),645)
+#define get_csv2_ipv6_pos645(X,Y) get_csv2_ipv6((X),(Y),645)
+#define get_csv2_string_pos645(X,Y) get_csv2_string((X),(Y),645)
+#define get_csv2_v_str_pos645(X,Y) get_csv2_string((X),(Y),645)
+#define get_csv2_bool_pos645(X,Y) get_csv2_bool((X),(Y),645)
+#define get_csv2_int_pos645(X,Y) get_csv2_int((X),(Y),645)
+#define get_csv2_llong_pos645(X,Y) get_csv2_llong((X),(Y),645)
+#define get_csv2_float_pos645(X,Y) get_csv2_float((X),(Y),645)
+#define get_csv2_uint_pos646(X,Y) get_csv2_uint((X),(Y),646)
+#define get_csv2_ullong_pos646(X,Y) get_csv2_ullong((X),(Y),646)
+#define get_csv2_ip_pos646(X,Y) get_csv2_ip((X),(Y),646)
+#define get_csv2_ipv6_pos646(X,Y) get_csv2_ipv6((X),(Y),646)
+#define get_csv2_string_pos646(X,Y) get_csv2_string((X),(Y),646)
+#define get_csv2_v_str_pos646(X,Y) get_csv2_string((X),(Y),646)
+#define get_csv2_bool_pos646(X,Y) get_csv2_bool((X),(Y),646)
+#define get_csv2_int_pos646(X,Y) get_csv2_int((X),(Y),646)
+#define get_csv2_llong_pos646(X,Y) get_csv2_llong((X),(Y),646)
+#define get_csv2_float_pos646(X,Y) get_csv2_float((X),(Y),646)
+#define get_csv2_uint_pos647(X,Y) get_csv2_uint((X),(Y),647)
+#define get_csv2_ullong_pos647(X,Y) get_csv2_ullong((X),(Y),647)
+#define get_csv2_ip_pos647(X,Y) get_csv2_ip((X),(Y),647)
+#define get_csv2_ipv6_pos647(X,Y) get_csv2_ipv6((X),(Y),647)
+#define get_csv2_string_pos647(X,Y) get_csv2_string((X),(Y),647)
+#define get_csv2_v_str_pos647(X,Y) get_csv2_string((X),(Y),647)
+#define get_csv2_bool_pos647(X,Y) get_csv2_bool((X),(Y),647)
+#define get_csv2_int_pos647(X,Y) get_csv2_int((X),(Y),647)
+#define get_csv2_llong_pos647(X,Y) get_csv2_llong((X),(Y),647)
+#define get_csv2_float_pos647(X,Y) get_csv2_float((X),(Y),647)
+#define get_csv2_uint_pos648(X,Y) get_csv2_uint((X),(Y),648)
+#define get_csv2_ullong_pos648(X,Y) get_csv2_ullong((X),(Y),648)
+#define get_csv2_ip_pos648(X,Y) get_csv2_ip((X),(Y),648)
+#define get_csv2_ipv6_pos648(X,Y) get_csv2_ipv6((X),(Y),648)
+#define get_csv2_string_pos648(X,Y) get_csv2_string((X),(Y),648)
+#define get_csv2_v_str_pos648(X,Y) get_csv2_string((X),(Y),648)
+#define get_csv2_bool_pos648(X,Y) get_csv2_bool((X),(Y),648)
+#define get_csv2_int_pos648(X,Y) get_csv2_int((X),(Y),648)
+#define get_csv2_llong_pos648(X,Y) get_csv2_llong((X),(Y),648)
+#define get_csv2_float_pos648(X,Y) get_csv2_float((X),(Y),648)
+#define get_csv2_uint_pos649(X,Y) get_csv2_uint((X),(Y),649)
+#define get_csv2_ullong_pos649(X,Y) get_csv2_ullong((X),(Y),649)
+#define get_csv2_ip_pos649(X,Y) get_csv2_ip((X),(Y),649)
+#define get_csv2_ipv6_pos649(X,Y) get_csv2_ipv6((X),(Y),649)
+#define get_csv2_string_pos649(X,Y) get_csv2_string((X),(Y),649)
+#define get_csv2_v_str_pos649(X,Y) get_csv2_string((X),(Y),649)
+#define get_csv2_bool_pos649(X,Y) get_csv2_bool((X),(Y),649)
+#define get_csv2_int_pos649(X,Y) get_csv2_int((X),(Y),649)
+#define get_csv2_llong_pos649(X,Y) get_csv2_llong((X),(Y),649)
+#define get_csv2_float_pos649(X,Y) get_csv2_float((X),(Y),649)
+#define get_csv2_uint_pos650(X,Y) get_csv2_uint((X),(Y),650)
+#define get_csv2_ullong_pos650(X,Y) get_csv2_ullong((X),(Y),650)
+#define get_csv2_ip_pos650(X,Y) get_csv2_ip((X),(Y),650)
+#define get_csv2_ipv6_pos650(X,Y) get_csv2_ipv6((X),(Y),650)
+#define get_csv2_string_pos650(X,Y) get_csv2_string((X),(Y),650)
+#define get_csv2_v_str_pos650(X,Y) get_csv2_string((X),(Y),650)
+#define get_csv2_bool_pos650(X,Y) get_csv2_bool((X),(Y),650)
+#define get_csv2_int_pos650(X,Y) get_csv2_int((X),(Y),650)
+#define get_csv2_llong_pos650(X,Y) get_csv2_llong((X),(Y),650)
+#define get_csv2_float_pos650(X,Y) get_csv2_float((X),(Y),650)
+#define get_csv2_uint_pos651(X,Y) get_csv2_uint((X),(Y),651)
+#define get_csv2_ullong_pos651(X,Y) get_csv2_ullong((X),(Y),651)
+#define get_csv2_ip_pos651(X,Y) get_csv2_ip((X),(Y),651)
+#define get_csv2_ipv6_pos651(X,Y) get_csv2_ipv6((X),(Y),651)
+#define get_csv2_string_pos651(X,Y) get_csv2_string((X),(Y),651)
+#define get_csv2_v_str_pos651(X,Y) get_csv2_string((X),(Y),651)
+#define get_csv2_bool_pos651(X,Y) get_csv2_bool((X),(Y),651)
+#define get_csv2_int_pos651(X,Y) get_csv2_int((X),(Y),651)
+#define get_csv2_llong_pos651(X,Y) get_csv2_llong((X),(Y),651)
+#define get_csv2_float_pos651(X,Y) get_csv2_float((X),(Y),651)
+#define get_csv2_uint_pos652(X,Y) get_csv2_uint((X),(Y),652)
+#define get_csv2_ullong_pos652(X,Y) get_csv2_ullong((X),(Y),652)
+#define get_csv2_ip_pos652(X,Y) get_csv2_ip((X),(Y),652)
+#define get_csv2_ipv6_pos652(X,Y) get_csv2_ipv6((X),(Y),652)
+#define get_csv2_string_pos652(X,Y) get_csv2_string((X),(Y),652)
+#define get_csv2_v_str_pos652(X,Y) get_csv2_string((X),(Y),652)
+#define get_csv2_bool_pos652(X,Y) get_csv2_bool((X),(Y),652)
+#define get_csv2_int_pos652(X,Y) get_csv2_int((X),(Y),652)
+#define get_csv2_llong_pos652(X,Y) get_csv2_llong((X),(Y),652)
+#define get_csv2_float_pos652(X,Y) get_csv2_float((X),(Y),652)
+#define get_csv2_uint_pos653(X,Y) get_csv2_uint((X),(Y),653)
+#define get_csv2_ullong_pos653(X,Y) get_csv2_ullong((X),(Y),653)
+#define get_csv2_ip_pos653(X,Y) get_csv2_ip((X),(Y),653)
+#define get_csv2_ipv6_pos653(X,Y) get_csv2_ipv6((X),(Y),653)
+#define get_csv2_string_pos653(X,Y) get_csv2_string((X),(Y),653)
+#define get_csv2_v_str_pos653(X,Y) get_csv2_string((X),(Y),653)
+#define get_csv2_bool_pos653(X,Y) get_csv2_bool((X),(Y),653)
+#define get_csv2_int_pos653(X,Y) get_csv2_int((X),(Y),653)
+#define get_csv2_llong_pos653(X,Y) get_csv2_llong((X),(Y),653)
+#define get_csv2_float_pos653(X,Y) get_csv2_float((X),(Y),653)
+#define get_csv2_uint_pos654(X,Y) get_csv2_uint((X),(Y),654)
+#define get_csv2_ullong_pos654(X,Y) get_csv2_ullong((X),(Y),654)
+#define get_csv2_ip_pos654(X,Y) get_csv2_ip((X),(Y),654)
+#define get_csv2_ipv6_pos654(X,Y) get_csv2_ipv6((X),(Y),654)
+#define get_csv2_string_pos654(X,Y) get_csv2_string((X),(Y),654)
+#define get_csv2_v_str_pos654(X,Y) get_csv2_string((X),(Y),654)
+#define get_csv2_bool_pos654(X,Y) get_csv2_bool((X),(Y),654)
+#define get_csv2_int_pos654(X,Y) get_csv2_int((X),(Y),654)
+#define get_csv2_llong_pos654(X,Y) get_csv2_llong((X),(Y),654)
+#define get_csv2_float_pos654(X,Y) get_csv2_float((X),(Y),654)
+#define get_csv2_uint_pos655(X,Y) get_csv2_uint((X),(Y),655)
+#define get_csv2_ullong_pos655(X,Y) get_csv2_ullong((X),(Y),655)
+#define get_csv2_ip_pos655(X,Y) get_csv2_ip((X),(Y),655)
+#define get_csv2_ipv6_pos655(X,Y) get_csv2_ipv6((X),(Y),655)
+#define get_csv2_string_pos655(X,Y) get_csv2_string((X),(Y),655)
+#define get_csv2_v_str_pos655(X,Y) get_csv2_string((X),(Y),655)
+#define get_csv2_bool_pos655(X,Y) get_csv2_bool((X),(Y),655)
+#define get_csv2_int_pos655(X,Y) get_csv2_int((X),(Y),655)
+#define get_csv2_llong_pos655(X,Y) get_csv2_llong((X),(Y),655)
+#define get_csv2_float_pos655(X,Y) get_csv2_float((X),(Y),655)
+#define get_csv2_uint_pos656(X,Y) get_csv2_uint((X),(Y),656)
+#define get_csv2_ullong_pos656(X,Y) get_csv2_ullong((X),(Y),656)
+#define get_csv2_ip_pos656(X,Y) get_csv2_ip((X),(Y),656)
+#define get_csv2_ipv6_pos656(X,Y) get_csv2_ipv6((X),(Y),656)
+#define get_csv2_string_pos656(X,Y) get_csv2_string((X),(Y),656)
+#define get_csv2_v_str_pos656(X,Y) get_csv2_string((X),(Y),656)
+#define get_csv2_bool_pos656(X,Y) get_csv2_bool((X),(Y),656)
+#define get_csv2_int_pos656(X,Y) get_csv2_int((X),(Y),656)
+#define get_csv2_llong_pos656(X,Y) get_csv2_llong((X),(Y),656)
+#define get_csv2_float_pos656(X,Y) get_csv2_float((X),(Y),656)
+#define get_csv2_uint_pos657(X,Y) get_csv2_uint((X),(Y),657)
+#define get_csv2_ullong_pos657(X,Y) get_csv2_ullong((X),(Y),657)
+#define get_csv2_ip_pos657(X,Y) get_csv2_ip((X),(Y),657)
+#define get_csv2_ipv6_pos657(X,Y) get_csv2_ipv6((X),(Y),657)
+#define get_csv2_string_pos657(X,Y) get_csv2_string((X),(Y),657)
+#define get_csv2_v_str_pos657(X,Y) get_csv2_string((X),(Y),657)
+#define get_csv2_bool_pos657(X,Y) get_csv2_bool((X),(Y),657)
+#define get_csv2_int_pos657(X,Y) get_csv2_int((X),(Y),657)
+#define get_csv2_llong_pos657(X,Y) get_csv2_llong((X),(Y),657)
+#define get_csv2_float_pos657(X,Y) get_csv2_float((X),(Y),657)
+#define get_csv2_uint_pos658(X,Y) get_csv2_uint((X),(Y),658)
+#define get_csv2_ullong_pos658(X,Y) get_csv2_ullong((X),(Y),658)
+#define get_csv2_ip_pos658(X,Y) get_csv2_ip((X),(Y),658)
+#define get_csv2_ipv6_pos658(X,Y) get_csv2_ipv6((X),(Y),658)
+#define get_csv2_string_pos658(X,Y) get_csv2_string((X),(Y),658)
+#define get_csv2_v_str_pos658(X,Y) get_csv2_string((X),(Y),658)
+#define get_csv2_bool_pos658(X,Y) get_csv2_bool((X),(Y),658)
+#define get_csv2_int_pos658(X,Y) get_csv2_int((X),(Y),658)
+#define get_csv2_llong_pos658(X,Y) get_csv2_llong((X),(Y),658)
+#define get_csv2_float_pos658(X,Y) get_csv2_float((X),(Y),658)
+#define get_csv2_uint_pos659(X,Y) get_csv2_uint((X),(Y),659)
+#define get_csv2_ullong_pos659(X,Y) get_csv2_ullong((X),(Y),659)
+#define get_csv2_ip_pos659(X,Y) get_csv2_ip((X),(Y),659)
+#define get_csv2_ipv6_pos659(X,Y) get_csv2_ipv6((X),(Y),659)
+#define get_csv2_string_pos659(X,Y) get_csv2_string((X),(Y),659)
+#define get_csv2_v_str_pos659(X,Y) get_csv2_string((X),(Y),659)
+#define get_csv2_bool_pos659(X,Y) get_csv2_bool((X),(Y),659)
+#define get_csv2_int_pos659(X,Y) get_csv2_int((X),(Y),659)
+#define get_csv2_llong_pos659(X,Y) get_csv2_llong((X),(Y),659)
+#define get_csv2_float_pos659(X,Y) get_csv2_float((X),(Y),659)
+#define get_csv2_uint_pos660(X,Y) get_csv2_uint((X),(Y),660)
+#define get_csv2_ullong_pos660(X,Y) get_csv2_ullong((X),(Y),660)
+#define get_csv2_ip_pos660(X,Y) get_csv2_ip((X),(Y),660)
+#define get_csv2_ipv6_pos660(X,Y) get_csv2_ipv6((X),(Y),660)
+#define get_csv2_string_pos660(X,Y) get_csv2_string((X),(Y),660)
+#define get_csv2_v_str_pos660(X,Y) get_csv2_string((X),(Y),660)
+#define get_csv2_bool_pos660(X,Y) get_csv2_bool((X),(Y),660)
+#define get_csv2_int_pos660(X,Y) get_csv2_int((X),(Y),660)
+#define get_csv2_llong_pos660(X,Y) get_csv2_llong((X),(Y),660)
+#define get_csv2_float_pos660(X,Y) get_csv2_float((X),(Y),660)
+#define get_csv2_uint_pos661(X,Y) get_csv2_uint((X),(Y),661)
+#define get_csv2_ullong_pos661(X,Y) get_csv2_ullong((X),(Y),661)
+#define get_csv2_ip_pos661(X,Y) get_csv2_ip((X),(Y),661)
+#define get_csv2_ipv6_pos661(X,Y) get_csv2_ipv6((X),(Y),661)
+#define get_csv2_string_pos661(X,Y) get_csv2_string((X),(Y),661)
+#define get_csv2_v_str_pos661(X,Y) get_csv2_string((X),(Y),661)
+#define get_csv2_bool_pos661(X,Y) get_csv2_bool((X),(Y),661)
+#define get_csv2_int_pos661(X,Y) get_csv2_int((X),(Y),661)
+#define get_csv2_llong_pos661(X,Y) get_csv2_llong((X),(Y),661)
+#define get_csv2_float_pos661(X,Y) get_csv2_float((X),(Y),661)
+#define get_csv2_uint_pos662(X,Y) get_csv2_uint((X),(Y),662)
+#define get_csv2_ullong_pos662(X,Y) get_csv2_ullong((X),(Y),662)
+#define get_csv2_ip_pos662(X,Y) get_csv2_ip((X),(Y),662)
+#define get_csv2_ipv6_pos662(X,Y) get_csv2_ipv6((X),(Y),662)
+#define get_csv2_string_pos662(X,Y) get_csv2_string((X),(Y),662)
+#define get_csv2_v_str_pos662(X,Y) get_csv2_string((X),(Y),662)
+#define get_csv2_bool_pos662(X,Y) get_csv2_bool((X),(Y),662)
+#define get_csv2_int_pos662(X,Y) get_csv2_int((X),(Y),662)
+#define get_csv2_llong_pos662(X,Y) get_csv2_llong((X),(Y),662)
+#define get_csv2_float_pos662(X,Y) get_csv2_float((X),(Y),662)
+#define get_csv2_uint_pos663(X,Y) get_csv2_uint((X),(Y),663)
+#define get_csv2_ullong_pos663(X,Y) get_csv2_ullong((X),(Y),663)
+#define get_csv2_ip_pos663(X,Y) get_csv2_ip((X),(Y),663)
+#define get_csv2_ipv6_pos663(X,Y) get_csv2_ipv6((X),(Y),663)
+#define get_csv2_string_pos663(X,Y) get_csv2_string((X),(Y),663)
+#define get_csv2_v_str_pos663(X,Y) get_csv2_string((X),(Y),663)
+#define get_csv2_bool_pos663(X,Y) get_csv2_bool((X),(Y),663)
+#define get_csv2_int_pos663(X,Y) get_csv2_int((X),(Y),663)
+#define get_csv2_llong_pos663(X,Y) get_csv2_llong((X),(Y),663)
+#define get_csv2_float_pos663(X,Y) get_csv2_float((X),(Y),663)
+#define get_csv2_uint_pos664(X,Y) get_csv2_uint((X),(Y),664)
+#define get_csv2_ullong_pos664(X,Y) get_csv2_ullong((X),(Y),664)
+#define get_csv2_ip_pos664(X,Y) get_csv2_ip((X),(Y),664)
+#define get_csv2_ipv6_pos664(X,Y) get_csv2_ipv6((X),(Y),664)
+#define get_csv2_string_pos664(X,Y) get_csv2_string((X),(Y),664)
+#define get_csv2_v_str_pos664(X,Y) get_csv2_string((X),(Y),664)
+#define get_csv2_bool_pos664(X,Y) get_csv2_bool((X),(Y),664)
+#define get_csv2_int_pos664(X,Y) get_csv2_int((X),(Y),664)
+#define get_csv2_llong_pos664(X,Y) get_csv2_llong((X),(Y),664)
+#define get_csv2_float_pos664(X,Y) get_csv2_float((X),(Y),664)
+#define get_csv2_uint_pos665(X,Y) get_csv2_uint((X),(Y),665)
+#define get_csv2_ullong_pos665(X,Y) get_csv2_ullong((X),(Y),665)
+#define get_csv2_ip_pos665(X,Y) get_csv2_ip((X),(Y),665)
+#define get_csv2_ipv6_pos665(X,Y) get_csv2_ipv6((X),(Y),665)
+#define get_csv2_string_pos665(X,Y) get_csv2_string((X),(Y),665)
+#define get_csv2_v_str_pos665(X,Y) get_csv2_string((X),(Y),665)
+#define get_csv2_bool_pos665(X,Y) get_csv2_bool((X),(Y),665)
+#define get_csv2_int_pos665(X,Y) get_csv2_int((X),(Y),665)
+#define get_csv2_llong_pos665(X,Y) get_csv2_llong((X),(Y),665)
+#define get_csv2_float_pos665(X,Y) get_csv2_float((X),(Y),665)
+#define get_csv2_uint_pos666(X,Y) get_csv2_uint((X),(Y),666)
+#define get_csv2_ullong_pos666(X,Y) get_csv2_ullong((X),(Y),666)
+#define get_csv2_ip_pos666(X,Y) get_csv2_ip((X),(Y),666)
+#define get_csv2_ipv6_pos666(X,Y) get_csv2_ipv6((X),(Y),666)
+#define get_csv2_string_pos666(X,Y) get_csv2_string((X),(Y),666)
+#define get_csv2_v_str_pos666(X,Y) get_csv2_string((X),(Y),666)
+#define get_csv2_bool_pos666(X,Y) get_csv2_bool((X),(Y),666)
+#define get_csv2_int_pos666(X,Y) get_csv2_int((X),(Y),666)
+#define get_csv2_llong_pos666(X,Y) get_csv2_llong((X),(Y),666)
+#define get_csv2_float_pos666(X,Y) get_csv2_float((X),(Y),666)
+#define get_csv2_uint_pos667(X,Y) get_csv2_uint((X),(Y),667)
+#define get_csv2_ullong_pos667(X,Y) get_csv2_ullong((X),(Y),667)
+#define get_csv2_ip_pos667(X,Y) get_csv2_ip((X),(Y),667)
+#define get_csv2_ipv6_pos667(X,Y) get_csv2_ipv6((X),(Y),667)
+#define get_csv2_string_pos667(X,Y) get_csv2_string((X),(Y),667)
+#define get_csv2_v_str_pos667(X,Y) get_csv2_string((X),(Y),667)
+#define get_csv2_bool_pos667(X,Y) get_csv2_bool((X),(Y),667)
+#define get_csv2_int_pos667(X,Y) get_csv2_int((X),(Y),667)
+#define get_csv2_llong_pos667(X,Y) get_csv2_llong((X),(Y),667)
+#define get_csv2_float_pos667(X,Y) get_csv2_float((X),(Y),667)
+#define get_csv2_uint_pos668(X,Y) get_csv2_uint((X),(Y),668)
+#define get_csv2_ullong_pos668(X,Y) get_csv2_ullong((X),(Y),668)
+#define get_csv2_ip_pos668(X,Y) get_csv2_ip((X),(Y),668)
+#define get_csv2_ipv6_pos668(X,Y) get_csv2_ipv6((X),(Y),668)
+#define get_csv2_string_pos668(X,Y) get_csv2_string((X),(Y),668)
+#define get_csv2_v_str_pos668(X,Y) get_csv2_string((X),(Y),668)
+#define get_csv2_bool_pos668(X,Y) get_csv2_bool((X),(Y),668)
+#define get_csv2_int_pos668(X,Y) get_csv2_int((X),(Y),668)
+#define get_csv2_llong_pos668(X,Y) get_csv2_llong((X),(Y),668)
+#define get_csv2_float_pos668(X,Y) get_csv2_float((X),(Y),668)
+#define get_csv2_uint_pos669(X,Y) get_csv2_uint((X),(Y),669)
+#define get_csv2_ullong_pos669(X,Y) get_csv2_ullong((X),(Y),669)
+#define get_csv2_ip_pos669(X,Y) get_csv2_ip((X),(Y),669)
+#define get_csv2_ipv6_pos669(X,Y) get_csv2_ipv6((X),(Y),669)
+#define get_csv2_string_pos669(X,Y) get_csv2_string((X),(Y),669)
+#define get_csv2_v_str_pos669(X,Y) get_csv2_string((X),(Y),669)
+#define get_csv2_bool_pos669(X,Y) get_csv2_bool((X),(Y),669)
+#define get_csv2_int_pos669(X,Y) get_csv2_int((X),(Y),669)
+#define get_csv2_llong_pos669(X,Y) get_csv2_llong((X),(Y),669)
+#define get_csv2_float_pos669(X,Y) get_csv2_float((X),(Y),669)
+#define get_csv2_uint_pos670(X,Y) get_csv2_uint((X),(Y),670)
+#define get_csv2_ullong_pos670(X,Y) get_csv2_ullong((X),(Y),670)
+#define get_csv2_ip_pos670(X,Y) get_csv2_ip((X),(Y),670)
+#define get_csv2_ipv6_pos670(X,Y) get_csv2_ipv6((X),(Y),670)
+#define get_csv2_string_pos670(X,Y) get_csv2_string((X),(Y),670)
+#define get_csv2_v_str_pos670(X,Y) get_csv2_string((X),(Y),670)
+#define get_csv2_bool_pos670(X,Y) get_csv2_bool((X),(Y),670)
+#define get_csv2_int_pos670(X,Y) get_csv2_int((X),(Y),670)
+#define get_csv2_llong_pos670(X,Y) get_csv2_llong((X),(Y),670)
+#define get_csv2_float_pos670(X,Y) get_csv2_float((X),(Y),670)
+#define get_csv2_uint_pos671(X,Y) get_csv2_uint((X),(Y),671)
+#define get_csv2_ullong_pos671(X,Y) get_csv2_ullong((X),(Y),671)
+#define get_csv2_ip_pos671(X,Y) get_csv2_ip((X),(Y),671)
+#define get_csv2_ipv6_pos671(X,Y) get_csv2_ipv6((X),(Y),671)
+#define get_csv2_string_pos671(X,Y) get_csv2_string((X),(Y),671)
+#define get_csv2_v_str_pos671(X,Y) get_csv2_string((X),(Y),671)
+#define get_csv2_bool_pos671(X,Y) get_csv2_bool((X),(Y),671)
+#define get_csv2_int_pos671(X,Y) get_csv2_int((X),(Y),671)
+#define get_csv2_llong_pos671(X,Y) get_csv2_llong((X),(Y),671)
+#define get_csv2_float_pos671(X,Y) get_csv2_float((X),(Y),671)
+#define get_csv2_uint_pos672(X,Y) get_csv2_uint((X),(Y),672)
+#define get_csv2_ullong_pos672(X,Y) get_csv2_ullong((X),(Y),672)
+#define get_csv2_ip_pos672(X,Y) get_csv2_ip((X),(Y),672)
+#define get_csv2_ipv6_pos672(X,Y) get_csv2_ipv6((X),(Y),672)
+#define get_csv2_string_pos672(X,Y) get_csv2_string((X),(Y),672)
+#define get_csv2_v_str_pos672(X,Y) get_csv2_string((X),(Y),672)
+#define get_csv2_bool_pos672(X,Y) get_csv2_bool((X),(Y),672)
+#define get_csv2_int_pos672(X,Y) get_csv2_int((X),(Y),672)
+#define get_csv2_llong_pos672(X,Y) get_csv2_llong((X),(Y),672)
+#define get_csv2_float_pos672(X,Y) get_csv2_float((X),(Y),672)
+#define get_csv2_uint_pos673(X,Y) get_csv2_uint((X),(Y),673)
+#define get_csv2_ullong_pos673(X,Y) get_csv2_ullong((X),(Y),673)
+#define get_csv2_ip_pos673(X,Y) get_csv2_ip((X),(Y),673)
+#define get_csv2_ipv6_pos673(X,Y) get_csv2_ipv6((X),(Y),673)
+#define get_csv2_string_pos673(X,Y) get_csv2_string((X),(Y),673)
+#define get_csv2_v_str_pos673(X,Y) get_csv2_string((X),(Y),673)
+#define get_csv2_bool_pos673(X,Y) get_csv2_bool((X),(Y),673)
+#define get_csv2_int_pos673(X,Y) get_csv2_int((X),(Y),673)
+#define get_csv2_llong_pos673(X,Y) get_csv2_llong((X),(Y),673)
+#define get_csv2_float_pos673(X,Y) get_csv2_float((X),(Y),673)
+#define get_csv2_uint_pos674(X,Y) get_csv2_uint((X),(Y),674)
+#define get_csv2_ullong_pos674(X,Y) get_csv2_ullong((X),(Y),674)
+#define get_csv2_ip_pos674(X,Y) get_csv2_ip((X),(Y),674)
+#define get_csv2_ipv6_pos674(X,Y) get_csv2_ipv6((X),(Y),674)
+#define get_csv2_string_pos674(X,Y) get_csv2_string((X),(Y),674)
+#define get_csv2_v_str_pos674(X,Y) get_csv2_string((X),(Y),674)
+#define get_csv2_bool_pos674(X,Y) get_csv2_bool((X),(Y),674)
+#define get_csv2_int_pos674(X,Y) get_csv2_int((X),(Y),674)
+#define get_csv2_llong_pos674(X,Y) get_csv2_llong((X),(Y),674)
+#define get_csv2_float_pos674(X,Y) get_csv2_float((X),(Y),674)
+#define get_csv2_uint_pos675(X,Y) get_csv2_uint((X),(Y),675)
+#define get_csv2_ullong_pos675(X,Y) get_csv2_ullong((X),(Y),675)
+#define get_csv2_ip_pos675(X,Y) get_csv2_ip((X),(Y),675)
+#define get_csv2_ipv6_pos675(X,Y) get_csv2_ipv6((X),(Y),675)
+#define get_csv2_string_pos675(X,Y) get_csv2_string((X),(Y),675)
+#define get_csv2_v_str_pos675(X,Y) get_csv2_string((X),(Y),675)
+#define get_csv2_bool_pos675(X,Y) get_csv2_bool((X),(Y),675)
+#define get_csv2_int_pos675(X,Y) get_csv2_int((X),(Y),675)
+#define get_csv2_llong_pos675(X,Y) get_csv2_llong((X),(Y),675)
+#define get_csv2_float_pos675(X,Y) get_csv2_float((X),(Y),675)
+#define get_csv2_uint_pos676(X,Y) get_csv2_uint((X),(Y),676)
+#define get_csv2_ullong_pos676(X,Y) get_csv2_ullong((X),(Y),676)
+#define get_csv2_ip_pos676(X,Y) get_csv2_ip((X),(Y),676)
+#define get_csv2_ipv6_pos676(X,Y) get_csv2_ipv6((X),(Y),676)
+#define get_csv2_string_pos676(X,Y) get_csv2_string((X),(Y),676)
+#define get_csv2_v_str_pos676(X,Y) get_csv2_string((X),(Y),676)
+#define get_csv2_bool_pos676(X,Y) get_csv2_bool((X),(Y),676)
+#define get_csv2_int_pos676(X,Y) get_csv2_int((X),(Y),676)
+#define get_csv2_llong_pos676(X,Y) get_csv2_llong((X),(Y),676)
+#define get_csv2_float_pos676(X,Y) get_csv2_float((X),(Y),676)
+#define get_csv2_uint_pos677(X,Y) get_csv2_uint((X),(Y),677)
+#define get_csv2_ullong_pos677(X,Y) get_csv2_ullong((X),(Y),677)
+#define get_csv2_ip_pos677(X,Y) get_csv2_ip((X),(Y),677)
+#define get_csv2_ipv6_pos677(X,Y) get_csv2_ipv6((X),(Y),677)
+#define get_csv2_string_pos677(X,Y) get_csv2_string((X),(Y),677)
+#define get_csv2_v_str_pos677(X,Y) get_csv2_string((X),(Y),677)
+#define get_csv2_bool_pos677(X,Y) get_csv2_bool((X),(Y),677)
+#define get_csv2_int_pos677(X,Y) get_csv2_int((X),(Y),677)
+#define get_csv2_llong_pos677(X,Y) get_csv2_llong((X),(Y),677)
+#define get_csv2_float_pos677(X,Y) get_csv2_float((X),(Y),677)
+#define get_csv2_uint_pos678(X,Y) get_csv2_uint((X),(Y),678)
+#define get_csv2_ullong_pos678(X,Y) get_csv2_ullong((X),(Y),678)
+#define get_csv2_ip_pos678(X,Y) get_csv2_ip((X),(Y),678)
+#define get_csv2_ipv6_pos678(X,Y) get_csv2_ipv6((X),(Y),678)
+#define get_csv2_string_pos678(X,Y) get_csv2_string((X),(Y),678)
+#define get_csv2_v_str_pos678(X,Y) get_csv2_string((X),(Y),678)
+#define get_csv2_bool_pos678(X,Y) get_csv2_bool((X),(Y),678)
+#define get_csv2_int_pos678(X,Y) get_csv2_int((X),(Y),678)
+#define get_csv2_llong_pos678(X,Y) get_csv2_llong((X),(Y),678)
+#define get_csv2_float_pos678(X,Y) get_csv2_float((X),(Y),678)
+#define get_csv2_uint_pos679(X,Y) get_csv2_uint((X),(Y),679)
+#define get_csv2_ullong_pos679(X,Y) get_csv2_ullong((X),(Y),679)
+#define get_csv2_ip_pos679(X,Y) get_csv2_ip((X),(Y),679)
+#define get_csv2_ipv6_pos679(X,Y) get_csv2_ipv6((X),(Y),679)
+#define get_csv2_string_pos679(X,Y) get_csv2_string((X),(Y),679)
+#define get_csv2_v_str_pos679(X,Y) get_csv2_string((X),(Y),679)
+#define get_csv2_bool_pos679(X,Y) get_csv2_bool((X),(Y),679)
+#define get_csv2_int_pos679(X,Y) get_csv2_int((X),(Y),679)
+#define get_csv2_llong_pos679(X,Y) get_csv2_llong((X),(Y),679)
+#define get_csv2_float_pos679(X,Y) get_csv2_float((X),(Y),679)
+#define get_csv2_uint_pos680(X,Y) get_csv2_uint((X),(Y),680)
+#define get_csv2_ullong_pos680(X,Y) get_csv2_ullong((X),(Y),680)
+#define get_csv2_ip_pos680(X,Y) get_csv2_ip((X),(Y),680)
+#define get_csv2_ipv6_pos680(X,Y) get_csv2_ipv6((X),(Y),680)
+#define get_csv2_string_pos680(X,Y) get_csv2_string((X),(Y),680)
+#define get_csv2_v_str_pos680(X,Y) get_csv2_string((X),(Y),680)
+#define get_csv2_bool_pos680(X,Y) get_csv2_bool((X),(Y),680)
+#define get_csv2_int_pos680(X,Y) get_csv2_int((X),(Y),680)
+#define get_csv2_llong_pos680(X,Y) get_csv2_llong((X),(Y),680)
+#define get_csv2_float_pos680(X,Y) get_csv2_float((X),(Y),680)
+#define get_csv2_uint_pos681(X,Y) get_csv2_uint((X),(Y),681)
+#define get_csv2_ullong_pos681(X,Y) get_csv2_ullong((X),(Y),681)
+#define get_csv2_ip_pos681(X,Y) get_csv2_ip((X),(Y),681)
+#define get_csv2_ipv6_pos681(X,Y) get_csv2_ipv6((X),(Y),681)
+#define get_csv2_string_pos681(X,Y) get_csv2_string((X),(Y),681)
+#define get_csv2_v_str_pos681(X,Y) get_csv2_string((X),(Y),681)
+#define get_csv2_bool_pos681(X,Y) get_csv2_bool((X),(Y),681)
+#define get_csv2_int_pos681(X,Y) get_csv2_int((X),(Y),681)
+#define get_csv2_llong_pos681(X,Y) get_csv2_llong((X),(Y),681)
+#define get_csv2_float_pos681(X,Y) get_csv2_float((X),(Y),681)
+#define get_csv2_uint_pos682(X,Y) get_csv2_uint((X),(Y),682)
+#define get_csv2_ullong_pos682(X,Y) get_csv2_ullong((X),(Y),682)
+#define get_csv2_ip_pos682(X,Y) get_csv2_ip((X),(Y),682)
+#define get_csv2_ipv6_pos682(X,Y) get_csv2_ipv6((X),(Y),682)
+#define get_csv2_string_pos682(X,Y) get_csv2_string((X),(Y),682)
+#define get_csv2_v_str_pos682(X,Y) get_csv2_string((X),(Y),682)
+#define get_csv2_bool_pos682(X,Y) get_csv2_bool((X),(Y),682)
+#define get_csv2_int_pos682(X,Y) get_csv2_int((X),(Y),682)
+#define get_csv2_llong_pos682(X,Y) get_csv2_llong((X),(Y),682)
+#define get_csv2_float_pos682(X,Y) get_csv2_float((X),(Y),682)
+#define get_csv2_uint_pos683(X,Y) get_csv2_uint((X),(Y),683)
+#define get_csv2_ullong_pos683(X,Y) get_csv2_ullong((X),(Y),683)
+#define get_csv2_ip_pos683(X,Y) get_csv2_ip((X),(Y),683)
+#define get_csv2_ipv6_pos683(X,Y) get_csv2_ipv6((X),(Y),683)
+#define get_csv2_string_pos683(X,Y) get_csv2_string((X),(Y),683)
+#define get_csv2_v_str_pos683(X,Y) get_csv2_string((X),(Y),683)
+#define get_csv2_bool_pos683(X,Y) get_csv2_bool((X),(Y),683)
+#define get_csv2_int_pos683(X,Y) get_csv2_int((X),(Y),683)
+#define get_csv2_llong_pos683(X,Y) get_csv2_llong((X),(Y),683)
+#define get_csv2_float_pos683(X,Y) get_csv2_float((X),(Y),683)
+#define get_csv2_uint_pos684(X,Y) get_csv2_uint((X),(Y),684)
+#define get_csv2_ullong_pos684(X,Y) get_csv2_ullong((X),(Y),684)
+#define get_csv2_ip_pos684(X,Y) get_csv2_ip((X),(Y),684)
+#define get_csv2_ipv6_pos684(X,Y) get_csv2_ipv6((X),(Y),684)
+#define get_csv2_string_pos684(X,Y) get_csv2_string((X),(Y),684)
+#define get_csv2_v_str_pos684(X,Y) get_csv2_string((X),(Y),684)
+#define get_csv2_bool_pos684(X,Y) get_csv2_bool((X),(Y),684)
+#define get_csv2_int_pos684(X,Y) get_csv2_int((X),(Y),684)
+#define get_csv2_llong_pos684(X,Y) get_csv2_llong((X),(Y),684)
+#define get_csv2_float_pos684(X,Y) get_csv2_float((X),(Y),684)
+#define get_csv2_uint_pos685(X,Y) get_csv2_uint((X),(Y),685)
+#define get_csv2_ullong_pos685(X,Y) get_csv2_ullong((X),(Y),685)
+#define get_csv2_ip_pos685(X,Y) get_csv2_ip((X),(Y),685)
+#define get_csv2_ipv6_pos685(X,Y) get_csv2_ipv6((X),(Y),685)
+#define get_csv2_string_pos685(X,Y) get_csv2_string((X),(Y),685)
+#define get_csv2_v_str_pos685(X,Y) get_csv2_string((X),(Y),685)
+#define get_csv2_bool_pos685(X,Y) get_csv2_bool((X),(Y),685)
+#define get_csv2_int_pos685(X,Y) get_csv2_int((X),(Y),685)
+#define get_csv2_llong_pos685(X,Y) get_csv2_llong((X),(Y),685)
+#define get_csv2_float_pos685(X,Y) get_csv2_float((X),(Y),685)
+#define get_csv2_uint_pos686(X,Y) get_csv2_uint((X),(Y),686)
+#define get_csv2_ullong_pos686(X,Y) get_csv2_ullong((X),(Y),686)
+#define get_csv2_ip_pos686(X,Y) get_csv2_ip((X),(Y),686)
+#define get_csv2_ipv6_pos686(X,Y) get_csv2_ipv6((X),(Y),686)
+#define get_csv2_string_pos686(X,Y) get_csv2_string((X),(Y),686)
+#define get_csv2_v_str_pos686(X,Y) get_csv2_string((X),(Y),686)
+#define get_csv2_bool_pos686(X,Y) get_csv2_bool((X),(Y),686)
+#define get_csv2_int_pos686(X,Y) get_csv2_int((X),(Y),686)
+#define get_csv2_llong_pos686(X,Y) get_csv2_llong((X),(Y),686)
+#define get_csv2_float_pos686(X,Y) get_csv2_float((X),(Y),686)
+#define get_csv2_uint_pos687(X,Y) get_csv2_uint((X),(Y),687)
+#define get_csv2_ullong_pos687(X,Y) get_csv2_ullong((X),(Y),687)
+#define get_csv2_ip_pos687(X,Y) get_csv2_ip((X),(Y),687)
+#define get_csv2_ipv6_pos687(X,Y) get_csv2_ipv6((X),(Y),687)
+#define get_csv2_string_pos687(X,Y) get_csv2_string((X),(Y),687)
+#define get_csv2_v_str_pos687(X,Y) get_csv2_string((X),(Y),687)
+#define get_csv2_bool_pos687(X,Y) get_csv2_bool((X),(Y),687)
+#define get_csv2_int_pos687(X,Y) get_csv2_int((X),(Y),687)
+#define get_csv2_llong_pos687(X,Y) get_csv2_llong((X),(Y),687)
+#define get_csv2_float_pos687(X,Y) get_csv2_float((X),(Y),687)
+#define get_csv2_uint_pos688(X,Y) get_csv2_uint((X),(Y),688)
+#define get_csv2_ullong_pos688(X,Y) get_csv2_ullong((X),(Y),688)
+#define get_csv2_ip_pos688(X,Y) get_csv2_ip((X),(Y),688)
+#define get_csv2_ipv6_pos688(X,Y) get_csv2_ipv6((X),(Y),688)
+#define get_csv2_string_pos688(X,Y) get_csv2_string((X),(Y),688)
+#define get_csv2_v_str_pos688(X,Y) get_csv2_string((X),(Y),688)
+#define get_csv2_bool_pos688(X,Y) get_csv2_bool((X),(Y),688)
+#define get_csv2_int_pos688(X,Y) get_csv2_int((X),(Y),688)
+#define get_csv2_llong_pos688(X,Y) get_csv2_llong((X),(Y),688)
+#define get_csv2_float_pos688(X,Y) get_csv2_float((X),(Y),688)
+#define get_csv2_uint_pos689(X,Y) get_csv2_uint((X),(Y),689)
+#define get_csv2_ullong_pos689(X,Y) get_csv2_ullong((X),(Y),689)
+#define get_csv2_ip_pos689(X,Y) get_csv2_ip((X),(Y),689)
+#define get_csv2_ipv6_pos689(X,Y) get_csv2_ipv6((X),(Y),689)
+#define get_csv2_string_pos689(X,Y) get_csv2_string((X),(Y),689)
+#define get_csv2_v_str_pos689(X,Y) get_csv2_string((X),(Y),689)
+#define get_csv2_bool_pos689(X,Y) get_csv2_bool((X),(Y),689)
+#define get_csv2_int_pos689(X,Y) get_csv2_int((X),(Y),689)
+#define get_csv2_llong_pos689(X,Y) get_csv2_llong((X),(Y),689)
+#define get_csv2_float_pos689(X,Y) get_csv2_float((X),(Y),689)
+#define get_csv2_uint_pos690(X,Y) get_csv2_uint((X),(Y),690)
+#define get_csv2_ullong_pos690(X,Y) get_csv2_ullong((X),(Y),690)
+#define get_csv2_ip_pos690(X,Y) get_csv2_ip((X),(Y),690)
+#define get_csv2_ipv6_pos690(X,Y) get_csv2_ipv6((X),(Y),690)
+#define get_csv2_string_pos690(X,Y) get_csv2_string((X),(Y),690)
+#define get_csv2_v_str_pos690(X,Y) get_csv2_string((X),(Y),690)
+#define get_csv2_bool_pos690(X,Y) get_csv2_bool((X),(Y),690)
+#define get_csv2_int_pos690(X,Y) get_csv2_int((X),(Y),690)
+#define get_csv2_llong_pos690(X,Y) get_csv2_llong((X),(Y),690)
+#define get_csv2_float_pos690(X,Y) get_csv2_float((X),(Y),690)
+#define get_csv2_uint_pos691(X,Y) get_csv2_uint((X),(Y),691)
+#define get_csv2_ullong_pos691(X,Y) get_csv2_ullong((X),(Y),691)
+#define get_csv2_ip_pos691(X,Y) get_csv2_ip((X),(Y),691)
+#define get_csv2_ipv6_pos691(X,Y) get_csv2_ipv6((X),(Y),691)
+#define get_csv2_string_pos691(X,Y) get_csv2_string((X),(Y),691)
+#define get_csv2_v_str_pos691(X,Y) get_csv2_string((X),(Y),691)
+#define get_csv2_bool_pos691(X,Y) get_csv2_bool((X),(Y),691)
+#define get_csv2_int_pos691(X,Y) get_csv2_int((X),(Y),691)
+#define get_csv2_llong_pos691(X,Y) get_csv2_llong((X),(Y),691)
+#define get_csv2_float_pos691(X,Y) get_csv2_float((X),(Y),691)
+#define get_csv2_uint_pos692(X,Y) get_csv2_uint((X),(Y),692)
+#define get_csv2_ullong_pos692(X,Y) get_csv2_ullong((X),(Y),692)
+#define get_csv2_ip_pos692(X,Y) get_csv2_ip((X),(Y),692)
+#define get_csv2_ipv6_pos692(X,Y) get_csv2_ipv6((X),(Y),692)
+#define get_csv2_string_pos692(X,Y) get_csv2_string((X),(Y),692)
+#define get_csv2_v_str_pos692(X,Y) get_csv2_string((X),(Y),692)
+#define get_csv2_bool_pos692(X,Y) get_csv2_bool((X),(Y),692)
+#define get_csv2_int_pos692(X,Y) get_csv2_int((X),(Y),692)
+#define get_csv2_llong_pos692(X,Y) get_csv2_llong((X),(Y),692)
+#define get_csv2_float_pos692(X,Y) get_csv2_float((X),(Y),692)
+#define get_csv2_uint_pos693(X,Y) get_csv2_uint((X),(Y),693)
+#define get_csv2_ullong_pos693(X,Y) get_csv2_ullong((X),(Y),693)
+#define get_csv2_ip_pos693(X,Y) get_csv2_ip((X),(Y),693)
+#define get_csv2_ipv6_pos693(X,Y) get_csv2_ipv6((X),(Y),693)
+#define get_csv2_string_pos693(X,Y) get_csv2_string((X),(Y),693)
+#define get_csv2_v_str_pos693(X,Y) get_csv2_string((X),(Y),693)
+#define get_csv2_bool_pos693(X,Y) get_csv2_bool((X),(Y),693)
+#define get_csv2_int_pos693(X,Y) get_csv2_int((X),(Y),693)
+#define get_csv2_llong_pos693(X,Y) get_csv2_llong((X),(Y),693)
+#define get_csv2_float_pos693(X,Y) get_csv2_float((X),(Y),693)
+#define get_csv2_uint_pos694(X,Y) get_csv2_uint((X),(Y),694)
+#define get_csv2_ullong_pos694(X,Y) get_csv2_ullong((X),(Y),694)
+#define get_csv2_ip_pos694(X,Y) get_csv2_ip((X),(Y),694)
+#define get_csv2_ipv6_pos694(X,Y) get_csv2_ipv6((X),(Y),694)
+#define get_csv2_string_pos694(X,Y) get_csv2_string((X),(Y),694)
+#define get_csv2_v_str_pos694(X,Y) get_csv2_string((X),(Y),694)
+#define get_csv2_bool_pos694(X,Y) get_csv2_bool((X),(Y),694)
+#define get_csv2_int_pos694(X,Y) get_csv2_int((X),(Y),694)
+#define get_csv2_llong_pos694(X,Y) get_csv2_llong((X),(Y),694)
+#define get_csv2_float_pos694(X,Y) get_csv2_float((X),(Y),694)
+#define get_csv2_uint_pos695(X,Y) get_csv2_uint((X),(Y),695)
+#define get_csv2_ullong_pos695(X,Y) get_csv2_ullong((X),(Y),695)
+#define get_csv2_ip_pos695(X,Y) get_csv2_ip((X),(Y),695)
+#define get_csv2_ipv6_pos695(X,Y) get_csv2_ipv6((X),(Y),695)
+#define get_csv2_string_pos695(X,Y) get_csv2_string((X),(Y),695)
+#define get_csv2_v_str_pos695(X,Y) get_csv2_string((X),(Y),695)
+#define get_csv2_bool_pos695(X,Y) get_csv2_bool((X),(Y),695)
+#define get_csv2_int_pos695(X,Y) get_csv2_int((X),(Y),695)
+#define get_csv2_llong_pos695(X,Y) get_csv2_llong((X),(Y),695)
+#define get_csv2_float_pos695(X,Y) get_csv2_float((X),(Y),695)
+#define get_csv2_uint_pos696(X,Y) get_csv2_uint((X),(Y),696)
+#define get_csv2_ullong_pos696(X,Y) get_csv2_ullong((X),(Y),696)
+#define get_csv2_ip_pos696(X,Y) get_csv2_ip((X),(Y),696)
+#define get_csv2_ipv6_pos696(X,Y) get_csv2_ipv6((X),(Y),696)
+#define get_csv2_string_pos696(X,Y) get_csv2_string((X),(Y),696)
+#define get_csv2_v_str_pos696(X,Y) get_csv2_string((X),(Y),696)
+#define get_csv2_bool_pos696(X,Y) get_csv2_bool((X),(Y),696)
+#define get_csv2_int_pos696(X,Y) get_csv2_int((X),(Y),696)
+#define get_csv2_llong_pos696(X,Y) get_csv2_llong((X),(Y),696)
+#define get_csv2_float_pos696(X,Y) get_csv2_float((X),(Y),696)
+#define get_csv2_uint_pos697(X,Y) get_csv2_uint((X),(Y),697)
+#define get_csv2_ullong_pos697(X,Y) get_csv2_ullong((X),(Y),697)
+#define get_csv2_ip_pos697(X,Y) get_csv2_ip((X),(Y),697)
+#define get_csv2_ipv6_pos697(X,Y) get_csv2_ipv6((X),(Y),697)
+#define get_csv2_string_pos697(X,Y) get_csv2_string((X),(Y),697)
+#define get_csv2_v_str_pos697(X,Y) get_csv2_string((X),(Y),697)
+#define get_csv2_bool_pos697(X,Y) get_csv2_bool((X),(Y),697)
+#define get_csv2_int_pos697(X,Y) get_csv2_int((X),(Y),697)
+#define get_csv2_llong_pos697(X,Y) get_csv2_llong((X),(Y),697)
+#define get_csv2_float_pos697(X,Y) get_csv2_float((X),(Y),697)
+#define get_csv2_uint_pos698(X,Y) get_csv2_uint((X),(Y),698)
+#define get_csv2_ullong_pos698(X,Y) get_csv2_ullong((X),(Y),698)
+#define get_csv2_ip_pos698(X,Y) get_csv2_ip((X),(Y),698)
+#define get_csv2_ipv6_pos698(X,Y) get_csv2_ipv6((X),(Y),698)
+#define get_csv2_string_pos698(X,Y) get_csv2_string((X),(Y),698)
+#define get_csv2_v_str_pos698(X,Y) get_csv2_string((X),(Y),698)
+#define get_csv2_bool_pos698(X,Y) get_csv2_bool((X),(Y),698)
+#define get_csv2_int_pos698(X,Y) get_csv2_int((X),(Y),698)
+#define get_csv2_llong_pos698(X,Y) get_csv2_llong((X),(Y),698)
+#define get_csv2_float_pos698(X,Y) get_csv2_float((X),(Y),698)
+#define get_csv2_uint_pos699(X,Y) get_csv2_uint((X),(Y),699)
+#define get_csv2_ullong_pos699(X,Y) get_csv2_ullong((X),(Y),699)
+#define get_csv2_ip_pos699(X,Y) get_csv2_ip((X),(Y),699)
+#define get_csv2_ipv6_pos699(X,Y) get_csv2_ipv6((X),(Y),699)
+#define get_csv2_string_pos699(X,Y) get_csv2_string((X),(Y),699)
+#define get_csv2_v_str_pos699(X,Y) get_csv2_string((X),(Y),699)
+#define get_csv2_bool_pos699(X,Y) get_csv2_bool((X),(Y),699)
+#define get_csv2_int_pos699(X,Y) get_csv2_int((X),(Y),699)
+#define get_csv2_llong_pos699(X,Y) get_csv2_llong((X),(Y),699)
+#define get_csv2_float_pos699(X,Y) get_csv2_float((X),(Y),699)
+#define get_csv2_uint_pos700(X,Y) get_csv2_uint((X),(Y),700)
+#define get_csv2_ullong_pos700(X,Y) get_csv2_ullong((X),(Y),700)
+#define get_csv2_ip_pos700(X,Y) get_csv2_ip((X),(Y),700)
+#define get_csv2_ipv6_pos700(X,Y) get_csv2_ipv6((X),(Y),700)
+#define get_csv2_string_pos700(X,Y) get_csv2_string((X),(Y),700)
+#define get_csv2_v_str_pos700(X,Y) get_csv2_string((X),(Y),700)
+#define get_csv2_bool_pos700(X,Y) get_csv2_bool((X),(Y),700)
+#define get_csv2_int_pos700(X,Y) get_csv2_int((X),(Y),700)
+#define get_csv2_llong_pos700(X,Y) get_csv2_llong((X),(Y),700)
+#define get_csv2_float_pos700(X,Y) get_csv2_float((X),(Y),700)
+#define get_csv2_uint_pos701(X,Y) get_csv2_uint((X),(Y),701)
+#define get_csv2_ullong_pos701(X,Y) get_csv2_ullong((X),(Y),701)
+#define get_csv2_ip_pos701(X,Y) get_csv2_ip((X),(Y),701)
+#define get_csv2_ipv6_pos701(X,Y) get_csv2_ipv6((X),(Y),701)
+#define get_csv2_string_pos701(X,Y) get_csv2_string((X),(Y),701)
+#define get_csv2_v_str_pos701(X,Y) get_csv2_string((X),(Y),701)
+#define get_csv2_bool_pos701(X,Y) get_csv2_bool((X),(Y),701)
+#define get_csv2_int_pos701(X,Y) get_csv2_int((X),(Y),701)
+#define get_csv2_llong_pos701(X,Y) get_csv2_llong((X),(Y),701)
+#define get_csv2_float_pos701(X,Y) get_csv2_float((X),(Y),701)
+#define get_csv2_uint_pos702(X,Y) get_csv2_uint((X),(Y),702)
+#define get_csv2_ullong_pos702(X,Y) get_csv2_ullong((X),(Y),702)
+#define get_csv2_ip_pos702(X,Y) get_csv2_ip((X),(Y),702)
+#define get_csv2_ipv6_pos702(X,Y) get_csv2_ipv6((X),(Y),702)
+#define get_csv2_string_pos702(X,Y) get_csv2_string((X),(Y),702)
+#define get_csv2_v_str_pos702(X,Y) get_csv2_string((X),(Y),702)
+#define get_csv2_bool_pos702(X,Y) get_csv2_bool((X),(Y),702)
+#define get_csv2_int_pos702(X,Y) get_csv2_int((X),(Y),702)
+#define get_csv2_llong_pos702(X,Y) get_csv2_llong((X),(Y),702)
+#define get_csv2_float_pos702(X,Y) get_csv2_float((X),(Y),702)
+#define get_csv2_uint_pos703(X,Y) get_csv2_uint((X),(Y),703)
+#define get_csv2_ullong_pos703(X,Y) get_csv2_ullong((X),(Y),703)
+#define get_csv2_ip_pos703(X,Y) get_csv2_ip((X),(Y),703)
+#define get_csv2_ipv6_pos703(X,Y) get_csv2_ipv6((X),(Y),703)
+#define get_csv2_string_pos703(X,Y) get_csv2_string((X),(Y),703)
+#define get_csv2_v_str_pos703(X,Y) get_csv2_string((X),(Y),703)
+#define get_csv2_bool_pos703(X,Y) get_csv2_bool((X),(Y),703)
+#define get_csv2_int_pos703(X,Y) get_csv2_int((X),(Y),703)
+#define get_csv2_llong_pos703(X,Y) get_csv2_llong((X),(Y),703)
+#define get_csv2_float_pos703(X,Y) get_csv2_float((X),(Y),703)
+#define get_csv2_uint_pos704(X,Y) get_csv2_uint((X),(Y),704)
+#define get_csv2_ullong_pos704(X,Y) get_csv2_ullong((X),(Y),704)
+#define get_csv2_ip_pos704(X,Y) get_csv2_ip((X),(Y),704)
+#define get_csv2_ipv6_pos704(X,Y) get_csv2_ipv6((X),(Y),704)
+#define get_csv2_string_pos704(X,Y) get_csv2_string((X),(Y),704)
+#define get_csv2_v_str_pos704(X,Y) get_csv2_string((X),(Y),704)
+#define get_csv2_bool_pos704(X,Y) get_csv2_bool((X),(Y),704)
+#define get_csv2_int_pos704(X,Y) get_csv2_int((X),(Y),704)
+#define get_csv2_llong_pos704(X,Y) get_csv2_llong((X),(Y),704)
+#define get_csv2_float_pos704(X,Y) get_csv2_float((X),(Y),704)
+#define get_csv2_uint_pos705(X,Y) get_csv2_uint((X),(Y),705)
+#define get_csv2_ullong_pos705(X,Y) get_csv2_ullong((X),(Y),705)
+#define get_csv2_ip_pos705(X,Y) get_csv2_ip((X),(Y),705)
+#define get_csv2_ipv6_pos705(X,Y) get_csv2_ipv6((X),(Y),705)
+#define get_csv2_string_pos705(X,Y) get_csv2_string((X),(Y),705)
+#define get_csv2_v_str_pos705(X,Y) get_csv2_string((X),(Y),705)
+#define get_csv2_bool_pos705(X,Y) get_csv2_bool((X),(Y),705)
+#define get_csv2_int_pos705(X,Y) get_csv2_int((X),(Y),705)
+#define get_csv2_llong_pos705(X,Y) get_csv2_llong((X),(Y),705)
+#define get_csv2_float_pos705(X,Y) get_csv2_float((X),(Y),705)
+#define get_csv2_uint_pos706(X,Y) get_csv2_uint((X),(Y),706)
+#define get_csv2_ullong_pos706(X,Y) get_csv2_ullong((X),(Y),706)
+#define get_csv2_ip_pos706(X,Y) get_csv2_ip((X),(Y),706)
+#define get_csv2_ipv6_pos706(X,Y) get_csv2_ipv6((X),(Y),706)
+#define get_csv2_string_pos706(X,Y) get_csv2_string((X),(Y),706)
+#define get_csv2_v_str_pos706(X,Y) get_csv2_string((X),(Y),706)
+#define get_csv2_bool_pos706(X,Y) get_csv2_bool((X),(Y),706)
+#define get_csv2_int_pos706(X,Y) get_csv2_int((X),(Y),706)
+#define get_csv2_llong_pos706(X,Y) get_csv2_llong((X),(Y),706)
+#define get_csv2_float_pos706(X,Y) get_csv2_float((X),(Y),706)
+#define get_csv2_uint_pos707(X,Y) get_csv2_uint((X),(Y),707)
+#define get_csv2_ullong_pos707(X,Y) get_csv2_ullong((X),(Y),707)
+#define get_csv2_ip_pos707(X,Y) get_csv2_ip((X),(Y),707)
+#define get_csv2_ipv6_pos707(X,Y) get_csv2_ipv6((X),(Y),707)
+#define get_csv2_string_pos707(X,Y) get_csv2_string((X),(Y),707)
+#define get_csv2_v_str_pos707(X,Y) get_csv2_string((X),(Y),707)
+#define get_csv2_bool_pos707(X,Y) get_csv2_bool((X),(Y),707)
+#define get_csv2_int_pos707(X,Y) get_csv2_int((X),(Y),707)
+#define get_csv2_llong_pos707(X,Y) get_csv2_llong((X),(Y),707)
+#define get_csv2_float_pos707(X,Y) get_csv2_float((X),(Y),707)
+#define get_csv2_uint_pos708(X,Y) get_csv2_uint((X),(Y),708)
+#define get_csv2_ullong_pos708(X,Y) get_csv2_ullong((X),(Y),708)
+#define get_csv2_ip_pos708(X,Y) get_csv2_ip((X),(Y),708)
+#define get_csv2_ipv6_pos708(X,Y) get_csv2_ipv6((X),(Y),708)
+#define get_csv2_string_pos708(X,Y) get_csv2_string((X),(Y),708)
+#define get_csv2_v_str_pos708(X,Y) get_csv2_string((X),(Y),708)
+#define get_csv2_bool_pos708(X,Y) get_csv2_bool((X),(Y),708)
+#define get_csv2_int_pos708(X,Y) get_csv2_int((X),(Y),708)
+#define get_csv2_llong_pos708(X,Y) get_csv2_llong((X),(Y),708)
+#define get_csv2_float_pos708(X,Y) get_csv2_float((X),(Y),708)
+#define get_csv2_uint_pos709(X,Y) get_csv2_uint((X),(Y),709)
+#define get_csv2_ullong_pos709(X,Y) get_csv2_ullong((X),(Y),709)
+#define get_csv2_ip_pos709(X,Y) get_csv2_ip((X),(Y),709)
+#define get_csv2_ipv6_pos709(X,Y) get_csv2_ipv6((X),(Y),709)
+#define get_csv2_string_pos709(X,Y) get_csv2_string((X),(Y),709)
+#define get_csv2_v_str_pos709(X,Y) get_csv2_string((X),(Y),709)
+#define get_csv2_bool_pos709(X,Y) get_csv2_bool((X),(Y),709)
+#define get_csv2_int_pos709(X,Y) get_csv2_int((X),(Y),709)
+#define get_csv2_llong_pos709(X,Y) get_csv2_llong((X),(Y),709)
+#define get_csv2_float_pos709(X,Y) get_csv2_float((X),(Y),709)
+#define get_csv2_uint_pos710(X,Y) get_csv2_uint((X),(Y),710)
+#define get_csv2_ullong_pos710(X,Y) get_csv2_ullong((X),(Y),710)
+#define get_csv2_ip_pos710(X,Y) get_csv2_ip((X),(Y),710)
+#define get_csv2_ipv6_pos710(X,Y) get_csv2_ipv6((X),(Y),710)
+#define get_csv2_string_pos710(X,Y) get_csv2_string((X),(Y),710)
+#define get_csv2_v_str_pos710(X,Y) get_csv2_string((X),(Y),710)
+#define get_csv2_bool_pos710(X,Y) get_csv2_bool((X),(Y),710)
+#define get_csv2_int_pos710(X,Y) get_csv2_int((X),(Y),710)
+#define get_csv2_llong_pos710(X,Y) get_csv2_llong((X),(Y),710)
+#define get_csv2_float_pos710(X,Y) get_csv2_float((X),(Y),710)
+#define get_csv2_uint_pos711(X,Y) get_csv2_uint((X),(Y),711)
+#define get_csv2_ullong_pos711(X,Y) get_csv2_ullong((X),(Y),711)
+#define get_csv2_ip_pos711(X,Y) get_csv2_ip((X),(Y),711)
+#define get_csv2_ipv6_pos711(X,Y) get_csv2_ipv6((X),(Y),711)
+#define get_csv2_string_pos711(X,Y) get_csv2_string((X),(Y),711)
+#define get_csv2_v_str_pos711(X,Y) get_csv2_string((X),(Y),711)
+#define get_csv2_bool_pos711(X,Y) get_csv2_bool((X),(Y),711)
+#define get_csv2_int_pos711(X,Y) get_csv2_int((X),(Y),711)
+#define get_csv2_llong_pos711(X,Y) get_csv2_llong((X),(Y),711)
+#define get_csv2_float_pos711(X,Y) get_csv2_float((X),(Y),711)
+#define get_csv2_uint_pos712(X,Y) get_csv2_uint((X),(Y),712)
+#define get_csv2_ullong_pos712(X,Y) get_csv2_ullong((X),(Y),712)
+#define get_csv2_ip_pos712(X,Y) get_csv2_ip((X),(Y),712)
+#define get_csv2_ipv6_pos712(X,Y) get_csv2_ipv6((X),(Y),712)
+#define get_csv2_string_pos712(X,Y) get_csv2_string((X),(Y),712)
+#define get_csv2_v_str_pos712(X,Y) get_csv2_string((X),(Y),712)
+#define get_csv2_bool_pos712(X,Y) get_csv2_bool((X),(Y),712)
+#define get_csv2_int_pos712(X,Y) get_csv2_int((X),(Y),712)
+#define get_csv2_llong_pos712(X,Y) get_csv2_llong((X),(Y),712)
+#define get_csv2_float_pos712(X,Y) get_csv2_float((X),(Y),712)
+#define get_csv2_uint_pos713(X,Y) get_csv2_uint((X),(Y),713)
+#define get_csv2_ullong_pos713(X,Y) get_csv2_ullong((X),(Y),713)
+#define get_csv2_ip_pos713(X,Y) get_csv2_ip((X),(Y),713)
+#define get_csv2_ipv6_pos713(X,Y) get_csv2_ipv6((X),(Y),713)
+#define get_csv2_string_pos713(X,Y) get_csv2_string((X),(Y),713)
+#define get_csv2_v_str_pos713(X,Y) get_csv2_string((X),(Y),713)
+#define get_csv2_bool_pos713(X,Y) get_csv2_bool((X),(Y),713)
+#define get_csv2_int_pos713(X,Y) get_csv2_int((X),(Y),713)
+#define get_csv2_llong_pos713(X,Y) get_csv2_llong((X),(Y),713)
+#define get_csv2_float_pos713(X,Y) get_csv2_float((X),(Y),713)
+#define get_csv2_uint_pos714(X,Y) get_csv2_uint((X),(Y),714)
+#define get_csv2_ullong_pos714(X,Y) get_csv2_ullong((X),(Y),714)
+#define get_csv2_ip_pos714(X,Y) get_csv2_ip((X),(Y),714)
+#define get_csv2_ipv6_pos714(X,Y) get_csv2_ipv6((X),(Y),714)
+#define get_csv2_string_pos714(X,Y) get_csv2_string((X),(Y),714)
+#define get_csv2_v_str_pos714(X,Y) get_csv2_string((X),(Y),714)
+#define get_csv2_bool_pos714(X,Y) get_csv2_bool((X),(Y),714)
+#define get_csv2_int_pos714(X,Y) get_csv2_int((X),(Y),714)
+#define get_csv2_llong_pos714(X,Y) get_csv2_llong((X),(Y),714)
+#define get_csv2_float_pos714(X,Y) get_csv2_float((X),(Y),714)
+#define get_csv2_uint_pos715(X,Y) get_csv2_uint((X),(Y),715)
+#define get_csv2_ullong_pos715(X,Y) get_csv2_ullong((X),(Y),715)
+#define get_csv2_ip_pos715(X,Y) get_csv2_ip((X),(Y),715)
+#define get_csv2_ipv6_pos715(X,Y) get_csv2_ipv6((X),(Y),715)
+#define get_csv2_string_pos715(X,Y) get_csv2_string((X),(Y),715)
+#define get_csv2_v_str_pos715(X,Y) get_csv2_string((X),(Y),715)
+#define get_csv2_bool_pos715(X,Y) get_csv2_bool((X),(Y),715)
+#define get_csv2_int_pos715(X,Y) get_csv2_int((X),(Y),715)
+#define get_csv2_llong_pos715(X,Y) get_csv2_llong((X),(Y),715)
+#define get_csv2_float_pos715(X,Y) get_csv2_float((X),(Y),715)
+#define get_csv2_uint_pos716(X,Y) get_csv2_uint((X),(Y),716)
+#define get_csv2_ullong_pos716(X,Y) get_csv2_ullong((X),(Y),716)
+#define get_csv2_ip_pos716(X,Y) get_csv2_ip((X),(Y),716)
+#define get_csv2_ipv6_pos716(X,Y) get_csv2_ipv6((X),(Y),716)
+#define get_csv2_string_pos716(X,Y) get_csv2_string((X),(Y),716)
+#define get_csv2_v_str_pos716(X,Y) get_csv2_string((X),(Y),716)
+#define get_csv2_bool_pos716(X,Y) get_csv2_bool((X),(Y),716)
+#define get_csv2_int_pos716(X,Y) get_csv2_int((X),(Y),716)
+#define get_csv2_llong_pos716(X,Y) get_csv2_llong((X),(Y),716)
+#define get_csv2_float_pos716(X,Y) get_csv2_float((X),(Y),716)
+#define get_csv2_uint_pos717(X,Y) get_csv2_uint((X),(Y),717)
+#define get_csv2_ullong_pos717(X,Y) get_csv2_ullong((X),(Y),717)
+#define get_csv2_ip_pos717(X,Y) get_csv2_ip((X),(Y),717)
+#define get_csv2_ipv6_pos717(X,Y) get_csv2_ipv6((X),(Y),717)
+#define get_csv2_string_pos717(X,Y) get_csv2_string((X),(Y),717)
+#define get_csv2_v_str_pos717(X,Y) get_csv2_string((X),(Y),717)
+#define get_csv2_bool_pos717(X,Y) get_csv2_bool((X),(Y),717)
+#define get_csv2_int_pos717(X,Y) get_csv2_int((X),(Y),717)
+#define get_csv2_llong_pos717(X,Y) get_csv2_llong((X),(Y),717)
+#define get_csv2_float_pos717(X,Y) get_csv2_float((X),(Y),717)
+#define get_csv2_uint_pos718(X,Y) get_csv2_uint((X),(Y),718)
+#define get_csv2_ullong_pos718(X,Y) get_csv2_ullong((X),(Y),718)
+#define get_csv2_ip_pos718(X,Y) get_csv2_ip((X),(Y),718)
+#define get_csv2_ipv6_pos718(X,Y) get_csv2_ipv6((X),(Y),718)
+#define get_csv2_string_pos718(X,Y) get_csv2_string((X),(Y),718)
+#define get_csv2_v_str_pos718(X,Y) get_csv2_string((X),(Y),718)
+#define get_csv2_bool_pos718(X,Y) get_csv2_bool((X),(Y),718)
+#define get_csv2_int_pos718(X,Y) get_csv2_int((X),(Y),718)
+#define get_csv2_llong_pos718(X,Y) get_csv2_llong((X),(Y),718)
+#define get_csv2_float_pos718(X,Y) get_csv2_float((X),(Y),718)
+#define get_csv2_uint_pos719(X,Y) get_csv2_uint((X),(Y),719)
+#define get_csv2_ullong_pos719(X,Y) get_csv2_ullong((X),(Y),719)
+#define get_csv2_ip_pos719(X,Y) get_csv2_ip((X),(Y),719)
+#define get_csv2_ipv6_pos719(X,Y) get_csv2_ipv6((X),(Y),719)
+#define get_csv2_string_pos719(X,Y) get_csv2_string((X),(Y),719)
+#define get_csv2_v_str_pos719(X,Y) get_csv2_string((X),(Y),719)
+#define get_csv2_bool_pos719(X,Y) get_csv2_bool((X),(Y),719)
+#define get_csv2_int_pos719(X,Y) get_csv2_int((X),(Y),719)
+#define get_csv2_llong_pos719(X,Y) get_csv2_llong((X),(Y),719)
+#define get_csv2_float_pos719(X,Y) get_csv2_float((X),(Y),719)
+#define get_csv2_uint_pos720(X,Y) get_csv2_uint((X),(Y),720)
+#define get_csv2_ullong_pos720(X,Y) get_csv2_ullong((X),(Y),720)
+#define get_csv2_ip_pos720(X,Y) get_csv2_ip((X),(Y),720)
+#define get_csv2_ipv6_pos720(X,Y) get_csv2_ipv6((X),(Y),720)
+#define get_csv2_string_pos720(X,Y) get_csv2_string((X),(Y),720)
+#define get_csv2_v_str_pos720(X,Y) get_csv2_string((X),(Y),720)
+#define get_csv2_bool_pos720(X,Y) get_csv2_bool((X),(Y),720)
+#define get_csv2_int_pos720(X,Y) get_csv2_int((X),(Y),720)
+#define get_csv2_llong_pos720(X,Y) get_csv2_llong((X),(Y),720)
+#define get_csv2_float_pos720(X,Y) get_csv2_float((X),(Y),720)
+#define get_csv2_uint_pos721(X,Y) get_csv2_uint((X),(Y),721)
+#define get_csv2_ullong_pos721(X,Y) get_csv2_ullong((X),(Y),721)
+#define get_csv2_ip_pos721(X,Y) get_csv2_ip((X),(Y),721)
+#define get_csv2_ipv6_pos721(X,Y) get_csv2_ipv6((X),(Y),721)
+#define get_csv2_string_pos721(X,Y) get_csv2_string((X),(Y),721)
+#define get_csv2_v_str_pos721(X,Y) get_csv2_string((X),(Y),721)
+#define get_csv2_bool_pos721(X,Y) get_csv2_bool((X),(Y),721)
+#define get_csv2_int_pos721(X,Y) get_csv2_int((X),(Y),721)
+#define get_csv2_llong_pos721(X,Y) get_csv2_llong((X),(Y),721)
+#define get_csv2_float_pos721(X,Y) get_csv2_float((X),(Y),721)
+#define get_csv2_uint_pos722(X,Y) get_csv2_uint((X),(Y),722)
+#define get_csv2_ullong_pos722(X,Y) get_csv2_ullong((X),(Y),722)
+#define get_csv2_ip_pos722(X,Y) get_csv2_ip((X),(Y),722)
+#define get_csv2_ipv6_pos722(X,Y) get_csv2_ipv6((X),(Y),722)
+#define get_csv2_string_pos722(X,Y) get_csv2_string((X),(Y),722)
+#define get_csv2_v_str_pos722(X,Y) get_csv2_string((X),(Y),722)
+#define get_csv2_bool_pos722(X,Y) get_csv2_bool((X),(Y),722)
+#define get_csv2_int_pos722(X,Y) get_csv2_int((X),(Y),722)
+#define get_csv2_llong_pos722(X,Y) get_csv2_llong((X),(Y),722)
+#define get_csv2_float_pos722(X,Y) get_csv2_float((X),(Y),722)
+#define get_csv2_uint_pos723(X,Y) get_csv2_uint((X),(Y),723)
+#define get_csv2_ullong_pos723(X,Y) get_csv2_ullong((X),(Y),723)
+#define get_csv2_ip_pos723(X,Y) get_csv2_ip((X),(Y),723)
+#define get_csv2_ipv6_pos723(X,Y) get_csv2_ipv6((X),(Y),723)
+#define get_csv2_string_pos723(X,Y) get_csv2_string((X),(Y),723)
+#define get_csv2_v_str_pos723(X,Y) get_csv2_string((X),(Y),723)
+#define get_csv2_bool_pos723(X,Y) get_csv2_bool((X),(Y),723)
+#define get_csv2_int_pos723(X,Y) get_csv2_int((X),(Y),723)
+#define get_csv2_llong_pos723(X,Y) get_csv2_llong((X),(Y),723)
+#define get_csv2_float_pos723(X,Y) get_csv2_float((X),(Y),723)
+#define get_csv2_uint_pos724(X,Y) get_csv2_uint((X),(Y),724)
+#define get_csv2_ullong_pos724(X,Y) get_csv2_ullong((X),(Y),724)
+#define get_csv2_ip_pos724(X,Y) get_csv2_ip((X),(Y),724)
+#define get_csv2_ipv6_pos724(X,Y) get_csv2_ipv6((X),(Y),724)
+#define get_csv2_string_pos724(X,Y) get_csv2_string((X),(Y),724)
+#define get_csv2_v_str_pos724(X,Y) get_csv2_string((X),(Y),724)
+#define get_csv2_bool_pos724(X,Y) get_csv2_bool((X),(Y),724)
+#define get_csv2_int_pos724(X,Y) get_csv2_int((X),(Y),724)
+#define get_csv2_llong_pos724(X,Y) get_csv2_llong((X),(Y),724)
+#define get_csv2_float_pos724(X,Y) get_csv2_float((X),(Y),724)
+#define get_csv2_uint_pos725(X,Y) get_csv2_uint((X),(Y),725)
+#define get_csv2_ullong_pos725(X,Y) get_csv2_ullong((X),(Y),725)
+#define get_csv2_ip_pos725(X,Y) get_csv2_ip((X),(Y),725)
+#define get_csv2_ipv6_pos725(X,Y) get_csv2_ipv6((X),(Y),725)
+#define get_csv2_string_pos725(X,Y) get_csv2_string((X),(Y),725)
+#define get_csv2_v_str_pos725(X,Y) get_csv2_string((X),(Y),725)
+#define get_csv2_bool_pos725(X,Y) get_csv2_bool((X),(Y),725)
+#define get_csv2_int_pos725(X,Y) get_csv2_int((X),(Y),725)
+#define get_csv2_llong_pos725(X,Y) get_csv2_llong((X),(Y),725)
+#define get_csv2_float_pos725(X,Y) get_csv2_float((X),(Y),725)
+#define get_csv2_uint_pos726(X,Y) get_csv2_uint((X),(Y),726)
+#define get_csv2_ullong_pos726(X,Y) get_csv2_ullong((X),(Y),726)
+#define get_csv2_ip_pos726(X,Y) get_csv2_ip((X),(Y),726)
+#define get_csv2_ipv6_pos726(X,Y) get_csv2_ipv6((X),(Y),726)
+#define get_csv2_string_pos726(X,Y) get_csv2_string((X),(Y),726)
+#define get_csv2_v_str_pos726(X,Y) get_csv2_string((X),(Y),726)
+#define get_csv2_bool_pos726(X,Y) get_csv2_bool((X),(Y),726)
+#define get_csv2_int_pos726(X,Y) get_csv2_int((X),(Y),726)
+#define get_csv2_llong_pos726(X,Y) get_csv2_llong((X),(Y),726)
+#define get_csv2_float_pos726(X,Y) get_csv2_float((X),(Y),726)
+#define get_csv2_uint_pos727(X,Y) get_csv2_uint((X),(Y),727)
+#define get_csv2_ullong_pos727(X,Y) get_csv2_ullong((X),(Y),727)
+#define get_csv2_ip_pos727(X,Y) get_csv2_ip((X),(Y),727)
+#define get_csv2_ipv6_pos727(X,Y) get_csv2_ipv6((X),(Y),727)
+#define get_csv2_string_pos727(X,Y) get_csv2_string((X),(Y),727)
+#define get_csv2_v_str_pos727(X,Y) get_csv2_string((X),(Y),727)
+#define get_csv2_bool_pos727(X,Y) get_csv2_bool((X),(Y),727)
+#define get_csv2_int_pos727(X,Y) get_csv2_int((X),(Y),727)
+#define get_csv2_llong_pos727(X,Y) get_csv2_llong((X),(Y),727)
+#define get_csv2_float_pos727(X,Y) get_csv2_float((X),(Y),727)
+#define get_csv2_uint_pos728(X,Y) get_csv2_uint((X),(Y),728)
+#define get_csv2_ullong_pos728(X,Y) get_csv2_ullong((X),(Y),728)
+#define get_csv2_ip_pos728(X,Y) get_csv2_ip((X),(Y),728)
+#define get_csv2_ipv6_pos728(X,Y) get_csv2_ipv6((X),(Y),728)
+#define get_csv2_string_pos728(X,Y) get_csv2_string((X),(Y),728)
+#define get_csv2_v_str_pos728(X,Y) get_csv2_string((X),(Y),728)
+#define get_csv2_bool_pos728(X,Y) get_csv2_bool((X),(Y),728)
+#define get_csv2_int_pos728(X,Y) get_csv2_int((X),(Y),728)
+#define get_csv2_llong_pos728(X,Y) get_csv2_llong((X),(Y),728)
+#define get_csv2_float_pos728(X,Y) get_csv2_float((X),(Y),728)
+#define get_csv2_uint_pos729(X,Y) get_csv2_uint((X),(Y),729)
+#define get_csv2_ullong_pos729(X,Y) get_csv2_ullong((X),(Y),729)
+#define get_csv2_ip_pos729(X,Y) get_csv2_ip((X),(Y),729)
+#define get_csv2_ipv6_pos729(X,Y) get_csv2_ipv6((X),(Y),729)
+#define get_csv2_string_pos729(X,Y) get_csv2_string((X),(Y),729)
+#define get_csv2_v_str_pos729(X,Y) get_csv2_string((X),(Y),729)
+#define get_csv2_bool_pos729(X,Y) get_csv2_bool((X),(Y),729)
+#define get_csv2_int_pos729(X,Y) get_csv2_int((X),(Y),729)
+#define get_csv2_llong_pos729(X,Y) get_csv2_llong((X),(Y),729)
+#define get_csv2_float_pos729(X,Y) get_csv2_float((X),(Y),729)
+#define get_csv2_uint_pos730(X,Y) get_csv2_uint((X),(Y),730)
+#define get_csv2_ullong_pos730(X,Y) get_csv2_ullong((X),(Y),730)
+#define get_csv2_ip_pos730(X,Y) get_csv2_ip((X),(Y),730)
+#define get_csv2_ipv6_pos730(X,Y) get_csv2_ipv6((X),(Y),730)
+#define get_csv2_string_pos730(X,Y) get_csv2_string((X),(Y),730)
+#define get_csv2_v_str_pos730(X,Y) get_csv2_string((X),(Y),730)
+#define get_csv2_bool_pos730(X,Y) get_csv2_bool((X),(Y),730)
+#define get_csv2_int_pos730(X,Y) get_csv2_int((X),(Y),730)
+#define get_csv2_llong_pos730(X,Y) get_csv2_llong((X),(Y),730)
+#define get_csv2_float_pos730(X,Y) get_csv2_float((X),(Y),730)
+#define get_csv2_uint_pos731(X,Y) get_csv2_uint((X),(Y),731)
+#define get_csv2_ullong_pos731(X,Y) get_csv2_ullong((X),(Y),731)
+#define get_csv2_ip_pos731(X,Y) get_csv2_ip((X),(Y),731)
+#define get_csv2_ipv6_pos731(X,Y) get_csv2_ipv6((X),(Y),731)
+#define get_csv2_string_pos731(X,Y) get_csv2_string((X),(Y),731)
+#define get_csv2_v_str_pos731(X,Y) get_csv2_string((X),(Y),731)
+#define get_csv2_bool_pos731(X,Y) get_csv2_bool((X),(Y),731)
+#define get_csv2_int_pos731(X,Y) get_csv2_int((X),(Y),731)
+#define get_csv2_llong_pos731(X,Y) get_csv2_llong((X),(Y),731)
+#define get_csv2_float_pos731(X,Y) get_csv2_float((X),(Y),731)
+#define get_csv2_uint_pos732(X,Y) get_csv2_uint((X),(Y),732)
+#define get_csv2_ullong_pos732(X,Y) get_csv2_ullong((X),(Y),732)
+#define get_csv2_ip_pos732(X,Y) get_csv2_ip((X),(Y),732)
+#define get_csv2_ipv6_pos732(X,Y) get_csv2_ipv6((X),(Y),732)
+#define get_csv2_string_pos732(X,Y) get_csv2_string((X),(Y),732)
+#define get_csv2_v_str_pos732(X,Y) get_csv2_string((X),(Y),732)
+#define get_csv2_bool_pos732(X,Y) get_csv2_bool((X),(Y),732)
+#define get_csv2_int_pos732(X,Y) get_csv2_int((X),(Y),732)
+#define get_csv2_llong_pos732(X,Y) get_csv2_llong((X),(Y),732)
+#define get_csv2_float_pos732(X,Y) get_csv2_float((X),(Y),732)
+#define get_csv2_uint_pos733(X,Y) get_csv2_uint((X),(Y),733)
+#define get_csv2_ullong_pos733(X,Y) get_csv2_ullong((X),(Y),733)
+#define get_csv2_ip_pos733(X,Y) get_csv2_ip((X),(Y),733)
+#define get_csv2_ipv6_pos733(X,Y) get_csv2_ipv6((X),(Y),733)
+#define get_csv2_string_pos733(X,Y) get_csv2_string((X),(Y),733)
+#define get_csv2_v_str_pos733(X,Y) get_csv2_string((X),(Y),733)
+#define get_csv2_bool_pos733(X,Y) get_csv2_bool((X),(Y),733)
+#define get_csv2_int_pos733(X,Y) get_csv2_int((X),(Y),733)
+#define get_csv2_llong_pos733(X,Y) get_csv2_llong((X),(Y),733)
+#define get_csv2_float_pos733(X,Y) get_csv2_float((X),(Y),733)
+#define get_csv2_uint_pos734(X,Y) get_csv2_uint((X),(Y),734)
+#define get_csv2_ullong_pos734(X,Y) get_csv2_ullong((X),(Y),734)
+#define get_csv2_ip_pos734(X,Y) get_csv2_ip((X),(Y),734)
+#define get_csv2_ipv6_pos734(X,Y) get_csv2_ipv6((X),(Y),734)
+#define get_csv2_string_pos734(X,Y) get_csv2_string((X),(Y),734)
+#define get_csv2_v_str_pos734(X,Y) get_csv2_string((X),(Y),734)
+#define get_csv2_bool_pos734(X,Y) get_csv2_bool((X),(Y),734)
+#define get_csv2_int_pos734(X,Y) get_csv2_int((X),(Y),734)
+#define get_csv2_llong_pos734(X,Y) get_csv2_llong((X),(Y),734)
+#define get_csv2_float_pos734(X,Y) get_csv2_float((X),(Y),734)
+#define get_csv2_uint_pos735(X,Y) get_csv2_uint((X),(Y),735)
+#define get_csv2_ullong_pos735(X,Y) get_csv2_ullong((X),(Y),735)
+#define get_csv2_ip_pos735(X,Y) get_csv2_ip((X),(Y),735)
+#define get_csv2_ipv6_pos735(X,Y) get_csv2_ipv6((X),(Y),735)
+#define get_csv2_string_pos735(X,Y) get_csv2_string((X),(Y),735)
+#define get_csv2_v_str_pos735(X,Y) get_csv2_string((X),(Y),735)
+#define get_csv2_bool_pos735(X,Y) get_csv2_bool((X),(Y),735)
+#define get_csv2_int_pos735(X,Y) get_csv2_int((X),(Y),735)
+#define get_csv2_llong_pos735(X,Y) get_csv2_llong((X),(Y),735)
+#define get_csv2_float_pos735(X,Y) get_csv2_float((X),(Y),735)
+#define get_csv2_uint_pos736(X,Y) get_csv2_uint((X),(Y),736)
+#define get_csv2_ullong_pos736(X,Y) get_csv2_ullong((X),(Y),736)
+#define get_csv2_ip_pos736(X,Y) get_csv2_ip((X),(Y),736)
+#define get_csv2_ipv6_pos736(X,Y) get_csv2_ipv6((X),(Y),736)
+#define get_csv2_string_pos736(X,Y) get_csv2_string((X),(Y),736)
+#define get_csv2_v_str_pos736(X,Y) get_csv2_string((X),(Y),736)
+#define get_csv2_bool_pos736(X,Y) get_csv2_bool((X),(Y),736)
+#define get_csv2_int_pos736(X,Y) get_csv2_int((X),(Y),736)
+#define get_csv2_llong_pos736(X,Y) get_csv2_llong((X),(Y),736)
+#define get_csv2_float_pos736(X,Y) get_csv2_float((X),(Y),736)
+#define get_csv2_uint_pos737(X,Y) get_csv2_uint((X),(Y),737)
+#define get_csv2_ullong_pos737(X,Y) get_csv2_ullong((X),(Y),737)
+#define get_csv2_ip_pos737(X,Y) get_csv2_ip((X),(Y),737)
+#define get_csv2_ipv6_pos737(X,Y) get_csv2_ipv6((X),(Y),737)
+#define get_csv2_string_pos737(X,Y) get_csv2_string((X),(Y),737)
+#define get_csv2_v_str_pos737(X,Y) get_csv2_string((X),(Y),737)
+#define get_csv2_bool_pos737(X,Y) get_csv2_bool((X),(Y),737)
+#define get_csv2_int_pos737(X,Y) get_csv2_int((X),(Y),737)
+#define get_csv2_llong_pos737(X,Y) get_csv2_llong((X),(Y),737)
+#define get_csv2_float_pos737(X,Y) get_csv2_float((X),(Y),737)
+#define get_csv2_uint_pos738(X,Y) get_csv2_uint((X),(Y),738)
+#define get_csv2_ullong_pos738(X,Y) get_csv2_ullong((X),(Y),738)
+#define get_csv2_ip_pos738(X,Y) get_csv2_ip((X),(Y),738)
+#define get_csv2_ipv6_pos738(X,Y) get_csv2_ipv6((X),(Y),738)
+#define get_csv2_string_pos738(X,Y) get_csv2_string((X),(Y),738)
+#define get_csv2_v_str_pos738(X,Y) get_csv2_string((X),(Y),738)
+#define get_csv2_bool_pos738(X,Y) get_csv2_bool((X),(Y),738)
+#define get_csv2_int_pos738(X,Y) get_csv2_int((X),(Y),738)
+#define get_csv2_llong_pos738(X,Y) get_csv2_llong((X),(Y),738)
+#define get_csv2_float_pos738(X,Y) get_csv2_float((X),(Y),738)
+#define get_csv2_uint_pos739(X,Y) get_csv2_uint((X),(Y),739)
+#define get_csv2_ullong_pos739(X,Y) get_csv2_ullong((X),(Y),739)
+#define get_csv2_ip_pos739(X,Y) get_csv2_ip((X),(Y),739)
+#define get_csv2_ipv6_pos739(X,Y) get_csv2_ipv6((X),(Y),739)
+#define get_csv2_string_pos739(X,Y) get_csv2_string((X),(Y),739)
+#define get_csv2_v_str_pos739(X,Y) get_csv2_string((X),(Y),739)
+#define get_csv2_bool_pos739(X,Y) get_csv2_bool((X),(Y),739)
+#define get_csv2_int_pos739(X,Y) get_csv2_int((X),(Y),739)
+#define get_csv2_llong_pos739(X,Y) get_csv2_llong((X),(Y),739)
+#define get_csv2_float_pos739(X,Y) get_csv2_float((X),(Y),739)
+#define get_csv2_uint_pos740(X,Y) get_csv2_uint((X),(Y),740)
+#define get_csv2_ullong_pos740(X,Y) get_csv2_ullong((X),(Y),740)
+#define get_csv2_ip_pos740(X,Y) get_csv2_ip((X),(Y),740)
+#define get_csv2_ipv6_pos740(X,Y) get_csv2_ipv6((X),(Y),740)
+#define get_csv2_string_pos740(X,Y) get_csv2_string((X),(Y),740)
+#define get_csv2_v_str_pos740(X,Y) get_csv2_string((X),(Y),740)
+#define get_csv2_bool_pos740(X,Y) get_csv2_bool((X),(Y),740)
+#define get_csv2_int_pos740(X,Y) get_csv2_int((X),(Y),740)
+#define get_csv2_llong_pos740(X,Y) get_csv2_llong((X),(Y),740)
+#define get_csv2_float_pos740(X,Y) get_csv2_float((X),(Y),740)
+#define get_csv2_uint_pos741(X,Y) get_csv2_uint((X),(Y),741)
+#define get_csv2_ullong_pos741(X,Y) get_csv2_ullong((X),(Y),741)
+#define get_csv2_ip_pos741(X,Y) get_csv2_ip((X),(Y),741)
+#define get_csv2_ipv6_pos741(X,Y) get_csv2_ipv6((X),(Y),741)
+#define get_csv2_string_pos741(X,Y) get_csv2_string((X),(Y),741)
+#define get_csv2_v_str_pos741(X,Y) get_csv2_string((X),(Y),741)
+#define get_csv2_bool_pos741(X,Y) get_csv2_bool((X),(Y),741)
+#define get_csv2_int_pos741(X,Y) get_csv2_int((X),(Y),741)
+#define get_csv2_llong_pos741(X,Y) get_csv2_llong((X),(Y),741)
+#define get_csv2_float_pos741(X,Y) get_csv2_float((X),(Y),741)
+#define get_csv2_uint_pos742(X,Y) get_csv2_uint((X),(Y),742)
+#define get_csv2_ullong_pos742(X,Y) get_csv2_ullong((X),(Y),742)
+#define get_csv2_ip_pos742(X,Y) get_csv2_ip((X),(Y),742)
+#define get_csv2_ipv6_pos742(X,Y) get_csv2_ipv6((X),(Y),742)
+#define get_csv2_string_pos742(X,Y) get_csv2_string((X),(Y),742)
+#define get_csv2_v_str_pos742(X,Y) get_csv2_string((X),(Y),742)
+#define get_csv2_bool_pos742(X,Y) get_csv2_bool((X),(Y),742)
+#define get_csv2_int_pos742(X,Y) get_csv2_int((X),(Y),742)
+#define get_csv2_llong_pos742(X,Y) get_csv2_llong((X),(Y),742)
+#define get_csv2_float_pos742(X,Y) get_csv2_float((X),(Y),742)
+#define get_csv2_uint_pos743(X,Y) get_csv2_uint((X),(Y),743)
+#define get_csv2_ullong_pos743(X,Y) get_csv2_ullong((X),(Y),743)
+#define get_csv2_ip_pos743(X,Y) get_csv2_ip((X),(Y),743)
+#define get_csv2_ipv6_pos743(X,Y) get_csv2_ipv6((X),(Y),743)
+#define get_csv2_string_pos743(X,Y) get_csv2_string((X),(Y),743)
+#define get_csv2_v_str_pos743(X,Y) get_csv2_string((X),(Y),743)
+#define get_csv2_bool_pos743(X,Y) get_csv2_bool((X),(Y),743)
+#define get_csv2_int_pos743(X,Y) get_csv2_int((X),(Y),743)
+#define get_csv2_llong_pos743(X,Y) get_csv2_llong((X),(Y),743)
+#define get_csv2_float_pos743(X,Y) get_csv2_float((X),(Y),743)
+#define get_csv2_uint_pos744(X,Y) get_csv2_uint((X),(Y),744)
+#define get_csv2_ullong_pos744(X,Y) get_csv2_ullong((X),(Y),744)
+#define get_csv2_ip_pos744(X,Y) get_csv2_ip((X),(Y),744)
+#define get_csv2_ipv6_pos744(X,Y) get_csv2_ipv6((X),(Y),744)
+#define get_csv2_string_pos744(X,Y) get_csv2_string((X),(Y),744)
+#define get_csv2_v_str_pos744(X,Y) get_csv2_string((X),(Y),744)
+#define get_csv2_bool_pos744(X,Y) get_csv2_bool((X),(Y),744)
+#define get_csv2_int_pos744(X,Y) get_csv2_int((X),(Y),744)
+#define get_csv2_llong_pos744(X,Y) get_csv2_llong((X),(Y),744)
+#define get_csv2_float_pos744(X,Y) get_csv2_float((X),(Y),744)
+#define get_csv2_uint_pos745(X,Y) get_csv2_uint((X),(Y),745)
+#define get_csv2_ullong_pos745(X,Y) get_csv2_ullong((X),(Y),745)
+#define get_csv2_ip_pos745(X,Y) get_csv2_ip((X),(Y),745)
+#define get_csv2_ipv6_pos745(X,Y) get_csv2_ipv6((X),(Y),745)
+#define get_csv2_string_pos745(X,Y) get_csv2_string((X),(Y),745)
+#define get_csv2_v_str_pos745(X,Y) get_csv2_string((X),(Y),745)
+#define get_csv2_bool_pos745(X,Y) get_csv2_bool((X),(Y),745)
+#define get_csv2_int_pos745(X,Y) get_csv2_int((X),(Y),745)
+#define get_csv2_llong_pos745(X,Y) get_csv2_llong((X),(Y),745)
+#define get_csv2_float_pos745(X,Y) get_csv2_float((X),(Y),745)
+#define get_csv2_uint_pos746(X,Y) get_csv2_uint((X),(Y),746)
+#define get_csv2_ullong_pos746(X,Y) get_csv2_ullong((X),(Y),746)
+#define get_csv2_ip_pos746(X,Y) get_csv2_ip((X),(Y),746)
+#define get_csv2_ipv6_pos746(X,Y) get_csv2_ipv6((X),(Y),746)
+#define get_csv2_string_pos746(X,Y) get_csv2_string((X),(Y),746)
+#define get_csv2_v_str_pos746(X,Y) get_csv2_string((X),(Y),746)
+#define get_csv2_bool_pos746(X,Y) get_csv2_bool((X),(Y),746)
+#define get_csv2_int_pos746(X,Y) get_csv2_int((X),(Y),746)
+#define get_csv2_llong_pos746(X,Y) get_csv2_llong((X),(Y),746)
+#define get_csv2_float_pos746(X,Y) get_csv2_float((X),(Y),746)
+#define get_csv2_uint_pos747(X,Y) get_csv2_uint((X),(Y),747)
+#define get_csv2_ullong_pos747(X,Y) get_csv2_ullong((X),(Y),747)
+#define get_csv2_ip_pos747(X,Y) get_csv2_ip((X),(Y),747)
+#define get_csv2_ipv6_pos747(X,Y) get_csv2_ipv6((X),(Y),747)
+#define get_csv2_string_pos747(X,Y) get_csv2_string((X),(Y),747)
+#define get_csv2_v_str_pos747(X,Y) get_csv2_string((X),(Y),747)
+#define get_csv2_bool_pos747(X,Y) get_csv2_bool((X),(Y),747)
+#define get_csv2_int_pos747(X,Y) get_csv2_int((X),(Y),747)
+#define get_csv2_llong_pos747(X,Y) get_csv2_llong((X),(Y),747)
+#define get_csv2_float_pos747(X,Y) get_csv2_float((X),(Y),747)
+#define get_csv2_uint_pos748(X,Y) get_csv2_uint((X),(Y),748)
+#define get_csv2_ullong_pos748(X,Y) get_csv2_ullong((X),(Y),748)
+#define get_csv2_ip_pos748(X,Y) get_csv2_ip((X),(Y),748)
+#define get_csv2_ipv6_pos748(X,Y) get_csv2_ipv6((X),(Y),748)
+#define get_csv2_string_pos748(X,Y) get_csv2_string((X),(Y),748)
+#define get_csv2_v_str_pos748(X,Y) get_csv2_string((X),(Y),748)
+#define get_csv2_bool_pos748(X,Y) get_csv2_bool((X),(Y),748)
+#define get_csv2_int_pos748(X,Y) get_csv2_int((X),(Y),748)
+#define get_csv2_llong_pos748(X,Y) get_csv2_llong((X),(Y),748)
+#define get_csv2_float_pos748(X,Y) get_csv2_float((X),(Y),748)
+#define get_csv2_uint_pos749(X,Y) get_csv2_uint((X),(Y),749)
+#define get_csv2_ullong_pos749(X,Y) get_csv2_ullong((X),(Y),749)
+#define get_csv2_ip_pos749(X,Y) get_csv2_ip((X),(Y),749)
+#define get_csv2_ipv6_pos749(X,Y) get_csv2_ipv6((X),(Y),749)
+#define get_csv2_string_pos749(X,Y) get_csv2_string((X),(Y),749)
+#define get_csv2_v_str_pos749(X,Y) get_csv2_string((X),(Y),749)
+#define get_csv2_bool_pos749(X,Y) get_csv2_bool((X),(Y),749)
+#define get_csv2_int_pos749(X,Y) get_csv2_int((X),(Y),749)
+#define get_csv2_llong_pos749(X,Y) get_csv2_llong((X),(Y),749)
+#define get_csv2_float_pos749(X,Y) get_csv2_float((X),(Y),749)
+#define get_csv2_uint_pos750(X,Y) get_csv2_uint((X),(Y),750)
+#define get_csv2_ullong_pos750(X,Y) get_csv2_ullong((X),(Y),750)
+#define get_csv2_ip_pos750(X,Y) get_csv2_ip((X),(Y),750)
+#define get_csv2_ipv6_pos750(X,Y) get_csv2_ipv6((X),(Y),750)
+#define get_csv2_string_pos750(X,Y) get_csv2_string((X),(Y),750)
+#define get_csv2_v_str_pos750(X,Y) get_csv2_string((X),(Y),750)
+#define get_csv2_bool_pos750(X,Y) get_csv2_bool((X),(Y),750)
+#define get_csv2_int_pos750(X,Y) get_csv2_int((X),(Y),750)
+#define get_csv2_llong_pos750(X,Y) get_csv2_llong((X),(Y),750)
+#define get_csv2_float_pos750(X,Y) get_csv2_float((X),(Y),750)
+#define get_csv2_uint_pos751(X,Y) get_csv2_uint((X),(Y),751)
+#define get_csv2_ullong_pos751(X,Y) get_csv2_ullong((X),(Y),751)
+#define get_csv2_ip_pos751(X,Y) get_csv2_ip((X),(Y),751)
+#define get_csv2_ipv6_pos751(X,Y) get_csv2_ipv6((X),(Y),751)
+#define get_csv2_string_pos751(X,Y) get_csv2_string((X),(Y),751)
+#define get_csv2_v_str_pos751(X,Y) get_csv2_string((X),(Y),751)
+#define get_csv2_bool_pos751(X,Y) get_csv2_bool((X),(Y),751)
+#define get_csv2_int_pos751(X,Y) get_csv2_int((X),(Y),751)
+#define get_csv2_llong_pos751(X,Y) get_csv2_llong((X),(Y),751)
+#define get_csv2_float_pos751(X,Y) get_csv2_float((X),(Y),751)
+#define get_csv2_uint_pos752(X,Y) get_csv2_uint((X),(Y),752)
+#define get_csv2_ullong_pos752(X,Y) get_csv2_ullong((X),(Y),752)
+#define get_csv2_ip_pos752(X,Y) get_csv2_ip((X),(Y),752)
+#define get_csv2_ipv6_pos752(X,Y) get_csv2_ipv6((X),(Y),752)
+#define get_csv2_string_pos752(X,Y) get_csv2_string((X),(Y),752)
+#define get_csv2_v_str_pos752(X,Y) get_csv2_string((X),(Y),752)
+#define get_csv2_bool_pos752(X,Y) get_csv2_bool((X),(Y),752)
+#define get_csv2_int_pos752(X,Y) get_csv2_int((X),(Y),752)
+#define get_csv2_llong_pos752(X,Y) get_csv2_llong((X),(Y),752)
+#define get_csv2_float_pos752(X,Y) get_csv2_float((X),(Y),752)
+#define get_csv2_uint_pos753(X,Y) get_csv2_uint((X),(Y),753)
+#define get_csv2_ullong_pos753(X,Y) get_csv2_ullong((X),(Y),753)
+#define get_csv2_ip_pos753(X,Y) get_csv2_ip((X),(Y),753)
+#define get_csv2_ipv6_pos753(X,Y) get_csv2_ipv6((X),(Y),753)
+#define get_csv2_string_pos753(X,Y) get_csv2_string((X),(Y),753)
+#define get_csv2_v_str_pos753(X,Y) get_csv2_string((X),(Y),753)
+#define get_csv2_bool_pos753(X,Y) get_csv2_bool((X),(Y),753)
+#define get_csv2_int_pos753(X,Y) get_csv2_int((X),(Y),753)
+#define get_csv2_llong_pos753(X,Y) get_csv2_llong((X),(Y),753)
+#define get_csv2_float_pos753(X,Y) get_csv2_float((X),(Y),753)
+#define get_csv2_uint_pos754(X,Y) get_csv2_uint((X),(Y),754)
+#define get_csv2_ullong_pos754(X,Y) get_csv2_ullong((X),(Y),754)
+#define get_csv2_ip_pos754(X,Y) get_csv2_ip((X),(Y),754)
+#define get_csv2_ipv6_pos754(X,Y) get_csv2_ipv6((X),(Y),754)
+#define get_csv2_string_pos754(X,Y) get_csv2_string((X),(Y),754)
+#define get_csv2_v_str_pos754(X,Y) get_csv2_string((X),(Y),754)
+#define get_csv2_bool_pos754(X,Y) get_csv2_bool((X),(Y),754)
+#define get_csv2_int_pos754(X,Y) get_csv2_int((X),(Y),754)
+#define get_csv2_llong_pos754(X,Y) get_csv2_llong((X),(Y),754)
+#define get_csv2_float_pos754(X,Y) get_csv2_float((X),(Y),754)
+#define get_csv2_uint_pos755(X,Y) get_csv2_uint((X),(Y),755)
+#define get_csv2_ullong_pos755(X,Y) get_csv2_ullong((X),(Y),755)
+#define get_csv2_ip_pos755(X,Y) get_csv2_ip((X),(Y),755)
+#define get_csv2_ipv6_pos755(X,Y) get_csv2_ipv6((X),(Y),755)
+#define get_csv2_string_pos755(X,Y) get_csv2_string((X),(Y),755)
+#define get_csv2_v_str_pos755(X,Y) get_csv2_string((X),(Y),755)
+#define get_csv2_bool_pos755(X,Y) get_csv2_bool((X),(Y),755)
+#define get_csv2_int_pos755(X,Y) get_csv2_int((X),(Y),755)
+#define get_csv2_llong_pos755(X,Y) get_csv2_llong((X),(Y),755)
+#define get_csv2_float_pos755(X,Y) get_csv2_float((X),(Y),755)
+#define get_csv2_uint_pos756(X,Y) get_csv2_uint((X),(Y),756)
+#define get_csv2_ullong_pos756(X,Y) get_csv2_ullong((X),(Y),756)
+#define get_csv2_ip_pos756(X,Y) get_csv2_ip((X),(Y),756)
+#define get_csv2_ipv6_pos756(X,Y) get_csv2_ipv6((X),(Y),756)
+#define get_csv2_string_pos756(X,Y) get_csv2_string((X),(Y),756)
+#define get_csv2_v_str_pos756(X,Y) get_csv2_string((X),(Y),756)
+#define get_csv2_bool_pos756(X,Y) get_csv2_bool((X),(Y),756)
+#define get_csv2_int_pos756(X,Y) get_csv2_int((X),(Y),756)
+#define get_csv2_llong_pos756(X,Y) get_csv2_llong((X),(Y),756)
+#define get_csv2_float_pos756(X,Y) get_csv2_float((X),(Y),756)
+#define get_csv2_uint_pos757(X,Y) get_csv2_uint((X),(Y),757)
+#define get_csv2_ullong_pos757(X,Y) get_csv2_ullong((X),(Y),757)
+#define get_csv2_ip_pos757(X,Y) get_csv2_ip((X),(Y),757)
+#define get_csv2_ipv6_pos757(X,Y) get_csv2_ipv6((X),(Y),757)
+#define get_csv2_string_pos757(X,Y) get_csv2_string((X),(Y),757)
+#define get_csv2_v_str_pos757(X,Y) get_csv2_string((X),(Y),757)
+#define get_csv2_bool_pos757(X,Y) get_csv2_bool((X),(Y),757)
+#define get_csv2_int_pos757(X,Y) get_csv2_int((X),(Y),757)
+#define get_csv2_llong_pos757(X,Y) get_csv2_llong((X),(Y),757)
+#define get_csv2_float_pos757(X,Y) get_csv2_float((X),(Y),757)
+#define get_csv2_uint_pos758(X,Y) get_csv2_uint((X),(Y),758)
+#define get_csv2_ullong_pos758(X,Y) get_csv2_ullong((X),(Y),758)
+#define get_csv2_ip_pos758(X,Y) get_csv2_ip((X),(Y),758)
+#define get_csv2_ipv6_pos758(X,Y) get_csv2_ipv6((X),(Y),758)
+#define get_csv2_string_pos758(X,Y) get_csv2_string((X),(Y),758)
+#define get_csv2_v_str_pos758(X,Y) get_csv2_string((X),(Y),758)
+#define get_csv2_bool_pos758(X,Y) get_csv2_bool((X),(Y),758)
+#define get_csv2_int_pos758(X,Y) get_csv2_int((X),(Y),758)
+#define get_csv2_llong_pos758(X,Y) get_csv2_llong((X),(Y),758)
+#define get_csv2_float_pos758(X,Y) get_csv2_float((X),(Y),758)
+#define get_csv2_uint_pos759(X,Y) get_csv2_uint((X),(Y),759)
+#define get_csv2_ullong_pos759(X,Y) get_csv2_ullong((X),(Y),759)
+#define get_csv2_ip_pos759(X,Y) get_csv2_ip((X),(Y),759)
+#define get_csv2_ipv6_pos759(X,Y) get_csv2_ipv6((X),(Y),759)
+#define get_csv2_string_pos759(X,Y) get_csv2_string((X),(Y),759)
+#define get_csv2_v_str_pos759(X,Y) get_csv2_string((X),(Y),759)
+#define get_csv2_bool_pos759(X,Y) get_csv2_bool((X),(Y),759)
+#define get_csv2_int_pos759(X,Y) get_csv2_int((X),(Y),759)
+#define get_csv2_llong_pos759(X,Y) get_csv2_llong((X),(Y),759)
+#define get_csv2_float_pos759(X,Y) get_csv2_float((X),(Y),759)
+#define get_csv2_uint_pos760(X,Y) get_csv2_uint((X),(Y),760)
+#define get_csv2_ullong_pos760(X,Y) get_csv2_ullong((X),(Y),760)
+#define get_csv2_ip_pos760(X,Y) get_csv2_ip((X),(Y),760)
+#define get_csv2_ipv6_pos760(X,Y) get_csv2_ipv6((X),(Y),760)
+#define get_csv2_string_pos760(X,Y) get_csv2_string((X),(Y),760)
+#define get_csv2_v_str_pos760(X,Y) get_csv2_string((X),(Y),760)
+#define get_csv2_bool_pos760(X,Y) get_csv2_bool((X),(Y),760)
+#define get_csv2_int_pos760(X,Y) get_csv2_int((X),(Y),760)
+#define get_csv2_llong_pos760(X,Y) get_csv2_llong((X),(Y),760)
+#define get_csv2_float_pos760(X,Y) get_csv2_float((X),(Y),760)
+#define get_csv2_uint_pos761(X,Y) get_csv2_uint((X),(Y),761)
+#define get_csv2_ullong_pos761(X,Y) get_csv2_ullong((X),(Y),761)
+#define get_csv2_ip_pos761(X,Y) get_csv2_ip((X),(Y),761)
+#define get_csv2_ipv6_pos761(X,Y) get_csv2_ipv6((X),(Y),761)
+#define get_csv2_string_pos761(X,Y) get_csv2_string((X),(Y),761)
+#define get_csv2_v_str_pos761(X,Y) get_csv2_string((X),(Y),761)
+#define get_csv2_bool_pos761(X,Y) get_csv2_bool((X),(Y),761)
+#define get_csv2_int_pos761(X,Y) get_csv2_int((X),(Y),761)
+#define get_csv2_llong_pos761(X,Y) get_csv2_llong((X),(Y),761)
+#define get_csv2_float_pos761(X,Y) get_csv2_float((X),(Y),761)
+#define get_csv2_uint_pos762(X,Y) get_csv2_uint((X),(Y),762)
+#define get_csv2_ullong_pos762(X,Y) get_csv2_ullong((X),(Y),762)
+#define get_csv2_ip_pos762(X,Y) get_csv2_ip((X),(Y),762)
+#define get_csv2_ipv6_pos762(X,Y) get_csv2_ipv6((X),(Y),762)
+#define get_csv2_string_pos762(X,Y) get_csv2_string((X),(Y),762)
+#define get_csv2_v_str_pos762(X,Y) get_csv2_string((X),(Y),762)
+#define get_csv2_bool_pos762(X,Y) get_csv2_bool((X),(Y),762)
+#define get_csv2_int_pos762(X,Y) get_csv2_int((X),(Y),762)
+#define get_csv2_llong_pos762(X,Y) get_csv2_llong((X),(Y),762)
+#define get_csv2_float_pos762(X,Y) get_csv2_float((X),(Y),762)
+#define get_csv2_uint_pos763(X,Y) get_csv2_uint((X),(Y),763)
+#define get_csv2_ullong_pos763(X,Y) get_csv2_ullong((X),(Y),763)
+#define get_csv2_ip_pos763(X,Y) get_csv2_ip((X),(Y),763)
+#define get_csv2_ipv6_pos763(X,Y) get_csv2_ipv6((X),(Y),763)
+#define get_csv2_string_pos763(X,Y) get_csv2_string((X),(Y),763)
+#define get_csv2_v_str_pos763(X,Y) get_csv2_string((X),(Y),763)
+#define get_csv2_bool_pos763(X,Y) get_csv2_bool((X),(Y),763)
+#define get_csv2_int_pos763(X,Y) get_csv2_int((X),(Y),763)
+#define get_csv2_llong_pos763(X,Y) get_csv2_llong((X),(Y),763)
+#define get_csv2_float_pos763(X,Y) get_csv2_float((X),(Y),763)
+#define get_csv2_uint_pos764(X,Y) get_csv2_uint((X),(Y),764)
+#define get_csv2_ullong_pos764(X,Y) get_csv2_ullong((X),(Y),764)
+#define get_csv2_ip_pos764(X,Y) get_csv2_ip((X),(Y),764)
+#define get_csv2_ipv6_pos764(X,Y) get_csv2_ipv6((X),(Y),764)
+#define get_csv2_string_pos764(X,Y) get_csv2_string((X),(Y),764)
+#define get_csv2_v_str_pos764(X,Y) get_csv2_string((X),(Y),764)
+#define get_csv2_bool_pos764(X,Y) get_csv2_bool((X),(Y),764)
+#define get_csv2_int_pos764(X,Y) get_csv2_int((X),(Y),764)
+#define get_csv2_llong_pos764(X,Y) get_csv2_llong((X),(Y),764)
+#define get_csv2_float_pos764(X,Y) get_csv2_float((X),(Y),764)
+#define get_csv2_uint_pos765(X,Y) get_csv2_uint((X),(Y),765)
+#define get_csv2_ullong_pos765(X,Y) get_csv2_ullong((X),(Y),765)
+#define get_csv2_ip_pos765(X,Y) get_csv2_ip((X),(Y),765)
+#define get_csv2_ipv6_pos765(X,Y) get_csv2_ipv6((X),(Y),765)
+#define get_csv2_string_pos765(X,Y) get_csv2_string((X),(Y),765)
+#define get_csv2_v_str_pos765(X,Y) get_csv2_string((X),(Y),765)
+#define get_csv2_bool_pos765(X,Y) get_csv2_bool((X),(Y),765)
+#define get_csv2_int_pos765(X,Y) get_csv2_int((X),(Y),765)
+#define get_csv2_llong_pos765(X,Y) get_csv2_llong((X),(Y),765)
+#define get_csv2_float_pos765(X,Y) get_csv2_float((X),(Y),765)
+#define get_csv2_uint_pos766(X,Y) get_csv2_uint((X),(Y),766)
+#define get_csv2_ullong_pos766(X,Y) get_csv2_ullong((X),(Y),766)
+#define get_csv2_ip_pos766(X,Y) get_csv2_ip((X),(Y),766)
+#define get_csv2_ipv6_pos766(X,Y) get_csv2_ipv6((X),(Y),766)
+#define get_csv2_string_pos766(X,Y) get_csv2_string((X),(Y),766)
+#define get_csv2_v_str_pos766(X,Y) get_csv2_string((X),(Y),766)
+#define get_csv2_bool_pos766(X,Y) get_csv2_bool((X),(Y),766)
+#define get_csv2_int_pos766(X,Y) get_csv2_int((X),(Y),766)
+#define get_csv2_llong_pos766(X,Y) get_csv2_llong((X),(Y),766)
+#define get_csv2_float_pos766(X,Y) get_csv2_float((X),(Y),766)
+#define get_csv2_uint_pos767(X,Y) get_csv2_uint((X),(Y),767)
+#define get_csv2_ullong_pos767(X,Y) get_csv2_ullong((X),(Y),767)
+#define get_csv2_ip_pos767(X,Y) get_csv2_ip((X),(Y),767)
+#define get_csv2_ipv6_pos767(X,Y) get_csv2_ipv6((X),(Y),767)
+#define get_csv2_string_pos767(X,Y) get_csv2_string((X),(Y),767)
+#define get_csv2_v_str_pos767(X,Y) get_csv2_string((X),(Y),767)
+#define get_csv2_bool_pos767(X,Y) get_csv2_bool((X),(Y),767)
+#define get_csv2_int_pos767(X,Y) get_csv2_int((X),(Y),767)
+#define get_csv2_llong_pos767(X,Y) get_csv2_llong((X),(Y),767)
+#define get_csv2_float_pos767(X,Y) get_csv2_float((X),(Y),767)
+#define get_csv2_uint_pos768(X,Y) get_csv2_uint((X),(Y),768)
+#define get_csv2_ullong_pos768(X,Y) get_csv2_ullong((X),(Y),768)
+#define get_csv2_ip_pos768(X,Y) get_csv2_ip((X),(Y),768)
+#define get_csv2_ipv6_pos768(X,Y) get_csv2_ipv6((X),(Y),768)
+#define get_csv2_string_pos768(X,Y) get_csv2_string((X),(Y),768)
+#define get_csv2_v_str_pos768(X,Y) get_csv2_string((X),(Y),768)
+#define get_csv2_bool_pos768(X,Y) get_csv2_bool((X),(Y),768)
+#define get_csv2_int_pos768(X,Y) get_csv2_int((X),(Y),768)
+#define get_csv2_llong_pos768(X,Y) get_csv2_llong((X),(Y),768)
+#define get_csv2_float_pos768(X,Y) get_csv2_float((X),(Y),768)
+#define get_csv2_uint_pos769(X,Y) get_csv2_uint((X),(Y),769)
+#define get_csv2_ullong_pos769(X,Y) get_csv2_ullong((X),(Y),769)
+#define get_csv2_ip_pos769(X,Y) get_csv2_ip((X),(Y),769)
+#define get_csv2_ipv6_pos769(X,Y) get_csv2_ipv6((X),(Y),769)
+#define get_csv2_string_pos769(X,Y) get_csv2_string((X),(Y),769)
+#define get_csv2_v_str_pos769(X,Y) get_csv2_string((X),(Y),769)
+#define get_csv2_bool_pos769(X,Y) get_csv2_bool((X),(Y),769)
+#define get_csv2_int_pos769(X,Y) get_csv2_int((X),(Y),769)
+#define get_csv2_llong_pos769(X,Y) get_csv2_llong((X),(Y),769)
+#define get_csv2_float_pos769(X,Y) get_csv2_float((X),(Y),769)
+#define get_csv2_uint_pos770(X,Y) get_csv2_uint((X),(Y),770)
+#define get_csv2_ullong_pos770(X,Y) get_csv2_ullong((X),(Y),770)
+#define get_csv2_ip_pos770(X,Y) get_csv2_ip((X),(Y),770)
+#define get_csv2_ipv6_pos770(X,Y) get_csv2_ipv6((X),(Y),770)
+#define get_csv2_string_pos770(X,Y) get_csv2_string((X),(Y),770)
+#define get_csv2_v_str_pos770(X,Y) get_csv2_string((X),(Y),770)
+#define get_csv2_bool_pos770(X,Y) get_csv2_bool((X),(Y),770)
+#define get_csv2_int_pos770(X,Y) get_csv2_int((X),(Y),770)
+#define get_csv2_llong_pos770(X,Y) get_csv2_llong((X),(Y),770)
+#define get_csv2_float_pos770(X,Y) get_csv2_float((X),(Y),770)
+#define get_csv2_uint_pos771(X,Y) get_csv2_uint((X),(Y),771)
+#define get_csv2_ullong_pos771(X,Y) get_csv2_ullong((X),(Y),771)
+#define get_csv2_ip_pos771(X,Y) get_csv2_ip((X),(Y),771)
+#define get_csv2_ipv6_pos771(X,Y) get_csv2_ipv6((X),(Y),771)
+#define get_csv2_string_pos771(X,Y) get_csv2_string((X),(Y),771)
+#define get_csv2_v_str_pos771(X,Y) get_csv2_string((X),(Y),771)
+#define get_csv2_bool_pos771(X,Y) get_csv2_bool((X),(Y),771)
+#define get_csv2_int_pos771(X,Y) get_csv2_int((X),(Y),771)
+#define get_csv2_llong_pos771(X,Y) get_csv2_llong((X),(Y),771)
+#define get_csv2_float_pos771(X,Y) get_csv2_float((X),(Y),771)
+#define get_csv2_uint_pos772(X,Y) get_csv2_uint((X),(Y),772)
+#define get_csv2_ullong_pos772(X,Y) get_csv2_ullong((X),(Y),772)
+#define get_csv2_ip_pos772(X,Y) get_csv2_ip((X),(Y),772)
+#define get_csv2_ipv6_pos772(X,Y) get_csv2_ipv6((X),(Y),772)
+#define get_csv2_string_pos772(X,Y) get_csv2_string((X),(Y),772)
+#define get_csv2_v_str_pos772(X,Y) get_csv2_string((X),(Y),772)
+#define get_csv2_bool_pos772(X,Y) get_csv2_bool((X),(Y),772)
+#define get_csv2_int_pos772(X,Y) get_csv2_int((X),(Y),772)
+#define get_csv2_llong_pos772(X,Y) get_csv2_llong((X),(Y),772)
+#define get_csv2_float_pos772(X,Y) get_csv2_float((X),(Y),772)
+#define get_csv2_uint_pos773(X,Y) get_csv2_uint((X),(Y),773)
+#define get_csv2_ullong_pos773(X,Y) get_csv2_ullong((X),(Y),773)
+#define get_csv2_ip_pos773(X,Y) get_csv2_ip((X),(Y),773)
+#define get_csv2_ipv6_pos773(X,Y) get_csv2_ipv6((X),(Y),773)
+#define get_csv2_string_pos773(X,Y) get_csv2_string((X),(Y),773)
+#define get_csv2_v_str_pos773(X,Y) get_csv2_string((X),(Y),773)
+#define get_csv2_bool_pos773(X,Y) get_csv2_bool((X),(Y),773)
+#define get_csv2_int_pos773(X,Y) get_csv2_int((X),(Y),773)
+#define get_csv2_llong_pos773(X,Y) get_csv2_llong((X),(Y),773)
+#define get_csv2_float_pos773(X,Y) get_csv2_float((X),(Y),773)
+#define get_csv2_uint_pos774(X,Y) get_csv2_uint((X),(Y),774)
+#define get_csv2_ullong_pos774(X,Y) get_csv2_ullong((X),(Y),774)
+#define get_csv2_ip_pos774(X,Y) get_csv2_ip((X),(Y),774)
+#define get_csv2_ipv6_pos774(X,Y) get_csv2_ipv6((X),(Y),774)
+#define get_csv2_string_pos774(X,Y) get_csv2_string((X),(Y),774)
+#define get_csv2_v_str_pos774(X,Y) get_csv2_string((X),(Y),774)
+#define get_csv2_bool_pos774(X,Y) get_csv2_bool((X),(Y),774)
+#define get_csv2_int_pos774(X,Y) get_csv2_int((X),(Y),774)
+#define get_csv2_llong_pos774(X,Y) get_csv2_llong((X),(Y),774)
+#define get_csv2_float_pos774(X,Y) get_csv2_float((X),(Y),774)
+#define get_csv2_uint_pos775(X,Y) get_csv2_uint((X),(Y),775)
+#define get_csv2_ullong_pos775(X,Y) get_csv2_ullong((X),(Y),775)
+#define get_csv2_ip_pos775(X,Y) get_csv2_ip((X),(Y),775)
+#define get_csv2_ipv6_pos775(X,Y) get_csv2_ipv6((X),(Y),775)
+#define get_csv2_string_pos775(X,Y) get_csv2_string((X),(Y),775)
+#define get_csv2_v_str_pos775(X,Y) get_csv2_string((X),(Y),775)
+#define get_csv2_bool_pos775(X,Y) get_csv2_bool((X),(Y),775)
+#define get_csv2_int_pos775(X,Y) get_csv2_int((X),(Y),775)
+#define get_csv2_llong_pos775(X,Y) get_csv2_llong((X),(Y),775)
+#define get_csv2_float_pos775(X,Y) get_csv2_float((X),(Y),775)
+#define get_csv2_uint_pos776(X,Y) get_csv2_uint((X),(Y),776)
+#define get_csv2_ullong_pos776(X,Y) get_csv2_ullong((X),(Y),776)
+#define get_csv2_ip_pos776(X,Y) get_csv2_ip((X),(Y),776)
+#define get_csv2_ipv6_pos776(X,Y) get_csv2_ipv6((X),(Y),776)
+#define get_csv2_string_pos776(X,Y) get_csv2_string((X),(Y),776)
+#define get_csv2_v_str_pos776(X,Y) get_csv2_string((X),(Y),776)
+#define get_csv2_bool_pos776(X,Y) get_csv2_bool((X),(Y),776)
+#define get_csv2_int_pos776(X,Y) get_csv2_int((X),(Y),776)
+#define get_csv2_llong_pos776(X,Y) get_csv2_llong((X),(Y),776)
+#define get_csv2_float_pos776(X,Y) get_csv2_float((X),(Y),776)
+#define get_csv2_uint_pos777(X,Y) get_csv2_uint((X),(Y),777)
+#define get_csv2_ullong_pos777(X,Y) get_csv2_ullong((X),(Y),777)
+#define get_csv2_ip_pos777(X,Y) get_csv2_ip((X),(Y),777)
+#define get_csv2_ipv6_pos777(X,Y) get_csv2_ipv6((X),(Y),777)
+#define get_csv2_string_pos777(X,Y) get_csv2_string((X),(Y),777)
+#define get_csv2_v_str_pos777(X,Y) get_csv2_string((X),(Y),777)
+#define get_csv2_bool_pos777(X,Y) get_csv2_bool((X),(Y),777)
+#define get_csv2_int_pos777(X,Y) get_csv2_int((X),(Y),777)
+#define get_csv2_llong_pos777(X,Y) get_csv2_llong((X),(Y),777)
+#define get_csv2_float_pos777(X,Y) get_csv2_float((X),(Y),777)
+#define get_csv2_uint_pos778(X,Y) get_csv2_uint((X),(Y),778)
+#define get_csv2_ullong_pos778(X,Y) get_csv2_ullong((X),(Y),778)
+#define get_csv2_ip_pos778(X,Y) get_csv2_ip((X),(Y),778)
+#define get_csv2_ipv6_pos778(X,Y) get_csv2_ipv6((X),(Y),778)
+#define get_csv2_string_pos778(X,Y) get_csv2_string((X),(Y),778)
+#define get_csv2_v_str_pos778(X,Y) get_csv2_string((X),(Y),778)
+#define get_csv2_bool_pos778(X,Y) get_csv2_bool((X),(Y),778)
+#define get_csv2_int_pos778(X,Y) get_csv2_int((X),(Y),778)
+#define get_csv2_llong_pos778(X,Y) get_csv2_llong((X),(Y),778)
+#define get_csv2_float_pos778(X,Y) get_csv2_float((X),(Y),778)
+#define get_csv2_uint_pos779(X,Y) get_csv2_uint((X),(Y),779)
+#define get_csv2_ullong_pos779(X,Y) get_csv2_ullong((X),(Y),779)
+#define get_csv2_ip_pos779(X,Y) get_csv2_ip((X),(Y),779)
+#define get_csv2_ipv6_pos779(X,Y) get_csv2_ipv6((X),(Y),779)
+#define get_csv2_string_pos779(X,Y) get_csv2_string((X),(Y),779)
+#define get_csv2_v_str_pos779(X,Y) get_csv2_string((X),(Y),779)
+#define get_csv2_bool_pos779(X,Y) get_csv2_bool((X),(Y),779)
+#define get_csv2_int_pos779(X,Y) get_csv2_int((X),(Y),779)
+#define get_csv2_llong_pos779(X,Y) get_csv2_llong((X),(Y),779)
+#define get_csv2_float_pos779(X,Y) get_csv2_float((X),(Y),779)
+#define get_csv2_uint_pos780(X,Y) get_csv2_uint((X),(Y),780)
+#define get_csv2_ullong_pos780(X,Y) get_csv2_ullong((X),(Y),780)
+#define get_csv2_ip_pos780(X,Y) get_csv2_ip((X),(Y),780)
+#define get_csv2_ipv6_pos780(X,Y) get_csv2_ipv6((X),(Y),780)
+#define get_csv2_string_pos780(X,Y) get_csv2_string((X),(Y),780)
+#define get_csv2_v_str_pos780(X,Y) get_csv2_string((X),(Y),780)
+#define get_csv2_bool_pos780(X,Y) get_csv2_bool((X),(Y),780)
+#define get_csv2_int_pos780(X,Y) get_csv2_int((X),(Y),780)
+#define get_csv2_llong_pos780(X,Y) get_csv2_llong((X),(Y),780)
+#define get_csv2_float_pos780(X,Y) get_csv2_float((X),(Y),780)
+#define get_csv2_uint_pos781(X,Y) get_csv2_uint((X),(Y),781)
+#define get_csv2_ullong_pos781(X,Y) get_csv2_ullong((X),(Y),781)
+#define get_csv2_ip_pos781(X,Y) get_csv2_ip((X),(Y),781)
+#define get_csv2_ipv6_pos781(X,Y) get_csv2_ipv6((X),(Y),781)
+#define get_csv2_string_pos781(X,Y) get_csv2_string((X),(Y),781)
+#define get_csv2_v_str_pos781(X,Y) get_csv2_string((X),(Y),781)
+#define get_csv2_bool_pos781(X,Y) get_csv2_bool((X),(Y),781)
+#define get_csv2_int_pos781(X,Y) get_csv2_int((X),(Y),781)
+#define get_csv2_llong_pos781(X,Y) get_csv2_llong((X),(Y),781)
+#define get_csv2_float_pos781(X,Y) get_csv2_float((X),(Y),781)
+#define get_csv2_uint_pos782(X,Y) get_csv2_uint((X),(Y),782)
+#define get_csv2_ullong_pos782(X,Y) get_csv2_ullong((X),(Y),782)
+#define get_csv2_ip_pos782(X,Y) get_csv2_ip((X),(Y),782)
+#define get_csv2_ipv6_pos782(X,Y) get_csv2_ipv6((X),(Y),782)
+#define get_csv2_string_pos782(X,Y) get_csv2_string((X),(Y),782)
+#define get_csv2_v_str_pos782(X,Y) get_csv2_string((X),(Y),782)
+#define get_csv2_bool_pos782(X,Y) get_csv2_bool((X),(Y),782)
+#define get_csv2_int_pos782(X,Y) get_csv2_int((X),(Y),782)
+#define get_csv2_llong_pos782(X,Y) get_csv2_llong((X),(Y),782)
+#define get_csv2_float_pos782(X,Y) get_csv2_float((X),(Y),782)
+#define get_csv2_uint_pos783(X,Y) get_csv2_uint((X),(Y),783)
+#define get_csv2_ullong_pos783(X,Y) get_csv2_ullong((X),(Y),783)
+#define get_csv2_ip_pos783(X,Y) get_csv2_ip((X),(Y),783)
+#define get_csv2_ipv6_pos783(X,Y) get_csv2_ipv6((X),(Y),783)
+#define get_csv2_string_pos783(X,Y) get_csv2_string((X),(Y),783)
+#define get_csv2_v_str_pos783(X,Y) get_csv2_string((X),(Y),783)
+#define get_csv2_bool_pos783(X,Y) get_csv2_bool((X),(Y),783)
+#define get_csv2_int_pos783(X,Y) get_csv2_int((X),(Y),783)
+#define get_csv2_llong_pos783(X,Y) get_csv2_llong((X),(Y),783)
+#define get_csv2_float_pos783(X,Y) get_csv2_float((X),(Y),783)
+#define get_csv2_uint_pos784(X,Y) get_csv2_uint((X),(Y),784)
+#define get_csv2_ullong_pos784(X,Y) get_csv2_ullong((X),(Y),784)
+#define get_csv2_ip_pos784(X,Y) get_csv2_ip((X),(Y),784)
+#define get_csv2_ipv6_pos784(X,Y) get_csv2_ipv6((X),(Y),784)
+#define get_csv2_string_pos784(X,Y) get_csv2_string((X),(Y),784)
+#define get_csv2_v_str_pos784(X,Y) get_csv2_string((X),(Y),784)
+#define get_csv2_bool_pos784(X,Y) get_csv2_bool((X),(Y),784)
+#define get_csv2_int_pos784(X,Y) get_csv2_int((X),(Y),784)
+#define get_csv2_llong_pos784(X,Y) get_csv2_llong((X),(Y),784)
+#define get_csv2_float_pos784(X,Y) get_csv2_float((X),(Y),784)
+#define get_csv2_uint_pos785(X,Y) get_csv2_uint((X),(Y),785)
+#define get_csv2_ullong_pos785(X,Y) get_csv2_ullong((X),(Y),785)
+#define get_csv2_ip_pos785(X,Y) get_csv2_ip((X),(Y),785)
+#define get_csv2_ipv6_pos785(X,Y) get_csv2_ipv6((X),(Y),785)
+#define get_csv2_string_pos785(X,Y) get_csv2_string((X),(Y),785)
+#define get_csv2_v_str_pos785(X,Y) get_csv2_string((X),(Y),785)
+#define get_csv2_bool_pos785(X,Y) get_csv2_bool((X),(Y),785)
+#define get_csv2_int_pos785(X,Y) get_csv2_int((X),(Y),785)
+#define get_csv2_llong_pos785(X,Y) get_csv2_llong((X),(Y),785)
+#define get_csv2_float_pos785(X,Y) get_csv2_float((X),(Y),785)
+#define get_csv2_uint_pos786(X,Y) get_csv2_uint((X),(Y),786)
+#define get_csv2_ullong_pos786(X,Y) get_csv2_ullong((X),(Y),786)
+#define get_csv2_ip_pos786(X,Y) get_csv2_ip((X),(Y),786)
+#define get_csv2_ipv6_pos786(X,Y) get_csv2_ipv6((X),(Y),786)
+#define get_csv2_string_pos786(X,Y) get_csv2_string((X),(Y),786)
+#define get_csv2_v_str_pos786(X,Y) get_csv2_string((X),(Y),786)
+#define get_csv2_bool_pos786(X,Y) get_csv2_bool((X),(Y),786)
+#define get_csv2_int_pos786(X,Y) get_csv2_int((X),(Y),786)
+#define get_csv2_llong_pos786(X,Y) get_csv2_llong((X),(Y),786)
+#define get_csv2_float_pos786(X,Y) get_csv2_float((X),(Y),786)
+#define get_csv2_uint_pos787(X,Y) get_csv2_uint((X),(Y),787)
+#define get_csv2_ullong_pos787(X,Y) get_csv2_ullong((X),(Y),787)
+#define get_csv2_ip_pos787(X,Y) get_csv2_ip((X),(Y),787)
+#define get_csv2_ipv6_pos787(X,Y) get_csv2_ipv6((X),(Y),787)
+#define get_csv2_string_pos787(X,Y) get_csv2_string((X),(Y),787)
+#define get_csv2_v_str_pos787(X,Y) get_csv2_string((X),(Y),787)
+#define get_csv2_bool_pos787(X,Y) get_csv2_bool((X),(Y),787)
+#define get_csv2_int_pos787(X,Y) get_csv2_int((X),(Y),787)
+#define get_csv2_llong_pos787(X,Y) get_csv2_llong((X),(Y),787)
+#define get_csv2_float_pos787(X,Y) get_csv2_float((X),(Y),787)
+#define get_csv2_uint_pos788(X,Y) get_csv2_uint((X),(Y),788)
+#define get_csv2_ullong_pos788(X,Y) get_csv2_ullong((X),(Y),788)
+#define get_csv2_ip_pos788(X,Y) get_csv2_ip((X),(Y),788)
+#define get_csv2_ipv6_pos788(X,Y) get_csv2_ipv6((X),(Y),788)
+#define get_csv2_string_pos788(X,Y) get_csv2_string((X),(Y),788)
+#define get_csv2_v_str_pos788(X,Y) get_csv2_string((X),(Y),788)
+#define get_csv2_bool_pos788(X,Y) get_csv2_bool((X),(Y),788)
+#define get_csv2_int_pos788(X,Y) get_csv2_int((X),(Y),788)
+#define get_csv2_llong_pos788(X,Y) get_csv2_llong((X),(Y),788)
+#define get_csv2_float_pos788(X,Y) get_csv2_float((X),(Y),788)
+#define get_csv2_uint_pos789(X,Y) get_csv2_uint((X),(Y),789)
+#define get_csv2_ullong_pos789(X,Y) get_csv2_ullong((X),(Y),789)
+#define get_csv2_ip_pos789(X,Y) get_csv2_ip((X),(Y),789)
+#define get_csv2_ipv6_pos789(X,Y) get_csv2_ipv6((X),(Y),789)
+#define get_csv2_string_pos789(X,Y) get_csv2_string((X),(Y),789)
+#define get_csv2_v_str_pos789(X,Y) get_csv2_string((X),(Y),789)
+#define get_csv2_bool_pos789(X,Y) get_csv2_bool((X),(Y),789)
+#define get_csv2_int_pos789(X,Y) get_csv2_int((X),(Y),789)
+#define get_csv2_llong_pos789(X,Y) get_csv2_llong((X),(Y),789)
+#define get_csv2_float_pos789(X,Y) get_csv2_float((X),(Y),789)
+#define get_csv2_uint_pos790(X,Y) get_csv2_uint((X),(Y),790)
+#define get_csv2_ullong_pos790(X,Y) get_csv2_ullong((X),(Y),790)
+#define get_csv2_ip_pos790(X,Y) get_csv2_ip((X),(Y),790)
+#define get_csv2_ipv6_pos790(X,Y) get_csv2_ipv6((X),(Y),790)
+#define get_csv2_string_pos790(X,Y) get_csv2_string((X),(Y),790)
+#define get_csv2_v_str_pos790(X,Y) get_csv2_string((X),(Y),790)
+#define get_csv2_bool_pos790(X,Y) get_csv2_bool((X),(Y),790)
+#define get_csv2_int_pos790(X,Y) get_csv2_int((X),(Y),790)
+#define get_csv2_llong_pos790(X,Y) get_csv2_llong((X),(Y),790)
+#define get_csv2_float_pos790(X,Y) get_csv2_float((X),(Y),790)
+#define get_csv2_uint_pos791(X,Y) get_csv2_uint((X),(Y),791)
+#define get_csv2_ullong_pos791(X,Y) get_csv2_ullong((X),(Y),791)
+#define get_csv2_ip_pos791(X,Y) get_csv2_ip((X),(Y),791)
+#define get_csv2_ipv6_pos791(X,Y) get_csv2_ipv6((X),(Y),791)
+#define get_csv2_string_pos791(X,Y) get_csv2_string((X),(Y),791)
+#define get_csv2_v_str_pos791(X,Y) get_csv2_string((X),(Y),791)
+#define get_csv2_bool_pos791(X,Y) get_csv2_bool((X),(Y),791)
+#define get_csv2_int_pos791(X,Y) get_csv2_int((X),(Y),791)
+#define get_csv2_llong_pos791(X,Y) get_csv2_llong((X),(Y),791)
+#define get_csv2_float_pos791(X,Y) get_csv2_float((X),(Y),791)
+#define get_csv2_uint_pos792(X,Y) get_csv2_uint((X),(Y),792)
+#define get_csv2_ullong_pos792(X,Y) get_csv2_ullong((X),(Y),792)
+#define get_csv2_ip_pos792(X,Y) get_csv2_ip((X),(Y),792)
+#define get_csv2_ipv6_pos792(X,Y) get_csv2_ipv6((X),(Y),792)
+#define get_csv2_string_pos792(X,Y) get_csv2_string((X),(Y),792)
+#define get_csv2_v_str_pos792(X,Y) get_csv2_string((X),(Y),792)
+#define get_csv2_bool_pos792(X,Y) get_csv2_bool((X),(Y),792)
+#define get_csv2_int_pos792(X,Y) get_csv2_int((X),(Y),792)
+#define get_csv2_llong_pos792(X,Y) get_csv2_llong((X),(Y),792)
+#define get_csv2_float_pos792(X,Y) get_csv2_float((X),(Y),792)
+#define get_csv2_uint_pos793(X,Y) get_csv2_uint((X),(Y),793)
+#define get_csv2_ullong_pos793(X,Y) get_csv2_ullong((X),(Y),793)
+#define get_csv2_ip_pos793(X,Y) get_csv2_ip((X),(Y),793)
+#define get_csv2_ipv6_pos793(X,Y) get_csv2_ipv6((X),(Y),793)
+#define get_csv2_string_pos793(X,Y) get_csv2_string((X),(Y),793)
+#define get_csv2_v_str_pos793(X,Y) get_csv2_string((X),(Y),793)
+#define get_csv2_bool_pos793(X,Y) get_csv2_bool((X),(Y),793)
+#define get_csv2_int_pos793(X,Y) get_csv2_int((X),(Y),793)
+#define get_csv2_llong_pos793(X,Y) get_csv2_llong((X),(Y),793)
+#define get_csv2_float_pos793(X,Y) get_csv2_float((X),(Y),793)
+#define get_csv2_uint_pos794(X,Y) get_csv2_uint((X),(Y),794)
+#define get_csv2_ullong_pos794(X,Y) get_csv2_ullong((X),(Y),794)
+#define get_csv2_ip_pos794(X,Y) get_csv2_ip((X),(Y),794)
+#define get_csv2_ipv6_pos794(X,Y) get_csv2_ipv6((X),(Y),794)
+#define get_csv2_string_pos794(X,Y) get_csv2_string((X),(Y),794)
+#define get_csv2_v_str_pos794(X,Y) get_csv2_string((X),(Y),794)
+#define get_csv2_bool_pos794(X,Y) get_csv2_bool((X),(Y),794)
+#define get_csv2_int_pos794(X,Y) get_csv2_int((X),(Y),794)
+#define get_csv2_llong_pos794(X,Y) get_csv2_llong((X),(Y),794)
+#define get_csv2_float_pos794(X,Y) get_csv2_float((X),(Y),794)
+#define get_csv2_uint_pos795(X,Y) get_csv2_uint((X),(Y),795)
+#define get_csv2_ullong_pos795(X,Y) get_csv2_ullong((X),(Y),795)
+#define get_csv2_ip_pos795(X,Y) get_csv2_ip((X),(Y),795)
+#define get_csv2_ipv6_pos795(X,Y) get_csv2_ipv6((X),(Y),795)
+#define get_csv2_string_pos795(X,Y) get_csv2_string((X),(Y),795)
+#define get_csv2_v_str_pos795(X,Y) get_csv2_string((X),(Y),795)
+#define get_csv2_bool_pos795(X,Y) get_csv2_bool((X),(Y),795)
+#define get_csv2_int_pos795(X,Y) get_csv2_int((X),(Y),795)
+#define get_csv2_llong_pos795(X,Y) get_csv2_llong((X),(Y),795)
+#define get_csv2_float_pos795(X,Y) get_csv2_float((X),(Y),795)
+#define get_csv2_uint_pos796(X,Y) get_csv2_uint((X),(Y),796)
+#define get_csv2_ullong_pos796(X,Y) get_csv2_ullong((X),(Y),796)
+#define get_csv2_ip_pos796(X,Y) get_csv2_ip((X),(Y),796)
+#define get_csv2_ipv6_pos796(X,Y) get_csv2_ipv6((X),(Y),796)
+#define get_csv2_string_pos796(X,Y) get_csv2_string((X),(Y),796)
+#define get_csv2_v_str_pos796(X,Y) get_csv2_string((X),(Y),796)
+#define get_csv2_bool_pos796(X,Y) get_csv2_bool((X),(Y),796)
+#define get_csv2_int_pos796(X,Y) get_csv2_int((X),(Y),796)
+#define get_csv2_llong_pos796(X,Y) get_csv2_llong((X),(Y),796)
+#define get_csv2_float_pos796(X,Y) get_csv2_float((X),(Y),796)
+#define get_csv2_uint_pos797(X,Y) get_csv2_uint((X),(Y),797)
+#define get_csv2_ullong_pos797(X,Y) get_csv2_ullong((X),(Y),797)
+#define get_csv2_ip_pos797(X,Y) get_csv2_ip((X),(Y),797)
+#define get_csv2_ipv6_pos797(X,Y) get_csv2_ipv6((X),(Y),797)
+#define get_csv2_string_pos797(X,Y) get_csv2_string((X),(Y),797)
+#define get_csv2_v_str_pos797(X,Y) get_csv2_string((X),(Y),797)
+#define get_csv2_bool_pos797(X,Y) get_csv2_bool((X),(Y),797)
+#define get_csv2_int_pos797(X,Y) get_csv2_int((X),(Y),797)
+#define get_csv2_llong_pos797(X,Y) get_csv2_llong((X),(Y),797)
+#define get_csv2_float_pos797(X,Y) get_csv2_float((X),(Y),797)
+#define get_csv2_uint_pos798(X,Y) get_csv2_uint((X),(Y),798)
+#define get_csv2_ullong_pos798(X,Y) get_csv2_ullong((X),(Y),798)
+#define get_csv2_ip_pos798(X,Y) get_csv2_ip((X),(Y),798)
+#define get_csv2_ipv6_pos798(X,Y) get_csv2_ipv6((X),(Y),798)
+#define get_csv2_string_pos798(X,Y) get_csv2_string((X),(Y),798)
+#define get_csv2_v_str_pos798(X,Y) get_csv2_string((X),(Y),798)
+#define get_csv2_bool_pos798(X,Y) get_csv2_bool((X),(Y),798)
+#define get_csv2_int_pos798(X,Y) get_csv2_int((X),(Y),798)
+#define get_csv2_llong_pos798(X,Y) get_csv2_llong((X),(Y),798)
+#define get_csv2_float_pos798(X,Y) get_csv2_float((X),(Y),798)
+#define get_csv2_uint_pos799(X,Y) get_csv2_uint((X),(Y),799)
+#define get_csv2_ullong_pos799(X,Y) get_csv2_ullong((X),(Y),799)
+#define get_csv2_ip_pos799(X,Y) get_csv2_ip((X),(Y),799)
+#define get_csv2_ipv6_pos799(X,Y) get_csv2_ipv6((X),(Y),799)
+#define get_csv2_string_pos799(X,Y) get_csv2_string((X),(Y),799)
+#define get_csv2_v_str_pos799(X,Y) get_csv2_string((X),(Y),799)
+#define get_csv2_bool_pos799(X,Y) get_csv2_bool((X),(Y),799)
+#define get_csv2_int_pos799(X,Y) get_csv2_int((X),(Y),799)
+#define get_csv2_llong_pos799(X,Y) get_csv2_llong((X),(Y),799)
+#define get_csv2_float_pos799(X,Y) get_csv2_float((X),(Y),799)
+#define get_csv2_uint_pos800(X,Y) get_csv2_uint((X),(Y),800)
+#define get_csv2_ullong_pos800(X,Y) get_csv2_ullong((X),(Y),800)
+#define get_csv2_ip_pos800(X,Y) get_csv2_ip((X),(Y),800)
+#define get_csv2_ipv6_pos800(X,Y) get_csv2_ipv6((X),(Y),800)
+#define get_csv2_string_pos800(X,Y) get_csv2_string((X),(Y),800)
+#define get_csv2_v_str_pos800(X,Y) get_csv2_string((X),(Y),800)
+#define get_csv2_bool_pos800(X,Y) get_csv2_bool((X),(Y),800)
+#define get_csv2_int_pos800(X,Y) get_csv2_int((X),(Y),800)
+#define get_csv2_llong_pos800(X,Y) get_csv2_llong((X),(Y),800)
+#define get_csv2_float_pos800(X,Y) get_csv2_float((X),(Y),800)
+#define get_csv2_uint_pos801(X,Y) get_csv2_uint((X),(Y),801)
+#define get_csv2_ullong_pos801(X,Y) get_csv2_ullong((X),(Y),801)
+#define get_csv2_ip_pos801(X,Y) get_csv2_ip((X),(Y),801)
+#define get_csv2_ipv6_pos801(X,Y) get_csv2_ipv6((X),(Y),801)
+#define get_csv2_string_pos801(X,Y) get_csv2_string((X),(Y),801)
+#define get_csv2_v_str_pos801(X,Y) get_csv2_string((X),(Y),801)
+#define get_csv2_bool_pos801(X,Y) get_csv2_bool((X),(Y),801)
+#define get_csv2_int_pos801(X,Y) get_csv2_int((X),(Y),801)
+#define get_csv2_llong_pos801(X,Y) get_csv2_llong((X),(Y),801)
+#define get_csv2_float_pos801(X,Y) get_csv2_float((X),(Y),801)
+#define get_csv2_uint_pos802(X,Y) get_csv2_uint((X),(Y),802)
+#define get_csv2_ullong_pos802(X,Y) get_csv2_ullong((X),(Y),802)
+#define get_csv2_ip_pos802(X,Y) get_csv2_ip((X),(Y),802)
+#define get_csv2_ipv6_pos802(X,Y) get_csv2_ipv6((X),(Y),802)
+#define get_csv2_string_pos802(X,Y) get_csv2_string((X),(Y),802)
+#define get_csv2_v_str_pos802(X,Y) get_csv2_string((X),(Y),802)
+#define get_csv2_bool_pos802(X,Y) get_csv2_bool((X),(Y),802)
+#define get_csv2_int_pos802(X,Y) get_csv2_int((X),(Y),802)
+#define get_csv2_llong_pos802(X,Y) get_csv2_llong((X),(Y),802)
+#define get_csv2_float_pos802(X,Y) get_csv2_float((X),(Y),802)
+#define get_csv2_uint_pos803(X,Y) get_csv2_uint((X),(Y),803)
+#define get_csv2_ullong_pos803(X,Y) get_csv2_ullong((X),(Y),803)
+#define get_csv2_ip_pos803(X,Y) get_csv2_ip((X),(Y),803)
+#define get_csv2_ipv6_pos803(X,Y) get_csv2_ipv6((X),(Y),803)
+#define get_csv2_string_pos803(X,Y) get_csv2_string((X),(Y),803)
+#define get_csv2_v_str_pos803(X,Y) get_csv2_string((X),(Y),803)
+#define get_csv2_bool_pos803(X,Y) get_csv2_bool((X),(Y),803)
+#define get_csv2_int_pos803(X,Y) get_csv2_int((X),(Y),803)
+#define get_csv2_llong_pos803(X,Y) get_csv2_llong((X),(Y),803)
+#define get_csv2_float_pos803(X,Y) get_csv2_float((X),(Y),803)
+#define get_csv2_uint_pos804(X,Y) get_csv2_uint((X),(Y),804)
+#define get_csv2_ullong_pos804(X,Y) get_csv2_ullong((X),(Y),804)
+#define get_csv2_ip_pos804(X,Y) get_csv2_ip((X),(Y),804)
+#define get_csv2_ipv6_pos804(X,Y) get_csv2_ipv6((X),(Y),804)
+#define get_csv2_string_pos804(X,Y) get_csv2_string((X),(Y),804)
+#define get_csv2_v_str_pos804(X,Y) get_csv2_string((X),(Y),804)
+#define get_csv2_bool_pos804(X,Y) get_csv2_bool((X),(Y),804)
+#define get_csv2_int_pos804(X,Y) get_csv2_int((X),(Y),804)
+#define get_csv2_llong_pos804(X,Y) get_csv2_llong((X),(Y),804)
+#define get_csv2_float_pos804(X,Y) get_csv2_float((X),(Y),804)
+#define get_csv2_uint_pos805(X,Y) get_csv2_uint((X),(Y),805)
+#define get_csv2_ullong_pos805(X,Y) get_csv2_ullong((X),(Y),805)
+#define get_csv2_ip_pos805(X,Y) get_csv2_ip((X),(Y),805)
+#define get_csv2_ipv6_pos805(X,Y) get_csv2_ipv6((X),(Y),805)
+#define get_csv2_string_pos805(X,Y) get_csv2_string((X),(Y),805)
+#define get_csv2_v_str_pos805(X,Y) get_csv2_string((X),(Y),805)
+#define get_csv2_bool_pos805(X,Y) get_csv2_bool((X),(Y),805)
+#define get_csv2_int_pos805(X,Y) get_csv2_int((X),(Y),805)
+#define get_csv2_llong_pos805(X,Y) get_csv2_llong((X),(Y),805)
+#define get_csv2_float_pos805(X,Y) get_csv2_float((X),(Y),805)
+#define get_csv2_uint_pos806(X,Y) get_csv2_uint((X),(Y),806)
+#define get_csv2_ullong_pos806(X,Y) get_csv2_ullong((X),(Y),806)
+#define get_csv2_ip_pos806(X,Y) get_csv2_ip((X),(Y),806)
+#define get_csv2_ipv6_pos806(X,Y) get_csv2_ipv6((X),(Y),806)
+#define get_csv2_string_pos806(X,Y) get_csv2_string((X),(Y),806)
+#define get_csv2_v_str_pos806(X,Y) get_csv2_string((X),(Y),806)
+#define get_csv2_bool_pos806(X,Y) get_csv2_bool((X),(Y),806)
+#define get_csv2_int_pos806(X,Y) get_csv2_int((X),(Y),806)
+#define get_csv2_llong_pos806(X,Y) get_csv2_llong((X),(Y),806)
+#define get_csv2_float_pos806(X,Y) get_csv2_float((X),(Y),806)
+#define get_csv2_uint_pos807(X,Y) get_csv2_uint((X),(Y),807)
+#define get_csv2_ullong_pos807(X,Y) get_csv2_ullong((X),(Y),807)
+#define get_csv2_ip_pos807(X,Y) get_csv2_ip((X),(Y),807)
+#define get_csv2_ipv6_pos807(X,Y) get_csv2_ipv6((X),(Y),807)
+#define get_csv2_string_pos807(X,Y) get_csv2_string((X),(Y),807)
+#define get_csv2_v_str_pos807(X,Y) get_csv2_string((X),(Y),807)
+#define get_csv2_bool_pos807(X,Y) get_csv2_bool((X),(Y),807)
+#define get_csv2_int_pos807(X,Y) get_csv2_int((X),(Y),807)
+#define get_csv2_llong_pos807(X,Y) get_csv2_llong((X),(Y),807)
+#define get_csv2_float_pos807(X,Y) get_csv2_float((X),(Y),807)
+#define get_csv2_uint_pos808(X,Y) get_csv2_uint((X),(Y),808)
+#define get_csv2_ullong_pos808(X,Y) get_csv2_ullong((X),(Y),808)
+#define get_csv2_ip_pos808(X,Y) get_csv2_ip((X),(Y),808)
+#define get_csv2_ipv6_pos808(X,Y) get_csv2_ipv6((X),(Y),808)
+#define get_csv2_string_pos808(X,Y) get_csv2_string((X),(Y),808)
+#define get_csv2_v_str_pos808(X,Y) get_csv2_string((X),(Y),808)
+#define get_csv2_bool_pos808(X,Y) get_csv2_bool((X),(Y),808)
+#define get_csv2_int_pos808(X,Y) get_csv2_int((X),(Y),808)
+#define get_csv2_llong_pos808(X,Y) get_csv2_llong((X),(Y),808)
+#define get_csv2_float_pos808(X,Y) get_csv2_float((X),(Y),808)
+#define get_csv2_uint_pos809(X,Y) get_csv2_uint((X),(Y),809)
+#define get_csv2_ullong_pos809(X,Y) get_csv2_ullong((X),(Y),809)
+#define get_csv2_ip_pos809(X,Y) get_csv2_ip((X),(Y),809)
+#define get_csv2_ipv6_pos809(X,Y) get_csv2_ipv6((X),(Y),809)
+#define get_csv2_string_pos809(X,Y) get_csv2_string((X),(Y),809)
+#define get_csv2_v_str_pos809(X,Y) get_csv2_string((X),(Y),809)
+#define get_csv2_bool_pos809(X,Y) get_csv2_bool((X),(Y),809)
+#define get_csv2_int_pos809(X,Y) get_csv2_int((X),(Y),809)
+#define get_csv2_llong_pos809(X,Y) get_csv2_llong((X),(Y),809)
+#define get_csv2_float_pos809(X,Y) get_csv2_float((X),(Y),809)
+#define get_csv2_uint_pos810(X,Y) get_csv2_uint((X),(Y),810)
+#define get_csv2_ullong_pos810(X,Y) get_csv2_ullong((X),(Y),810)
+#define get_csv2_ip_pos810(X,Y) get_csv2_ip((X),(Y),810)
+#define get_csv2_ipv6_pos810(X,Y) get_csv2_ipv6((X),(Y),810)
+#define get_csv2_string_pos810(X,Y) get_csv2_string((X),(Y),810)
+#define get_csv2_v_str_pos810(X,Y) get_csv2_string((X),(Y),810)
+#define get_csv2_bool_pos810(X,Y) get_csv2_bool((X),(Y),810)
+#define get_csv2_int_pos810(X,Y) get_csv2_int((X),(Y),810)
+#define get_csv2_llong_pos810(X,Y) get_csv2_llong((X),(Y),810)
+#define get_csv2_float_pos810(X,Y) get_csv2_float((X),(Y),810)
+#define get_csv2_uint_pos811(X,Y) get_csv2_uint((X),(Y),811)
+#define get_csv2_ullong_pos811(X,Y) get_csv2_ullong((X),(Y),811)
+#define get_csv2_ip_pos811(X,Y) get_csv2_ip((X),(Y),811)
+#define get_csv2_ipv6_pos811(X,Y) get_csv2_ipv6((X),(Y),811)
+#define get_csv2_string_pos811(X,Y) get_csv2_string((X),(Y),811)
+#define get_csv2_v_str_pos811(X,Y) get_csv2_string((X),(Y),811)
+#define get_csv2_bool_pos811(X,Y) get_csv2_bool((X),(Y),811)
+#define get_csv2_int_pos811(X,Y) get_csv2_int((X),(Y),811)
+#define get_csv2_llong_pos811(X,Y) get_csv2_llong((X),(Y),811)
+#define get_csv2_float_pos811(X,Y) get_csv2_float((X),(Y),811)
+#define get_csv2_uint_pos812(X,Y) get_csv2_uint((X),(Y),812)
+#define get_csv2_ullong_pos812(X,Y) get_csv2_ullong((X),(Y),812)
+#define get_csv2_ip_pos812(X,Y) get_csv2_ip((X),(Y),812)
+#define get_csv2_ipv6_pos812(X,Y) get_csv2_ipv6((X),(Y),812)
+#define get_csv2_string_pos812(X,Y) get_csv2_string((X),(Y),812)
+#define get_csv2_v_str_pos812(X,Y) get_csv2_string((X),(Y),812)
+#define get_csv2_bool_pos812(X,Y) get_csv2_bool((X),(Y),812)
+#define get_csv2_int_pos812(X,Y) get_csv2_int((X),(Y),812)
+#define get_csv2_llong_pos812(X,Y) get_csv2_llong((X),(Y),812)
+#define get_csv2_float_pos812(X,Y) get_csv2_float((X),(Y),812)
+#define get_csv2_uint_pos813(X,Y) get_csv2_uint((X),(Y),813)
+#define get_csv2_ullong_pos813(X,Y) get_csv2_ullong((X),(Y),813)
+#define get_csv2_ip_pos813(X,Y) get_csv2_ip((X),(Y),813)
+#define get_csv2_ipv6_pos813(X,Y) get_csv2_ipv6((X),(Y),813)
+#define get_csv2_string_pos813(X,Y) get_csv2_string((X),(Y),813)
+#define get_csv2_v_str_pos813(X,Y) get_csv2_string((X),(Y),813)
+#define get_csv2_bool_pos813(X,Y) get_csv2_bool((X),(Y),813)
+#define get_csv2_int_pos813(X,Y) get_csv2_int((X),(Y),813)
+#define get_csv2_llong_pos813(X,Y) get_csv2_llong((X),(Y),813)
+#define get_csv2_float_pos813(X,Y) get_csv2_float((X),(Y),813)
+#define get_csv2_uint_pos814(X,Y) get_csv2_uint((X),(Y),814)
+#define get_csv2_ullong_pos814(X,Y) get_csv2_ullong((X),(Y),814)
+#define get_csv2_ip_pos814(X,Y) get_csv2_ip((X),(Y),814)
+#define get_csv2_ipv6_pos814(X,Y) get_csv2_ipv6((X),(Y),814)
+#define get_csv2_string_pos814(X,Y) get_csv2_string((X),(Y),814)
+#define get_csv2_v_str_pos814(X,Y) get_csv2_string((X),(Y),814)
+#define get_csv2_bool_pos814(X,Y) get_csv2_bool((X),(Y),814)
+#define get_csv2_int_pos814(X,Y) get_csv2_int((X),(Y),814)
+#define get_csv2_llong_pos814(X,Y) get_csv2_llong((X),(Y),814)
+#define get_csv2_float_pos814(X,Y) get_csv2_float((X),(Y),814)
+#define get_csv2_uint_pos815(X,Y) get_csv2_uint((X),(Y),815)
+#define get_csv2_ullong_pos815(X,Y) get_csv2_ullong((X),(Y),815)
+#define get_csv2_ip_pos815(X,Y) get_csv2_ip((X),(Y),815)
+#define get_csv2_ipv6_pos815(X,Y) get_csv2_ipv6((X),(Y),815)
+#define get_csv2_string_pos815(X,Y) get_csv2_string((X),(Y),815)
+#define get_csv2_v_str_pos815(X,Y) get_csv2_string((X),(Y),815)
+#define get_csv2_bool_pos815(X,Y) get_csv2_bool((X),(Y),815)
+#define get_csv2_int_pos815(X,Y) get_csv2_int((X),(Y),815)
+#define get_csv2_llong_pos815(X,Y) get_csv2_llong((X),(Y),815)
+#define get_csv2_float_pos815(X,Y) get_csv2_float((X),(Y),815)
+#define get_csv2_uint_pos816(X,Y) get_csv2_uint((X),(Y),816)
+#define get_csv2_ullong_pos816(X,Y) get_csv2_ullong((X),(Y),816)
+#define get_csv2_ip_pos816(X,Y) get_csv2_ip((X),(Y),816)
+#define get_csv2_ipv6_pos816(X,Y) get_csv2_ipv6((X),(Y),816)
+#define get_csv2_string_pos816(X,Y) get_csv2_string((X),(Y),816)
+#define get_csv2_v_str_pos816(X,Y) get_csv2_string((X),(Y),816)
+#define get_csv2_bool_pos816(X,Y) get_csv2_bool((X),(Y),816)
+#define get_csv2_int_pos816(X,Y) get_csv2_int((X),(Y),816)
+#define get_csv2_llong_pos816(X,Y) get_csv2_llong((X),(Y),816)
+#define get_csv2_float_pos816(X,Y) get_csv2_float((X),(Y),816)
+#define get_csv2_uint_pos817(X,Y) get_csv2_uint((X),(Y),817)
+#define get_csv2_ullong_pos817(X,Y) get_csv2_ullong((X),(Y),817)
+#define get_csv2_ip_pos817(X,Y) get_csv2_ip((X),(Y),817)
+#define get_csv2_ipv6_pos817(X,Y) get_csv2_ipv6((X),(Y),817)
+#define get_csv2_string_pos817(X,Y) get_csv2_string((X),(Y),817)
+#define get_csv2_v_str_pos817(X,Y) get_csv2_string((X),(Y),817)
+#define get_csv2_bool_pos817(X,Y) get_csv2_bool((X),(Y),817)
+#define get_csv2_int_pos817(X,Y) get_csv2_int((X),(Y),817)
+#define get_csv2_llong_pos817(X,Y) get_csv2_llong((X),(Y),817)
+#define get_csv2_float_pos817(X,Y) get_csv2_float((X),(Y),817)
+#define get_csv2_uint_pos818(X,Y) get_csv2_uint((X),(Y),818)
+#define get_csv2_ullong_pos818(X,Y) get_csv2_ullong((X),(Y),818)
+#define get_csv2_ip_pos818(X,Y) get_csv2_ip((X),(Y),818)
+#define get_csv2_ipv6_pos818(X,Y) get_csv2_ipv6((X),(Y),818)
+#define get_csv2_string_pos818(X,Y) get_csv2_string((X),(Y),818)
+#define get_csv2_v_str_pos818(X,Y) get_csv2_string((X),(Y),818)
+#define get_csv2_bool_pos818(X,Y) get_csv2_bool((X),(Y),818)
+#define get_csv2_int_pos818(X,Y) get_csv2_int((X),(Y),818)
+#define get_csv2_llong_pos818(X,Y) get_csv2_llong((X),(Y),818)
+#define get_csv2_float_pos818(X,Y) get_csv2_float((X),(Y),818)
+#define get_csv2_uint_pos819(X,Y) get_csv2_uint((X),(Y),819)
+#define get_csv2_ullong_pos819(X,Y) get_csv2_ullong((X),(Y),819)
+#define get_csv2_ip_pos819(X,Y) get_csv2_ip((X),(Y),819)
+#define get_csv2_ipv6_pos819(X,Y) get_csv2_ipv6((X),(Y),819)
+#define get_csv2_string_pos819(X,Y) get_csv2_string((X),(Y),819)
+#define get_csv2_v_str_pos819(X,Y) get_csv2_string((X),(Y),819)
+#define get_csv2_bool_pos819(X,Y) get_csv2_bool((X),(Y),819)
+#define get_csv2_int_pos819(X,Y) get_csv2_int((X),(Y),819)
+#define get_csv2_llong_pos819(X,Y) get_csv2_llong((X),(Y),819)
+#define get_csv2_float_pos819(X,Y) get_csv2_float((X),(Y),819)
+#define get_csv2_uint_pos820(X,Y) get_csv2_uint((X),(Y),820)
+#define get_csv2_ullong_pos820(X,Y) get_csv2_ullong((X),(Y),820)
+#define get_csv2_ip_pos820(X,Y) get_csv2_ip((X),(Y),820)
+#define get_csv2_ipv6_pos820(X,Y) get_csv2_ipv6((X),(Y),820)
+#define get_csv2_string_pos820(X,Y) get_csv2_string((X),(Y),820)
+#define get_csv2_v_str_pos820(X,Y) get_csv2_string((X),(Y),820)
+#define get_csv2_bool_pos820(X,Y) get_csv2_bool((X),(Y),820)
+#define get_csv2_int_pos820(X,Y) get_csv2_int((X),(Y),820)
+#define get_csv2_llong_pos820(X,Y) get_csv2_llong((X),(Y),820)
+#define get_csv2_float_pos820(X,Y) get_csv2_float((X),(Y),820)
+#define get_csv2_uint_pos821(X,Y) get_csv2_uint((X),(Y),821)
+#define get_csv2_ullong_pos821(X,Y) get_csv2_ullong((X),(Y),821)
+#define get_csv2_ip_pos821(X,Y) get_csv2_ip((X),(Y),821)
+#define get_csv2_ipv6_pos821(X,Y) get_csv2_ipv6((X),(Y),821)
+#define get_csv2_string_pos821(X,Y) get_csv2_string((X),(Y),821)
+#define get_csv2_v_str_pos821(X,Y) get_csv2_string((X),(Y),821)
+#define get_csv2_bool_pos821(X,Y) get_csv2_bool((X),(Y),821)
+#define get_csv2_int_pos821(X,Y) get_csv2_int((X),(Y),821)
+#define get_csv2_llong_pos821(X,Y) get_csv2_llong((X),(Y),821)
+#define get_csv2_float_pos821(X,Y) get_csv2_float((X),(Y),821)
+#define get_csv2_uint_pos822(X,Y) get_csv2_uint((X),(Y),822)
+#define get_csv2_ullong_pos822(X,Y) get_csv2_ullong((X),(Y),822)
+#define get_csv2_ip_pos822(X,Y) get_csv2_ip((X),(Y),822)
+#define get_csv2_ipv6_pos822(X,Y) get_csv2_ipv6((X),(Y),822)
+#define get_csv2_string_pos822(X,Y) get_csv2_string((X),(Y),822)
+#define get_csv2_v_str_pos822(X,Y) get_csv2_string((X),(Y),822)
+#define get_csv2_bool_pos822(X,Y) get_csv2_bool((X),(Y),822)
+#define get_csv2_int_pos822(X,Y) get_csv2_int((X),(Y),822)
+#define get_csv2_llong_pos822(X,Y) get_csv2_llong((X),(Y),822)
+#define get_csv2_float_pos822(X,Y) get_csv2_float((X),(Y),822)
+#define get_csv2_uint_pos823(X,Y) get_csv2_uint((X),(Y),823)
+#define get_csv2_ullong_pos823(X,Y) get_csv2_ullong((X),(Y),823)
+#define get_csv2_ip_pos823(X,Y) get_csv2_ip((X),(Y),823)
+#define get_csv2_ipv6_pos823(X,Y) get_csv2_ipv6((X),(Y),823)
+#define get_csv2_string_pos823(X,Y) get_csv2_string((X),(Y),823)
+#define get_csv2_v_str_pos823(X,Y) get_csv2_string((X),(Y),823)
+#define get_csv2_bool_pos823(X,Y) get_csv2_bool((X),(Y),823)
+#define get_csv2_int_pos823(X,Y) get_csv2_int((X),(Y),823)
+#define get_csv2_llong_pos823(X,Y) get_csv2_llong((X),(Y),823)
+#define get_csv2_float_pos823(X,Y) get_csv2_float((X),(Y),823)
+#define get_csv2_uint_pos824(X,Y) get_csv2_uint((X),(Y),824)
+#define get_csv2_ullong_pos824(X,Y) get_csv2_ullong((X),(Y),824)
+#define get_csv2_ip_pos824(X,Y) get_csv2_ip((X),(Y),824)
+#define get_csv2_ipv6_pos824(X,Y) get_csv2_ipv6((X),(Y),824)
+#define get_csv2_string_pos824(X,Y) get_csv2_string((X),(Y),824)
+#define get_csv2_v_str_pos824(X,Y) get_csv2_string((X),(Y),824)
+#define get_csv2_bool_pos824(X,Y) get_csv2_bool((X),(Y),824)
+#define get_csv2_int_pos824(X,Y) get_csv2_int((X),(Y),824)
+#define get_csv2_llong_pos824(X,Y) get_csv2_llong((X),(Y),824)
+#define get_csv2_float_pos824(X,Y) get_csv2_float((X),(Y),824)
+#define get_csv2_uint_pos825(X,Y) get_csv2_uint((X),(Y),825)
+#define get_csv2_ullong_pos825(X,Y) get_csv2_ullong((X),(Y),825)
+#define get_csv2_ip_pos825(X,Y) get_csv2_ip((X),(Y),825)
+#define get_csv2_ipv6_pos825(X,Y) get_csv2_ipv6((X),(Y),825)
+#define get_csv2_string_pos825(X,Y) get_csv2_string((X),(Y),825)
+#define get_csv2_v_str_pos825(X,Y) get_csv2_string((X),(Y),825)
+#define get_csv2_bool_pos825(X,Y) get_csv2_bool((X),(Y),825)
+#define get_csv2_int_pos825(X,Y) get_csv2_int((X),(Y),825)
+#define get_csv2_llong_pos825(X,Y) get_csv2_llong((X),(Y),825)
+#define get_csv2_float_pos825(X,Y) get_csv2_float((X),(Y),825)
+#define get_csv2_uint_pos826(X,Y) get_csv2_uint((X),(Y),826)
+#define get_csv2_ullong_pos826(X,Y) get_csv2_ullong((X),(Y),826)
+#define get_csv2_ip_pos826(X,Y) get_csv2_ip((X),(Y),826)
+#define get_csv2_ipv6_pos826(X,Y) get_csv2_ipv6((X),(Y),826)
+#define get_csv2_string_pos826(X,Y) get_csv2_string((X),(Y),826)
+#define get_csv2_v_str_pos826(X,Y) get_csv2_string((X),(Y),826)
+#define get_csv2_bool_pos826(X,Y) get_csv2_bool((X),(Y),826)
+#define get_csv2_int_pos826(X,Y) get_csv2_int((X),(Y),826)
+#define get_csv2_llong_pos826(X,Y) get_csv2_llong((X),(Y),826)
+#define get_csv2_float_pos826(X,Y) get_csv2_float((X),(Y),826)
+#define get_csv2_uint_pos827(X,Y) get_csv2_uint((X),(Y),827)
+#define get_csv2_ullong_pos827(X,Y) get_csv2_ullong((X),(Y),827)
+#define get_csv2_ip_pos827(X,Y) get_csv2_ip((X),(Y),827)
+#define get_csv2_ipv6_pos827(X,Y) get_csv2_ipv6((X),(Y),827)
+#define get_csv2_string_pos827(X,Y) get_csv2_string((X),(Y),827)
+#define get_csv2_v_str_pos827(X,Y) get_csv2_string((X),(Y),827)
+#define get_csv2_bool_pos827(X,Y) get_csv2_bool((X),(Y),827)
+#define get_csv2_int_pos827(X,Y) get_csv2_int((X),(Y),827)
+#define get_csv2_llong_pos827(X,Y) get_csv2_llong((X),(Y),827)
+#define get_csv2_float_pos827(X,Y) get_csv2_float((X),(Y),827)
+#define get_csv2_uint_pos828(X,Y) get_csv2_uint((X),(Y),828)
+#define get_csv2_ullong_pos828(X,Y) get_csv2_ullong((X),(Y),828)
+#define get_csv2_ip_pos828(X,Y) get_csv2_ip((X),(Y),828)
+#define get_csv2_ipv6_pos828(X,Y) get_csv2_ipv6((X),(Y),828)
+#define get_csv2_string_pos828(X,Y) get_csv2_string((X),(Y),828)
+#define get_csv2_v_str_pos828(X,Y) get_csv2_string((X),(Y),828)
+#define get_csv2_bool_pos828(X,Y) get_csv2_bool((X),(Y),828)
+#define get_csv2_int_pos828(X,Y) get_csv2_int((X),(Y),828)
+#define get_csv2_llong_pos828(X,Y) get_csv2_llong((X),(Y),828)
+#define get_csv2_float_pos828(X,Y) get_csv2_float((X),(Y),828)
+#define get_csv2_uint_pos829(X,Y) get_csv2_uint((X),(Y),829)
+#define get_csv2_ullong_pos829(X,Y) get_csv2_ullong((X),(Y),829)
+#define get_csv2_ip_pos829(X,Y) get_csv2_ip((X),(Y),829)
+#define get_csv2_ipv6_pos829(X,Y) get_csv2_ipv6((X),(Y),829)
+#define get_csv2_string_pos829(X,Y) get_csv2_string((X),(Y),829)
+#define get_csv2_v_str_pos829(X,Y) get_csv2_string((X),(Y),829)
+#define get_csv2_bool_pos829(X,Y) get_csv2_bool((X),(Y),829)
+#define get_csv2_int_pos829(X,Y) get_csv2_int((X),(Y),829)
+#define get_csv2_llong_pos829(X,Y) get_csv2_llong((X),(Y),829)
+#define get_csv2_float_pos829(X,Y) get_csv2_float((X),(Y),829)
+#define get_csv2_uint_pos830(X,Y) get_csv2_uint((X),(Y),830)
+#define get_csv2_ullong_pos830(X,Y) get_csv2_ullong((X),(Y),830)
+#define get_csv2_ip_pos830(X,Y) get_csv2_ip((X),(Y),830)
+#define get_csv2_ipv6_pos830(X,Y) get_csv2_ipv6((X),(Y),830)
+#define get_csv2_string_pos830(X,Y) get_csv2_string((X),(Y),830)
+#define get_csv2_v_str_pos830(X,Y) get_csv2_string((X),(Y),830)
+#define get_csv2_bool_pos830(X,Y) get_csv2_bool((X),(Y),830)
+#define get_csv2_int_pos830(X,Y) get_csv2_int((X),(Y),830)
+#define get_csv2_llong_pos830(X,Y) get_csv2_llong((X),(Y),830)
+#define get_csv2_float_pos830(X,Y) get_csv2_float((X),(Y),830)
+#define get_csv2_uint_pos831(X,Y) get_csv2_uint((X),(Y),831)
+#define get_csv2_ullong_pos831(X,Y) get_csv2_ullong((X),(Y),831)
+#define get_csv2_ip_pos831(X,Y) get_csv2_ip((X),(Y),831)
+#define get_csv2_ipv6_pos831(X,Y) get_csv2_ipv6((X),(Y),831)
+#define get_csv2_string_pos831(X,Y) get_csv2_string((X),(Y),831)
+#define get_csv2_v_str_pos831(X,Y) get_csv2_string((X),(Y),831)
+#define get_csv2_bool_pos831(X,Y) get_csv2_bool((X),(Y),831)
+#define get_csv2_int_pos831(X,Y) get_csv2_int((X),(Y),831)
+#define get_csv2_llong_pos831(X,Y) get_csv2_llong((X),(Y),831)
+#define get_csv2_float_pos831(X,Y) get_csv2_float((X),(Y),831)
+#define get_csv2_uint_pos832(X,Y) get_csv2_uint((X),(Y),832)
+#define get_csv2_ullong_pos832(X,Y) get_csv2_ullong((X),(Y),832)
+#define get_csv2_ip_pos832(X,Y) get_csv2_ip((X),(Y),832)
+#define get_csv2_ipv6_pos832(X,Y) get_csv2_ipv6((X),(Y),832)
+#define get_csv2_string_pos832(X,Y) get_csv2_string((X),(Y),832)
+#define get_csv2_v_str_pos832(X,Y) get_csv2_string((X),(Y),832)
+#define get_csv2_bool_pos832(X,Y) get_csv2_bool((X),(Y),832)
+#define get_csv2_int_pos832(X,Y) get_csv2_int((X),(Y),832)
+#define get_csv2_llong_pos832(X,Y) get_csv2_llong((X),(Y),832)
+#define get_csv2_float_pos832(X,Y) get_csv2_float((X),(Y),832)
+#define get_csv2_uint_pos833(X,Y) get_csv2_uint((X),(Y),833)
+#define get_csv2_ullong_pos833(X,Y) get_csv2_ullong((X),(Y),833)
+#define get_csv2_ip_pos833(X,Y) get_csv2_ip((X),(Y),833)
+#define get_csv2_ipv6_pos833(X,Y) get_csv2_ipv6((X),(Y),833)
+#define get_csv2_string_pos833(X,Y) get_csv2_string((X),(Y),833)
+#define get_csv2_v_str_pos833(X,Y) get_csv2_string((X),(Y),833)
+#define get_csv2_bool_pos833(X,Y) get_csv2_bool((X),(Y),833)
+#define get_csv2_int_pos833(X,Y) get_csv2_int((X),(Y),833)
+#define get_csv2_llong_pos833(X,Y) get_csv2_llong((X),(Y),833)
+#define get_csv2_float_pos833(X,Y) get_csv2_float((X),(Y),833)
+#define get_csv2_uint_pos834(X,Y) get_csv2_uint((X),(Y),834)
+#define get_csv2_ullong_pos834(X,Y) get_csv2_ullong((X),(Y),834)
+#define get_csv2_ip_pos834(X,Y) get_csv2_ip((X),(Y),834)
+#define get_csv2_ipv6_pos834(X,Y) get_csv2_ipv6((X),(Y),834)
+#define get_csv2_string_pos834(X,Y) get_csv2_string((X),(Y),834)
+#define get_csv2_v_str_pos834(X,Y) get_csv2_string((X),(Y),834)
+#define get_csv2_bool_pos834(X,Y) get_csv2_bool((X),(Y),834)
+#define get_csv2_int_pos834(X,Y) get_csv2_int((X),(Y),834)
+#define get_csv2_llong_pos834(X,Y) get_csv2_llong((X),(Y),834)
+#define get_csv2_float_pos834(X,Y) get_csv2_float((X),(Y),834)
+#define get_csv2_uint_pos835(X,Y) get_csv2_uint((X),(Y),835)
+#define get_csv2_ullong_pos835(X,Y) get_csv2_ullong((X),(Y),835)
+#define get_csv2_ip_pos835(X,Y) get_csv2_ip((X),(Y),835)
+#define get_csv2_ipv6_pos835(X,Y) get_csv2_ipv6((X),(Y),835)
+#define get_csv2_string_pos835(X,Y) get_csv2_string((X),(Y),835)
+#define get_csv2_v_str_pos835(X,Y) get_csv2_string((X),(Y),835)
+#define get_csv2_bool_pos835(X,Y) get_csv2_bool((X),(Y),835)
+#define get_csv2_int_pos835(X,Y) get_csv2_int((X),(Y),835)
+#define get_csv2_llong_pos835(X,Y) get_csv2_llong((X),(Y),835)
+#define get_csv2_float_pos835(X,Y) get_csv2_float((X),(Y),835)
+#define get_csv2_uint_pos836(X,Y) get_csv2_uint((X),(Y),836)
+#define get_csv2_ullong_pos836(X,Y) get_csv2_ullong((X),(Y),836)
+#define get_csv2_ip_pos836(X,Y) get_csv2_ip((X),(Y),836)
+#define get_csv2_ipv6_pos836(X,Y) get_csv2_ipv6((X),(Y),836)
+#define get_csv2_string_pos836(X,Y) get_csv2_string((X),(Y),836)
+#define get_csv2_v_str_pos836(X,Y) get_csv2_string((X),(Y),836)
+#define get_csv2_bool_pos836(X,Y) get_csv2_bool((X),(Y),836)
+#define get_csv2_int_pos836(X,Y) get_csv2_int((X),(Y),836)
+#define get_csv2_llong_pos836(X,Y) get_csv2_llong((X),(Y),836)
+#define get_csv2_float_pos836(X,Y) get_csv2_float((X),(Y),836)
+#define get_csv2_uint_pos837(X,Y) get_csv2_uint((X),(Y),837)
+#define get_csv2_ullong_pos837(X,Y) get_csv2_ullong((X),(Y),837)
+#define get_csv2_ip_pos837(X,Y) get_csv2_ip((X),(Y),837)
+#define get_csv2_ipv6_pos837(X,Y) get_csv2_ipv6((X),(Y),837)
+#define get_csv2_string_pos837(X,Y) get_csv2_string((X),(Y),837)
+#define get_csv2_v_str_pos837(X,Y) get_csv2_string((X),(Y),837)
+#define get_csv2_bool_pos837(X,Y) get_csv2_bool((X),(Y),837)
+#define get_csv2_int_pos837(X,Y) get_csv2_int((X),(Y),837)
+#define get_csv2_llong_pos837(X,Y) get_csv2_llong((X),(Y),837)
+#define get_csv2_float_pos837(X,Y) get_csv2_float((X),(Y),837)
+#define get_csv2_uint_pos838(X,Y) get_csv2_uint((X),(Y),838)
+#define get_csv2_ullong_pos838(X,Y) get_csv2_ullong((X),(Y),838)
+#define get_csv2_ip_pos838(X,Y) get_csv2_ip((X),(Y),838)
+#define get_csv2_ipv6_pos838(X,Y) get_csv2_ipv6((X),(Y),838)
+#define get_csv2_string_pos838(X,Y) get_csv2_string((X),(Y),838)
+#define get_csv2_v_str_pos838(X,Y) get_csv2_string((X),(Y),838)
+#define get_csv2_bool_pos838(X,Y) get_csv2_bool((X),(Y),838)
+#define get_csv2_int_pos838(X,Y) get_csv2_int((X),(Y),838)
+#define get_csv2_llong_pos838(X,Y) get_csv2_llong((X),(Y),838)
+#define get_csv2_float_pos838(X,Y) get_csv2_float((X),(Y),838)
+#define get_csv2_uint_pos839(X,Y) get_csv2_uint((X),(Y),839)
+#define get_csv2_ullong_pos839(X,Y) get_csv2_ullong((X),(Y),839)
+#define get_csv2_ip_pos839(X,Y) get_csv2_ip((X),(Y),839)
+#define get_csv2_ipv6_pos839(X,Y) get_csv2_ipv6((X),(Y),839)
+#define get_csv2_string_pos839(X,Y) get_csv2_string((X),(Y),839)
+#define get_csv2_v_str_pos839(X,Y) get_csv2_string((X),(Y),839)
+#define get_csv2_bool_pos839(X,Y) get_csv2_bool((X),(Y),839)
+#define get_csv2_int_pos839(X,Y) get_csv2_int((X),(Y),839)
+#define get_csv2_llong_pos839(X,Y) get_csv2_llong((X),(Y),839)
+#define get_csv2_float_pos839(X,Y) get_csv2_float((X),(Y),839)
+#define get_csv2_uint_pos840(X,Y) get_csv2_uint((X),(Y),840)
+#define get_csv2_ullong_pos840(X,Y) get_csv2_ullong((X),(Y),840)
+#define get_csv2_ip_pos840(X,Y) get_csv2_ip((X),(Y),840)
+#define get_csv2_ipv6_pos840(X,Y) get_csv2_ipv6((X),(Y),840)
+#define get_csv2_string_pos840(X,Y) get_csv2_string((X),(Y),840)
+#define get_csv2_v_str_pos840(X,Y) get_csv2_string((X),(Y),840)
+#define get_csv2_bool_pos840(X,Y) get_csv2_bool((X),(Y),840)
+#define get_csv2_int_pos840(X,Y) get_csv2_int((X),(Y),840)
+#define get_csv2_llong_pos840(X,Y) get_csv2_llong((X),(Y),840)
+#define get_csv2_float_pos840(X,Y) get_csv2_float((X),(Y),840)
+#define get_csv2_uint_pos841(X,Y) get_csv2_uint((X),(Y),841)
+#define get_csv2_ullong_pos841(X,Y) get_csv2_ullong((X),(Y),841)
+#define get_csv2_ip_pos841(X,Y) get_csv2_ip((X),(Y),841)
+#define get_csv2_ipv6_pos841(X,Y) get_csv2_ipv6((X),(Y),841)
+#define get_csv2_string_pos841(X,Y) get_csv2_string((X),(Y),841)
+#define get_csv2_v_str_pos841(X,Y) get_csv2_string((X),(Y),841)
+#define get_csv2_bool_pos841(X,Y) get_csv2_bool((X),(Y),841)
+#define get_csv2_int_pos841(X,Y) get_csv2_int((X),(Y),841)
+#define get_csv2_llong_pos841(X,Y) get_csv2_llong((X),(Y),841)
+#define get_csv2_float_pos841(X,Y) get_csv2_float((X),(Y),841)
+#define get_csv2_uint_pos842(X,Y) get_csv2_uint((X),(Y),842)
+#define get_csv2_ullong_pos842(X,Y) get_csv2_ullong((X),(Y),842)
+#define get_csv2_ip_pos842(X,Y) get_csv2_ip((X),(Y),842)
+#define get_csv2_ipv6_pos842(X,Y) get_csv2_ipv6((X),(Y),842)
+#define get_csv2_string_pos842(X,Y) get_csv2_string((X),(Y),842)
+#define get_csv2_v_str_pos842(X,Y) get_csv2_string((X),(Y),842)
+#define get_csv2_bool_pos842(X,Y) get_csv2_bool((X),(Y),842)
+#define get_csv2_int_pos842(X,Y) get_csv2_int((X),(Y),842)
+#define get_csv2_llong_pos842(X,Y) get_csv2_llong((X),(Y),842)
+#define get_csv2_float_pos842(X,Y) get_csv2_float((X),(Y),842)
+#define get_csv2_uint_pos843(X,Y) get_csv2_uint((X),(Y),843)
+#define get_csv2_ullong_pos843(X,Y) get_csv2_ullong((X),(Y),843)
+#define get_csv2_ip_pos843(X,Y) get_csv2_ip((X),(Y),843)
+#define get_csv2_ipv6_pos843(X,Y) get_csv2_ipv6((X),(Y),843)
+#define get_csv2_string_pos843(X,Y) get_csv2_string((X),(Y),843)
+#define get_csv2_v_str_pos843(X,Y) get_csv2_string((X),(Y),843)
+#define get_csv2_bool_pos843(X,Y) get_csv2_bool((X),(Y),843)
+#define get_csv2_int_pos843(X,Y) get_csv2_int((X),(Y),843)
+#define get_csv2_llong_pos843(X,Y) get_csv2_llong((X),(Y),843)
+#define get_csv2_float_pos843(X,Y) get_csv2_float((X),(Y),843)
+#define get_csv2_uint_pos844(X,Y) get_csv2_uint((X),(Y),844)
+#define get_csv2_ullong_pos844(X,Y) get_csv2_ullong((X),(Y),844)
+#define get_csv2_ip_pos844(X,Y) get_csv2_ip((X),(Y),844)
+#define get_csv2_ipv6_pos844(X,Y) get_csv2_ipv6((X),(Y),844)
+#define get_csv2_string_pos844(X,Y) get_csv2_string((X),(Y),844)
+#define get_csv2_v_str_pos844(X,Y) get_csv2_string((X),(Y),844)
+#define get_csv2_bool_pos844(X,Y) get_csv2_bool((X),(Y),844)
+#define get_csv2_int_pos844(X,Y) get_csv2_int((X),(Y),844)
+#define get_csv2_llong_pos844(X,Y) get_csv2_llong((X),(Y),844)
+#define get_csv2_float_pos844(X,Y) get_csv2_float((X),(Y),844)
+#define get_csv2_uint_pos845(X,Y) get_csv2_uint((X),(Y),845)
+#define get_csv2_ullong_pos845(X,Y) get_csv2_ullong((X),(Y),845)
+#define get_csv2_ip_pos845(X,Y) get_csv2_ip((X),(Y),845)
+#define get_csv2_ipv6_pos845(X,Y) get_csv2_ipv6((X),(Y),845)
+#define get_csv2_string_pos845(X,Y) get_csv2_string((X),(Y),845)
+#define get_csv2_v_str_pos845(X,Y) get_csv2_string((X),(Y),845)
+#define get_csv2_bool_pos845(X,Y) get_csv2_bool((X),(Y),845)
+#define get_csv2_int_pos845(X,Y) get_csv2_int((X),(Y),845)
+#define get_csv2_llong_pos845(X,Y) get_csv2_llong((X),(Y),845)
+#define get_csv2_float_pos845(X,Y) get_csv2_float((X),(Y),845)
+#define get_csv2_uint_pos846(X,Y) get_csv2_uint((X),(Y),846)
+#define get_csv2_ullong_pos846(X,Y) get_csv2_ullong((X),(Y),846)
+#define get_csv2_ip_pos846(X,Y) get_csv2_ip((X),(Y),846)
+#define get_csv2_ipv6_pos846(X,Y) get_csv2_ipv6((X),(Y),846)
+#define get_csv2_string_pos846(X,Y) get_csv2_string((X),(Y),846)
+#define get_csv2_v_str_pos846(X,Y) get_csv2_string((X),(Y),846)
+#define get_csv2_bool_pos846(X,Y) get_csv2_bool((X),(Y),846)
+#define get_csv2_int_pos846(X,Y) get_csv2_int((X),(Y),846)
+#define get_csv2_llong_pos846(X,Y) get_csv2_llong((X),(Y),846)
+#define get_csv2_float_pos846(X,Y) get_csv2_float((X),(Y),846)
+#define get_csv2_uint_pos847(X,Y) get_csv2_uint((X),(Y),847)
+#define get_csv2_ullong_pos847(X,Y) get_csv2_ullong((X),(Y),847)
+#define get_csv2_ip_pos847(X,Y) get_csv2_ip((X),(Y),847)
+#define get_csv2_ipv6_pos847(X,Y) get_csv2_ipv6((X),(Y),847)
+#define get_csv2_string_pos847(X,Y) get_csv2_string((X),(Y),847)
+#define get_csv2_v_str_pos847(X,Y) get_csv2_string((X),(Y),847)
+#define get_csv2_bool_pos847(X,Y) get_csv2_bool((X),(Y),847)
+#define get_csv2_int_pos847(X,Y) get_csv2_int((X),(Y),847)
+#define get_csv2_llong_pos847(X,Y) get_csv2_llong((X),(Y),847)
+#define get_csv2_float_pos847(X,Y) get_csv2_float((X),(Y),847)
+#define get_csv2_uint_pos848(X,Y) get_csv2_uint((X),(Y),848)
+#define get_csv2_ullong_pos848(X,Y) get_csv2_ullong((X),(Y),848)
+#define get_csv2_ip_pos848(X,Y) get_csv2_ip((X),(Y),848)
+#define get_csv2_ipv6_pos848(X,Y) get_csv2_ipv6((X),(Y),848)
+#define get_csv2_string_pos848(X,Y) get_csv2_string((X),(Y),848)
+#define get_csv2_v_str_pos848(X,Y) get_csv2_string((X),(Y),848)
+#define get_csv2_bool_pos848(X,Y) get_csv2_bool((X),(Y),848)
+#define get_csv2_int_pos848(X,Y) get_csv2_int((X),(Y),848)
+#define get_csv2_llong_pos848(X,Y) get_csv2_llong((X),(Y),848)
+#define get_csv2_float_pos848(X,Y) get_csv2_float((X),(Y),848)
+#define get_csv2_uint_pos849(X,Y) get_csv2_uint((X),(Y),849)
+#define get_csv2_ullong_pos849(X,Y) get_csv2_ullong((X),(Y),849)
+#define get_csv2_ip_pos849(X,Y) get_csv2_ip((X),(Y),849)
+#define get_csv2_ipv6_pos849(X,Y) get_csv2_ipv6((X),(Y),849)
+#define get_csv2_string_pos849(X,Y) get_csv2_string((X),(Y),849)
+#define get_csv2_v_str_pos849(X,Y) get_csv2_string((X),(Y),849)
+#define get_csv2_bool_pos849(X,Y) get_csv2_bool((X),(Y),849)
+#define get_csv2_int_pos849(X,Y) get_csv2_int((X),(Y),849)
+#define get_csv2_llong_pos849(X,Y) get_csv2_llong((X),(Y),849)
+#define get_csv2_float_pos849(X,Y) get_csv2_float((X),(Y),849)
+#define get_csv2_uint_pos850(X,Y) get_csv2_uint((X),(Y),850)
+#define get_csv2_ullong_pos850(X,Y) get_csv2_ullong((X),(Y),850)
+#define get_csv2_ip_pos850(X,Y) get_csv2_ip((X),(Y),850)
+#define get_csv2_ipv6_pos850(X,Y) get_csv2_ipv6((X),(Y),850)
+#define get_csv2_string_pos850(X,Y) get_csv2_string((X),(Y),850)
+#define get_csv2_v_str_pos850(X,Y) get_csv2_string((X),(Y),850)
+#define get_csv2_bool_pos850(X,Y) get_csv2_bool((X),(Y),850)
+#define get_csv2_int_pos850(X,Y) get_csv2_int((X),(Y),850)
+#define get_csv2_llong_pos850(X,Y) get_csv2_llong((X),(Y),850)
+#define get_csv2_float_pos850(X,Y) get_csv2_float((X),(Y),850)
+#define get_csv2_uint_pos851(X,Y) get_csv2_uint((X),(Y),851)
+#define get_csv2_ullong_pos851(X,Y) get_csv2_ullong((X),(Y),851)
+#define get_csv2_ip_pos851(X,Y) get_csv2_ip((X),(Y),851)
+#define get_csv2_ipv6_pos851(X,Y) get_csv2_ipv6((X),(Y),851)
+#define get_csv2_string_pos851(X,Y) get_csv2_string((X),(Y),851)
+#define get_csv2_v_str_pos851(X,Y) get_csv2_string((X),(Y),851)
+#define get_csv2_bool_pos851(X,Y) get_csv2_bool((X),(Y),851)
+#define get_csv2_int_pos851(X,Y) get_csv2_int((X),(Y),851)
+#define get_csv2_llong_pos851(X,Y) get_csv2_llong((X),(Y),851)
+#define get_csv2_float_pos851(X,Y) get_csv2_float((X),(Y),851)
+#define get_csv2_uint_pos852(X,Y) get_csv2_uint((X),(Y),852)
+#define get_csv2_ullong_pos852(X,Y) get_csv2_ullong((X),(Y),852)
+#define get_csv2_ip_pos852(X,Y) get_csv2_ip((X),(Y),852)
+#define get_csv2_ipv6_pos852(X,Y) get_csv2_ipv6((X),(Y),852)
+#define get_csv2_string_pos852(X,Y) get_csv2_string((X),(Y),852)
+#define get_csv2_v_str_pos852(X,Y) get_csv2_string((X),(Y),852)
+#define get_csv2_bool_pos852(X,Y) get_csv2_bool((X),(Y),852)
+#define get_csv2_int_pos852(X,Y) get_csv2_int((X),(Y),852)
+#define get_csv2_llong_pos852(X,Y) get_csv2_llong((X),(Y),852)
+#define get_csv2_float_pos852(X,Y) get_csv2_float((X),(Y),852)
+#define get_csv2_uint_pos853(X,Y) get_csv2_uint((X),(Y),853)
+#define get_csv2_ullong_pos853(X,Y) get_csv2_ullong((X),(Y),853)
+#define get_csv2_ip_pos853(X,Y) get_csv2_ip((X),(Y),853)
+#define get_csv2_ipv6_pos853(X,Y) get_csv2_ipv6((X),(Y),853)
+#define get_csv2_string_pos853(X,Y) get_csv2_string((X),(Y),853)
+#define get_csv2_v_str_pos853(X,Y) get_csv2_string((X),(Y),853)
+#define get_csv2_bool_pos853(X,Y) get_csv2_bool((X),(Y),853)
+#define get_csv2_int_pos853(X,Y) get_csv2_int((X),(Y),853)
+#define get_csv2_llong_pos853(X,Y) get_csv2_llong((X),(Y),853)
+#define get_csv2_float_pos853(X,Y) get_csv2_float((X),(Y),853)
+#define get_csv2_uint_pos854(X,Y) get_csv2_uint((X),(Y),854)
+#define get_csv2_ullong_pos854(X,Y) get_csv2_ullong((X),(Y),854)
+#define get_csv2_ip_pos854(X,Y) get_csv2_ip((X),(Y),854)
+#define get_csv2_ipv6_pos854(X,Y) get_csv2_ipv6((X),(Y),854)
+#define get_csv2_string_pos854(X,Y) get_csv2_string((X),(Y),854)
+#define get_csv2_v_str_pos854(X,Y) get_csv2_string((X),(Y),854)
+#define get_csv2_bool_pos854(X,Y) get_csv2_bool((X),(Y),854)
+#define get_csv2_int_pos854(X,Y) get_csv2_int((X),(Y),854)
+#define get_csv2_llong_pos854(X,Y) get_csv2_llong((X),(Y),854)
+#define get_csv2_float_pos854(X,Y) get_csv2_float((X),(Y),854)
+#define get_csv2_uint_pos855(X,Y) get_csv2_uint((X),(Y),855)
+#define get_csv2_ullong_pos855(X,Y) get_csv2_ullong((X),(Y),855)
+#define get_csv2_ip_pos855(X,Y) get_csv2_ip((X),(Y),855)
+#define get_csv2_ipv6_pos855(X,Y) get_csv2_ipv6((X),(Y),855)
+#define get_csv2_string_pos855(X,Y) get_csv2_string((X),(Y),855)
+#define get_csv2_v_str_pos855(X,Y) get_csv2_string((X),(Y),855)
+#define get_csv2_bool_pos855(X,Y) get_csv2_bool((X),(Y),855)
+#define get_csv2_int_pos855(X,Y) get_csv2_int((X),(Y),855)
+#define get_csv2_llong_pos855(X,Y) get_csv2_llong((X),(Y),855)
+#define get_csv2_float_pos855(X,Y) get_csv2_float((X),(Y),855)
+#define get_csv2_uint_pos856(X,Y) get_csv2_uint((X),(Y),856)
+#define get_csv2_ullong_pos856(X,Y) get_csv2_ullong((X),(Y),856)
+#define get_csv2_ip_pos856(X,Y) get_csv2_ip((X),(Y),856)
+#define get_csv2_ipv6_pos856(X,Y) get_csv2_ipv6((X),(Y),856)
+#define get_csv2_string_pos856(X,Y) get_csv2_string((X),(Y),856)
+#define get_csv2_v_str_pos856(X,Y) get_csv2_string((X),(Y),856)
+#define get_csv2_bool_pos856(X,Y) get_csv2_bool((X),(Y),856)
+#define get_csv2_int_pos856(X,Y) get_csv2_int((X),(Y),856)
+#define get_csv2_llong_pos856(X,Y) get_csv2_llong((X),(Y),856)
+#define get_csv2_float_pos856(X,Y) get_csv2_float((X),(Y),856)
+#define get_csv2_uint_pos857(X,Y) get_csv2_uint((X),(Y),857)
+#define get_csv2_ullong_pos857(X,Y) get_csv2_ullong((X),(Y),857)
+#define get_csv2_ip_pos857(X,Y) get_csv2_ip((X),(Y),857)
+#define get_csv2_ipv6_pos857(X,Y) get_csv2_ipv6((X),(Y),857)
+#define get_csv2_string_pos857(X,Y) get_csv2_string((X),(Y),857)
+#define get_csv2_v_str_pos857(X,Y) get_csv2_string((X),(Y),857)
+#define get_csv2_bool_pos857(X,Y) get_csv2_bool((X),(Y),857)
+#define get_csv2_int_pos857(X,Y) get_csv2_int((X),(Y),857)
+#define get_csv2_llong_pos857(X,Y) get_csv2_llong((X),(Y),857)
+#define get_csv2_float_pos857(X,Y) get_csv2_float((X),(Y),857)
+#define get_csv2_uint_pos858(X,Y) get_csv2_uint((X),(Y),858)
+#define get_csv2_ullong_pos858(X,Y) get_csv2_ullong((X),(Y),858)
+#define get_csv2_ip_pos858(X,Y) get_csv2_ip((X),(Y),858)
+#define get_csv2_ipv6_pos858(X,Y) get_csv2_ipv6((X),(Y),858)
+#define get_csv2_string_pos858(X,Y) get_csv2_string((X),(Y),858)
+#define get_csv2_v_str_pos858(X,Y) get_csv2_string((X),(Y),858)
+#define get_csv2_bool_pos858(X,Y) get_csv2_bool((X),(Y),858)
+#define get_csv2_int_pos858(X,Y) get_csv2_int((X),(Y),858)
+#define get_csv2_llong_pos858(X,Y) get_csv2_llong((X),(Y),858)
+#define get_csv2_float_pos858(X,Y) get_csv2_float((X),(Y),858)
+#define get_csv2_uint_pos859(X,Y) get_csv2_uint((X),(Y),859)
+#define get_csv2_ullong_pos859(X,Y) get_csv2_ullong((X),(Y),859)
+#define get_csv2_ip_pos859(X,Y) get_csv2_ip((X),(Y),859)
+#define get_csv2_ipv6_pos859(X,Y) get_csv2_ipv6((X),(Y),859)
+#define get_csv2_string_pos859(X,Y) get_csv2_string((X),(Y),859)
+#define get_csv2_v_str_pos859(X,Y) get_csv2_string((X),(Y),859)
+#define get_csv2_bool_pos859(X,Y) get_csv2_bool((X),(Y),859)
+#define get_csv2_int_pos859(X,Y) get_csv2_int((X),(Y),859)
+#define get_csv2_llong_pos859(X,Y) get_csv2_llong((X),(Y),859)
+#define get_csv2_float_pos859(X,Y) get_csv2_float((X),(Y),859)
+#define get_csv2_uint_pos860(X,Y) get_csv2_uint((X),(Y),860)
+#define get_csv2_ullong_pos860(X,Y) get_csv2_ullong((X),(Y),860)
+#define get_csv2_ip_pos860(X,Y) get_csv2_ip((X),(Y),860)
+#define get_csv2_ipv6_pos860(X,Y) get_csv2_ipv6((X),(Y),860)
+#define get_csv2_string_pos860(X,Y) get_csv2_string((X),(Y),860)
+#define get_csv2_v_str_pos860(X,Y) get_csv2_string((X),(Y),860)
+#define get_csv2_bool_pos860(X,Y) get_csv2_bool((X),(Y),860)
+#define get_csv2_int_pos860(X,Y) get_csv2_int((X),(Y),860)
+#define get_csv2_llong_pos860(X,Y) get_csv2_llong((X),(Y),860)
+#define get_csv2_float_pos860(X,Y) get_csv2_float((X),(Y),860)
+#define get_csv2_uint_pos861(X,Y) get_csv2_uint((X),(Y),861)
+#define get_csv2_ullong_pos861(X,Y) get_csv2_ullong((X),(Y),861)
+#define get_csv2_ip_pos861(X,Y) get_csv2_ip((X),(Y),861)
+#define get_csv2_ipv6_pos861(X,Y) get_csv2_ipv6((X),(Y),861)
+#define get_csv2_string_pos861(X,Y) get_csv2_string((X),(Y),861)
+#define get_csv2_v_str_pos861(X,Y) get_csv2_string((X),(Y),861)
+#define get_csv2_bool_pos861(X,Y) get_csv2_bool((X),(Y),861)
+#define get_csv2_int_pos861(X,Y) get_csv2_int((X),(Y),861)
+#define get_csv2_llong_pos861(X,Y) get_csv2_llong((X),(Y),861)
+#define get_csv2_float_pos861(X,Y) get_csv2_float((X),(Y),861)
+#define get_csv2_uint_pos862(X,Y) get_csv2_uint((X),(Y),862)
+#define get_csv2_ullong_pos862(X,Y) get_csv2_ullong((X),(Y),862)
+#define get_csv2_ip_pos862(X,Y) get_csv2_ip((X),(Y),862)
+#define get_csv2_ipv6_pos862(X,Y) get_csv2_ipv6((X),(Y),862)
+#define get_csv2_string_pos862(X,Y) get_csv2_string((X),(Y),862)
+#define get_csv2_v_str_pos862(X,Y) get_csv2_string((X),(Y),862)
+#define get_csv2_bool_pos862(X,Y) get_csv2_bool((X),(Y),862)
+#define get_csv2_int_pos862(X,Y) get_csv2_int((X),(Y),862)
+#define get_csv2_llong_pos862(X,Y) get_csv2_llong((X),(Y),862)
+#define get_csv2_float_pos862(X,Y) get_csv2_float((X),(Y),862)
+#define get_csv2_uint_pos863(X,Y) get_csv2_uint((X),(Y),863)
+#define get_csv2_ullong_pos863(X,Y) get_csv2_ullong((X),(Y),863)
+#define get_csv2_ip_pos863(X,Y) get_csv2_ip((X),(Y),863)
+#define get_csv2_ipv6_pos863(X,Y) get_csv2_ipv6((X),(Y),863)
+#define get_csv2_string_pos863(X,Y) get_csv2_string((X),(Y),863)
+#define get_csv2_v_str_pos863(X,Y) get_csv2_string((X),(Y),863)
+#define get_csv2_bool_pos863(X,Y) get_csv2_bool((X),(Y),863)
+#define get_csv2_int_pos863(X,Y) get_csv2_int((X),(Y),863)
+#define get_csv2_llong_pos863(X,Y) get_csv2_llong((X),(Y),863)
+#define get_csv2_float_pos863(X,Y) get_csv2_float((X),(Y),863)
+#define get_csv2_uint_pos864(X,Y) get_csv2_uint((X),(Y),864)
+#define get_csv2_ullong_pos864(X,Y) get_csv2_ullong((X),(Y),864)
+#define get_csv2_ip_pos864(X,Y) get_csv2_ip((X),(Y),864)
+#define get_csv2_ipv6_pos864(X,Y) get_csv2_ipv6((X),(Y),864)
+#define get_csv2_string_pos864(X,Y) get_csv2_string((X),(Y),864)
+#define get_csv2_v_str_pos864(X,Y) get_csv2_string((X),(Y),864)
+#define get_csv2_bool_pos864(X,Y) get_csv2_bool((X),(Y),864)
+#define get_csv2_int_pos864(X,Y) get_csv2_int((X),(Y),864)
+#define get_csv2_llong_pos864(X,Y) get_csv2_llong((X),(Y),864)
+#define get_csv2_float_pos864(X,Y) get_csv2_float((X),(Y),864)
+#define get_csv2_uint_pos865(X,Y) get_csv2_uint((X),(Y),865)
+#define get_csv2_ullong_pos865(X,Y) get_csv2_ullong((X),(Y),865)
+#define get_csv2_ip_pos865(X,Y) get_csv2_ip((X),(Y),865)
+#define get_csv2_ipv6_pos865(X,Y) get_csv2_ipv6((X),(Y),865)
+#define get_csv2_string_pos865(X,Y) get_csv2_string((X),(Y),865)
+#define get_csv2_v_str_pos865(X,Y) get_csv2_string((X),(Y),865)
+#define get_csv2_bool_pos865(X,Y) get_csv2_bool((X),(Y),865)
+#define get_csv2_int_pos865(X,Y) get_csv2_int((X),(Y),865)
+#define get_csv2_llong_pos865(X,Y) get_csv2_llong((X),(Y),865)
+#define get_csv2_float_pos865(X,Y) get_csv2_float((X),(Y),865)
+#define get_csv2_uint_pos866(X,Y) get_csv2_uint((X),(Y),866)
+#define get_csv2_ullong_pos866(X,Y) get_csv2_ullong((X),(Y),866)
+#define get_csv2_ip_pos866(X,Y) get_csv2_ip((X),(Y),866)
+#define get_csv2_ipv6_pos866(X,Y) get_csv2_ipv6((X),(Y),866)
+#define get_csv2_string_pos866(X,Y) get_csv2_string((X),(Y),866)
+#define get_csv2_v_str_pos866(X,Y) get_csv2_string((X),(Y),866)
+#define get_csv2_bool_pos866(X,Y) get_csv2_bool((X),(Y),866)
+#define get_csv2_int_pos866(X,Y) get_csv2_int((X),(Y),866)
+#define get_csv2_llong_pos866(X,Y) get_csv2_llong((X),(Y),866)
+#define get_csv2_float_pos866(X,Y) get_csv2_float((X),(Y),866)
+#define get_csv2_uint_pos867(X,Y) get_csv2_uint((X),(Y),867)
+#define get_csv2_ullong_pos867(X,Y) get_csv2_ullong((X),(Y),867)
+#define get_csv2_ip_pos867(X,Y) get_csv2_ip((X),(Y),867)
+#define get_csv2_ipv6_pos867(X,Y) get_csv2_ipv6((X),(Y),867)
+#define get_csv2_string_pos867(X,Y) get_csv2_string((X),(Y),867)
+#define get_csv2_v_str_pos867(X,Y) get_csv2_string((X),(Y),867)
+#define get_csv2_bool_pos867(X,Y) get_csv2_bool((X),(Y),867)
+#define get_csv2_int_pos867(X,Y) get_csv2_int((X),(Y),867)
+#define get_csv2_llong_pos867(X,Y) get_csv2_llong((X),(Y),867)
+#define get_csv2_float_pos867(X,Y) get_csv2_float((X),(Y),867)
+#define get_csv2_uint_pos868(X,Y) get_csv2_uint((X),(Y),868)
+#define get_csv2_ullong_pos868(X,Y) get_csv2_ullong((X),(Y),868)
+#define get_csv2_ip_pos868(X,Y) get_csv2_ip((X),(Y),868)
+#define get_csv2_ipv6_pos868(X,Y) get_csv2_ipv6((X),(Y),868)
+#define get_csv2_string_pos868(X,Y) get_csv2_string((X),(Y),868)
+#define get_csv2_v_str_pos868(X,Y) get_csv2_string((X),(Y),868)
+#define get_csv2_bool_pos868(X,Y) get_csv2_bool((X),(Y),868)
+#define get_csv2_int_pos868(X,Y) get_csv2_int((X),(Y),868)
+#define get_csv2_llong_pos868(X,Y) get_csv2_llong((X),(Y),868)
+#define get_csv2_float_pos868(X,Y) get_csv2_float((X),(Y),868)
+#define get_csv2_uint_pos869(X,Y) get_csv2_uint((X),(Y),869)
+#define get_csv2_ullong_pos869(X,Y) get_csv2_ullong((X),(Y),869)
+#define get_csv2_ip_pos869(X,Y) get_csv2_ip((X),(Y),869)
+#define get_csv2_ipv6_pos869(X,Y) get_csv2_ipv6((X),(Y),869)
+#define get_csv2_string_pos869(X,Y) get_csv2_string((X),(Y),869)
+#define get_csv2_v_str_pos869(X,Y) get_csv2_string((X),(Y),869)
+#define get_csv2_bool_pos869(X,Y) get_csv2_bool((X),(Y),869)
+#define get_csv2_int_pos869(X,Y) get_csv2_int((X),(Y),869)
+#define get_csv2_llong_pos869(X,Y) get_csv2_llong((X),(Y),869)
+#define get_csv2_float_pos869(X,Y) get_csv2_float((X),(Y),869)
+#define get_csv2_uint_pos870(X,Y) get_csv2_uint((X),(Y),870)
+#define get_csv2_ullong_pos870(X,Y) get_csv2_ullong((X),(Y),870)
+#define get_csv2_ip_pos870(X,Y) get_csv2_ip((X),(Y),870)
+#define get_csv2_ipv6_pos870(X,Y) get_csv2_ipv6((X),(Y),870)
+#define get_csv2_string_pos870(X,Y) get_csv2_string((X),(Y),870)
+#define get_csv2_v_str_pos870(X,Y) get_csv2_string((X),(Y),870)
+#define get_csv2_bool_pos870(X,Y) get_csv2_bool((X),(Y),870)
+#define get_csv2_int_pos870(X,Y) get_csv2_int((X),(Y),870)
+#define get_csv2_llong_pos870(X,Y) get_csv2_llong((X),(Y),870)
+#define get_csv2_float_pos870(X,Y) get_csv2_float((X),(Y),870)
+#define get_csv2_uint_pos871(X,Y) get_csv2_uint((X),(Y),871)
+#define get_csv2_ullong_pos871(X,Y) get_csv2_ullong((X),(Y),871)
+#define get_csv2_ip_pos871(X,Y) get_csv2_ip((X),(Y),871)
+#define get_csv2_ipv6_pos871(X,Y) get_csv2_ipv6((X),(Y),871)
+#define get_csv2_string_pos871(X,Y) get_csv2_string((X),(Y),871)
+#define get_csv2_v_str_pos871(X,Y) get_csv2_string((X),(Y),871)
+#define get_csv2_bool_pos871(X,Y) get_csv2_bool((X),(Y),871)
+#define get_csv2_int_pos871(X,Y) get_csv2_int((X),(Y),871)
+#define get_csv2_llong_pos871(X,Y) get_csv2_llong((X),(Y),871)
+#define get_csv2_float_pos871(X,Y) get_csv2_float((X),(Y),871)
+#define get_csv2_uint_pos872(X,Y) get_csv2_uint((X),(Y),872)
+#define get_csv2_ullong_pos872(X,Y) get_csv2_ullong((X),(Y),872)
+#define get_csv2_ip_pos872(X,Y) get_csv2_ip((X),(Y),872)
+#define get_csv2_ipv6_pos872(X,Y) get_csv2_ipv6((X),(Y),872)
+#define get_csv2_string_pos872(X,Y) get_csv2_string((X),(Y),872)
+#define get_csv2_v_str_pos872(X,Y) get_csv2_string((X),(Y),872)
+#define get_csv2_bool_pos872(X,Y) get_csv2_bool((X),(Y),872)
+#define get_csv2_int_pos872(X,Y) get_csv2_int((X),(Y),872)
+#define get_csv2_llong_pos872(X,Y) get_csv2_llong((X),(Y),872)
+#define get_csv2_float_pos872(X,Y) get_csv2_float((X),(Y),872)
+#define get_csv2_uint_pos873(X,Y) get_csv2_uint((X),(Y),873)
+#define get_csv2_ullong_pos873(X,Y) get_csv2_ullong((X),(Y),873)
+#define get_csv2_ip_pos873(X,Y) get_csv2_ip((X),(Y),873)
+#define get_csv2_ipv6_pos873(X,Y) get_csv2_ipv6((X),(Y),873)
+#define get_csv2_string_pos873(X,Y) get_csv2_string((X),(Y),873)
+#define get_csv2_v_str_pos873(X,Y) get_csv2_string((X),(Y),873)
+#define get_csv2_bool_pos873(X,Y) get_csv2_bool((X),(Y),873)
+#define get_csv2_int_pos873(X,Y) get_csv2_int((X),(Y),873)
+#define get_csv2_llong_pos873(X,Y) get_csv2_llong((X),(Y),873)
+#define get_csv2_float_pos873(X,Y) get_csv2_float((X),(Y),873)
+#define get_csv2_uint_pos874(X,Y) get_csv2_uint((X),(Y),874)
+#define get_csv2_ullong_pos874(X,Y) get_csv2_ullong((X),(Y),874)
+#define get_csv2_ip_pos874(X,Y) get_csv2_ip((X),(Y),874)
+#define get_csv2_ipv6_pos874(X,Y) get_csv2_ipv6((X),(Y),874)
+#define get_csv2_string_pos874(X,Y) get_csv2_string((X),(Y),874)
+#define get_csv2_v_str_pos874(X,Y) get_csv2_string((X),(Y),874)
+#define get_csv2_bool_pos874(X,Y) get_csv2_bool((X),(Y),874)
+#define get_csv2_int_pos874(X,Y) get_csv2_int((X),(Y),874)
+#define get_csv2_llong_pos874(X,Y) get_csv2_llong((X),(Y),874)
+#define get_csv2_float_pos874(X,Y) get_csv2_float((X),(Y),874)
+#define get_csv2_uint_pos875(X,Y) get_csv2_uint((X),(Y),875)
+#define get_csv2_ullong_pos875(X,Y) get_csv2_ullong((X),(Y),875)
+#define get_csv2_ip_pos875(X,Y) get_csv2_ip((X),(Y),875)
+#define get_csv2_ipv6_pos875(X,Y) get_csv2_ipv6((X),(Y),875)
+#define get_csv2_string_pos875(X,Y) get_csv2_string((X),(Y),875)
+#define get_csv2_v_str_pos875(X,Y) get_csv2_string((X),(Y),875)
+#define get_csv2_bool_pos875(X,Y) get_csv2_bool((X),(Y),875)
+#define get_csv2_int_pos875(X,Y) get_csv2_int((X),(Y),875)
+#define get_csv2_llong_pos875(X,Y) get_csv2_llong((X),(Y),875)
+#define get_csv2_float_pos875(X,Y) get_csv2_float((X),(Y),875)
+#define get_csv2_uint_pos876(X,Y) get_csv2_uint((X),(Y),876)
+#define get_csv2_ullong_pos876(X,Y) get_csv2_ullong((X),(Y),876)
+#define get_csv2_ip_pos876(X,Y) get_csv2_ip((X),(Y),876)
+#define get_csv2_ipv6_pos876(X,Y) get_csv2_ipv6((X),(Y),876)
+#define get_csv2_string_pos876(X,Y) get_csv2_string((X),(Y),876)
+#define get_csv2_v_str_pos876(X,Y) get_csv2_string((X),(Y),876)
+#define get_csv2_bool_pos876(X,Y) get_csv2_bool((X),(Y),876)
+#define get_csv2_int_pos876(X,Y) get_csv2_int((X),(Y),876)
+#define get_csv2_llong_pos876(X,Y) get_csv2_llong((X),(Y),876)
+#define get_csv2_float_pos876(X,Y) get_csv2_float((X),(Y),876)
+#define get_csv2_uint_pos877(X,Y) get_csv2_uint((X),(Y),877)
+#define get_csv2_ullong_pos877(X,Y) get_csv2_ullong((X),(Y),877)
+#define get_csv2_ip_pos877(X,Y) get_csv2_ip((X),(Y),877)
+#define get_csv2_ipv6_pos877(X,Y) get_csv2_ipv6((X),(Y),877)
+#define get_csv2_string_pos877(X,Y) get_csv2_string((X),(Y),877)
+#define get_csv2_v_str_pos877(X,Y) get_csv2_string((X),(Y),877)
+#define get_csv2_bool_pos877(X,Y) get_csv2_bool((X),(Y),877)
+#define get_csv2_int_pos877(X,Y) get_csv2_int((X),(Y),877)
+#define get_csv2_llong_pos877(X,Y) get_csv2_llong((X),(Y),877)
+#define get_csv2_float_pos877(X,Y) get_csv2_float((X),(Y),877)
+#define get_csv2_uint_pos878(X,Y) get_csv2_uint((X),(Y),878)
+#define get_csv2_ullong_pos878(X,Y) get_csv2_ullong((X),(Y),878)
+#define get_csv2_ip_pos878(X,Y) get_csv2_ip((X),(Y),878)
+#define get_csv2_ipv6_pos878(X,Y) get_csv2_ipv6((X),(Y),878)
+#define get_csv2_string_pos878(X,Y) get_csv2_string((X),(Y),878)
+#define get_csv2_v_str_pos878(X,Y) get_csv2_string((X),(Y),878)
+#define get_csv2_bool_pos878(X,Y) get_csv2_bool((X),(Y),878)
+#define get_csv2_int_pos878(X,Y) get_csv2_int((X),(Y),878)
+#define get_csv2_llong_pos878(X,Y) get_csv2_llong((X),(Y),878)
+#define get_csv2_float_pos878(X,Y) get_csv2_float((X),(Y),878)
+#define get_csv2_uint_pos879(X,Y) get_csv2_uint((X),(Y),879)
+#define get_csv2_ullong_pos879(X,Y) get_csv2_ullong((X),(Y),879)
+#define get_csv2_ip_pos879(X,Y) get_csv2_ip((X),(Y),879)
+#define get_csv2_ipv6_pos879(X,Y) get_csv2_ipv6((X),(Y),879)
+#define get_csv2_string_pos879(X,Y) get_csv2_string((X),(Y),879)
+#define get_csv2_v_str_pos879(X,Y) get_csv2_string((X),(Y),879)
+#define get_csv2_bool_pos879(X,Y) get_csv2_bool((X),(Y),879)
+#define get_csv2_int_pos879(X,Y) get_csv2_int((X),(Y),879)
+#define get_csv2_llong_pos879(X,Y) get_csv2_llong((X),(Y),879)
+#define get_csv2_float_pos879(X,Y) get_csv2_float((X),(Y),879)
+#define get_csv2_uint_pos880(X,Y) get_csv2_uint((X),(Y),880)
+#define get_csv2_ullong_pos880(X,Y) get_csv2_ullong((X),(Y),880)
+#define get_csv2_ip_pos880(X,Y) get_csv2_ip((X),(Y),880)
+#define get_csv2_ipv6_pos880(X,Y) get_csv2_ipv6((X),(Y),880)
+#define get_csv2_string_pos880(X,Y) get_csv2_string((X),(Y),880)
+#define get_csv2_v_str_pos880(X,Y) get_csv2_string((X),(Y),880)
+#define get_csv2_bool_pos880(X,Y) get_csv2_bool((X),(Y),880)
+#define get_csv2_int_pos880(X,Y) get_csv2_int((X),(Y),880)
+#define get_csv2_llong_pos880(X,Y) get_csv2_llong((X),(Y),880)
+#define get_csv2_float_pos880(X,Y) get_csv2_float((X),(Y),880)
+#define get_csv2_uint_pos881(X,Y) get_csv2_uint((X),(Y),881)
+#define get_csv2_ullong_pos881(X,Y) get_csv2_ullong((X),(Y),881)
+#define get_csv2_ip_pos881(X,Y) get_csv2_ip((X),(Y),881)
+#define get_csv2_ipv6_pos881(X,Y) get_csv2_ipv6((X),(Y),881)
+#define get_csv2_string_pos881(X,Y) get_csv2_string((X),(Y),881)
+#define get_csv2_v_str_pos881(X,Y) get_csv2_string((X),(Y),881)
+#define get_csv2_bool_pos881(X,Y) get_csv2_bool((X),(Y),881)
+#define get_csv2_int_pos881(X,Y) get_csv2_int((X),(Y),881)
+#define get_csv2_llong_pos881(X,Y) get_csv2_llong((X),(Y),881)
+#define get_csv2_float_pos881(X,Y) get_csv2_float((X),(Y),881)
+#define get_csv2_uint_pos882(X,Y) get_csv2_uint((X),(Y),882)
+#define get_csv2_ullong_pos882(X,Y) get_csv2_ullong((X),(Y),882)
+#define get_csv2_ip_pos882(X,Y) get_csv2_ip((X),(Y),882)
+#define get_csv2_ipv6_pos882(X,Y) get_csv2_ipv6((X),(Y),882)
+#define get_csv2_string_pos882(X,Y) get_csv2_string((X),(Y),882)
+#define get_csv2_v_str_pos882(X,Y) get_csv2_string((X),(Y),882)
+#define get_csv2_bool_pos882(X,Y) get_csv2_bool((X),(Y),882)
+#define get_csv2_int_pos882(X,Y) get_csv2_int((X),(Y),882)
+#define get_csv2_llong_pos882(X,Y) get_csv2_llong((X),(Y),882)
+#define get_csv2_float_pos882(X,Y) get_csv2_float((X),(Y),882)
+#define get_csv2_uint_pos883(X,Y) get_csv2_uint((X),(Y),883)
+#define get_csv2_ullong_pos883(X,Y) get_csv2_ullong((X),(Y),883)
+#define get_csv2_ip_pos883(X,Y) get_csv2_ip((X),(Y),883)
+#define get_csv2_ipv6_pos883(X,Y) get_csv2_ipv6((X),(Y),883)
+#define get_csv2_string_pos883(X,Y) get_csv2_string((X),(Y),883)
+#define get_csv2_v_str_pos883(X,Y) get_csv2_string((X),(Y),883)
+#define get_csv2_bool_pos883(X,Y) get_csv2_bool((X),(Y),883)
+#define get_csv2_int_pos883(X,Y) get_csv2_int((X),(Y),883)
+#define get_csv2_llong_pos883(X,Y) get_csv2_llong((X),(Y),883)
+#define get_csv2_float_pos883(X,Y) get_csv2_float((X),(Y),883)
+#define get_csv2_uint_pos884(X,Y) get_csv2_uint((X),(Y),884)
+#define get_csv2_ullong_pos884(X,Y) get_csv2_ullong((X),(Y),884)
+#define get_csv2_ip_pos884(X,Y) get_csv2_ip((X),(Y),884)
+#define get_csv2_ipv6_pos884(X,Y) get_csv2_ipv6((X),(Y),884)
+#define get_csv2_string_pos884(X,Y) get_csv2_string((X),(Y),884)
+#define get_csv2_v_str_pos884(X,Y) get_csv2_string((X),(Y),884)
+#define get_csv2_bool_pos884(X,Y) get_csv2_bool((X),(Y),884)
+#define get_csv2_int_pos884(X,Y) get_csv2_int((X),(Y),884)
+#define get_csv2_llong_pos884(X,Y) get_csv2_llong((X),(Y),884)
+#define get_csv2_float_pos884(X,Y) get_csv2_float((X),(Y),884)
+#define get_csv2_uint_pos885(X,Y) get_csv2_uint((X),(Y),885)
+#define get_csv2_ullong_pos885(X,Y) get_csv2_ullong((X),(Y),885)
+#define get_csv2_ip_pos885(X,Y) get_csv2_ip((X),(Y),885)
+#define get_csv2_ipv6_pos885(X,Y) get_csv2_ipv6((X),(Y),885)
+#define get_csv2_string_pos885(X,Y) get_csv2_string((X),(Y),885)
+#define get_csv2_v_str_pos885(X,Y) get_csv2_string((X),(Y),885)
+#define get_csv2_bool_pos885(X,Y) get_csv2_bool((X),(Y),885)
+#define get_csv2_int_pos885(X,Y) get_csv2_int((X),(Y),885)
+#define get_csv2_llong_pos885(X,Y) get_csv2_llong((X),(Y),885)
+#define get_csv2_float_pos885(X,Y) get_csv2_float((X),(Y),885)
+#define get_csv2_uint_pos886(X,Y) get_csv2_uint((X),(Y),886)
+#define get_csv2_ullong_pos886(X,Y) get_csv2_ullong((X),(Y),886)
+#define get_csv2_ip_pos886(X,Y) get_csv2_ip((X),(Y),886)
+#define get_csv2_ipv6_pos886(X,Y) get_csv2_ipv6((X),(Y),886)
+#define get_csv2_string_pos886(X,Y) get_csv2_string((X),(Y),886)
+#define get_csv2_v_str_pos886(X,Y) get_csv2_string((X),(Y),886)
+#define get_csv2_bool_pos886(X,Y) get_csv2_bool((X),(Y),886)
+#define get_csv2_int_pos886(X,Y) get_csv2_int((X),(Y),886)
+#define get_csv2_llong_pos886(X,Y) get_csv2_llong((X),(Y),886)
+#define get_csv2_float_pos886(X,Y) get_csv2_float((X),(Y),886)
+#define get_csv2_uint_pos887(X,Y) get_csv2_uint((X),(Y),887)
+#define get_csv2_ullong_pos887(X,Y) get_csv2_ullong((X),(Y),887)
+#define get_csv2_ip_pos887(X,Y) get_csv2_ip((X),(Y),887)
+#define get_csv2_ipv6_pos887(X,Y) get_csv2_ipv6((X),(Y),887)
+#define get_csv2_string_pos887(X,Y) get_csv2_string((X),(Y),887)
+#define get_csv2_v_str_pos887(X,Y) get_csv2_string((X),(Y),887)
+#define get_csv2_bool_pos887(X,Y) get_csv2_bool((X),(Y),887)
+#define get_csv2_int_pos887(X,Y) get_csv2_int((X),(Y),887)
+#define get_csv2_llong_pos887(X,Y) get_csv2_llong((X),(Y),887)
+#define get_csv2_float_pos887(X,Y) get_csv2_float((X),(Y),887)
+#define get_csv2_uint_pos888(X,Y) get_csv2_uint((X),(Y),888)
+#define get_csv2_ullong_pos888(X,Y) get_csv2_ullong((X),(Y),888)
+#define get_csv2_ip_pos888(X,Y) get_csv2_ip((X),(Y),888)
+#define get_csv2_ipv6_pos888(X,Y) get_csv2_ipv6((X),(Y),888)
+#define get_csv2_string_pos888(X,Y) get_csv2_string((X),(Y),888)
+#define get_csv2_v_str_pos888(X,Y) get_csv2_string((X),(Y),888)
+#define get_csv2_bool_pos888(X,Y) get_csv2_bool((X),(Y),888)
+#define get_csv2_int_pos888(X,Y) get_csv2_int((X),(Y),888)
+#define get_csv2_llong_pos888(X,Y) get_csv2_llong((X),(Y),888)
+#define get_csv2_float_pos888(X,Y) get_csv2_float((X),(Y),888)
+#define get_csv2_uint_pos889(X,Y) get_csv2_uint((X),(Y),889)
+#define get_csv2_ullong_pos889(X,Y) get_csv2_ullong((X),(Y),889)
+#define get_csv2_ip_pos889(X,Y) get_csv2_ip((X),(Y),889)
+#define get_csv2_ipv6_pos889(X,Y) get_csv2_ipv6((X),(Y),889)
+#define get_csv2_string_pos889(X,Y) get_csv2_string((X),(Y),889)
+#define get_csv2_v_str_pos889(X,Y) get_csv2_string((X),(Y),889)
+#define get_csv2_bool_pos889(X,Y) get_csv2_bool((X),(Y),889)
+#define get_csv2_int_pos889(X,Y) get_csv2_int((X),(Y),889)
+#define get_csv2_llong_pos889(X,Y) get_csv2_llong((X),(Y),889)
+#define get_csv2_float_pos889(X,Y) get_csv2_float((X),(Y),889)
+#define get_csv2_uint_pos890(X,Y) get_csv2_uint((X),(Y),890)
+#define get_csv2_ullong_pos890(X,Y) get_csv2_ullong((X),(Y),890)
+#define get_csv2_ip_pos890(X,Y) get_csv2_ip((X),(Y),890)
+#define get_csv2_ipv6_pos890(X,Y) get_csv2_ipv6((X),(Y),890)
+#define get_csv2_string_pos890(X,Y) get_csv2_string((X),(Y),890)
+#define get_csv2_v_str_pos890(X,Y) get_csv2_string((X),(Y),890)
+#define get_csv2_bool_pos890(X,Y) get_csv2_bool((X),(Y),890)
+#define get_csv2_int_pos890(X,Y) get_csv2_int((X),(Y),890)
+#define get_csv2_llong_pos890(X,Y) get_csv2_llong((X),(Y),890)
+#define get_csv2_float_pos890(X,Y) get_csv2_float((X),(Y),890)
+#define get_csv2_uint_pos891(X,Y) get_csv2_uint((X),(Y),891)
+#define get_csv2_ullong_pos891(X,Y) get_csv2_ullong((X),(Y),891)
+#define get_csv2_ip_pos891(X,Y) get_csv2_ip((X),(Y),891)
+#define get_csv2_ipv6_pos891(X,Y) get_csv2_ipv6((X),(Y),891)
+#define get_csv2_string_pos891(X,Y) get_csv2_string((X),(Y),891)
+#define get_csv2_v_str_pos891(X,Y) get_csv2_string((X),(Y),891)
+#define get_csv2_bool_pos891(X,Y) get_csv2_bool((X),(Y),891)
+#define get_csv2_int_pos891(X,Y) get_csv2_int((X),(Y),891)
+#define get_csv2_llong_pos891(X,Y) get_csv2_llong((X),(Y),891)
+#define get_csv2_float_pos891(X,Y) get_csv2_float((X),(Y),891)
+#define get_csv2_uint_pos892(X,Y) get_csv2_uint((X),(Y),892)
+#define get_csv2_ullong_pos892(X,Y) get_csv2_ullong((X),(Y),892)
+#define get_csv2_ip_pos892(X,Y) get_csv2_ip((X),(Y),892)
+#define get_csv2_ipv6_pos892(X,Y) get_csv2_ipv6((X),(Y),892)
+#define get_csv2_string_pos892(X,Y) get_csv2_string((X),(Y),892)
+#define get_csv2_v_str_pos892(X,Y) get_csv2_string((X),(Y),892)
+#define get_csv2_bool_pos892(X,Y) get_csv2_bool((X),(Y),892)
+#define get_csv2_int_pos892(X,Y) get_csv2_int((X),(Y),892)
+#define get_csv2_llong_pos892(X,Y) get_csv2_llong((X),(Y),892)
+#define get_csv2_float_pos892(X,Y) get_csv2_float((X),(Y),892)
+#define get_csv2_uint_pos893(X,Y) get_csv2_uint((X),(Y),893)
+#define get_csv2_ullong_pos893(X,Y) get_csv2_ullong((X),(Y),893)
+#define get_csv2_ip_pos893(X,Y) get_csv2_ip((X),(Y),893)
+#define get_csv2_ipv6_pos893(X,Y) get_csv2_ipv6((X),(Y),893)
+#define get_csv2_string_pos893(X,Y) get_csv2_string((X),(Y),893)
+#define get_csv2_v_str_pos893(X,Y) get_csv2_string((X),(Y),893)
+#define get_csv2_bool_pos893(X,Y) get_csv2_bool((X),(Y),893)
+#define get_csv2_int_pos893(X,Y) get_csv2_int((X),(Y),893)
+#define get_csv2_llong_pos893(X,Y) get_csv2_llong((X),(Y),893)
+#define get_csv2_float_pos893(X,Y) get_csv2_float((X),(Y),893)
+#define get_csv2_uint_pos894(X,Y) get_csv2_uint((X),(Y),894)
+#define get_csv2_ullong_pos894(X,Y) get_csv2_ullong((X),(Y),894)
+#define get_csv2_ip_pos894(X,Y) get_csv2_ip((X),(Y),894)
+#define get_csv2_ipv6_pos894(X,Y) get_csv2_ipv6((X),(Y),894)
+#define get_csv2_string_pos894(X,Y) get_csv2_string((X),(Y),894)
+#define get_csv2_v_str_pos894(X,Y) get_csv2_string((X),(Y),894)
+#define get_csv2_bool_pos894(X,Y) get_csv2_bool((X),(Y),894)
+#define get_csv2_int_pos894(X,Y) get_csv2_int((X),(Y),894)
+#define get_csv2_llong_pos894(X,Y) get_csv2_llong((X),(Y),894)
+#define get_csv2_float_pos894(X,Y) get_csv2_float((X),(Y),894)
+#define get_csv2_uint_pos895(X,Y) get_csv2_uint((X),(Y),895)
+#define get_csv2_ullong_pos895(X,Y) get_csv2_ullong((X),(Y),895)
+#define get_csv2_ip_pos895(X,Y) get_csv2_ip((X),(Y),895)
+#define get_csv2_ipv6_pos895(X,Y) get_csv2_ipv6((X),(Y),895)
+#define get_csv2_string_pos895(X,Y) get_csv2_string((X),(Y),895)
+#define get_csv2_v_str_pos895(X,Y) get_csv2_string((X),(Y),895)
+#define get_csv2_bool_pos895(X,Y) get_csv2_bool((X),(Y),895)
+#define get_csv2_int_pos895(X,Y) get_csv2_int((X),(Y),895)
+#define get_csv2_llong_pos895(X,Y) get_csv2_llong((X),(Y),895)
+#define get_csv2_float_pos895(X,Y) get_csv2_float((X),(Y),895)
+#define get_csv2_uint_pos896(X,Y) get_csv2_uint((X),(Y),896)
+#define get_csv2_ullong_pos896(X,Y) get_csv2_ullong((X),(Y),896)
+#define get_csv2_ip_pos896(X,Y) get_csv2_ip((X),(Y),896)
+#define get_csv2_ipv6_pos896(X,Y) get_csv2_ipv6((X),(Y),896)
+#define get_csv2_string_pos896(X,Y) get_csv2_string((X),(Y),896)
+#define get_csv2_v_str_pos896(X,Y) get_csv2_string((X),(Y),896)
+#define get_csv2_bool_pos896(X,Y) get_csv2_bool((X),(Y),896)
+#define get_csv2_int_pos896(X,Y) get_csv2_int((X),(Y),896)
+#define get_csv2_llong_pos896(X,Y) get_csv2_llong((X),(Y),896)
+#define get_csv2_float_pos896(X,Y) get_csv2_float((X),(Y),896)
+#define get_csv2_uint_pos897(X,Y) get_csv2_uint((X),(Y),897)
+#define get_csv2_ullong_pos897(X,Y) get_csv2_ullong((X),(Y),897)
+#define get_csv2_ip_pos897(X,Y) get_csv2_ip((X),(Y),897)
+#define get_csv2_ipv6_pos897(X,Y) get_csv2_ipv6((X),(Y),897)
+#define get_csv2_string_pos897(X,Y) get_csv2_string((X),(Y),897)
+#define get_csv2_v_str_pos897(X,Y) get_csv2_string((X),(Y),897)
+#define get_csv2_bool_pos897(X,Y) get_csv2_bool((X),(Y),897)
+#define get_csv2_int_pos897(X,Y) get_csv2_int((X),(Y),897)
+#define get_csv2_llong_pos897(X,Y) get_csv2_llong((X),(Y),897)
+#define get_csv2_float_pos897(X,Y) get_csv2_float((X),(Y),897)
+#define get_csv2_uint_pos898(X,Y) get_csv2_uint((X),(Y),898)
+#define get_csv2_ullong_pos898(X,Y) get_csv2_ullong((X),(Y),898)
+#define get_csv2_ip_pos898(X,Y) get_csv2_ip((X),(Y),898)
+#define get_csv2_ipv6_pos898(X,Y) get_csv2_ipv6((X),(Y),898)
+#define get_csv2_string_pos898(X,Y) get_csv2_string((X),(Y),898)
+#define get_csv2_v_str_pos898(X,Y) get_csv2_string((X),(Y),898)
+#define get_csv2_bool_pos898(X,Y) get_csv2_bool((X),(Y),898)
+#define get_csv2_int_pos898(X,Y) get_csv2_int((X),(Y),898)
+#define get_csv2_llong_pos898(X,Y) get_csv2_llong((X),(Y),898)
+#define get_csv2_float_pos898(X,Y) get_csv2_float((X),(Y),898)
+#define get_csv2_uint_pos899(X,Y) get_csv2_uint((X),(Y),899)
+#define get_csv2_ullong_pos899(X,Y) get_csv2_ullong((X),(Y),899)
+#define get_csv2_ip_pos899(X,Y) get_csv2_ip((X),(Y),899)
+#define get_csv2_ipv6_pos899(X,Y) get_csv2_ipv6((X),(Y),899)
+#define get_csv2_string_pos899(X,Y) get_csv2_string((X),(Y),899)
+#define get_csv2_v_str_pos899(X,Y) get_csv2_string((X),(Y),899)
+#define get_csv2_bool_pos899(X,Y) get_csv2_bool((X),(Y),899)
+#define get_csv2_int_pos899(X,Y) get_csv2_int((X),(Y),899)
+#define get_csv2_llong_pos899(X,Y) get_csv2_llong((X),(Y),899)
+#define get_csv2_float_pos899(X,Y) get_csv2_float((X),(Y),899)
+#define get_csv2_uint_pos900(X,Y) get_csv2_uint((X),(Y),900)
+#define get_csv2_ullong_pos900(X,Y) get_csv2_ullong((X),(Y),900)
+#define get_csv2_ip_pos900(X,Y) get_csv2_ip((X),(Y),900)
+#define get_csv2_ipv6_pos900(X,Y) get_csv2_ipv6((X),(Y),900)
+#define get_csv2_string_pos900(X,Y) get_csv2_string((X),(Y),900)
+#define get_csv2_v_str_pos900(X,Y) get_csv2_string((X),(Y),900)
+#define get_csv2_bool_pos900(X,Y) get_csv2_bool((X),(Y),900)
+#define get_csv2_int_pos900(X,Y) get_csv2_int((X),(Y),900)
+#define get_csv2_llong_pos900(X,Y) get_csv2_llong((X),(Y),900)
+#define get_csv2_float_pos900(X,Y) get_csv2_float((X),(Y),900)
+#define get_csv2_uint_pos901(X,Y) get_csv2_uint((X),(Y),901)
+#define get_csv2_ullong_pos901(X,Y) get_csv2_ullong((X),(Y),901)
+#define get_csv2_ip_pos901(X,Y) get_csv2_ip((X),(Y),901)
+#define get_csv2_ipv6_pos901(X,Y) get_csv2_ipv6((X),(Y),901)
+#define get_csv2_string_pos901(X,Y) get_csv2_string((X),(Y),901)
+#define get_csv2_v_str_pos901(X,Y) get_csv2_string((X),(Y),901)
+#define get_csv2_bool_pos901(X,Y) get_csv2_bool((X),(Y),901)
+#define get_csv2_int_pos901(X,Y) get_csv2_int((X),(Y),901)
+#define get_csv2_llong_pos901(X,Y) get_csv2_llong((X),(Y),901)
+#define get_csv2_float_pos901(X,Y) get_csv2_float((X),(Y),901)
+#define get_csv2_uint_pos902(X,Y) get_csv2_uint((X),(Y),902)
+#define get_csv2_ullong_pos902(X,Y) get_csv2_ullong((X),(Y),902)
+#define get_csv2_ip_pos902(X,Y) get_csv2_ip((X),(Y),902)
+#define get_csv2_ipv6_pos902(X,Y) get_csv2_ipv6((X),(Y),902)
+#define get_csv2_string_pos902(X,Y) get_csv2_string((X),(Y),902)
+#define get_csv2_v_str_pos902(X,Y) get_csv2_string((X),(Y),902)
+#define get_csv2_bool_pos902(X,Y) get_csv2_bool((X),(Y),902)
+#define get_csv2_int_pos902(X,Y) get_csv2_int((X),(Y),902)
+#define get_csv2_llong_pos902(X,Y) get_csv2_llong((X),(Y),902)
+#define get_csv2_float_pos902(X,Y) get_csv2_float((X),(Y),902)
+#define get_csv2_uint_pos903(X,Y) get_csv2_uint((X),(Y),903)
+#define get_csv2_ullong_pos903(X,Y) get_csv2_ullong((X),(Y),903)
+#define get_csv2_ip_pos903(X,Y) get_csv2_ip((X),(Y),903)
+#define get_csv2_ipv6_pos903(X,Y) get_csv2_ipv6((X),(Y),903)
+#define get_csv2_string_pos903(X,Y) get_csv2_string((X),(Y),903)
+#define get_csv2_v_str_pos903(X,Y) get_csv2_string((X),(Y),903)
+#define get_csv2_bool_pos903(X,Y) get_csv2_bool((X),(Y),903)
+#define get_csv2_int_pos903(X,Y) get_csv2_int((X),(Y),903)
+#define get_csv2_llong_pos903(X,Y) get_csv2_llong((X),(Y),903)
+#define get_csv2_float_pos903(X,Y) get_csv2_float((X),(Y),903)
+#define get_csv2_uint_pos904(X,Y) get_csv2_uint((X),(Y),904)
+#define get_csv2_ullong_pos904(X,Y) get_csv2_ullong((X),(Y),904)
+#define get_csv2_ip_pos904(X,Y) get_csv2_ip((X),(Y),904)
+#define get_csv2_ipv6_pos904(X,Y) get_csv2_ipv6((X),(Y),904)
+#define get_csv2_string_pos904(X,Y) get_csv2_string((X),(Y),904)
+#define get_csv2_v_str_pos904(X,Y) get_csv2_string((X),(Y),904)
+#define get_csv2_bool_pos904(X,Y) get_csv2_bool((X),(Y),904)
+#define get_csv2_int_pos904(X,Y) get_csv2_int((X),(Y),904)
+#define get_csv2_llong_pos904(X,Y) get_csv2_llong((X),(Y),904)
+#define get_csv2_float_pos904(X,Y) get_csv2_float((X),(Y),904)
+#define get_csv2_uint_pos905(X,Y) get_csv2_uint((X),(Y),905)
+#define get_csv2_ullong_pos905(X,Y) get_csv2_ullong((X),(Y),905)
+#define get_csv2_ip_pos905(X,Y) get_csv2_ip((X),(Y),905)
+#define get_csv2_ipv6_pos905(X,Y) get_csv2_ipv6((X),(Y),905)
+#define get_csv2_string_pos905(X,Y) get_csv2_string((X),(Y),905)
+#define get_csv2_v_str_pos905(X,Y) get_csv2_string((X),(Y),905)
+#define get_csv2_bool_pos905(X,Y) get_csv2_bool((X),(Y),905)
+#define get_csv2_int_pos905(X,Y) get_csv2_int((X),(Y),905)
+#define get_csv2_llong_pos905(X,Y) get_csv2_llong((X),(Y),905)
+#define get_csv2_float_pos905(X,Y) get_csv2_float((X),(Y),905)
+#define get_csv2_uint_pos906(X,Y) get_csv2_uint((X),(Y),906)
+#define get_csv2_ullong_pos906(X,Y) get_csv2_ullong((X),(Y),906)
+#define get_csv2_ip_pos906(X,Y) get_csv2_ip((X),(Y),906)
+#define get_csv2_ipv6_pos906(X,Y) get_csv2_ipv6((X),(Y),906)
+#define get_csv2_string_pos906(X,Y) get_csv2_string((X),(Y),906)
+#define get_csv2_v_str_pos906(X,Y) get_csv2_string((X),(Y),906)
+#define get_csv2_bool_pos906(X,Y) get_csv2_bool((X),(Y),906)
+#define get_csv2_int_pos906(X,Y) get_csv2_int((X),(Y),906)
+#define get_csv2_llong_pos906(X,Y) get_csv2_llong((X),(Y),906)
+#define get_csv2_float_pos906(X,Y) get_csv2_float((X),(Y),906)
+#define get_csv2_uint_pos907(X,Y) get_csv2_uint((X),(Y),907)
+#define get_csv2_ullong_pos907(X,Y) get_csv2_ullong((X),(Y),907)
+#define get_csv2_ip_pos907(X,Y) get_csv2_ip((X),(Y),907)
+#define get_csv2_ipv6_pos907(X,Y) get_csv2_ipv6((X),(Y),907)
+#define get_csv2_string_pos907(X,Y) get_csv2_string((X),(Y),907)
+#define get_csv2_v_str_pos907(X,Y) get_csv2_string((X),(Y),907)
+#define get_csv2_bool_pos907(X,Y) get_csv2_bool((X),(Y),907)
+#define get_csv2_int_pos907(X,Y) get_csv2_int((X),(Y),907)
+#define get_csv2_llong_pos907(X,Y) get_csv2_llong((X),(Y),907)
+#define get_csv2_float_pos907(X,Y) get_csv2_float((X),(Y),907)
+#define get_csv2_uint_pos908(X,Y) get_csv2_uint((X),(Y),908)
+#define get_csv2_ullong_pos908(X,Y) get_csv2_ullong((X),(Y),908)
+#define get_csv2_ip_pos908(X,Y) get_csv2_ip((X),(Y),908)
+#define get_csv2_ipv6_pos908(X,Y) get_csv2_ipv6((X),(Y),908)
+#define get_csv2_string_pos908(X,Y) get_csv2_string((X),(Y),908)
+#define get_csv2_v_str_pos908(X,Y) get_csv2_string((X),(Y),908)
+#define get_csv2_bool_pos908(X,Y) get_csv2_bool((X),(Y),908)
+#define get_csv2_int_pos908(X,Y) get_csv2_int((X),(Y),908)
+#define get_csv2_llong_pos908(X,Y) get_csv2_llong((X),(Y),908)
+#define get_csv2_float_pos908(X,Y) get_csv2_float((X),(Y),908)
+#define get_csv2_uint_pos909(X,Y) get_csv2_uint((X),(Y),909)
+#define get_csv2_ullong_pos909(X,Y) get_csv2_ullong((X),(Y),909)
+#define get_csv2_ip_pos909(X,Y) get_csv2_ip((X),(Y),909)
+#define get_csv2_ipv6_pos909(X,Y) get_csv2_ipv6((X),(Y),909)
+#define get_csv2_string_pos909(X,Y) get_csv2_string((X),(Y),909)
+#define get_csv2_v_str_pos909(X,Y) get_csv2_string((X),(Y),909)
+#define get_csv2_bool_pos909(X,Y) get_csv2_bool((X),(Y),909)
+#define get_csv2_int_pos909(X,Y) get_csv2_int((X),(Y),909)
+#define get_csv2_llong_pos909(X,Y) get_csv2_llong((X),(Y),909)
+#define get_csv2_float_pos909(X,Y) get_csv2_float((X),(Y),909)
+#define get_csv2_uint_pos910(X,Y) get_csv2_uint((X),(Y),910)
+#define get_csv2_ullong_pos910(X,Y) get_csv2_ullong((X),(Y),910)
+#define get_csv2_ip_pos910(X,Y) get_csv2_ip((X),(Y),910)
+#define get_csv2_ipv6_pos910(X,Y) get_csv2_ipv6((X),(Y),910)
+#define get_csv2_string_pos910(X,Y) get_csv2_string((X),(Y),910)
+#define get_csv2_v_str_pos910(X,Y) get_csv2_string((X),(Y),910)
+#define get_csv2_bool_pos910(X,Y) get_csv2_bool((X),(Y),910)
+#define get_csv2_int_pos910(X,Y) get_csv2_int((X),(Y),910)
+#define get_csv2_llong_pos910(X,Y) get_csv2_llong((X),(Y),910)
+#define get_csv2_float_pos910(X,Y) get_csv2_float((X),(Y),910)
+#define get_csv2_uint_pos911(X,Y) get_csv2_uint((X),(Y),911)
+#define get_csv2_ullong_pos911(X,Y) get_csv2_ullong((X),(Y),911)
+#define get_csv2_ip_pos911(X,Y) get_csv2_ip((X),(Y),911)
+#define get_csv2_ipv6_pos911(X,Y) get_csv2_ipv6((X),(Y),911)
+#define get_csv2_string_pos911(X,Y) get_csv2_string((X),(Y),911)
+#define get_csv2_v_str_pos911(X,Y) get_csv2_string((X),(Y),911)
+#define get_csv2_bool_pos911(X,Y) get_csv2_bool((X),(Y),911)
+#define get_csv2_int_pos911(X,Y) get_csv2_int((X),(Y),911)
+#define get_csv2_llong_pos911(X,Y) get_csv2_llong((X),(Y),911)
+#define get_csv2_float_pos911(X,Y) get_csv2_float((X),(Y),911)
+#define get_csv2_uint_pos912(X,Y) get_csv2_uint((X),(Y),912)
+#define get_csv2_ullong_pos912(X,Y) get_csv2_ullong((X),(Y),912)
+#define get_csv2_ip_pos912(X,Y) get_csv2_ip((X),(Y),912)
+#define get_csv2_ipv6_pos912(X,Y) get_csv2_ipv6((X),(Y),912)
+#define get_csv2_string_pos912(X,Y) get_csv2_string((X),(Y),912)
+#define get_csv2_v_str_pos912(X,Y) get_csv2_string((X),(Y),912)
+#define get_csv2_bool_pos912(X,Y) get_csv2_bool((X),(Y),912)
+#define get_csv2_int_pos912(X,Y) get_csv2_int((X),(Y),912)
+#define get_csv2_llong_pos912(X,Y) get_csv2_llong((X),(Y),912)
+#define get_csv2_float_pos912(X,Y) get_csv2_float((X),(Y),912)
+#define get_csv2_uint_pos913(X,Y) get_csv2_uint((X),(Y),913)
+#define get_csv2_ullong_pos913(X,Y) get_csv2_ullong((X),(Y),913)
+#define get_csv2_ip_pos913(X,Y) get_csv2_ip((X),(Y),913)
+#define get_csv2_ipv6_pos913(X,Y) get_csv2_ipv6((X),(Y),913)
+#define get_csv2_string_pos913(X,Y) get_csv2_string((X),(Y),913)
+#define get_csv2_v_str_pos913(X,Y) get_csv2_string((X),(Y),913)
+#define get_csv2_bool_pos913(X,Y) get_csv2_bool((X),(Y),913)
+#define get_csv2_int_pos913(X,Y) get_csv2_int((X),(Y),913)
+#define get_csv2_llong_pos913(X,Y) get_csv2_llong((X),(Y),913)
+#define get_csv2_float_pos913(X,Y) get_csv2_float((X),(Y),913)
+#define get_csv2_uint_pos914(X,Y) get_csv2_uint((X),(Y),914)
+#define get_csv2_ullong_pos914(X,Y) get_csv2_ullong((X),(Y),914)
+#define get_csv2_ip_pos914(X,Y) get_csv2_ip((X),(Y),914)
+#define get_csv2_ipv6_pos914(X,Y) get_csv2_ipv6((X),(Y),914)
+#define get_csv2_string_pos914(X,Y) get_csv2_string((X),(Y),914)
+#define get_csv2_v_str_pos914(X,Y) get_csv2_string((X),(Y),914)
+#define get_csv2_bool_pos914(X,Y) get_csv2_bool((X),(Y),914)
+#define get_csv2_int_pos914(X,Y) get_csv2_int((X),(Y),914)
+#define get_csv2_llong_pos914(X,Y) get_csv2_llong((X),(Y),914)
+#define get_csv2_float_pos914(X,Y) get_csv2_float((X),(Y),914)
+#define get_csv2_uint_pos915(X,Y) get_csv2_uint((X),(Y),915)
+#define get_csv2_ullong_pos915(X,Y) get_csv2_ullong((X),(Y),915)
+#define get_csv2_ip_pos915(X,Y) get_csv2_ip((X),(Y),915)
+#define get_csv2_ipv6_pos915(X,Y) get_csv2_ipv6((X),(Y),915)
+#define get_csv2_string_pos915(X,Y) get_csv2_string((X),(Y),915)
+#define get_csv2_v_str_pos915(X,Y) get_csv2_string((X),(Y),915)
+#define get_csv2_bool_pos915(X,Y) get_csv2_bool((X),(Y),915)
+#define get_csv2_int_pos915(X,Y) get_csv2_int((X),(Y),915)
+#define get_csv2_llong_pos915(X,Y) get_csv2_llong((X),(Y),915)
+#define get_csv2_float_pos915(X,Y) get_csv2_float((X),(Y),915)
+#define get_csv2_uint_pos916(X,Y) get_csv2_uint((X),(Y),916)
+#define get_csv2_ullong_pos916(X,Y) get_csv2_ullong((X),(Y),916)
+#define get_csv2_ip_pos916(X,Y) get_csv2_ip((X),(Y),916)
+#define get_csv2_ipv6_pos916(X,Y) get_csv2_ipv6((X),(Y),916)
+#define get_csv2_string_pos916(X,Y) get_csv2_string((X),(Y),916)
+#define get_csv2_v_str_pos916(X,Y) get_csv2_string((X),(Y),916)
+#define get_csv2_bool_pos916(X,Y) get_csv2_bool((X),(Y),916)
+#define get_csv2_int_pos916(X,Y) get_csv2_int((X),(Y),916)
+#define get_csv2_llong_pos916(X,Y) get_csv2_llong((X),(Y),916)
+#define get_csv2_float_pos916(X,Y) get_csv2_float((X),(Y),916)
+#define get_csv2_uint_pos917(X,Y) get_csv2_uint((X),(Y),917)
+#define get_csv2_ullong_pos917(X,Y) get_csv2_ullong((X),(Y),917)
+#define get_csv2_ip_pos917(X,Y) get_csv2_ip((X),(Y),917)
+#define get_csv2_ipv6_pos917(X,Y) get_csv2_ipv6((X),(Y),917)
+#define get_csv2_string_pos917(X,Y) get_csv2_string((X),(Y),917)
+#define get_csv2_v_str_pos917(X,Y) get_csv2_string((X),(Y),917)
+#define get_csv2_bool_pos917(X,Y) get_csv2_bool((X),(Y),917)
+#define get_csv2_int_pos917(X,Y) get_csv2_int((X),(Y),917)
+#define get_csv2_llong_pos917(X,Y) get_csv2_llong((X),(Y),917)
+#define get_csv2_float_pos917(X,Y) get_csv2_float((X),(Y),917)
+#define get_csv2_uint_pos918(X,Y) get_csv2_uint((X),(Y),918)
+#define get_csv2_ullong_pos918(X,Y) get_csv2_ullong((X),(Y),918)
+#define get_csv2_ip_pos918(X,Y) get_csv2_ip((X),(Y),918)
+#define get_csv2_ipv6_pos918(X,Y) get_csv2_ipv6((X),(Y),918)
+#define get_csv2_string_pos918(X,Y) get_csv2_string((X),(Y),918)
+#define get_csv2_v_str_pos918(X,Y) get_csv2_string((X),(Y),918)
+#define get_csv2_bool_pos918(X,Y) get_csv2_bool((X),(Y),918)
+#define get_csv2_int_pos918(X,Y) get_csv2_int((X),(Y),918)
+#define get_csv2_llong_pos918(X,Y) get_csv2_llong((X),(Y),918)
+#define get_csv2_float_pos918(X,Y) get_csv2_float((X),(Y),918)
+#define get_csv2_uint_pos919(X,Y) get_csv2_uint((X),(Y),919)
+#define get_csv2_ullong_pos919(X,Y) get_csv2_ullong((X),(Y),919)
+#define get_csv2_ip_pos919(X,Y) get_csv2_ip((X),(Y),919)
+#define get_csv2_ipv6_pos919(X,Y) get_csv2_ipv6((X),(Y),919)
+#define get_csv2_string_pos919(X,Y) get_csv2_string((X),(Y),919)
+#define get_csv2_v_str_pos919(X,Y) get_csv2_string((X),(Y),919)
+#define get_csv2_bool_pos919(X,Y) get_csv2_bool((X),(Y),919)
+#define get_csv2_int_pos919(X,Y) get_csv2_int((X),(Y),919)
+#define get_csv2_llong_pos919(X,Y) get_csv2_llong((X),(Y),919)
+#define get_csv2_float_pos919(X,Y) get_csv2_float((X),(Y),919)
+#define get_csv2_uint_pos920(X,Y) get_csv2_uint((X),(Y),920)
+#define get_csv2_ullong_pos920(X,Y) get_csv2_ullong((X),(Y),920)
+#define get_csv2_ip_pos920(X,Y) get_csv2_ip((X),(Y),920)
+#define get_csv2_ipv6_pos920(X,Y) get_csv2_ipv6((X),(Y),920)
+#define get_csv2_string_pos920(X,Y) get_csv2_string((X),(Y),920)
+#define get_csv2_v_str_pos920(X,Y) get_csv2_string((X),(Y),920)
+#define get_csv2_bool_pos920(X,Y) get_csv2_bool((X),(Y),920)
+#define get_csv2_int_pos920(X,Y) get_csv2_int((X),(Y),920)
+#define get_csv2_llong_pos920(X,Y) get_csv2_llong((X),(Y),920)
+#define get_csv2_float_pos920(X,Y) get_csv2_float((X),(Y),920)
+#define get_csv2_uint_pos921(X,Y) get_csv2_uint((X),(Y),921)
+#define get_csv2_ullong_pos921(X,Y) get_csv2_ullong((X),(Y),921)
+#define get_csv2_ip_pos921(X,Y) get_csv2_ip((X),(Y),921)
+#define get_csv2_ipv6_pos921(X,Y) get_csv2_ipv6((X),(Y),921)
+#define get_csv2_string_pos921(X,Y) get_csv2_string((X),(Y),921)
+#define get_csv2_v_str_pos921(X,Y) get_csv2_string((X),(Y),921)
+#define get_csv2_bool_pos921(X,Y) get_csv2_bool((X),(Y),921)
+#define get_csv2_int_pos921(X,Y) get_csv2_int((X),(Y),921)
+#define get_csv2_llong_pos921(X,Y) get_csv2_llong((X),(Y),921)
+#define get_csv2_float_pos921(X,Y) get_csv2_float((X),(Y),921)
+#define get_csv2_uint_pos922(X,Y) get_csv2_uint((X),(Y),922)
+#define get_csv2_ullong_pos922(X,Y) get_csv2_ullong((X),(Y),922)
+#define get_csv2_ip_pos922(X,Y) get_csv2_ip((X),(Y),922)
+#define get_csv2_ipv6_pos922(X,Y) get_csv2_ipv6((X),(Y),922)
+#define get_csv2_string_pos922(X,Y) get_csv2_string((X),(Y),922)
+#define get_csv2_v_str_pos922(X,Y) get_csv2_string((X),(Y),922)
+#define get_csv2_bool_pos922(X,Y) get_csv2_bool((X),(Y),922)
+#define get_csv2_int_pos922(X,Y) get_csv2_int((X),(Y),922)
+#define get_csv2_llong_pos922(X,Y) get_csv2_llong((X),(Y),922)
+#define get_csv2_float_pos922(X,Y) get_csv2_float((X),(Y),922)
+#define get_csv2_uint_pos923(X,Y) get_csv2_uint((X),(Y),923)
+#define get_csv2_ullong_pos923(X,Y) get_csv2_ullong((X),(Y),923)
+#define get_csv2_ip_pos923(X,Y) get_csv2_ip((X),(Y),923)
+#define get_csv2_ipv6_pos923(X,Y) get_csv2_ipv6((X),(Y),923)
+#define get_csv2_string_pos923(X,Y) get_csv2_string((X),(Y),923)
+#define get_csv2_v_str_pos923(X,Y) get_csv2_string((X),(Y),923)
+#define get_csv2_bool_pos923(X,Y) get_csv2_bool((X),(Y),923)
+#define get_csv2_int_pos923(X,Y) get_csv2_int((X),(Y),923)
+#define get_csv2_llong_pos923(X,Y) get_csv2_llong((X),(Y),923)
+#define get_csv2_float_pos923(X,Y) get_csv2_float((X),(Y),923)
+#define get_csv2_uint_pos924(X,Y) get_csv2_uint((X),(Y),924)
+#define get_csv2_ullong_pos924(X,Y) get_csv2_ullong((X),(Y),924)
+#define get_csv2_ip_pos924(X,Y) get_csv2_ip((X),(Y),924)
+#define get_csv2_ipv6_pos924(X,Y) get_csv2_ipv6((X),(Y),924)
+#define get_csv2_string_pos924(X,Y) get_csv2_string((X),(Y),924)
+#define get_csv2_v_str_pos924(X,Y) get_csv2_string((X),(Y),924)
+#define get_csv2_bool_pos924(X,Y) get_csv2_bool((X),(Y),924)
+#define get_csv2_int_pos924(X,Y) get_csv2_int((X),(Y),924)
+#define get_csv2_llong_pos924(X,Y) get_csv2_llong((X),(Y),924)
+#define get_csv2_float_pos924(X,Y) get_csv2_float((X),(Y),924)
+#define get_csv2_uint_pos925(X,Y) get_csv2_uint((X),(Y),925)
+#define get_csv2_ullong_pos925(X,Y) get_csv2_ullong((X),(Y),925)
+#define get_csv2_ip_pos925(X,Y) get_csv2_ip((X),(Y),925)
+#define get_csv2_ipv6_pos925(X,Y) get_csv2_ipv6((X),(Y),925)
+#define get_csv2_string_pos925(X,Y) get_csv2_string((X),(Y),925)
+#define get_csv2_v_str_pos925(X,Y) get_csv2_string((X),(Y),925)
+#define get_csv2_bool_pos925(X,Y) get_csv2_bool((X),(Y),925)
+#define get_csv2_int_pos925(X,Y) get_csv2_int((X),(Y),925)
+#define get_csv2_llong_pos925(X,Y) get_csv2_llong((X),(Y),925)
+#define get_csv2_float_pos925(X,Y) get_csv2_float((X),(Y),925)
+#define get_csv2_uint_pos926(X,Y) get_csv2_uint((X),(Y),926)
+#define get_csv2_ullong_pos926(X,Y) get_csv2_ullong((X),(Y),926)
+#define get_csv2_ip_pos926(X,Y) get_csv2_ip((X),(Y),926)
+#define get_csv2_ipv6_pos926(X,Y) get_csv2_ipv6((X),(Y),926)
+#define get_csv2_string_pos926(X,Y) get_csv2_string((X),(Y),926)
+#define get_csv2_v_str_pos926(X,Y) get_csv2_string((X),(Y),926)
+#define get_csv2_bool_pos926(X,Y) get_csv2_bool((X),(Y),926)
+#define get_csv2_int_pos926(X,Y) get_csv2_int((X),(Y),926)
+#define get_csv2_llong_pos926(X,Y) get_csv2_llong((X),(Y),926)
+#define get_csv2_float_pos926(X,Y) get_csv2_float((X),(Y),926)
+#define get_csv2_uint_pos927(X,Y) get_csv2_uint((X),(Y),927)
+#define get_csv2_ullong_pos927(X,Y) get_csv2_ullong((X),(Y),927)
+#define get_csv2_ip_pos927(X,Y) get_csv2_ip((X),(Y),927)
+#define get_csv2_ipv6_pos927(X,Y) get_csv2_ipv6((X),(Y),927)
+#define get_csv2_string_pos927(X,Y) get_csv2_string((X),(Y),927)
+#define get_csv2_v_str_pos927(X,Y) get_csv2_string((X),(Y),927)
+#define get_csv2_bool_pos927(X,Y) get_csv2_bool((X),(Y),927)
+#define get_csv2_int_pos927(X,Y) get_csv2_int((X),(Y),927)
+#define get_csv2_llong_pos927(X,Y) get_csv2_llong((X),(Y),927)
+#define get_csv2_float_pos927(X,Y) get_csv2_float((X),(Y),927)
+#define get_csv2_uint_pos928(X,Y) get_csv2_uint((X),(Y),928)
+#define get_csv2_ullong_pos928(X,Y) get_csv2_ullong((X),(Y),928)
+#define get_csv2_ip_pos928(X,Y) get_csv2_ip((X),(Y),928)
+#define get_csv2_ipv6_pos928(X,Y) get_csv2_ipv6((X),(Y),928)
+#define get_csv2_string_pos928(X,Y) get_csv2_string((X),(Y),928)
+#define get_csv2_v_str_pos928(X,Y) get_csv2_string((X),(Y),928)
+#define get_csv2_bool_pos928(X,Y) get_csv2_bool((X),(Y),928)
+#define get_csv2_int_pos928(X,Y) get_csv2_int((X),(Y),928)
+#define get_csv2_llong_pos928(X,Y) get_csv2_llong((X),(Y),928)
+#define get_csv2_float_pos928(X,Y) get_csv2_float((X),(Y),928)
+#define get_csv2_uint_pos929(X,Y) get_csv2_uint((X),(Y),929)
+#define get_csv2_ullong_pos929(X,Y) get_csv2_ullong((X),(Y),929)
+#define get_csv2_ip_pos929(X,Y) get_csv2_ip((X),(Y),929)
+#define get_csv2_ipv6_pos929(X,Y) get_csv2_ipv6((X),(Y),929)
+#define get_csv2_string_pos929(X,Y) get_csv2_string((X),(Y),929)
+#define get_csv2_v_str_pos929(X,Y) get_csv2_string((X),(Y),929)
+#define get_csv2_bool_pos929(X,Y) get_csv2_bool((X),(Y),929)
+#define get_csv2_int_pos929(X,Y) get_csv2_int((X),(Y),929)
+#define get_csv2_llong_pos929(X,Y) get_csv2_llong((X),(Y),929)
+#define get_csv2_float_pos929(X,Y) get_csv2_float((X),(Y),929)
+#define get_csv2_uint_pos930(X,Y) get_csv2_uint((X),(Y),930)
+#define get_csv2_ullong_pos930(X,Y) get_csv2_ullong((X),(Y),930)
+#define get_csv2_ip_pos930(X,Y) get_csv2_ip((X),(Y),930)
+#define get_csv2_ipv6_pos930(X,Y) get_csv2_ipv6((X),(Y),930)
+#define get_csv2_string_pos930(X,Y) get_csv2_string((X),(Y),930)
+#define get_csv2_v_str_pos930(X,Y) get_csv2_string((X),(Y),930)
+#define get_csv2_bool_pos930(X,Y) get_csv2_bool((X),(Y),930)
+#define get_csv2_int_pos930(X,Y) get_csv2_int((X),(Y),930)
+#define get_csv2_llong_pos930(X,Y) get_csv2_llong((X),(Y),930)
+#define get_csv2_float_pos930(X,Y) get_csv2_float((X),(Y),930)
+#define get_csv2_uint_pos931(X,Y) get_csv2_uint((X),(Y),931)
+#define get_csv2_ullong_pos931(X,Y) get_csv2_ullong((X),(Y),931)
+#define get_csv2_ip_pos931(X,Y) get_csv2_ip((X),(Y),931)
+#define get_csv2_ipv6_pos931(X,Y) get_csv2_ipv6((X),(Y),931)
+#define get_csv2_string_pos931(X,Y) get_csv2_string((X),(Y),931)
+#define get_csv2_v_str_pos931(X,Y) get_csv2_string((X),(Y),931)
+#define get_csv2_bool_pos931(X,Y) get_csv2_bool((X),(Y),931)
+#define get_csv2_int_pos931(X,Y) get_csv2_int((X),(Y),931)
+#define get_csv2_llong_pos931(X,Y) get_csv2_llong((X),(Y),931)
+#define get_csv2_float_pos931(X,Y) get_csv2_float((X),(Y),931)
+#define get_csv2_uint_pos932(X,Y) get_csv2_uint((X),(Y),932)
+#define get_csv2_ullong_pos932(X,Y) get_csv2_ullong((X),(Y),932)
+#define get_csv2_ip_pos932(X,Y) get_csv2_ip((X),(Y),932)
+#define get_csv2_ipv6_pos932(X,Y) get_csv2_ipv6((X),(Y),932)
+#define get_csv2_string_pos932(X,Y) get_csv2_string((X),(Y),932)
+#define get_csv2_v_str_pos932(X,Y) get_csv2_string((X),(Y),932)
+#define get_csv2_bool_pos932(X,Y) get_csv2_bool((X),(Y),932)
+#define get_csv2_int_pos932(X,Y) get_csv2_int((X),(Y),932)
+#define get_csv2_llong_pos932(X,Y) get_csv2_llong((X),(Y),932)
+#define get_csv2_float_pos932(X,Y) get_csv2_float((X),(Y),932)
+#define get_csv2_uint_pos933(X,Y) get_csv2_uint((X),(Y),933)
+#define get_csv2_ullong_pos933(X,Y) get_csv2_ullong((X),(Y),933)
+#define get_csv2_ip_pos933(X,Y) get_csv2_ip((X),(Y),933)
+#define get_csv2_ipv6_pos933(X,Y) get_csv2_ipv6((X),(Y),933)
+#define get_csv2_string_pos933(X,Y) get_csv2_string((X),(Y),933)
+#define get_csv2_v_str_pos933(X,Y) get_csv2_string((X),(Y),933)
+#define get_csv2_bool_pos933(X,Y) get_csv2_bool((X),(Y),933)
+#define get_csv2_int_pos933(X,Y) get_csv2_int((X),(Y),933)
+#define get_csv2_llong_pos933(X,Y) get_csv2_llong((X),(Y),933)
+#define get_csv2_float_pos933(X,Y) get_csv2_float((X),(Y),933)
+#define get_csv2_uint_pos934(X,Y) get_csv2_uint((X),(Y),934)
+#define get_csv2_ullong_pos934(X,Y) get_csv2_ullong((X),(Y),934)
+#define get_csv2_ip_pos934(X,Y) get_csv2_ip((X),(Y),934)
+#define get_csv2_ipv6_pos934(X,Y) get_csv2_ipv6((X),(Y),934)
+#define get_csv2_string_pos934(X,Y) get_csv2_string((X),(Y),934)
+#define get_csv2_v_str_pos934(X,Y) get_csv2_string((X),(Y),934)
+#define get_csv2_bool_pos934(X,Y) get_csv2_bool((X),(Y),934)
+#define get_csv2_int_pos934(X,Y) get_csv2_int((X),(Y),934)
+#define get_csv2_llong_pos934(X,Y) get_csv2_llong((X),(Y),934)
+#define get_csv2_float_pos934(X,Y) get_csv2_float((X),(Y),934)
+#define get_csv2_uint_pos935(X,Y) get_csv2_uint((X),(Y),935)
+#define get_csv2_ullong_pos935(X,Y) get_csv2_ullong((X),(Y),935)
+#define get_csv2_ip_pos935(X,Y) get_csv2_ip((X),(Y),935)
+#define get_csv2_ipv6_pos935(X,Y) get_csv2_ipv6((X),(Y),935)
+#define get_csv2_string_pos935(X,Y) get_csv2_string((X),(Y),935)
+#define get_csv2_v_str_pos935(X,Y) get_csv2_string((X),(Y),935)
+#define get_csv2_bool_pos935(X,Y) get_csv2_bool((X),(Y),935)
+#define get_csv2_int_pos935(X,Y) get_csv2_int((X),(Y),935)
+#define get_csv2_llong_pos935(X,Y) get_csv2_llong((X),(Y),935)
+#define get_csv2_float_pos935(X,Y) get_csv2_float((X),(Y),935)
+#define get_csv2_uint_pos936(X,Y) get_csv2_uint((X),(Y),936)
+#define get_csv2_ullong_pos936(X,Y) get_csv2_ullong((X),(Y),936)
+#define get_csv2_ip_pos936(X,Y) get_csv2_ip((X),(Y),936)
+#define get_csv2_ipv6_pos936(X,Y) get_csv2_ipv6((X),(Y),936)
+#define get_csv2_string_pos936(X,Y) get_csv2_string((X),(Y),936)
+#define get_csv2_v_str_pos936(X,Y) get_csv2_string((X),(Y),936)
+#define get_csv2_bool_pos936(X,Y) get_csv2_bool((X),(Y),936)
+#define get_csv2_int_pos936(X,Y) get_csv2_int((X),(Y),936)
+#define get_csv2_llong_pos936(X,Y) get_csv2_llong((X),(Y),936)
+#define get_csv2_float_pos936(X,Y) get_csv2_float((X),(Y),936)
+#define get_csv2_uint_pos937(X,Y) get_csv2_uint((X),(Y),937)
+#define get_csv2_ullong_pos937(X,Y) get_csv2_ullong((X),(Y),937)
+#define get_csv2_ip_pos937(X,Y) get_csv2_ip((X),(Y),937)
+#define get_csv2_ipv6_pos937(X,Y) get_csv2_ipv6((X),(Y),937)
+#define get_csv2_string_pos937(X,Y) get_csv2_string((X),(Y),937)
+#define get_csv2_v_str_pos937(X,Y) get_csv2_string((X),(Y),937)
+#define get_csv2_bool_pos937(X,Y) get_csv2_bool((X),(Y),937)
+#define get_csv2_int_pos937(X,Y) get_csv2_int((X),(Y),937)
+#define get_csv2_llong_pos937(X,Y) get_csv2_llong((X),(Y),937)
+#define get_csv2_float_pos937(X,Y) get_csv2_float((X),(Y),937)
+#define get_csv2_uint_pos938(X,Y) get_csv2_uint((X),(Y),938)
+#define get_csv2_ullong_pos938(X,Y) get_csv2_ullong((X),(Y),938)
+#define get_csv2_ip_pos938(X,Y) get_csv2_ip((X),(Y),938)
+#define get_csv2_ipv6_pos938(X,Y) get_csv2_ipv6((X),(Y),938)
+#define get_csv2_string_pos938(X,Y) get_csv2_string((X),(Y),938)
+#define get_csv2_v_str_pos938(X,Y) get_csv2_string((X),(Y),938)
+#define get_csv2_bool_pos938(X,Y) get_csv2_bool((X),(Y),938)
+#define get_csv2_int_pos938(X,Y) get_csv2_int((X),(Y),938)
+#define get_csv2_llong_pos938(X,Y) get_csv2_llong((X),(Y),938)
+#define get_csv2_float_pos938(X,Y) get_csv2_float((X),(Y),938)
+#define get_csv2_uint_pos939(X,Y) get_csv2_uint((X),(Y),939)
+#define get_csv2_ullong_pos939(X,Y) get_csv2_ullong((X),(Y),939)
+#define get_csv2_ip_pos939(X,Y) get_csv2_ip((X),(Y),939)
+#define get_csv2_ipv6_pos939(X,Y) get_csv2_ipv6((X),(Y),939)
+#define get_csv2_string_pos939(X,Y) get_csv2_string((X),(Y),939)
+#define get_csv2_v_str_pos939(X,Y) get_csv2_string((X),(Y),939)
+#define get_csv2_bool_pos939(X,Y) get_csv2_bool((X),(Y),939)
+#define get_csv2_int_pos939(X,Y) get_csv2_int((X),(Y),939)
+#define get_csv2_llong_pos939(X,Y) get_csv2_llong((X),(Y),939)
+#define get_csv2_float_pos939(X,Y) get_csv2_float((X),(Y),939)
+#define get_csv2_uint_pos940(X,Y) get_csv2_uint((X),(Y),940)
+#define get_csv2_ullong_pos940(X,Y) get_csv2_ullong((X),(Y),940)
+#define get_csv2_ip_pos940(X,Y) get_csv2_ip((X),(Y),940)
+#define get_csv2_ipv6_pos940(X,Y) get_csv2_ipv6((X),(Y),940)
+#define get_csv2_string_pos940(X,Y) get_csv2_string((X),(Y),940)
+#define get_csv2_v_str_pos940(X,Y) get_csv2_string((X),(Y),940)
+#define get_csv2_bool_pos940(X,Y) get_csv2_bool((X),(Y),940)
+#define get_csv2_int_pos940(X,Y) get_csv2_int((X),(Y),940)
+#define get_csv2_llong_pos940(X,Y) get_csv2_llong((X),(Y),940)
+#define get_csv2_float_pos940(X,Y) get_csv2_float((X),(Y),940)
+#define get_csv2_uint_pos941(X,Y) get_csv2_uint((X),(Y),941)
+#define get_csv2_ullong_pos941(X,Y) get_csv2_ullong((X),(Y),941)
+#define get_csv2_ip_pos941(X,Y) get_csv2_ip((X),(Y),941)
+#define get_csv2_ipv6_pos941(X,Y) get_csv2_ipv6((X),(Y),941)
+#define get_csv2_string_pos941(X,Y) get_csv2_string((X),(Y),941)
+#define get_csv2_v_str_pos941(X,Y) get_csv2_string((X),(Y),941)
+#define get_csv2_bool_pos941(X,Y) get_csv2_bool((X),(Y),941)
+#define get_csv2_int_pos941(X,Y) get_csv2_int((X),(Y),941)
+#define get_csv2_llong_pos941(X,Y) get_csv2_llong((X),(Y),941)
+#define get_csv2_float_pos941(X,Y) get_csv2_float((X),(Y),941)
+#define get_csv2_uint_pos942(X,Y) get_csv2_uint((X),(Y),942)
+#define get_csv2_ullong_pos942(X,Y) get_csv2_ullong((X),(Y),942)
+#define get_csv2_ip_pos942(X,Y) get_csv2_ip((X),(Y),942)
+#define get_csv2_ipv6_pos942(X,Y) get_csv2_ipv6((X),(Y),942)
+#define get_csv2_string_pos942(X,Y) get_csv2_string((X),(Y),942)
+#define get_csv2_v_str_pos942(X,Y) get_csv2_string((X),(Y),942)
+#define get_csv2_bool_pos942(X,Y) get_csv2_bool((X),(Y),942)
+#define get_csv2_int_pos942(X,Y) get_csv2_int((X),(Y),942)
+#define get_csv2_llong_pos942(X,Y) get_csv2_llong((X),(Y),942)
+#define get_csv2_float_pos942(X,Y) get_csv2_float((X),(Y),942)
+#define get_csv2_uint_pos943(X,Y) get_csv2_uint((X),(Y),943)
+#define get_csv2_ullong_pos943(X,Y) get_csv2_ullong((X),(Y),943)
+#define get_csv2_ip_pos943(X,Y) get_csv2_ip((X),(Y),943)
+#define get_csv2_ipv6_pos943(X,Y) get_csv2_ipv6((X),(Y),943)
+#define get_csv2_string_pos943(X,Y) get_csv2_string((X),(Y),943)
+#define get_csv2_v_str_pos943(X,Y) get_csv2_string((X),(Y),943)
+#define get_csv2_bool_pos943(X,Y) get_csv2_bool((X),(Y),943)
+#define get_csv2_int_pos943(X,Y) get_csv2_int((X),(Y),943)
+#define get_csv2_llong_pos943(X,Y) get_csv2_llong((X),(Y),943)
+#define get_csv2_float_pos943(X,Y) get_csv2_float((X),(Y),943)
+#define get_csv2_uint_pos944(X,Y) get_csv2_uint((X),(Y),944)
+#define get_csv2_ullong_pos944(X,Y) get_csv2_ullong((X),(Y),944)
+#define get_csv2_ip_pos944(X,Y) get_csv2_ip((X),(Y),944)
+#define get_csv2_ipv6_pos944(X,Y) get_csv2_ipv6((X),(Y),944)
+#define get_csv2_string_pos944(X,Y) get_csv2_string((X),(Y),944)
+#define get_csv2_v_str_pos944(X,Y) get_csv2_string((X),(Y),944)
+#define get_csv2_bool_pos944(X,Y) get_csv2_bool((X),(Y),944)
+#define get_csv2_int_pos944(X,Y) get_csv2_int((X),(Y),944)
+#define get_csv2_llong_pos944(X,Y) get_csv2_llong((X),(Y),944)
+#define get_csv2_float_pos944(X,Y) get_csv2_float((X),(Y),944)
+#define get_csv2_uint_pos945(X,Y) get_csv2_uint((X),(Y),945)
+#define get_csv2_ullong_pos945(X,Y) get_csv2_ullong((X),(Y),945)
+#define get_csv2_ip_pos945(X,Y) get_csv2_ip((X),(Y),945)
+#define get_csv2_ipv6_pos945(X,Y) get_csv2_ipv6((X),(Y),945)
+#define get_csv2_string_pos945(X,Y) get_csv2_string((X),(Y),945)
+#define get_csv2_v_str_pos945(X,Y) get_csv2_string((X),(Y),945)
+#define get_csv2_bool_pos945(X,Y) get_csv2_bool((X),(Y),945)
+#define get_csv2_int_pos945(X,Y) get_csv2_int((X),(Y),945)
+#define get_csv2_llong_pos945(X,Y) get_csv2_llong((X),(Y),945)
+#define get_csv2_float_pos945(X,Y) get_csv2_float((X),(Y),945)
+#define get_csv2_uint_pos946(X,Y) get_csv2_uint((X),(Y),946)
+#define get_csv2_ullong_pos946(X,Y) get_csv2_ullong((X),(Y),946)
+#define get_csv2_ip_pos946(X,Y) get_csv2_ip((X),(Y),946)
+#define get_csv2_ipv6_pos946(X,Y) get_csv2_ipv6((X),(Y),946)
+#define get_csv2_string_pos946(X,Y) get_csv2_string((X),(Y),946)
+#define get_csv2_v_str_pos946(X,Y) get_csv2_string((X),(Y),946)
+#define get_csv2_bool_pos946(X,Y) get_csv2_bool((X),(Y),946)
+#define get_csv2_int_pos946(X,Y) get_csv2_int((X),(Y),946)
+#define get_csv2_llong_pos946(X,Y) get_csv2_llong((X),(Y),946)
+#define get_csv2_float_pos946(X,Y) get_csv2_float((X),(Y),946)
+#define get_csv2_uint_pos947(X,Y) get_csv2_uint((X),(Y),947)
+#define get_csv2_ullong_pos947(X,Y) get_csv2_ullong((X),(Y),947)
+#define get_csv2_ip_pos947(X,Y) get_csv2_ip((X),(Y),947)
+#define get_csv2_ipv6_pos947(X,Y) get_csv2_ipv6((X),(Y),947)
+#define get_csv2_string_pos947(X,Y) get_csv2_string((X),(Y),947)
+#define get_csv2_v_str_pos947(X,Y) get_csv2_string((X),(Y),947)
+#define get_csv2_bool_pos947(X,Y) get_csv2_bool((X),(Y),947)
+#define get_csv2_int_pos947(X,Y) get_csv2_int((X),(Y),947)
+#define get_csv2_llong_pos947(X,Y) get_csv2_llong((X),(Y),947)
+#define get_csv2_float_pos947(X,Y) get_csv2_float((X),(Y),947)
+#define get_csv2_uint_pos948(X,Y) get_csv2_uint((X),(Y),948)
+#define get_csv2_ullong_pos948(X,Y) get_csv2_ullong((X),(Y),948)
+#define get_csv2_ip_pos948(X,Y) get_csv2_ip((X),(Y),948)
+#define get_csv2_ipv6_pos948(X,Y) get_csv2_ipv6((X),(Y),948)
+#define get_csv2_string_pos948(X,Y) get_csv2_string((X),(Y),948)
+#define get_csv2_v_str_pos948(X,Y) get_csv2_string((X),(Y),948)
+#define get_csv2_bool_pos948(X,Y) get_csv2_bool((X),(Y),948)
+#define get_csv2_int_pos948(X,Y) get_csv2_int((X),(Y),948)
+#define get_csv2_llong_pos948(X,Y) get_csv2_llong((X),(Y),948)
+#define get_csv2_float_pos948(X,Y) get_csv2_float((X),(Y),948)
+#define get_csv2_uint_pos949(X,Y) get_csv2_uint((X),(Y),949)
+#define get_csv2_ullong_pos949(X,Y) get_csv2_ullong((X),(Y),949)
+#define get_csv2_ip_pos949(X,Y) get_csv2_ip((X),(Y),949)
+#define get_csv2_ipv6_pos949(X,Y) get_csv2_ipv6((X),(Y),949)
+#define get_csv2_string_pos949(X,Y) get_csv2_string((X),(Y),949)
+#define get_csv2_v_str_pos949(X,Y) get_csv2_string((X),(Y),949)
+#define get_csv2_bool_pos949(X,Y) get_csv2_bool((X),(Y),949)
+#define get_csv2_int_pos949(X,Y) get_csv2_int((X),(Y),949)
+#define get_csv2_llong_pos949(X,Y) get_csv2_llong((X),(Y),949)
+#define get_csv2_float_pos949(X,Y) get_csv2_float((X),(Y),949)
+#define get_csv2_uint_pos950(X,Y) get_csv2_uint((X),(Y),950)
+#define get_csv2_ullong_pos950(X,Y) get_csv2_ullong((X),(Y),950)
+#define get_csv2_ip_pos950(X,Y) get_csv2_ip((X),(Y),950)
+#define get_csv2_ipv6_pos950(X,Y) get_csv2_ipv6((X),(Y),950)
+#define get_csv2_string_pos950(X,Y) get_csv2_string((X),(Y),950)
+#define get_csv2_v_str_pos950(X,Y) get_csv2_string((X),(Y),950)
+#define get_csv2_bool_pos950(X,Y) get_csv2_bool((X),(Y),950)
+#define get_csv2_int_pos950(X,Y) get_csv2_int((X),(Y),950)
+#define get_csv2_llong_pos950(X,Y) get_csv2_llong((X),(Y),950)
+#define get_csv2_float_pos950(X,Y) get_csv2_float((X),(Y),950)
+#define get_csv2_uint_pos951(X,Y) get_csv2_uint((X),(Y),951)
+#define get_csv2_ullong_pos951(X,Y) get_csv2_ullong((X),(Y),951)
+#define get_csv2_ip_pos951(X,Y) get_csv2_ip((X),(Y),951)
+#define get_csv2_ipv6_pos951(X,Y) get_csv2_ipv6((X),(Y),951)
+#define get_csv2_string_pos951(X,Y) get_csv2_string((X),(Y),951)
+#define get_csv2_v_str_pos951(X,Y) get_csv2_string((X),(Y),951)
+#define get_csv2_bool_pos951(X,Y) get_csv2_bool((X),(Y),951)
+#define get_csv2_int_pos951(X,Y) get_csv2_int((X),(Y),951)
+#define get_csv2_llong_pos951(X,Y) get_csv2_llong((X),(Y),951)
+#define get_csv2_float_pos951(X,Y) get_csv2_float((X),(Y),951)
+#define get_csv2_uint_pos952(X,Y) get_csv2_uint((X),(Y),952)
+#define get_csv2_ullong_pos952(X,Y) get_csv2_ullong((X),(Y),952)
+#define get_csv2_ip_pos952(X,Y) get_csv2_ip((X),(Y),952)
+#define get_csv2_ipv6_pos952(X,Y) get_csv2_ipv6((X),(Y),952)
+#define get_csv2_string_pos952(X,Y) get_csv2_string((X),(Y),952)
+#define get_csv2_v_str_pos952(X,Y) get_csv2_string((X),(Y),952)
+#define get_csv2_bool_pos952(X,Y) get_csv2_bool((X),(Y),952)
+#define get_csv2_int_pos952(X,Y) get_csv2_int((X),(Y),952)
+#define get_csv2_llong_pos952(X,Y) get_csv2_llong((X),(Y),952)
+#define get_csv2_float_pos952(X,Y) get_csv2_float((X),(Y),952)
+#define get_csv2_uint_pos953(X,Y) get_csv2_uint((X),(Y),953)
+#define get_csv2_ullong_pos953(X,Y) get_csv2_ullong((X),(Y),953)
+#define get_csv2_ip_pos953(X,Y) get_csv2_ip((X),(Y),953)
+#define get_csv2_ipv6_pos953(X,Y) get_csv2_ipv6((X),(Y),953)
+#define get_csv2_string_pos953(X,Y) get_csv2_string((X),(Y),953)
+#define get_csv2_v_str_pos953(X,Y) get_csv2_string((X),(Y),953)
+#define get_csv2_bool_pos953(X,Y) get_csv2_bool((X),(Y),953)
+#define get_csv2_int_pos953(X,Y) get_csv2_int((X),(Y),953)
+#define get_csv2_llong_pos953(X,Y) get_csv2_llong((X),(Y),953)
+#define get_csv2_float_pos953(X,Y) get_csv2_float((X),(Y),953)
+#define get_csv2_uint_pos954(X,Y) get_csv2_uint((X),(Y),954)
+#define get_csv2_ullong_pos954(X,Y) get_csv2_ullong((X),(Y),954)
+#define get_csv2_ip_pos954(X,Y) get_csv2_ip((X),(Y),954)
+#define get_csv2_ipv6_pos954(X,Y) get_csv2_ipv6((X),(Y),954)
+#define get_csv2_string_pos954(X,Y) get_csv2_string((X),(Y),954)
+#define get_csv2_v_str_pos954(X,Y) get_csv2_string((X),(Y),954)
+#define get_csv2_bool_pos954(X,Y) get_csv2_bool((X),(Y),954)
+#define get_csv2_int_pos954(X,Y) get_csv2_int((X),(Y),954)
+#define get_csv2_llong_pos954(X,Y) get_csv2_llong((X),(Y),954)
+#define get_csv2_float_pos954(X,Y) get_csv2_float((X),(Y),954)
+#define get_csv2_uint_pos955(X,Y) get_csv2_uint((X),(Y),955)
+#define get_csv2_ullong_pos955(X,Y) get_csv2_ullong((X),(Y),955)
+#define get_csv2_ip_pos955(X,Y) get_csv2_ip((X),(Y),955)
+#define get_csv2_ipv6_pos955(X,Y) get_csv2_ipv6((X),(Y),955)
+#define get_csv2_string_pos955(X,Y) get_csv2_string((X),(Y),955)
+#define get_csv2_v_str_pos955(X,Y) get_csv2_string((X),(Y),955)
+#define get_csv2_bool_pos955(X,Y) get_csv2_bool((X),(Y),955)
+#define get_csv2_int_pos955(X,Y) get_csv2_int((X),(Y),955)
+#define get_csv2_llong_pos955(X,Y) get_csv2_llong((X),(Y),955)
+#define get_csv2_float_pos955(X,Y) get_csv2_float((X),(Y),955)
+#define get_csv2_uint_pos956(X,Y) get_csv2_uint((X),(Y),956)
+#define get_csv2_ullong_pos956(X,Y) get_csv2_ullong((X),(Y),956)
+#define get_csv2_ip_pos956(X,Y) get_csv2_ip((X),(Y),956)
+#define get_csv2_ipv6_pos956(X,Y) get_csv2_ipv6((X),(Y),956)
+#define get_csv2_string_pos956(X,Y) get_csv2_string((X),(Y),956)
+#define get_csv2_v_str_pos956(X,Y) get_csv2_string((X),(Y),956)
+#define get_csv2_bool_pos956(X,Y) get_csv2_bool((X),(Y),956)
+#define get_csv2_int_pos956(X,Y) get_csv2_int((X),(Y),956)
+#define get_csv2_llong_pos956(X,Y) get_csv2_llong((X),(Y),956)
+#define get_csv2_float_pos956(X,Y) get_csv2_float((X),(Y),956)
+#define get_csv2_uint_pos957(X,Y) get_csv2_uint((X),(Y),957)
+#define get_csv2_ullong_pos957(X,Y) get_csv2_ullong((X),(Y),957)
+#define get_csv2_ip_pos957(X,Y) get_csv2_ip((X),(Y),957)
+#define get_csv2_ipv6_pos957(X,Y) get_csv2_ipv6((X),(Y),957)
+#define get_csv2_string_pos957(X,Y) get_csv2_string((X),(Y),957)
+#define get_csv2_v_str_pos957(X,Y) get_csv2_string((X),(Y),957)
+#define get_csv2_bool_pos957(X,Y) get_csv2_bool((X),(Y),957)
+#define get_csv2_int_pos957(X,Y) get_csv2_int((X),(Y),957)
+#define get_csv2_llong_pos957(X,Y) get_csv2_llong((X),(Y),957)
+#define get_csv2_float_pos957(X,Y) get_csv2_float((X),(Y),957)
+#define get_csv2_uint_pos958(X,Y) get_csv2_uint((X),(Y),958)
+#define get_csv2_ullong_pos958(X,Y) get_csv2_ullong((X),(Y),958)
+#define get_csv2_ip_pos958(X,Y) get_csv2_ip((X),(Y),958)
+#define get_csv2_ipv6_pos958(X,Y) get_csv2_ipv6((X),(Y),958)
+#define get_csv2_string_pos958(X,Y) get_csv2_string((X),(Y),958)
+#define get_csv2_v_str_pos958(X,Y) get_csv2_string((X),(Y),958)
+#define get_csv2_bool_pos958(X,Y) get_csv2_bool((X),(Y),958)
+#define get_csv2_int_pos958(X,Y) get_csv2_int((X),(Y),958)
+#define get_csv2_llong_pos958(X,Y) get_csv2_llong((X),(Y),958)
+#define get_csv2_float_pos958(X,Y) get_csv2_float((X),(Y),958)
+#define get_csv2_uint_pos959(X,Y) get_csv2_uint((X),(Y),959)
+#define get_csv2_ullong_pos959(X,Y) get_csv2_ullong((X),(Y),959)
+#define get_csv2_ip_pos959(X,Y) get_csv2_ip((X),(Y),959)
+#define get_csv2_ipv6_pos959(X,Y) get_csv2_ipv6((X),(Y),959)
+#define get_csv2_string_pos959(X,Y) get_csv2_string((X),(Y),959)
+#define get_csv2_v_str_pos959(X,Y) get_csv2_string((X),(Y),959)
+#define get_csv2_bool_pos959(X,Y) get_csv2_bool((X),(Y),959)
+#define get_csv2_int_pos959(X,Y) get_csv2_int((X),(Y),959)
+#define get_csv2_llong_pos959(X,Y) get_csv2_llong((X),(Y),959)
+#define get_csv2_float_pos959(X,Y) get_csv2_float((X),(Y),959)
+#define get_csv2_uint_pos960(X,Y) get_csv2_uint((X),(Y),960)
+#define get_csv2_ullong_pos960(X,Y) get_csv2_ullong((X),(Y),960)
+#define get_csv2_ip_pos960(X,Y) get_csv2_ip((X),(Y),960)
+#define get_csv2_ipv6_pos960(X,Y) get_csv2_ipv6((X),(Y),960)
+#define get_csv2_string_pos960(X,Y) get_csv2_string((X),(Y),960)
+#define get_csv2_v_str_pos960(X,Y) get_csv2_string((X),(Y),960)
+#define get_csv2_bool_pos960(X,Y) get_csv2_bool((X),(Y),960)
+#define get_csv2_int_pos960(X,Y) get_csv2_int((X),(Y),960)
+#define get_csv2_llong_pos960(X,Y) get_csv2_llong((X),(Y),960)
+#define get_csv2_float_pos960(X,Y) get_csv2_float((X),(Y),960)
+#define get_csv2_uint_pos961(X,Y) get_csv2_uint((X),(Y),961)
+#define get_csv2_ullong_pos961(X,Y) get_csv2_ullong((X),(Y),961)
+#define get_csv2_ip_pos961(X,Y) get_csv2_ip((X),(Y),961)
+#define get_csv2_ipv6_pos961(X,Y) get_csv2_ipv6((X),(Y),961)
+#define get_csv2_string_pos961(X,Y) get_csv2_string((X),(Y),961)
+#define get_csv2_v_str_pos961(X,Y) get_csv2_string((X),(Y),961)
+#define get_csv2_bool_pos961(X,Y) get_csv2_bool((X),(Y),961)
+#define get_csv2_int_pos961(X,Y) get_csv2_int((X),(Y),961)
+#define get_csv2_llong_pos961(X,Y) get_csv2_llong((X),(Y),961)
+#define get_csv2_float_pos961(X,Y) get_csv2_float((X),(Y),961)
+#define get_csv2_uint_pos962(X,Y) get_csv2_uint((X),(Y),962)
+#define get_csv2_ullong_pos962(X,Y) get_csv2_ullong((X),(Y),962)
+#define get_csv2_ip_pos962(X,Y) get_csv2_ip((X),(Y),962)
+#define get_csv2_ipv6_pos962(X,Y) get_csv2_ipv6((X),(Y),962)
+#define get_csv2_string_pos962(X,Y) get_csv2_string((X),(Y),962)
+#define get_csv2_v_str_pos962(X,Y) get_csv2_string((X),(Y),962)
+#define get_csv2_bool_pos962(X,Y) get_csv2_bool((X),(Y),962)
+#define get_csv2_int_pos962(X,Y) get_csv2_int((X),(Y),962)
+#define get_csv2_llong_pos962(X,Y) get_csv2_llong((X),(Y),962)
+#define get_csv2_float_pos962(X,Y) get_csv2_float((X),(Y),962)
+#define get_csv2_uint_pos963(X,Y) get_csv2_uint((X),(Y),963)
+#define get_csv2_ullong_pos963(X,Y) get_csv2_ullong((X),(Y),963)
+#define get_csv2_ip_pos963(X,Y) get_csv2_ip((X),(Y),963)
+#define get_csv2_ipv6_pos963(X,Y) get_csv2_ipv6((X),(Y),963)
+#define get_csv2_string_pos963(X,Y) get_csv2_string((X),(Y),963)
+#define get_csv2_v_str_pos963(X,Y) get_csv2_string((X),(Y),963)
+#define get_csv2_bool_pos963(X,Y) get_csv2_bool((X),(Y),963)
+#define get_csv2_int_pos963(X,Y) get_csv2_int((X),(Y),963)
+#define get_csv2_llong_pos963(X,Y) get_csv2_llong((X),(Y),963)
+#define get_csv2_float_pos963(X,Y) get_csv2_float((X),(Y),963)
+#define get_csv2_uint_pos964(X,Y) get_csv2_uint((X),(Y),964)
+#define get_csv2_ullong_pos964(X,Y) get_csv2_ullong((X),(Y),964)
+#define get_csv2_ip_pos964(X,Y) get_csv2_ip((X),(Y),964)
+#define get_csv2_ipv6_pos964(X,Y) get_csv2_ipv6((X),(Y),964)
+#define get_csv2_string_pos964(X,Y) get_csv2_string((X),(Y),964)
+#define get_csv2_v_str_pos964(X,Y) get_csv2_string((X),(Y),964)
+#define get_csv2_bool_pos964(X,Y) get_csv2_bool((X),(Y),964)
+#define get_csv2_int_pos964(X,Y) get_csv2_int((X),(Y),964)
+#define get_csv2_llong_pos964(X,Y) get_csv2_llong((X),(Y),964)
+#define get_csv2_float_pos964(X,Y) get_csv2_float((X),(Y),964)
+#define get_csv2_uint_pos965(X,Y) get_csv2_uint((X),(Y),965)
+#define get_csv2_ullong_pos965(X,Y) get_csv2_ullong((X),(Y),965)
+#define get_csv2_ip_pos965(X,Y) get_csv2_ip((X),(Y),965)
+#define get_csv2_ipv6_pos965(X,Y) get_csv2_ipv6((X),(Y),965)
+#define get_csv2_string_pos965(X,Y) get_csv2_string((X),(Y),965)
+#define get_csv2_v_str_pos965(X,Y) get_csv2_string((X),(Y),965)
+#define get_csv2_bool_pos965(X,Y) get_csv2_bool((X),(Y),965)
+#define get_csv2_int_pos965(X,Y) get_csv2_int((X),(Y),965)
+#define get_csv2_llong_pos965(X,Y) get_csv2_llong((X),(Y),965)
+#define get_csv2_float_pos965(X,Y) get_csv2_float((X),(Y),965)
+#define get_csv2_uint_pos966(X,Y) get_csv2_uint((X),(Y),966)
+#define get_csv2_ullong_pos966(X,Y) get_csv2_ullong((X),(Y),966)
+#define get_csv2_ip_pos966(X,Y) get_csv2_ip((X),(Y),966)
+#define get_csv2_ipv6_pos966(X,Y) get_csv2_ipv6((X),(Y),966)
+#define get_csv2_string_pos966(X,Y) get_csv2_string((X),(Y),966)
+#define get_csv2_v_str_pos966(X,Y) get_csv2_string((X),(Y),966)
+#define get_csv2_bool_pos966(X,Y) get_csv2_bool((X),(Y),966)
+#define get_csv2_int_pos966(X,Y) get_csv2_int((X),(Y),966)
+#define get_csv2_llong_pos966(X,Y) get_csv2_llong((X),(Y),966)
+#define get_csv2_float_pos966(X,Y) get_csv2_float((X),(Y),966)
+#define get_csv2_uint_pos967(X,Y) get_csv2_uint((X),(Y),967)
+#define get_csv2_ullong_pos967(X,Y) get_csv2_ullong((X),(Y),967)
+#define get_csv2_ip_pos967(X,Y) get_csv2_ip((X),(Y),967)
+#define get_csv2_ipv6_pos967(X,Y) get_csv2_ipv6((X),(Y),967)
+#define get_csv2_string_pos967(X,Y) get_csv2_string((X),(Y),967)
+#define get_csv2_v_str_pos967(X,Y) get_csv2_string((X),(Y),967)
+#define get_csv2_bool_pos967(X,Y) get_csv2_bool((X),(Y),967)
+#define get_csv2_int_pos967(X,Y) get_csv2_int((X),(Y),967)
+#define get_csv2_llong_pos967(X,Y) get_csv2_llong((X),(Y),967)
+#define get_csv2_float_pos967(X,Y) get_csv2_float((X),(Y),967)
+#define get_csv2_uint_pos968(X,Y) get_csv2_uint((X),(Y),968)
+#define get_csv2_ullong_pos968(X,Y) get_csv2_ullong((X),(Y),968)
+#define get_csv2_ip_pos968(X,Y) get_csv2_ip((X),(Y),968)
+#define get_csv2_ipv6_pos968(X,Y) get_csv2_ipv6((X),(Y),968)
+#define get_csv2_string_pos968(X,Y) get_csv2_string((X),(Y),968)
+#define get_csv2_v_str_pos968(X,Y) get_csv2_string((X),(Y),968)
+#define get_csv2_bool_pos968(X,Y) get_csv2_bool((X),(Y),968)
+#define get_csv2_int_pos968(X,Y) get_csv2_int((X),(Y),968)
+#define get_csv2_llong_pos968(X,Y) get_csv2_llong((X),(Y),968)
+#define get_csv2_float_pos968(X,Y) get_csv2_float((X),(Y),968)
+#define get_csv2_uint_pos969(X,Y) get_csv2_uint((X),(Y),969)
+#define get_csv2_ullong_pos969(X,Y) get_csv2_ullong((X),(Y),969)
+#define get_csv2_ip_pos969(X,Y) get_csv2_ip((X),(Y),969)
+#define get_csv2_ipv6_pos969(X,Y) get_csv2_ipv6((X),(Y),969)
+#define get_csv2_string_pos969(X,Y) get_csv2_string((X),(Y),969)
+#define get_csv2_v_str_pos969(X,Y) get_csv2_string((X),(Y),969)
+#define get_csv2_bool_pos969(X,Y) get_csv2_bool((X),(Y),969)
+#define get_csv2_int_pos969(X,Y) get_csv2_int((X),(Y),969)
+#define get_csv2_llong_pos969(X,Y) get_csv2_llong((X),(Y),969)
+#define get_csv2_float_pos969(X,Y) get_csv2_float((X),(Y),969)
+#define get_csv2_uint_pos970(X,Y) get_csv2_uint((X),(Y),970)
+#define get_csv2_ullong_pos970(X,Y) get_csv2_ullong((X),(Y),970)
+#define get_csv2_ip_pos970(X,Y) get_csv2_ip((X),(Y),970)
+#define get_csv2_ipv6_pos970(X,Y) get_csv2_ipv6((X),(Y),970)
+#define get_csv2_string_pos970(X,Y) get_csv2_string((X),(Y),970)
+#define get_csv2_v_str_pos970(X,Y) get_csv2_string((X),(Y),970)
+#define get_csv2_bool_pos970(X,Y) get_csv2_bool((X),(Y),970)
+#define get_csv2_int_pos970(X,Y) get_csv2_int((X),(Y),970)
+#define get_csv2_llong_pos970(X,Y) get_csv2_llong((X),(Y),970)
+#define get_csv2_float_pos970(X,Y) get_csv2_float((X),(Y),970)
+#define get_csv2_uint_pos971(X,Y) get_csv2_uint((X),(Y),971)
+#define get_csv2_ullong_pos971(X,Y) get_csv2_ullong((X),(Y),971)
+#define get_csv2_ip_pos971(X,Y) get_csv2_ip((X),(Y),971)
+#define get_csv2_ipv6_pos971(X,Y) get_csv2_ipv6((X),(Y),971)
+#define get_csv2_string_pos971(X,Y) get_csv2_string((X),(Y),971)
+#define get_csv2_v_str_pos971(X,Y) get_csv2_string((X),(Y),971)
+#define get_csv2_bool_pos971(X,Y) get_csv2_bool((X),(Y),971)
+#define get_csv2_int_pos971(X,Y) get_csv2_int((X),(Y),971)
+#define get_csv2_llong_pos971(X,Y) get_csv2_llong((X),(Y),971)
+#define get_csv2_float_pos971(X,Y) get_csv2_float((X),(Y),971)
+#define get_csv2_uint_pos972(X,Y) get_csv2_uint((X),(Y),972)
+#define get_csv2_ullong_pos972(X,Y) get_csv2_ullong((X),(Y),972)
+#define get_csv2_ip_pos972(X,Y) get_csv2_ip((X),(Y),972)
+#define get_csv2_ipv6_pos972(X,Y) get_csv2_ipv6((X),(Y),972)
+#define get_csv2_string_pos972(X,Y) get_csv2_string((X),(Y),972)
+#define get_csv2_v_str_pos972(X,Y) get_csv2_string((X),(Y),972)
+#define get_csv2_bool_pos972(X,Y) get_csv2_bool((X),(Y),972)
+#define get_csv2_int_pos972(X,Y) get_csv2_int((X),(Y),972)
+#define get_csv2_llong_pos972(X,Y) get_csv2_llong((X),(Y),972)
+#define get_csv2_float_pos972(X,Y) get_csv2_float((X),(Y),972)
+#define get_csv2_uint_pos973(X,Y) get_csv2_uint((X),(Y),973)
+#define get_csv2_ullong_pos973(X,Y) get_csv2_ullong((X),(Y),973)
+#define get_csv2_ip_pos973(X,Y) get_csv2_ip((X),(Y),973)
+#define get_csv2_ipv6_pos973(X,Y) get_csv2_ipv6((X),(Y),973)
+#define get_csv2_string_pos973(X,Y) get_csv2_string((X),(Y),973)
+#define get_csv2_v_str_pos973(X,Y) get_csv2_string((X),(Y),973)
+#define get_csv2_bool_pos973(X,Y) get_csv2_bool((X),(Y),973)
+#define get_csv2_int_pos973(X,Y) get_csv2_int((X),(Y),973)
+#define get_csv2_llong_pos973(X,Y) get_csv2_llong((X),(Y),973)
+#define get_csv2_float_pos973(X,Y) get_csv2_float((X),(Y),973)
+#define get_csv2_uint_pos974(X,Y) get_csv2_uint((X),(Y),974)
+#define get_csv2_ullong_pos974(X,Y) get_csv2_ullong((X),(Y),974)
+#define get_csv2_ip_pos974(X,Y) get_csv2_ip((X),(Y),974)
+#define get_csv2_ipv6_pos974(X,Y) get_csv2_ipv6((X),(Y),974)
+#define get_csv2_string_pos974(X,Y) get_csv2_string((X),(Y),974)
+#define get_csv2_v_str_pos974(X,Y) get_csv2_string((X),(Y),974)
+#define get_csv2_bool_pos974(X,Y) get_csv2_bool((X),(Y),974)
+#define get_csv2_int_pos974(X,Y) get_csv2_int((X),(Y),974)
+#define get_csv2_llong_pos974(X,Y) get_csv2_llong((X),(Y),974)
+#define get_csv2_float_pos974(X,Y) get_csv2_float((X),(Y),974)
+#define get_csv2_uint_pos975(X,Y) get_csv2_uint((X),(Y),975)
+#define get_csv2_ullong_pos975(X,Y) get_csv2_ullong((X),(Y),975)
+#define get_csv2_ip_pos975(X,Y) get_csv2_ip((X),(Y),975)
+#define get_csv2_ipv6_pos975(X,Y) get_csv2_ipv6((X),(Y),975)
+#define get_csv2_string_pos975(X,Y) get_csv2_string((X),(Y),975)
+#define get_csv2_v_str_pos975(X,Y) get_csv2_string((X),(Y),975)
+#define get_csv2_bool_pos975(X,Y) get_csv2_bool((X),(Y),975)
+#define get_csv2_int_pos975(X,Y) get_csv2_int((X),(Y),975)
+#define get_csv2_llong_pos975(X,Y) get_csv2_llong((X),(Y),975)
+#define get_csv2_float_pos975(X,Y) get_csv2_float((X),(Y),975)
+#define get_csv2_uint_pos976(X,Y) get_csv2_uint((X),(Y),976)
+#define get_csv2_ullong_pos976(X,Y) get_csv2_ullong((X),(Y),976)
+#define get_csv2_ip_pos976(X,Y) get_csv2_ip((X),(Y),976)
+#define get_csv2_ipv6_pos976(X,Y) get_csv2_ipv6((X),(Y),976)
+#define get_csv2_string_pos976(X,Y) get_csv2_string((X),(Y),976)
+#define get_csv2_v_str_pos976(X,Y) get_csv2_string((X),(Y),976)
+#define get_csv2_bool_pos976(X,Y) get_csv2_bool((X),(Y),976)
+#define get_csv2_int_pos976(X,Y) get_csv2_int((X),(Y),976)
+#define get_csv2_llong_pos976(X,Y) get_csv2_llong((X),(Y),976)
+#define get_csv2_float_pos976(X,Y) get_csv2_float((X),(Y),976)
+#define get_csv2_uint_pos977(X,Y) get_csv2_uint((X),(Y),977)
+#define get_csv2_ullong_pos977(X,Y) get_csv2_ullong((X),(Y),977)
+#define get_csv2_ip_pos977(X,Y) get_csv2_ip((X),(Y),977)
+#define get_csv2_ipv6_pos977(X,Y) get_csv2_ipv6((X),(Y),977)
+#define get_csv2_string_pos977(X,Y) get_csv2_string((X),(Y),977)
+#define get_csv2_v_str_pos977(X,Y) get_csv2_string((X),(Y),977)
+#define get_csv2_bool_pos977(X,Y) get_csv2_bool((X),(Y),977)
+#define get_csv2_int_pos977(X,Y) get_csv2_int((X),(Y),977)
+#define get_csv2_llong_pos977(X,Y) get_csv2_llong((X),(Y),977)
+#define get_csv2_float_pos977(X,Y) get_csv2_float((X),(Y),977)
+#define get_csv2_uint_pos978(X,Y) get_csv2_uint((X),(Y),978)
+#define get_csv2_ullong_pos978(X,Y) get_csv2_ullong((X),(Y),978)
+#define get_csv2_ip_pos978(X,Y) get_csv2_ip((X),(Y),978)
+#define get_csv2_ipv6_pos978(X,Y) get_csv2_ipv6((X),(Y),978)
+#define get_csv2_string_pos978(X,Y) get_csv2_string((X),(Y),978)
+#define get_csv2_v_str_pos978(X,Y) get_csv2_string((X),(Y),978)
+#define get_csv2_bool_pos978(X,Y) get_csv2_bool((X),(Y),978)
+#define get_csv2_int_pos978(X,Y) get_csv2_int((X),(Y),978)
+#define get_csv2_llong_pos978(X,Y) get_csv2_llong((X),(Y),978)
+#define get_csv2_float_pos978(X,Y) get_csv2_float((X),(Y),978)
+#define get_csv2_uint_pos979(X,Y) get_csv2_uint((X),(Y),979)
+#define get_csv2_ullong_pos979(X,Y) get_csv2_ullong((X),(Y),979)
+#define get_csv2_ip_pos979(X,Y) get_csv2_ip((X),(Y),979)
+#define get_csv2_ipv6_pos979(X,Y) get_csv2_ipv6((X),(Y),979)
+#define get_csv2_string_pos979(X,Y) get_csv2_string((X),(Y),979)
+#define get_csv2_v_str_pos979(X,Y) get_csv2_string((X),(Y),979)
+#define get_csv2_bool_pos979(X,Y) get_csv2_bool((X),(Y),979)
+#define get_csv2_int_pos979(X,Y) get_csv2_int((X),(Y),979)
+#define get_csv2_llong_pos979(X,Y) get_csv2_llong((X),(Y),979)
+#define get_csv2_float_pos979(X,Y) get_csv2_float((X),(Y),979)
+#define get_csv2_uint_pos980(X,Y) get_csv2_uint((X),(Y),980)
+#define get_csv2_ullong_pos980(X,Y) get_csv2_ullong((X),(Y),980)
+#define get_csv2_ip_pos980(X,Y) get_csv2_ip((X),(Y),980)
+#define get_csv2_ipv6_pos980(X,Y) get_csv2_ipv6((X),(Y),980)
+#define get_csv2_string_pos980(X,Y) get_csv2_string((X),(Y),980)
+#define get_csv2_v_str_pos980(X,Y) get_csv2_string((X),(Y),980)
+#define get_csv2_bool_pos980(X,Y) get_csv2_bool((X),(Y),980)
+#define get_csv2_int_pos980(X,Y) get_csv2_int((X),(Y),980)
+#define get_csv2_llong_pos980(X,Y) get_csv2_llong((X),(Y),980)
+#define get_csv2_float_pos980(X,Y) get_csv2_float((X),(Y),980)
+#define get_csv2_uint_pos981(X,Y) get_csv2_uint((X),(Y),981)
+#define get_csv2_ullong_pos981(X,Y) get_csv2_ullong((X),(Y),981)
+#define get_csv2_ip_pos981(X,Y) get_csv2_ip((X),(Y),981)
+#define get_csv2_ipv6_pos981(X,Y) get_csv2_ipv6((X),(Y),981)
+#define get_csv2_string_pos981(X,Y) get_csv2_string((X),(Y),981)
+#define get_csv2_v_str_pos981(X,Y) get_csv2_string((X),(Y),981)
+#define get_csv2_bool_pos981(X,Y) get_csv2_bool((X),(Y),981)
+#define get_csv2_int_pos981(X,Y) get_csv2_int((X),(Y),981)
+#define get_csv2_llong_pos981(X,Y) get_csv2_llong((X),(Y),981)
+#define get_csv2_float_pos981(X,Y) get_csv2_float((X),(Y),981)
+#define get_csv2_uint_pos982(X,Y) get_csv2_uint((X),(Y),982)
+#define get_csv2_ullong_pos982(X,Y) get_csv2_ullong((X),(Y),982)
+#define get_csv2_ip_pos982(X,Y) get_csv2_ip((X),(Y),982)
+#define get_csv2_ipv6_pos982(X,Y) get_csv2_ipv6((X),(Y),982)
+#define get_csv2_string_pos982(X,Y) get_csv2_string((X),(Y),982)
+#define get_csv2_v_str_pos982(X,Y) get_csv2_string((X),(Y),982)
+#define get_csv2_bool_pos982(X,Y) get_csv2_bool((X),(Y),982)
+#define get_csv2_int_pos982(X,Y) get_csv2_int((X),(Y),982)
+#define get_csv2_llong_pos982(X,Y) get_csv2_llong((X),(Y),982)
+#define get_csv2_float_pos982(X,Y) get_csv2_float((X),(Y),982)
+#define get_csv2_uint_pos983(X,Y) get_csv2_uint((X),(Y),983)
+#define get_csv2_ullong_pos983(X,Y) get_csv2_ullong((X),(Y),983)
+#define get_csv2_ip_pos983(X,Y) get_csv2_ip((X),(Y),983)
+#define get_csv2_ipv6_pos983(X,Y) get_csv2_ipv6((X),(Y),983)
+#define get_csv2_string_pos983(X,Y) get_csv2_string((X),(Y),983)
+#define get_csv2_v_str_pos983(X,Y) get_csv2_string((X),(Y),983)
+#define get_csv2_bool_pos983(X,Y) get_csv2_bool((X),(Y),983)
+#define get_csv2_int_pos983(X,Y) get_csv2_int((X),(Y),983)
+#define get_csv2_llong_pos983(X,Y) get_csv2_llong((X),(Y),983)
+#define get_csv2_float_pos983(X,Y) get_csv2_float((X),(Y),983)
+#define get_csv2_uint_pos984(X,Y) get_csv2_uint((X),(Y),984)
+#define get_csv2_ullong_pos984(X,Y) get_csv2_ullong((X),(Y),984)
+#define get_csv2_ip_pos984(X,Y) get_csv2_ip((X),(Y),984)
+#define get_csv2_ipv6_pos984(X,Y) get_csv2_ipv6((X),(Y),984)
+#define get_csv2_string_pos984(X,Y) get_csv2_string((X),(Y),984)
+#define get_csv2_v_str_pos984(X,Y) get_csv2_string((X),(Y),984)
+#define get_csv2_bool_pos984(X,Y) get_csv2_bool((X),(Y),984)
+#define get_csv2_int_pos984(X,Y) get_csv2_int((X),(Y),984)
+#define get_csv2_llong_pos984(X,Y) get_csv2_llong((X),(Y),984)
+#define get_csv2_float_pos984(X,Y) get_csv2_float((X),(Y),984)
+#define get_csv2_uint_pos985(X,Y) get_csv2_uint((X),(Y),985)
+#define get_csv2_ullong_pos985(X,Y) get_csv2_ullong((X),(Y),985)
+#define get_csv2_ip_pos985(X,Y) get_csv2_ip((X),(Y),985)
+#define get_csv2_ipv6_pos985(X,Y) get_csv2_ipv6((X),(Y),985)
+#define get_csv2_string_pos985(X,Y) get_csv2_string((X),(Y),985)
+#define get_csv2_v_str_pos985(X,Y) get_csv2_string((X),(Y),985)
+#define get_csv2_bool_pos985(X,Y) get_csv2_bool((X),(Y),985)
+#define get_csv2_int_pos985(X,Y) get_csv2_int((X),(Y),985)
+#define get_csv2_llong_pos985(X,Y) get_csv2_llong((X),(Y),985)
+#define get_csv2_float_pos985(X,Y) get_csv2_float((X),(Y),985)
+#define get_csv2_uint_pos986(X,Y) get_csv2_uint((X),(Y),986)
+#define get_csv2_ullong_pos986(X,Y) get_csv2_ullong((X),(Y),986)
+#define get_csv2_ip_pos986(X,Y) get_csv2_ip((X),(Y),986)
+#define get_csv2_ipv6_pos986(X,Y) get_csv2_ipv6((X),(Y),986)
+#define get_csv2_string_pos986(X,Y) get_csv2_string((X),(Y),986)
+#define get_csv2_v_str_pos986(X,Y) get_csv2_string((X),(Y),986)
+#define get_csv2_bool_pos986(X,Y) get_csv2_bool((X),(Y),986)
+#define get_csv2_int_pos986(X,Y) get_csv2_int((X),(Y),986)
+#define get_csv2_llong_pos986(X,Y) get_csv2_llong((X),(Y),986)
+#define get_csv2_float_pos986(X,Y) get_csv2_float((X),(Y),986)
+#define get_csv2_uint_pos987(X,Y) get_csv2_uint((X),(Y),987)
+#define get_csv2_ullong_pos987(X,Y) get_csv2_ullong((X),(Y),987)
+#define get_csv2_ip_pos987(X,Y) get_csv2_ip((X),(Y),987)
+#define get_csv2_ipv6_pos987(X,Y) get_csv2_ipv6((X),(Y),987)
+#define get_csv2_string_pos987(X,Y) get_csv2_string((X),(Y),987)
+#define get_csv2_v_str_pos987(X,Y) get_csv2_string((X),(Y),987)
+#define get_csv2_bool_pos987(X,Y) get_csv2_bool((X),(Y),987)
+#define get_csv2_int_pos987(X,Y) get_csv2_int((X),(Y),987)
+#define get_csv2_llong_pos987(X,Y) get_csv2_llong((X),(Y),987)
+#define get_csv2_float_pos987(X,Y) get_csv2_float((X),(Y),987)
+#define get_csv2_uint_pos988(X,Y) get_csv2_uint((X),(Y),988)
+#define get_csv2_ullong_pos988(X,Y) get_csv2_ullong((X),(Y),988)
+#define get_csv2_ip_pos988(X,Y) get_csv2_ip((X),(Y),988)
+#define get_csv2_ipv6_pos988(X,Y) get_csv2_ipv6((X),(Y),988)
+#define get_csv2_string_pos988(X,Y) get_csv2_string((X),(Y),988)
+#define get_csv2_v_str_pos988(X,Y) get_csv2_string((X),(Y),988)
+#define get_csv2_bool_pos988(X,Y) get_csv2_bool((X),(Y),988)
+#define get_csv2_int_pos988(X,Y) get_csv2_int((X),(Y),988)
+#define get_csv2_llong_pos988(X,Y) get_csv2_llong((X),(Y),988)
+#define get_csv2_float_pos988(X,Y) get_csv2_float((X),(Y),988)
+#define get_csv2_uint_pos989(X,Y) get_csv2_uint((X),(Y),989)
+#define get_csv2_ullong_pos989(X,Y) get_csv2_ullong((X),(Y),989)
+#define get_csv2_ip_pos989(X,Y) get_csv2_ip((X),(Y),989)
+#define get_csv2_ipv6_pos989(X,Y) get_csv2_ipv6((X),(Y),989)
+#define get_csv2_string_pos989(X,Y) get_csv2_string((X),(Y),989)
+#define get_csv2_v_str_pos989(X,Y) get_csv2_string((X),(Y),989)
+#define get_csv2_bool_pos989(X,Y) get_csv2_bool((X),(Y),989)
+#define get_csv2_int_pos989(X,Y) get_csv2_int((X),(Y),989)
+#define get_csv2_llong_pos989(X,Y) get_csv2_llong((X),(Y),989)
+#define get_csv2_float_pos989(X,Y) get_csv2_float((X),(Y),989)
+#define get_csv2_uint_pos990(X,Y) get_csv2_uint((X),(Y),990)
+#define get_csv2_ullong_pos990(X,Y) get_csv2_ullong((X),(Y),990)
+#define get_csv2_ip_pos990(X,Y) get_csv2_ip((X),(Y),990)
+#define get_csv2_ipv6_pos990(X,Y) get_csv2_ipv6((X),(Y),990)
+#define get_csv2_string_pos990(X,Y) get_csv2_string((X),(Y),990)
+#define get_csv2_v_str_pos990(X,Y) get_csv2_string((X),(Y),990)
+#define get_csv2_bool_pos990(X,Y) get_csv2_bool((X),(Y),990)
+#define get_csv2_int_pos990(X,Y) get_csv2_int((X),(Y),990)
+#define get_csv2_llong_pos990(X,Y) get_csv2_llong((X),(Y),990)
+#define get_csv2_float_pos990(X,Y) get_csv2_float((X),(Y),990)
+#define get_csv2_uint_pos991(X,Y) get_csv2_uint((X),(Y),991)
+#define get_csv2_ullong_pos991(X,Y) get_csv2_ullong((X),(Y),991)
+#define get_csv2_ip_pos991(X,Y) get_csv2_ip((X),(Y),991)
+#define get_csv2_ipv6_pos991(X,Y) get_csv2_ipv6((X),(Y),991)
+#define get_csv2_string_pos991(X,Y) get_csv2_string((X),(Y),991)
+#define get_csv2_v_str_pos991(X,Y) get_csv2_string((X),(Y),991)
+#define get_csv2_bool_pos991(X,Y) get_csv2_bool((X),(Y),991)
+#define get_csv2_int_pos991(X,Y) get_csv2_int((X),(Y),991)
+#define get_csv2_llong_pos991(X,Y) get_csv2_llong((X),(Y),991)
+#define get_csv2_float_pos991(X,Y) get_csv2_float((X),(Y),991)
+#define get_csv2_uint_pos992(X,Y) get_csv2_uint((X),(Y),992)
+#define get_csv2_ullong_pos992(X,Y) get_csv2_ullong((X),(Y),992)
+#define get_csv2_ip_pos992(X,Y) get_csv2_ip((X),(Y),992)
+#define get_csv2_ipv6_pos992(X,Y) get_csv2_ipv6((X),(Y),992)
+#define get_csv2_string_pos992(X,Y) get_csv2_string((X),(Y),992)
+#define get_csv2_v_str_pos992(X,Y) get_csv2_string((X),(Y),992)
+#define get_csv2_bool_pos992(X,Y) get_csv2_bool((X),(Y),992)
+#define get_csv2_int_pos992(X,Y) get_csv2_int((X),(Y),992)
+#define get_csv2_llong_pos992(X,Y) get_csv2_llong((X),(Y),992)
+#define get_csv2_float_pos992(X,Y) get_csv2_float((X),(Y),992)
+#define get_csv2_uint_pos993(X,Y) get_csv2_uint((X),(Y),993)
+#define get_csv2_ullong_pos993(X,Y) get_csv2_ullong((X),(Y),993)
+#define get_csv2_ip_pos993(X,Y) get_csv2_ip((X),(Y),993)
+#define get_csv2_ipv6_pos993(X,Y) get_csv2_ipv6((X),(Y),993)
+#define get_csv2_string_pos993(X,Y) get_csv2_string((X),(Y),993)
+#define get_csv2_v_str_pos993(X,Y) get_csv2_string((X),(Y),993)
+#define get_csv2_bool_pos993(X,Y) get_csv2_bool((X),(Y),993)
+#define get_csv2_int_pos993(X,Y) get_csv2_int((X),(Y),993)
+#define get_csv2_llong_pos993(X,Y) get_csv2_llong((X),(Y),993)
+#define get_csv2_float_pos993(X,Y) get_csv2_float((X),(Y),993)
+#define get_csv2_uint_pos994(X,Y) get_csv2_uint((X),(Y),994)
+#define get_csv2_ullong_pos994(X,Y) get_csv2_ullong((X),(Y),994)
+#define get_csv2_ip_pos994(X,Y) get_csv2_ip((X),(Y),994)
+#define get_csv2_ipv6_pos994(X,Y) get_csv2_ipv6((X),(Y),994)
+#define get_csv2_string_pos994(X,Y) get_csv2_string((X),(Y),994)
+#define get_csv2_v_str_pos994(X,Y) get_csv2_string((X),(Y),994)
+#define get_csv2_bool_pos994(X,Y) get_csv2_bool((X),(Y),994)
+#define get_csv2_int_pos994(X,Y) get_csv2_int((X),(Y),994)
+#define get_csv2_llong_pos994(X,Y) get_csv2_llong((X),(Y),994)
+#define get_csv2_float_pos994(X,Y) get_csv2_float((X),(Y),994)
+#define get_csv2_uint_pos995(X,Y) get_csv2_uint((X),(Y),995)
+#define get_csv2_ullong_pos995(X,Y) get_csv2_ullong((X),(Y),995)
+#define get_csv2_ip_pos995(X,Y) get_csv2_ip((X),(Y),995)
+#define get_csv2_ipv6_pos995(X,Y) get_csv2_ipv6((X),(Y),995)
+#define get_csv2_string_pos995(X,Y) get_csv2_string((X),(Y),995)
+#define get_csv2_v_str_pos995(X,Y) get_csv2_string((X),(Y),995)
+#define get_csv2_bool_pos995(X,Y) get_csv2_bool((X),(Y),995)
+#define get_csv2_int_pos995(X,Y) get_csv2_int((X),(Y),995)
+#define get_csv2_llong_pos995(X,Y) get_csv2_llong((X),(Y),995)
+#define get_csv2_float_pos995(X,Y) get_csv2_float((X),(Y),995)
+#define get_csv2_uint_pos996(X,Y) get_csv2_uint((X),(Y),996)
+#define get_csv2_ullong_pos996(X,Y) get_csv2_ullong((X),(Y),996)
+#define get_csv2_ip_pos996(X,Y) get_csv2_ip((X),(Y),996)
+#define get_csv2_ipv6_pos996(X,Y) get_csv2_ipv6((X),(Y),996)
+#define get_csv2_string_pos996(X,Y) get_csv2_string((X),(Y),996)
+#define get_csv2_v_str_pos996(X,Y) get_csv2_string((X),(Y),996)
+#define get_csv2_bool_pos996(X,Y) get_csv2_bool((X),(Y),996)
+#define get_csv2_int_pos996(X,Y) get_csv2_int((X),(Y),996)
+#define get_csv2_llong_pos996(X,Y) get_csv2_llong((X),(Y),996)
+#define get_csv2_float_pos996(X,Y) get_csv2_float((X),(Y),996)
+#define get_csv2_uint_pos997(X,Y) get_csv2_uint((X),(Y),997)
+#define get_csv2_ullong_pos997(X,Y) get_csv2_ullong((X),(Y),997)
+#define get_csv2_ip_pos997(X,Y) get_csv2_ip((X),(Y),997)
+#define get_csv2_ipv6_pos997(X,Y) get_csv2_ipv6((X),(Y),997)
+#define get_csv2_string_pos997(X,Y) get_csv2_string((X),(Y),997)
+#define get_csv2_v_str_pos997(X,Y) get_csv2_string((X),(Y),997)
+#define get_csv2_bool_pos997(X,Y) get_csv2_bool((X),(Y),997)
+#define get_csv2_int_pos997(X,Y) get_csv2_int((X),(Y),997)
+#define get_csv2_llong_pos997(X,Y) get_csv2_llong((X),(Y),997)
+#define get_csv2_float_pos997(X,Y) get_csv2_float((X),(Y),997)
+#define get_csv2_uint_pos998(X,Y) get_csv2_uint((X),(Y),998)
+#define get_csv2_ullong_pos998(X,Y) get_csv2_ullong((X),(Y),998)
+#define get_csv2_ip_pos998(X,Y) get_csv2_ip((X),(Y),998)
+#define get_csv2_ipv6_pos998(X,Y) get_csv2_ipv6((X),(Y),998)
+#define get_csv2_string_pos998(X,Y) get_csv2_string((X),(Y),998)
+#define get_csv2_v_str_pos998(X,Y) get_csv2_string((X),(Y),998)
+#define get_csv2_bool_pos998(X,Y) get_csv2_bool((X),(Y),998)
+#define get_csv2_int_pos998(X,Y) get_csv2_int((X),(Y),998)
+#define get_csv2_llong_pos998(X,Y) get_csv2_llong((X),(Y),998)
+#define get_csv2_float_pos998(X,Y) get_csv2_float((X),(Y),998)
+#define get_csv2_uint_pos999(X,Y) get_csv2_uint((X),(Y),999)
+#define get_csv2_ullong_pos999(X,Y) get_csv2_ullong((X),(Y),999)
+#define get_csv2_ip_pos999(X,Y) get_csv2_ip((X),(Y),999)
+#define get_csv2_ipv6_pos999(X,Y) get_csv2_ipv6((X),(Y),999)
+#define get_csv2_string_pos999(X,Y) get_csv2_string((X),(Y),999)
+#define get_csv2_v_str_pos999(X,Y) get_csv2_string((X),(Y),999)
+#define get_csv2_bool_pos999(X,Y) get_csv2_bool((X),(Y),999)
+#define get_csv2_int_pos999(X,Y) get_csv2_int((X),(Y),999)
+#define get_csv2_llong_pos999(X,Y) get_csv2_llong((X),(Y),999)
+#define get_csv2_float_pos999(X,Y) get_csv2_float((X),(Y),999)
+#define get_csv2_uint_pos1000(X,Y) get_csv2_uint((X),(Y),1000)
+#define get_csv2_ullong_pos1000(X,Y) get_csv2_ullong((X),(Y),1000)
+#define get_csv2_ip_pos1000(X,Y) get_csv2_ip((X),(Y),1000)
+#define get_csv2_ipv6_pos1000(X,Y) get_csv2_ipv6((X),(Y),1000)
+#define get_csv2_string_pos1000(X,Y) get_csv2_string((X),(Y),1000)
+#define get_csv2_v_str_pos1000(X,Y) get_csv2_string((X),(Y),1000)
+#define get_csv2_bool_pos1000(X,Y) get_csv2_bool((X),(Y),1000)
+#define get_csv2_int_pos1000(X,Y) get_csv2_int((X),(Y),1000)
+#define get_csv2_llong_pos1000(X,Y) get_csv2_llong((X),(Y),1000)
+#define get_csv2_float_pos1000(X,Y) get_csv2_float((X),(Y),1000)
+#endif
diff --git a/include/lfta/csv_macro.h b/include/lfta/csv_macro.h
new file mode 100644 (file)
index 0000000..f2b9f84
--- /dev/null
@@ -0,0 +1,10017 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef CSV_MACRO_H
+#define CSV_MACRO_H
+#define get_csv_uint_pos1(X,Y) get_csv_uint((X),(Y),1)
+#define get_csv_ullong_pos1(X,Y) get_csv_ullong((X),(Y),1)
+#define get_csv_ip_pos1(X,Y) get_csv_ip((X),(Y),1)
+#define get_csv_ipv6_pos1(X,Y) get_csv_ipv6((X),(Y),1)
+#define get_csv_string_pos1(X,Y) get_csv_string((X),(Y),1)
+#define get_csv_v_str_pos1(X,Y) get_csv_string((X),(Y),1)
+#define get_csv_bool_pos1(X,Y) get_csv_bool((X),(Y),1)
+#define get_csv_int_pos1(X,Y) get_csv_int((X),(Y),1)
+#define get_csv_llong_pos1(X,Y) get_csv_llong((X),(Y),1)
+#define get_csv_float_pos1(X,Y) get_csv_float((X),(Y),1)
+#define get_csv_uint_pos2(X,Y) get_csv_uint((X),(Y),2)
+#define get_csv_ullong_pos2(X,Y) get_csv_ullong((X),(Y),2)
+#define get_csv_ip_pos2(X,Y) get_csv_ip((X),(Y),2)
+#define get_csv_ipv6_pos2(X,Y) get_csv_ipv6((X),(Y),2)
+#define get_csv_string_pos2(X,Y) get_csv_string((X),(Y),2)
+#define get_csv_v_str_pos2(X,Y) get_csv_string((X),(Y),2)
+#define get_csv_bool_pos2(X,Y) get_csv_bool((X),(Y),2)
+#define get_csv_int_pos2(X,Y) get_csv_int((X),(Y),2)
+#define get_csv_llong_pos2(X,Y) get_csv_llong((X),(Y),2)
+#define get_csv_float_pos2(X,Y) get_csv_float((X),(Y),2)
+#define get_csv_uint_pos3(X,Y) get_csv_uint((X),(Y),3)
+#define get_csv_ullong_pos3(X,Y) get_csv_ullong((X),(Y),3)
+#define get_csv_ip_pos3(X,Y) get_csv_ip((X),(Y),3)
+#define get_csv_ipv6_pos3(X,Y) get_csv_ipv6((X),(Y),3)
+#define get_csv_string_pos3(X,Y) get_csv_string((X),(Y),3)
+#define get_csv_v_str_pos3(X,Y) get_csv_string((X),(Y),3)
+#define get_csv_bool_pos3(X,Y) get_csv_bool((X),(Y),3)
+#define get_csv_int_pos3(X,Y) get_csv_int((X),(Y),3)
+#define get_csv_llong_pos3(X,Y) get_csv_llong((X),(Y),3)
+#define get_csv_float_pos3(X,Y) get_csv_float((X),(Y),3)
+#define get_csv_uint_pos4(X,Y) get_csv_uint((X),(Y),4)
+#define get_csv_ullong_pos4(X,Y) get_csv_ullong((X),(Y),4)
+#define get_csv_ip_pos4(X,Y) get_csv_ip((X),(Y),4)
+#define get_csv_ipv6_pos4(X,Y) get_csv_ipv6((X),(Y),4)
+#define get_csv_string_pos4(X,Y) get_csv_string((X),(Y),4)
+#define get_csv_v_str_pos4(X,Y) get_csv_string((X),(Y),4)
+#define get_csv_bool_pos4(X,Y) get_csv_bool((X),(Y),4)
+#define get_csv_int_pos4(X,Y) get_csv_int((X),(Y),4)
+#define get_csv_llong_pos4(X,Y) get_csv_llong((X),(Y),4)
+#define get_csv_float_pos4(X,Y) get_csv_float((X),(Y),4)
+#define get_csv_uint_pos5(X,Y) get_csv_uint((X),(Y),5)
+#define get_csv_ullong_pos5(X,Y) get_csv_ullong((X),(Y),5)
+#define get_csv_ip_pos5(X,Y) get_csv_ip((X),(Y),5)
+#define get_csv_ipv6_pos5(X,Y) get_csv_ipv6((X),(Y),5)
+#define get_csv_string_pos5(X,Y) get_csv_string((X),(Y),5)
+#define get_csv_v_str_pos5(X,Y) get_csv_string((X),(Y),5)
+#define get_csv_bool_pos5(X,Y) get_csv_bool((X),(Y),5)
+#define get_csv_int_pos5(X,Y) get_csv_int((X),(Y),5)
+#define get_csv_llong_pos5(X,Y) get_csv_llong((X),(Y),5)
+#define get_csv_float_pos5(X,Y) get_csv_float((X),(Y),5)
+#define get_csv_uint_pos6(X,Y) get_csv_uint((X),(Y),6)
+#define get_csv_ullong_pos6(X,Y) get_csv_ullong((X),(Y),6)
+#define get_csv_ip_pos6(X,Y) get_csv_ip((X),(Y),6)
+#define get_csv_ipv6_pos6(X,Y) get_csv_ipv6((X),(Y),6)
+#define get_csv_string_pos6(X,Y) get_csv_string((X),(Y),6)
+#define get_csv_v_str_pos6(X,Y) get_csv_string((X),(Y),6)
+#define get_csv_bool_pos6(X,Y) get_csv_bool((X),(Y),6)
+#define get_csv_int_pos6(X,Y) get_csv_int((X),(Y),6)
+#define get_csv_llong_pos6(X,Y) get_csv_llong((X),(Y),6)
+#define get_csv_float_pos6(X,Y) get_csv_float((X),(Y),6)
+#define get_csv_uint_pos7(X,Y) get_csv_uint((X),(Y),7)
+#define get_csv_ullong_pos7(X,Y) get_csv_ullong((X),(Y),7)
+#define get_csv_ip_pos7(X,Y) get_csv_ip((X),(Y),7)
+#define get_csv_ipv6_pos7(X,Y) get_csv_ipv6((X),(Y),7)
+#define get_csv_string_pos7(X,Y) get_csv_string((X),(Y),7)
+#define get_csv_v_str_pos7(X,Y) get_csv_string((X),(Y),7)
+#define get_csv_bool_pos7(X,Y) get_csv_bool((X),(Y),7)
+#define get_csv_int_pos7(X,Y) get_csv_int((X),(Y),7)
+#define get_csv_llong_pos7(X,Y) get_csv_llong((X),(Y),7)
+#define get_csv_float_pos7(X,Y) get_csv_float((X),(Y),7)
+#define get_csv_uint_pos8(X,Y) get_csv_uint((X),(Y),8)
+#define get_csv_ullong_pos8(X,Y) get_csv_ullong((X),(Y),8)
+#define get_csv_ip_pos8(X,Y) get_csv_ip((X),(Y),8)
+#define get_csv_ipv6_pos8(X,Y) get_csv_ipv6((X),(Y),8)
+#define get_csv_string_pos8(X,Y) get_csv_string((X),(Y),8)
+#define get_csv_v_str_pos8(X,Y) get_csv_string((X),(Y),8)
+#define get_csv_bool_pos8(X,Y) get_csv_bool((X),(Y),8)
+#define get_csv_int_pos8(X,Y) get_csv_int((X),(Y),8)
+#define get_csv_llong_pos8(X,Y) get_csv_llong((X),(Y),8)
+#define get_csv_float_pos8(X,Y) get_csv_float((X),(Y),8)
+#define get_csv_uint_pos9(X,Y) get_csv_uint((X),(Y),9)
+#define get_csv_ullong_pos9(X,Y) get_csv_ullong((X),(Y),9)
+#define get_csv_ip_pos9(X,Y) get_csv_ip((X),(Y),9)
+#define get_csv_ipv6_pos9(X,Y) get_csv_ipv6((X),(Y),9)
+#define get_csv_string_pos9(X,Y) get_csv_string((X),(Y),9)
+#define get_csv_v_str_pos9(X,Y) get_csv_string((X),(Y),9)
+#define get_csv_bool_pos9(X,Y) get_csv_bool((X),(Y),9)
+#define get_csv_int_pos9(X,Y) get_csv_int((X),(Y),9)
+#define get_csv_llong_pos9(X,Y) get_csv_llong((X),(Y),9)
+#define get_csv_float_pos9(X,Y) get_csv_float((X),(Y),9)
+#define get_csv_uint_pos10(X,Y) get_csv_uint((X),(Y),10)
+#define get_csv_ullong_pos10(X,Y) get_csv_ullong((X),(Y),10)
+#define get_csv_ip_pos10(X,Y) get_csv_ip((X),(Y),10)
+#define get_csv_ipv6_pos10(X,Y) get_csv_ipv6((X),(Y),10)
+#define get_csv_string_pos10(X,Y) get_csv_string((X),(Y),10)
+#define get_csv_v_str_pos10(X,Y) get_csv_string((X),(Y),10)
+#define get_csv_bool_pos10(X,Y) get_csv_bool((X),(Y),10)
+#define get_csv_int_pos10(X,Y) get_csv_int((X),(Y),10)
+#define get_csv_llong_pos10(X,Y) get_csv_llong((X),(Y),10)
+#define get_csv_float_pos10(X,Y) get_csv_float((X),(Y),10)
+#define get_csv_uint_pos11(X,Y) get_csv_uint((X),(Y),11)
+#define get_csv_ullong_pos11(X,Y) get_csv_ullong((X),(Y),11)
+#define get_csv_ip_pos11(X,Y) get_csv_ip((X),(Y),11)
+#define get_csv_ipv6_pos11(X,Y) get_csv_ipv6((X),(Y),11)
+#define get_csv_string_pos11(X,Y) get_csv_string((X),(Y),11)
+#define get_csv_v_str_pos11(X,Y) get_csv_string((X),(Y),11)
+#define get_csv_bool_pos11(X,Y) get_csv_bool((X),(Y),11)
+#define get_csv_int_pos11(X,Y) get_csv_int((X),(Y),11)
+#define get_csv_llong_pos11(X,Y) get_csv_llong((X),(Y),11)
+#define get_csv_float_pos11(X,Y) get_csv_float((X),(Y),11)
+#define get_csv_uint_pos12(X,Y) get_csv_uint((X),(Y),12)
+#define get_csv_ullong_pos12(X,Y) get_csv_ullong((X),(Y),12)
+#define get_csv_ip_pos12(X,Y) get_csv_ip((X),(Y),12)
+#define get_csv_ipv6_pos12(X,Y) get_csv_ipv6((X),(Y),12)
+#define get_csv_string_pos12(X,Y) get_csv_string((X),(Y),12)
+#define get_csv_v_str_pos12(X,Y) get_csv_string((X),(Y),12)
+#define get_csv_bool_pos12(X,Y) get_csv_bool((X),(Y),12)
+#define get_csv_int_pos12(X,Y) get_csv_int((X),(Y),12)
+#define get_csv_llong_pos12(X,Y) get_csv_llong((X),(Y),12)
+#define get_csv_float_pos12(X,Y) get_csv_float((X),(Y),12)
+#define get_csv_uint_pos13(X,Y) get_csv_uint((X),(Y),13)
+#define get_csv_ullong_pos13(X,Y) get_csv_ullong((X),(Y),13)
+#define get_csv_ip_pos13(X,Y) get_csv_ip((X),(Y),13)
+#define get_csv_ipv6_pos13(X,Y) get_csv_ipv6((X),(Y),13)
+#define get_csv_string_pos13(X,Y) get_csv_string((X),(Y),13)
+#define get_csv_v_str_pos13(X,Y) get_csv_string((X),(Y),13)
+#define get_csv_bool_pos13(X,Y) get_csv_bool((X),(Y),13)
+#define get_csv_int_pos13(X,Y) get_csv_int((X),(Y),13)
+#define get_csv_llong_pos13(X,Y) get_csv_llong((X),(Y),13)
+#define get_csv_float_pos13(X,Y) get_csv_float((X),(Y),13)
+#define get_csv_uint_pos14(X,Y) get_csv_uint((X),(Y),14)
+#define get_csv_ullong_pos14(X,Y) get_csv_ullong((X),(Y),14)
+#define get_csv_ip_pos14(X,Y) get_csv_ip((X),(Y),14)
+#define get_csv_ipv6_pos14(X,Y) get_csv_ipv6((X),(Y),14)
+#define get_csv_string_pos14(X,Y) get_csv_string((X),(Y),14)
+#define get_csv_v_str_pos14(X,Y) get_csv_string((X),(Y),14)
+#define get_csv_bool_pos14(X,Y) get_csv_bool((X),(Y),14)
+#define get_csv_int_pos14(X,Y) get_csv_int((X),(Y),14)
+#define get_csv_llong_pos14(X,Y) get_csv_llong((X),(Y),14)
+#define get_csv_float_pos14(X,Y) get_csv_float((X),(Y),14)
+#define get_csv_uint_pos15(X,Y) get_csv_uint((X),(Y),15)
+#define get_csv_ullong_pos15(X,Y) get_csv_ullong((X),(Y),15)
+#define get_csv_ip_pos15(X,Y) get_csv_ip((X),(Y),15)
+#define get_csv_ipv6_pos15(X,Y) get_csv_ipv6((X),(Y),15)
+#define get_csv_string_pos15(X,Y) get_csv_string((X),(Y),15)
+#define get_csv_v_str_pos15(X,Y) get_csv_string((X),(Y),15)
+#define get_csv_bool_pos15(X,Y) get_csv_bool((X),(Y),15)
+#define get_csv_int_pos15(X,Y) get_csv_int((X),(Y),15)
+#define get_csv_llong_pos15(X,Y) get_csv_llong((X),(Y),15)
+#define get_csv_float_pos15(X,Y) get_csv_float((X),(Y),15)
+#define get_csv_uint_pos16(X,Y) get_csv_uint((X),(Y),16)
+#define get_csv_ullong_pos16(X,Y) get_csv_ullong((X),(Y),16)
+#define get_csv_ip_pos16(X,Y) get_csv_ip((X),(Y),16)
+#define get_csv_ipv6_pos16(X,Y) get_csv_ipv6((X),(Y),16)
+#define get_csv_string_pos16(X,Y) get_csv_string((X),(Y),16)
+#define get_csv_v_str_pos16(X,Y) get_csv_string((X),(Y),16)
+#define get_csv_bool_pos16(X,Y) get_csv_bool((X),(Y),16)
+#define get_csv_int_pos16(X,Y) get_csv_int((X),(Y),16)
+#define get_csv_llong_pos16(X,Y) get_csv_llong((X),(Y),16)
+#define get_csv_float_pos16(X,Y) get_csv_float((X),(Y),16)
+#define get_csv_uint_pos17(X,Y) get_csv_uint((X),(Y),17)
+#define get_csv_ullong_pos17(X,Y) get_csv_ullong((X),(Y),17)
+#define get_csv_ip_pos17(X,Y) get_csv_ip((X),(Y),17)
+#define get_csv_ipv6_pos17(X,Y) get_csv_ipv6((X),(Y),17)
+#define get_csv_string_pos17(X,Y) get_csv_string((X),(Y),17)
+#define get_csv_v_str_pos17(X,Y) get_csv_string((X),(Y),17)
+#define get_csv_bool_pos17(X,Y) get_csv_bool((X),(Y),17)
+#define get_csv_int_pos17(X,Y) get_csv_int((X),(Y),17)
+#define get_csv_llong_pos17(X,Y) get_csv_llong((X),(Y),17)
+#define get_csv_float_pos17(X,Y) get_csv_float((X),(Y),17)
+#define get_csv_uint_pos18(X,Y) get_csv_uint((X),(Y),18)
+#define get_csv_ullong_pos18(X,Y) get_csv_ullong((X),(Y),18)
+#define get_csv_ip_pos18(X,Y) get_csv_ip((X),(Y),18)
+#define get_csv_ipv6_pos18(X,Y) get_csv_ipv6((X),(Y),18)
+#define get_csv_string_pos18(X,Y) get_csv_string((X),(Y),18)
+#define get_csv_v_str_pos18(X,Y) get_csv_string((X),(Y),18)
+#define get_csv_bool_pos18(X,Y) get_csv_bool((X),(Y),18)
+#define get_csv_int_pos18(X,Y) get_csv_int((X),(Y),18)
+#define get_csv_llong_pos18(X,Y) get_csv_llong((X),(Y),18)
+#define get_csv_float_pos18(X,Y) get_csv_float((X),(Y),18)
+#define get_csv_uint_pos19(X,Y) get_csv_uint((X),(Y),19)
+#define get_csv_ullong_pos19(X,Y) get_csv_ullong((X),(Y),19)
+#define get_csv_ip_pos19(X,Y) get_csv_ip((X),(Y),19)
+#define get_csv_ipv6_pos19(X,Y) get_csv_ipv6((X),(Y),19)
+#define get_csv_string_pos19(X,Y) get_csv_string((X),(Y),19)
+#define get_csv_v_str_pos19(X,Y) get_csv_string((X),(Y),19)
+#define get_csv_bool_pos19(X,Y) get_csv_bool((X),(Y),19)
+#define get_csv_int_pos19(X,Y) get_csv_int((X),(Y),19)
+#define get_csv_llong_pos19(X,Y) get_csv_llong((X),(Y),19)
+#define get_csv_float_pos19(X,Y) get_csv_float((X),(Y),19)
+#define get_csv_uint_pos20(X,Y) get_csv_uint((X),(Y),20)
+#define get_csv_ullong_pos20(X,Y) get_csv_ullong((X),(Y),20)
+#define get_csv_ip_pos20(X,Y) get_csv_ip((X),(Y),20)
+#define get_csv_ipv6_pos20(X,Y) get_csv_ipv6((X),(Y),20)
+#define get_csv_string_pos20(X,Y) get_csv_string((X),(Y),20)
+#define get_csv_v_str_pos20(X,Y) get_csv_string((X),(Y),20)
+#define get_csv_bool_pos20(X,Y) get_csv_bool((X),(Y),20)
+#define get_csv_int_pos20(X,Y) get_csv_int((X),(Y),20)
+#define get_csv_llong_pos20(X,Y) get_csv_llong((X),(Y),20)
+#define get_csv_float_pos20(X,Y) get_csv_float((X),(Y),20)
+#define get_csv_uint_pos21(X,Y) get_csv_uint((X),(Y),21)
+#define get_csv_ullong_pos21(X,Y) get_csv_ullong((X),(Y),21)
+#define get_csv_ip_pos21(X,Y) get_csv_ip((X),(Y),21)
+#define get_csv_ipv6_pos21(X,Y) get_csv_ipv6((X),(Y),21)
+#define get_csv_string_pos21(X,Y) get_csv_string((X),(Y),21)
+#define get_csv_v_str_pos21(X,Y) get_csv_string((X),(Y),21)
+#define get_csv_bool_pos21(X,Y) get_csv_bool((X),(Y),21)
+#define get_csv_int_pos21(X,Y) get_csv_int((X),(Y),21)
+#define get_csv_llong_pos21(X,Y) get_csv_llong((X),(Y),21)
+#define get_csv_float_pos21(X,Y) get_csv_float((X),(Y),21)
+#define get_csv_uint_pos22(X,Y) get_csv_uint((X),(Y),22)
+#define get_csv_ullong_pos22(X,Y) get_csv_ullong((X),(Y),22)
+#define get_csv_ip_pos22(X,Y) get_csv_ip((X),(Y),22)
+#define get_csv_ipv6_pos22(X,Y) get_csv_ipv6((X),(Y),22)
+#define get_csv_string_pos22(X,Y) get_csv_string((X),(Y),22)
+#define get_csv_v_str_pos22(X,Y) get_csv_string((X),(Y),22)
+#define get_csv_bool_pos22(X,Y) get_csv_bool((X),(Y),22)
+#define get_csv_int_pos22(X,Y) get_csv_int((X),(Y),22)
+#define get_csv_llong_pos22(X,Y) get_csv_llong((X),(Y),22)
+#define get_csv_float_pos22(X,Y) get_csv_float((X),(Y),22)
+#define get_csv_uint_pos23(X,Y) get_csv_uint((X),(Y),23)
+#define get_csv_ullong_pos23(X,Y) get_csv_ullong((X),(Y),23)
+#define get_csv_ip_pos23(X,Y) get_csv_ip((X),(Y),23)
+#define get_csv_ipv6_pos23(X,Y) get_csv_ipv6((X),(Y),23)
+#define get_csv_string_pos23(X,Y) get_csv_string((X),(Y),23)
+#define get_csv_v_str_pos23(X,Y) get_csv_string((X),(Y),23)
+#define get_csv_bool_pos23(X,Y) get_csv_bool((X),(Y),23)
+#define get_csv_int_pos23(X,Y) get_csv_int((X),(Y),23)
+#define get_csv_llong_pos23(X,Y) get_csv_llong((X),(Y),23)
+#define get_csv_float_pos23(X,Y) get_csv_float((X),(Y),23)
+#define get_csv_uint_pos24(X,Y) get_csv_uint((X),(Y),24)
+#define get_csv_ullong_pos24(X,Y) get_csv_ullong((X),(Y),24)
+#define get_csv_ip_pos24(X,Y) get_csv_ip((X),(Y),24)
+#define get_csv_ipv6_pos24(X,Y) get_csv_ipv6((X),(Y),24)
+#define get_csv_string_pos24(X,Y) get_csv_string((X),(Y),24)
+#define get_csv_v_str_pos24(X,Y) get_csv_string((X),(Y),24)
+#define get_csv_bool_pos24(X,Y) get_csv_bool((X),(Y),24)
+#define get_csv_int_pos24(X,Y) get_csv_int((X),(Y),24)
+#define get_csv_llong_pos24(X,Y) get_csv_llong((X),(Y),24)
+#define get_csv_float_pos24(X,Y) get_csv_float((X),(Y),24)
+#define get_csv_uint_pos25(X,Y) get_csv_uint((X),(Y),25)
+#define get_csv_ullong_pos25(X,Y) get_csv_ullong((X),(Y),25)
+#define get_csv_ip_pos25(X,Y) get_csv_ip((X),(Y),25)
+#define get_csv_ipv6_pos25(X,Y) get_csv_ipv6((X),(Y),25)
+#define get_csv_string_pos25(X,Y) get_csv_string((X),(Y),25)
+#define get_csv_v_str_pos25(X,Y) get_csv_string((X),(Y),25)
+#define get_csv_bool_pos25(X,Y) get_csv_bool((X),(Y),25)
+#define get_csv_int_pos25(X,Y) get_csv_int((X),(Y),25)
+#define get_csv_llong_pos25(X,Y) get_csv_llong((X),(Y),25)
+#define get_csv_float_pos25(X,Y) get_csv_float((X),(Y),25)
+#define get_csv_uint_pos26(X,Y) get_csv_uint((X),(Y),26)
+#define get_csv_ullong_pos26(X,Y) get_csv_ullong((X),(Y),26)
+#define get_csv_ip_pos26(X,Y) get_csv_ip((X),(Y),26)
+#define get_csv_ipv6_pos26(X,Y) get_csv_ipv6((X),(Y),26)
+#define get_csv_string_pos26(X,Y) get_csv_string((X),(Y),26)
+#define get_csv_v_str_pos26(X,Y) get_csv_string((X),(Y),26)
+#define get_csv_bool_pos26(X,Y) get_csv_bool((X),(Y),26)
+#define get_csv_int_pos26(X,Y) get_csv_int((X),(Y),26)
+#define get_csv_llong_pos26(X,Y) get_csv_llong((X),(Y),26)
+#define get_csv_float_pos26(X,Y) get_csv_float((X),(Y),26)
+#define get_csv_uint_pos27(X,Y) get_csv_uint((X),(Y),27)
+#define get_csv_ullong_pos27(X,Y) get_csv_ullong((X),(Y),27)
+#define get_csv_ip_pos27(X,Y) get_csv_ip((X),(Y),27)
+#define get_csv_ipv6_pos27(X,Y) get_csv_ipv6((X),(Y),27)
+#define get_csv_string_pos27(X,Y) get_csv_string((X),(Y),27)
+#define get_csv_v_str_pos27(X,Y) get_csv_string((X),(Y),27)
+#define get_csv_bool_pos27(X,Y) get_csv_bool((X),(Y),27)
+#define get_csv_int_pos27(X,Y) get_csv_int((X),(Y),27)
+#define get_csv_llong_pos27(X,Y) get_csv_llong((X),(Y),27)
+#define get_csv_float_pos27(X,Y) get_csv_float((X),(Y),27)
+#define get_csv_uint_pos28(X,Y) get_csv_uint((X),(Y),28)
+#define get_csv_ullong_pos28(X,Y) get_csv_ullong((X),(Y),28)
+#define get_csv_ip_pos28(X,Y) get_csv_ip((X),(Y),28)
+#define get_csv_ipv6_pos28(X,Y) get_csv_ipv6((X),(Y),28)
+#define get_csv_string_pos28(X,Y) get_csv_string((X),(Y),28)
+#define get_csv_v_str_pos28(X,Y) get_csv_string((X),(Y),28)
+#define get_csv_bool_pos28(X,Y) get_csv_bool((X),(Y),28)
+#define get_csv_int_pos28(X,Y) get_csv_int((X),(Y),28)
+#define get_csv_llong_pos28(X,Y) get_csv_llong((X),(Y),28)
+#define get_csv_float_pos28(X,Y) get_csv_float((X),(Y),28)
+#define get_csv_uint_pos29(X,Y) get_csv_uint((X),(Y),29)
+#define get_csv_ullong_pos29(X,Y) get_csv_ullong((X),(Y),29)
+#define get_csv_ip_pos29(X,Y) get_csv_ip((X),(Y),29)
+#define get_csv_ipv6_pos29(X,Y) get_csv_ipv6((X),(Y),29)
+#define get_csv_string_pos29(X,Y) get_csv_string((X),(Y),29)
+#define get_csv_v_str_pos29(X,Y) get_csv_string((X),(Y),29)
+#define get_csv_bool_pos29(X,Y) get_csv_bool((X),(Y),29)
+#define get_csv_int_pos29(X,Y) get_csv_int((X),(Y),29)
+#define get_csv_llong_pos29(X,Y) get_csv_llong((X),(Y),29)
+#define get_csv_float_pos29(X,Y) get_csv_float((X),(Y),29)
+#define get_csv_uint_pos30(X,Y) get_csv_uint((X),(Y),30)
+#define get_csv_ullong_pos30(X,Y) get_csv_ullong((X),(Y),30)
+#define get_csv_ip_pos30(X,Y) get_csv_ip((X),(Y),30)
+#define get_csv_ipv6_pos30(X,Y) get_csv_ipv6((X),(Y),30)
+#define get_csv_string_pos30(X,Y) get_csv_string((X),(Y),30)
+#define get_csv_v_str_pos30(X,Y) get_csv_string((X),(Y),30)
+#define get_csv_bool_pos30(X,Y) get_csv_bool((X),(Y),30)
+#define get_csv_int_pos30(X,Y) get_csv_int((X),(Y),30)
+#define get_csv_llong_pos30(X,Y) get_csv_llong((X),(Y),30)
+#define get_csv_float_pos30(X,Y) get_csv_float((X),(Y),30)
+#define get_csv_uint_pos31(X,Y) get_csv_uint((X),(Y),31)
+#define get_csv_ullong_pos31(X,Y) get_csv_ullong((X),(Y),31)
+#define get_csv_ip_pos31(X,Y) get_csv_ip((X),(Y),31)
+#define get_csv_ipv6_pos31(X,Y) get_csv_ipv6((X),(Y),31)
+#define get_csv_string_pos31(X,Y) get_csv_string((X),(Y),31)
+#define get_csv_v_str_pos31(X,Y) get_csv_string((X),(Y),31)
+#define get_csv_bool_pos31(X,Y) get_csv_bool((X),(Y),31)
+#define get_csv_int_pos31(X,Y) get_csv_int((X),(Y),31)
+#define get_csv_llong_pos31(X,Y) get_csv_llong((X),(Y),31)
+#define get_csv_float_pos31(X,Y) get_csv_float((X),(Y),31)
+#define get_csv_uint_pos32(X,Y) get_csv_uint((X),(Y),32)
+#define get_csv_ullong_pos32(X,Y) get_csv_ullong((X),(Y),32)
+#define get_csv_ip_pos32(X,Y) get_csv_ip((X),(Y),32)
+#define get_csv_ipv6_pos32(X,Y) get_csv_ipv6((X),(Y),32)
+#define get_csv_string_pos32(X,Y) get_csv_string((X),(Y),32)
+#define get_csv_v_str_pos32(X,Y) get_csv_string((X),(Y),32)
+#define get_csv_bool_pos32(X,Y) get_csv_bool((X),(Y),32)
+#define get_csv_int_pos32(X,Y) get_csv_int((X),(Y),32)
+#define get_csv_llong_pos32(X,Y) get_csv_llong((X),(Y),32)
+#define get_csv_float_pos32(X,Y) get_csv_float((X),(Y),32)
+#define get_csv_uint_pos33(X,Y) get_csv_uint((X),(Y),33)
+#define get_csv_ullong_pos33(X,Y) get_csv_ullong((X),(Y),33)
+#define get_csv_ip_pos33(X,Y) get_csv_ip((X),(Y),33)
+#define get_csv_ipv6_pos33(X,Y) get_csv_ipv6((X),(Y),33)
+#define get_csv_string_pos33(X,Y) get_csv_string((X),(Y),33)
+#define get_csv_v_str_pos33(X,Y) get_csv_string((X),(Y),33)
+#define get_csv_bool_pos33(X,Y) get_csv_bool((X),(Y),33)
+#define get_csv_int_pos33(X,Y) get_csv_int((X),(Y),33)
+#define get_csv_llong_pos33(X,Y) get_csv_llong((X),(Y),33)
+#define get_csv_float_pos33(X,Y) get_csv_float((X),(Y),33)
+#define get_csv_uint_pos34(X,Y) get_csv_uint((X),(Y),34)
+#define get_csv_ullong_pos34(X,Y) get_csv_ullong((X),(Y),34)
+#define get_csv_ip_pos34(X,Y) get_csv_ip((X),(Y),34)
+#define get_csv_ipv6_pos34(X,Y) get_csv_ipv6((X),(Y),34)
+#define get_csv_string_pos34(X,Y) get_csv_string((X),(Y),34)
+#define get_csv_v_str_pos34(X,Y) get_csv_string((X),(Y),34)
+#define get_csv_bool_pos34(X,Y) get_csv_bool((X),(Y),34)
+#define get_csv_int_pos34(X,Y) get_csv_int((X),(Y),34)
+#define get_csv_llong_pos34(X,Y) get_csv_llong((X),(Y),34)
+#define get_csv_float_pos34(X,Y) get_csv_float((X),(Y),34)
+#define get_csv_uint_pos35(X,Y) get_csv_uint((X),(Y),35)
+#define get_csv_ullong_pos35(X,Y) get_csv_ullong((X),(Y),35)
+#define get_csv_ip_pos35(X,Y) get_csv_ip((X),(Y),35)
+#define get_csv_ipv6_pos35(X,Y) get_csv_ipv6((X),(Y),35)
+#define get_csv_string_pos35(X,Y) get_csv_string((X),(Y),35)
+#define get_csv_v_str_pos35(X,Y) get_csv_string((X),(Y),35)
+#define get_csv_bool_pos35(X,Y) get_csv_bool((X),(Y),35)
+#define get_csv_int_pos35(X,Y) get_csv_int((X),(Y),35)
+#define get_csv_llong_pos35(X,Y) get_csv_llong((X),(Y),35)
+#define get_csv_float_pos35(X,Y) get_csv_float((X),(Y),35)
+#define get_csv_uint_pos36(X,Y) get_csv_uint((X),(Y),36)
+#define get_csv_ullong_pos36(X,Y) get_csv_ullong((X),(Y),36)
+#define get_csv_ip_pos36(X,Y) get_csv_ip((X),(Y),36)
+#define get_csv_ipv6_pos36(X,Y) get_csv_ipv6((X),(Y),36)
+#define get_csv_string_pos36(X,Y) get_csv_string((X),(Y),36)
+#define get_csv_v_str_pos36(X,Y) get_csv_string((X),(Y),36)
+#define get_csv_bool_pos36(X,Y) get_csv_bool((X),(Y),36)
+#define get_csv_int_pos36(X,Y) get_csv_int((X),(Y),36)
+#define get_csv_llong_pos36(X,Y) get_csv_llong((X),(Y),36)
+#define get_csv_float_pos36(X,Y) get_csv_float((X),(Y),36)
+#define get_csv_uint_pos37(X,Y) get_csv_uint((X),(Y),37)
+#define get_csv_ullong_pos37(X,Y) get_csv_ullong((X),(Y),37)
+#define get_csv_ip_pos37(X,Y) get_csv_ip((X),(Y),37)
+#define get_csv_ipv6_pos37(X,Y) get_csv_ipv6((X),(Y),37)
+#define get_csv_string_pos37(X,Y) get_csv_string((X),(Y),37)
+#define get_csv_v_str_pos37(X,Y) get_csv_string((X),(Y),37)
+#define get_csv_bool_pos37(X,Y) get_csv_bool((X),(Y),37)
+#define get_csv_int_pos37(X,Y) get_csv_int((X),(Y),37)
+#define get_csv_llong_pos37(X,Y) get_csv_llong((X),(Y),37)
+#define get_csv_float_pos37(X,Y) get_csv_float((X),(Y),37)
+#define get_csv_uint_pos38(X,Y) get_csv_uint((X),(Y),38)
+#define get_csv_ullong_pos38(X,Y) get_csv_ullong((X),(Y),38)
+#define get_csv_ip_pos38(X,Y) get_csv_ip((X),(Y),38)
+#define get_csv_ipv6_pos38(X,Y) get_csv_ipv6((X),(Y),38)
+#define get_csv_string_pos38(X,Y) get_csv_string((X),(Y),38)
+#define get_csv_v_str_pos38(X,Y) get_csv_string((X),(Y),38)
+#define get_csv_bool_pos38(X,Y) get_csv_bool((X),(Y),38)
+#define get_csv_int_pos38(X,Y) get_csv_int((X),(Y),38)
+#define get_csv_llong_pos38(X,Y) get_csv_llong((X),(Y),38)
+#define get_csv_float_pos38(X,Y) get_csv_float((X),(Y),38)
+#define get_csv_uint_pos39(X,Y) get_csv_uint((X),(Y),39)
+#define get_csv_ullong_pos39(X,Y) get_csv_ullong((X),(Y),39)
+#define get_csv_ip_pos39(X,Y) get_csv_ip((X),(Y),39)
+#define get_csv_ipv6_pos39(X,Y) get_csv_ipv6((X),(Y),39)
+#define get_csv_string_pos39(X,Y) get_csv_string((X),(Y),39)
+#define get_csv_v_str_pos39(X,Y) get_csv_string((X),(Y),39)
+#define get_csv_bool_pos39(X,Y) get_csv_bool((X),(Y),39)
+#define get_csv_int_pos39(X,Y) get_csv_int((X),(Y),39)
+#define get_csv_llong_pos39(X,Y) get_csv_llong((X),(Y),39)
+#define get_csv_float_pos39(X,Y) get_csv_float((X),(Y),39)
+#define get_csv_uint_pos40(X,Y) get_csv_uint((X),(Y),40)
+#define get_csv_ullong_pos40(X,Y) get_csv_ullong((X),(Y),40)
+#define get_csv_ip_pos40(X,Y) get_csv_ip((X),(Y),40)
+#define get_csv_ipv6_pos40(X,Y) get_csv_ipv6((X),(Y),40)
+#define get_csv_string_pos40(X,Y) get_csv_string((X),(Y),40)
+#define get_csv_v_str_pos40(X,Y) get_csv_string((X),(Y),40)
+#define get_csv_bool_pos40(X,Y) get_csv_bool((X),(Y),40)
+#define get_csv_int_pos40(X,Y) get_csv_int((X),(Y),40)
+#define get_csv_llong_pos40(X,Y) get_csv_llong((X),(Y),40)
+#define get_csv_float_pos40(X,Y) get_csv_float((X),(Y),40)
+#define get_csv_uint_pos41(X,Y) get_csv_uint((X),(Y),41)
+#define get_csv_ullong_pos41(X,Y) get_csv_ullong((X),(Y),41)
+#define get_csv_ip_pos41(X,Y) get_csv_ip((X),(Y),41)
+#define get_csv_ipv6_pos41(X,Y) get_csv_ipv6((X),(Y),41)
+#define get_csv_string_pos41(X,Y) get_csv_string((X),(Y),41)
+#define get_csv_v_str_pos41(X,Y) get_csv_string((X),(Y),41)
+#define get_csv_bool_pos41(X,Y) get_csv_bool((X),(Y),41)
+#define get_csv_int_pos41(X,Y) get_csv_int((X),(Y),41)
+#define get_csv_llong_pos41(X,Y) get_csv_llong((X),(Y),41)
+#define get_csv_float_pos41(X,Y) get_csv_float((X),(Y),41)
+#define get_csv_uint_pos42(X,Y) get_csv_uint((X),(Y),42)
+#define get_csv_ullong_pos42(X,Y) get_csv_ullong((X),(Y),42)
+#define get_csv_ip_pos42(X,Y) get_csv_ip((X),(Y),42)
+#define get_csv_ipv6_pos42(X,Y) get_csv_ipv6((X),(Y),42)
+#define get_csv_string_pos42(X,Y) get_csv_string((X),(Y),42)
+#define get_csv_v_str_pos42(X,Y) get_csv_string((X),(Y),42)
+#define get_csv_bool_pos42(X,Y) get_csv_bool((X),(Y),42)
+#define get_csv_int_pos42(X,Y) get_csv_int((X),(Y),42)
+#define get_csv_llong_pos42(X,Y) get_csv_llong((X),(Y),42)
+#define get_csv_float_pos42(X,Y) get_csv_float((X),(Y),42)
+#define get_csv_uint_pos43(X,Y) get_csv_uint((X),(Y),43)
+#define get_csv_ullong_pos43(X,Y) get_csv_ullong((X),(Y),43)
+#define get_csv_ip_pos43(X,Y) get_csv_ip((X),(Y),43)
+#define get_csv_ipv6_pos43(X,Y) get_csv_ipv6((X),(Y),43)
+#define get_csv_string_pos43(X,Y) get_csv_string((X),(Y),43)
+#define get_csv_v_str_pos43(X,Y) get_csv_string((X),(Y),43)
+#define get_csv_bool_pos43(X,Y) get_csv_bool((X),(Y),43)
+#define get_csv_int_pos43(X,Y) get_csv_int((X),(Y),43)
+#define get_csv_llong_pos43(X,Y) get_csv_llong((X),(Y),43)
+#define get_csv_float_pos43(X,Y) get_csv_float((X),(Y),43)
+#define get_csv_uint_pos44(X,Y) get_csv_uint((X),(Y),44)
+#define get_csv_ullong_pos44(X,Y) get_csv_ullong((X),(Y),44)
+#define get_csv_ip_pos44(X,Y) get_csv_ip((X),(Y),44)
+#define get_csv_ipv6_pos44(X,Y) get_csv_ipv6((X),(Y),44)
+#define get_csv_string_pos44(X,Y) get_csv_string((X),(Y),44)
+#define get_csv_v_str_pos44(X,Y) get_csv_string((X),(Y),44)
+#define get_csv_bool_pos44(X,Y) get_csv_bool((X),(Y),44)
+#define get_csv_int_pos44(X,Y) get_csv_int((X),(Y),44)
+#define get_csv_llong_pos44(X,Y) get_csv_llong((X),(Y),44)
+#define get_csv_float_pos44(X,Y) get_csv_float((X),(Y),44)
+#define get_csv_uint_pos45(X,Y) get_csv_uint((X),(Y),45)
+#define get_csv_ullong_pos45(X,Y) get_csv_ullong((X),(Y),45)
+#define get_csv_ip_pos45(X,Y) get_csv_ip((X),(Y),45)
+#define get_csv_ipv6_pos45(X,Y) get_csv_ipv6((X),(Y),45)
+#define get_csv_string_pos45(X,Y) get_csv_string((X),(Y),45)
+#define get_csv_v_str_pos45(X,Y) get_csv_string((X),(Y),45)
+#define get_csv_bool_pos45(X,Y) get_csv_bool((X),(Y),45)
+#define get_csv_int_pos45(X,Y) get_csv_int((X),(Y),45)
+#define get_csv_llong_pos45(X,Y) get_csv_llong((X),(Y),45)
+#define get_csv_float_pos45(X,Y) get_csv_float((X),(Y),45)
+#define get_csv_uint_pos46(X,Y) get_csv_uint((X),(Y),46)
+#define get_csv_ullong_pos46(X,Y) get_csv_ullong((X),(Y),46)
+#define get_csv_ip_pos46(X,Y) get_csv_ip((X),(Y),46)
+#define get_csv_ipv6_pos46(X,Y) get_csv_ipv6((X),(Y),46)
+#define get_csv_string_pos46(X,Y) get_csv_string((X),(Y),46)
+#define get_csv_v_str_pos46(X,Y) get_csv_string((X),(Y),46)
+#define get_csv_bool_pos46(X,Y) get_csv_bool((X),(Y),46)
+#define get_csv_int_pos46(X,Y) get_csv_int((X),(Y),46)
+#define get_csv_llong_pos46(X,Y) get_csv_llong((X),(Y),46)
+#define get_csv_float_pos46(X,Y) get_csv_float((X),(Y),46)
+#define get_csv_uint_pos47(X,Y) get_csv_uint((X),(Y),47)
+#define get_csv_ullong_pos47(X,Y) get_csv_ullong((X),(Y),47)
+#define get_csv_ip_pos47(X,Y) get_csv_ip((X),(Y),47)
+#define get_csv_ipv6_pos47(X,Y) get_csv_ipv6((X),(Y),47)
+#define get_csv_string_pos47(X,Y) get_csv_string((X),(Y),47)
+#define get_csv_v_str_pos47(X,Y) get_csv_string((X),(Y),47)
+#define get_csv_bool_pos47(X,Y) get_csv_bool((X),(Y),47)
+#define get_csv_int_pos47(X,Y) get_csv_int((X),(Y),47)
+#define get_csv_llong_pos47(X,Y) get_csv_llong((X),(Y),47)
+#define get_csv_float_pos47(X,Y) get_csv_float((X),(Y),47)
+#define get_csv_uint_pos48(X,Y) get_csv_uint((X),(Y),48)
+#define get_csv_ullong_pos48(X,Y) get_csv_ullong((X),(Y),48)
+#define get_csv_ip_pos48(X,Y) get_csv_ip((X),(Y),48)
+#define get_csv_ipv6_pos48(X,Y) get_csv_ipv6((X),(Y),48)
+#define get_csv_string_pos48(X,Y) get_csv_string((X),(Y),48)
+#define get_csv_v_str_pos48(X,Y) get_csv_string((X),(Y),48)
+#define get_csv_bool_pos48(X,Y) get_csv_bool((X),(Y),48)
+#define get_csv_int_pos48(X,Y) get_csv_int((X),(Y),48)
+#define get_csv_llong_pos48(X,Y) get_csv_llong((X),(Y),48)
+#define get_csv_float_pos48(X,Y) get_csv_float((X),(Y),48)
+#define get_csv_uint_pos49(X,Y) get_csv_uint((X),(Y),49)
+#define get_csv_ullong_pos49(X,Y) get_csv_ullong((X),(Y),49)
+#define get_csv_ip_pos49(X,Y) get_csv_ip((X),(Y),49)
+#define get_csv_ipv6_pos49(X,Y) get_csv_ipv6((X),(Y),49)
+#define get_csv_string_pos49(X,Y) get_csv_string((X),(Y),49)
+#define get_csv_v_str_pos49(X,Y) get_csv_string((X),(Y),49)
+#define get_csv_bool_pos49(X,Y) get_csv_bool((X),(Y),49)
+#define get_csv_int_pos49(X,Y) get_csv_int((X),(Y),49)
+#define get_csv_llong_pos49(X,Y) get_csv_llong((X),(Y),49)
+#define get_csv_float_pos49(X,Y) get_csv_float((X),(Y),49)
+#define get_csv_uint_pos50(X,Y) get_csv_uint((X),(Y),50)
+#define get_csv_ullong_pos50(X,Y) get_csv_ullong((X),(Y),50)
+#define get_csv_ip_pos50(X,Y) get_csv_ip((X),(Y),50)
+#define get_csv_ipv6_pos50(X,Y) get_csv_ipv6((X),(Y),50)
+#define get_csv_string_pos50(X,Y) get_csv_string((X),(Y),50)
+#define get_csv_v_str_pos50(X,Y) get_csv_string((X),(Y),50)
+#define get_csv_bool_pos50(X,Y) get_csv_bool((X),(Y),50)
+#define get_csv_int_pos50(X,Y) get_csv_int((X),(Y),50)
+#define get_csv_llong_pos50(X,Y) get_csv_llong((X),(Y),50)
+#define get_csv_float_pos50(X,Y) get_csv_float((X),(Y),50)
+#define get_csv_uint_pos51(X,Y) get_csv_uint((X),(Y),51)
+#define get_csv_ullong_pos51(X,Y) get_csv_ullong((X),(Y),51)
+#define get_csv_ip_pos51(X,Y) get_csv_ip((X),(Y),51)
+#define get_csv_ipv6_pos51(X,Y) get_csv_ipv6((X),(Y),51)
+#define get_csv_string_pos51(X,Y) get_csv_string((X),(Y),51)
+#define get_csv_v_str_pos51(X,Y) get_csv_string((X),(Y),51)
+#define get_csv_bool_pos51(X,Y) get_csv_bool((X),(Y),51)
+#define get_csv_int_pos51(X,Y) get_csv_int((X),(Y),51)
+#define get_csv_llong_pos51(X,Y) get_csv_llong((X),(Y),51)
+#define get_csv_float_pos51(X,Y) get_csv_float((X),(Y),51)
+#define get_csv_uint_pos52(X,Y) get_csv_uint((X),(Y),52)
+#define get_csv_ullong_pos52(X,Y) get_csv_ullong((X),(Y),52)
+#define get_csv_ip_pos52(X,Y) get_csv_ip((X),(Y),52)
+#define get_csv_ipv6_pos52(X,Y) get_csv_ipv6((X),(Y),52)
+#define get_csv_string_pos52(X,Y) get_csv_string((X),(Y),52)
+#define get_csv_v_str_pos52(X,Y) get_csv_string((X),(Y),52)
+#define get_csv_bool_pos52(X,Y) get_csv_bool((X),(Y),52)
+#define get_csv_int_pos52(X,Y) get_csv_int((X),(Y),52)
+#define get_csv_llong_pos52(X,Y) get_csv_llong((X),(Y),52)
+#define get_csv_float_pos52(X,Y) get_csv_float((X),(Y),52)
+#define get_csv_uint_pos53(X,Y) get_csv_uint((X),(Y),53)
+#define get_csv_ullong_pos53(X,Y) get_csv_ullong((X),(Y),53)
+#define get_csv_ip_pos53(X,Y) get_csv_ip((X),(Y),53)
+#define get_csv_ipv6_pos53(X,Y) get_csv_ipv6((X),(Y),53)
+#define get_csv_string_pos53(X,Y) get_csv_string((X),(Y),53)
+#define get_csv_v_str_pos53(X,Y) get_csv_string((X),(Y),53)
+#define get_csv_bool_pos53(X,Y) get_csv_bool((X),(Y),53)
+#define get_csv_int_pos53(X,Y) get_csv_int((X),(Y),53)
+#define get_csv_llong_pos53(X,Y) get_csv_llong((X),(Y),53)
+#define get_csv_float_pos53(X,Y) get_csv_float((X),(Y),53)
+#define get_csv_uint_pos54(X,Y) get_csv_uint((X),(Y),54)
+#define get_csv_ullong_pos54(X,Y) get_csv_ullong((X),(Y),54)
+#define get_csv_ip_pos54(X,Y) get_csv_ip((X),(Y),54)
+#define get_csv_ipv6_pos54(X,Y) get_csv_ipv6((X),(Y),54)
+#define get_csv_string_pos54(X,Y) get_csv_string((X),(Y),54)
+#define get_csv_v_str_pos54(X,Y) get_csv_string((X),(Y),54)
+#define get_csv_bool_pos54(X,Y) get_csv_bool((X),(Y),54)
+#define get_csv_int_pos54(X,Y) get_csv_int((X),(Y),54)
+#define get_csv_llong_pos54(X,Y) get_csv_llong((X),(Y),54)
+#define get_csv_float_pos54(X,Y) get_csv_float((X),(Y),54)
+#define get_csv_uint_pos55(X,Y) get_csv_uint((X),(Y),55)
+#define get_csv_ullong_pos55(X,Y) get_csv_ullong((X),(Y),55)
+#define get_csv_ip_pos55(X,Y) get_csv_ip((X),(Y),55)
+#define get_csv_ipv6_pos55(X,Y) get_csv_ipv6((X),(Y),55)
+#define get_csv_string_pos55(X,Y) get_csv_string((X),(Y),55)
+#define get_csv_v_str_pos55(X,Y) get_csv_string((X),(Y),55)
+#define get_csv_bool_pos55(X,Y) get_csv_bool((X),(Y),55)
+#define get_csv_int_pos55(X,Y) get_csv_int((X),(Y),55)
+#define get_csv_llong_pos55(X,Y) get_csv_llong((X),(Y),55)
+#define get_csv_float_pos55(X,Y) get_csv_float((X),(Y),55)
+#define get_csv_uint_pos56(X,Y) get_csv_uint((X),(Y),56)
+#define get_csv_ullong_pos56(X,Y) get_csv_ullong((X),(Y),56)
+#define get_csv_ip_pos56(X,Y) get_csv_ip((X),(Y),56)
+#define get_csv_ipv6_pos56(X,Y) get_csv_ipv6((X),(Y),56)
+#define get_csv_string_pos56(X,Y) get_csv_string((X),(Y),56)
+#define get_csv_v_str_pos56(X,Y) get_csv_string((X),(Y),56)
+#define get_csv_bool_pos56(X,Y) get_csv_bool((X),(Y),56)
+#define get_csv_int_pos56(X,Y) get_csv_int((X),(Y),56)
+#define get_csv_llong_pos56(X,Y) get_csv_llong((X),(Y),56)
+#define get_csv_float_pos56(X,Y) get_csv_float((X),(Y),56)
+#define get_csv_uint_pos57(X,Y) get_csv_uint((X),(Y),57)
+#define get_csv_ullong_pos57(X,Y) get_csv_ullong((X),(Y),57)
+#define get_csv_ip_pos57(X,Y) get_csv_ip((X),(Y),57)
+#define get_csv_ipv6_pos57(X,Y) get_csv_ipv6((X),(Y),57)
+#define get_csv_string_pos57(X,Y) get_csv_string((X),(Y),57)
+#define get_csv_v_str_pos57(X,Y) get_csv_string((X),(Y),57)
+#define get_csv_bool_pos57(X,Y) get_csv_bool((X),(Y),57)
+#define get_csv_int_pos57(X,Y) get_csv_int((X),(Y),57)
+#define get_csv_llong_pos57(X,Y) get_csv_llong((X),(Y),57)
+#define get_csv_float_pos57(X,Y) get_csv_float((X),(Y),57)
+#define get_csv_uint_pos58(X,Y) get_csv_uint((X),(Y),58)
+#define get_csv_ullong_pos58(X,Y) get_csv_ullong((X),(Y),58)
+#define get_csv_ip_pos58(X,Y) get_csv_ip((X),(Y),58)
+#define get_csv_ipv6_pos58(X,Y) get_csv_ipv6((X),(Y),58)
+#define get_csv_string_pos58(X,Y) get_csv_string((X),(Y),58)
+#define get_csv_v_str_pos58(X,Y) get_csv_string((X),(Y),58)
+#define get_csv_bool_pos58(X,Y) get_csv_bool((X),(Y),58)
+#define get_csv_int_pos58(X,Y) get_csv_int((X),(Y),58)
+#define get_csv_llong_pos58(X,Y) get_csv_llong((X),(Y),58)
+#define get_csv_float_pos58(X,Y) get_csv_float((X),(Y),58)
+#define get_csv_uint_pos59(X,Y) get_csv_uint((X),(Y),59)
+#define get_csv_ullong_pos59(X,Y) get_csv_ullong((X),(Y),59)
+#define get_csv_ip_pos59(X,Y) get_csv_ip((X),(Y),59)
+#define get_csv_ipv6_pos59(X,Y) get_csv_ipv6((X),(Y),59)
+#define get_csv_string_pos59(X,Y) get_csv_string((X),(Y),59)
+#define get_csv_v_str_pos59(X,Y) get_csv_string((X),(Y),59)
+#define get_csv_bool_pos59(X,Y) get_csv_bool((X),(Y),59)
+#define get_csv_int_pos59(X,Y) get_csv_int((X),(Y),59)
+#define get_csv_llong_pos59(X,Y) get_csv_llong((X),(Y),59)
+#define get_csv_float_pos59(X,Y) get_csv_float((X),(Y),59)
+#define get_csv_uint_pos60(X,Y) get_csv_uint((X),(Y),60)
+#define get_csv_ullong_pos60(X,Y) get_csv_ullong((X),(Y),60)
+#define get_csv_ip_pos60(X,Y) get_csv_ip((X),(Y),60)
+#define get_csv_ipv6_pos60(X,Y) get_csv_ipv6((X),(Y),60)
+#define get_csv_string_pos60(X,Y) get_csv_string((X),(Y),60)
+#define get_csv_v_str_pos60(X,Y) get_csv_string((X),(Y),60)
+#define get_csv_bool_pos60(X,Y) get_csv_bool((X),(Y),60)
+#define get_csv_int_pos60(X,Y) get_csv_int((X),(Y),60)
+#define get_csv_llong_pos60(X,Y) get_csv_llong((X),(Y),60)
+#define get_csv_float_pos60(X,Y) get_csv_float((X),(Y),60)
+#define get_csv_uint_pos61(X,Y) get_csv_uint((X),(Y),61)
+#define get_csv_ullong_pos61(X,Y) get_csv_ullong((X),(Y),61)
+#define get_csv_ip_pos61(X,Y) get_csv_ip((X),(Y),61)
+#define get_csv_ipv6_pos61(X,Y) get_csv_ipv6((X),(Y),61)
+#define get_csv_string_pos61(X,Y) get_csv_string((X),(Y),61)
+#define get_csv_v_str_pos61(X,Y) get_csv_string((X),(Y),61)
+#define get_csv_bool_pos61(X,Y) get_csv_bool((X),(Y),61)
+#define get_csv_int_pos61(X,Y) get_csv_int((X),(Y),61)
+#define get_csv_llong_pos61(X,Y) get_csv_llong((X),(Y),61)
+#define get_csv_float_pos61(X,Y) get_csv_float((X),(Y),61)
+#define get_csv_uint_pos62(X,Y) get_csv_uint((X),(Y),62)
+#define get_csv_ullong_pos62(X,Y) get_csv_ullong((X),(Y),62)
+#define get_csv_ip_pos62(X,Y) get_csv_ip((X),(Y),62)
+#define get_csv_ipv6_pos62(X,Y) get_csv_ipv6((X),(Y),62)
+#define get_csv_string_pos62(X,Y) get_csv_string((X),(Y),62)
+#define get_csv_v_str_pos62(X,Y) get_csv_string((X),(Y),62)
+#define get_csv_bool_pos62(X,Y) get_csv_bool((X),(Y),62)
+#define get_csv_int_pos62(X,Y) get_csv_int((X),(Y),62)
+#define get_csv_llong_pos62(X,Y) get_csv_llong((X),(Y),62)
+#define get_csv_float_pos62(X,Y) get_csv_float((X),(Y),62)
+#define get_csv_uint_pos63(X,Y) get_csv_uint((X),(Y),63)
+#define get_csv_ullong_pos63(X,Y) get_csv_ullong((X),(Y),63)
+#define get_csv_ip_pos63(X,Y) get_csv_ip((X),(Y),63)
+#define get_csv_ipv6_pos63(X,Y) get_csv_ipv6((X),(Y),63)
+#define get_csv_string_pos63(X,Y) get_csv_string((X),(Y),63)
+#define get_csv_v_str_pos63(X,Y) get_csv_string((X),(Y),63)
+#define get_csv_bool_pos63(X,Y) get_csv_bool((X),(Y),63)
+#define get_csv_int_pos63(X,Y) get_csv_int((X),(Y),63)
+#define get_csv_llong_pos63(X,Y) get_csv_llong((X),(Y),63)
+#define get_csv_float_pos63(X,Y) get_csv_float((X),(Y),63)
+#define get_csv_uint_pos64(X,Y) get_csv_uint((X),(Y),64)
+#define get_csv_ullong_pos64(X,Y) get_csv_ullong((X),(Y),64)
+#define get_csv_ip_pos64(X,Y) get_csv_ip((X),(Y),64)
+#define get_csv_ipv6_pos64(X,Y) get_csv_ipv6((X),(Y),64)
+#define get_csv_string_pos64(X,Y) get_csv_string((X),(Y),64)
+#define get_csv_v_str_pos64(X,Y) get_csv_string((X),(Y),64)
+#define get_csv_bool_pos64(X,Y) get_csv_bool((X),(Y),64)
+#define get_csv_int_pos64(X,Y) get_csv_int((X),(Y),64)
+#define get_csv_llong_pos64(X,Y) get_csv_llong((X),(Y),64)
+#define get_csv_float_pos64(X,Y) get_csv_float((X),(Y),64)
+#define get_csv_uint_pos65(X,Y) get_csv_uint((X),(Y),65)
+#define get_csv_ullong_pos65(X,Y) get_csv_ullong((X),(Y),65)
+#define get_csv_ip_pos65(X,Y) get_csv_ip((X),(Y),65)
+#define get_csv_ipv6_pos65(X,Y) get_csv_ipv6((X),(Y),65)
+#define get_csv_string_pos65(X,Y) get_csv_string((X),(Y),65)
+#define get_csv_v_str_pos65(X,Y) get_csv_string((X),(Y),65)
+#define get_csv_bool_pos65(X,Y) get_csv_bool((X),(Y),65)
+#define get_csv_int_pos65(X,Y) get_csv_int((X),(Y),65)
+#define get_csv_llong_pos65(X,Y) get_csv_llong((X),(Y),65)
+#define get_csv_float_pos65(X,Y) get_csv_float((X),(Y),65)
+#define get_csv_uint_pos66(X,Y) get_csv_uint((X),(Y),66)
+#define get_csv_ullong_pos66(X,Y) get_csv_ullong((X),(Y),66)
+#define get_csv_ip_pos66(X,Y) get_csv_ip((X),(Y),66)
+#define get_csv_ipv6_pos66(X,Y) get_csv_ipv6((X),(Y),66)
+#define get_csv_string_pos66(X,Y) get_csv_string((X),(Y),66)
+#define get_csv_v_str_pos66(X,Y) get_csv_string((X),(Y),66)
+#define get_csv_bool_pos66(X,Y) get_csv_bool((X),(Y),66)
+#define get_csv_int_pos66(X,Y) get_csv_int((X),(Y),66)
+#define get_csv_llong_pos66(X,Y) get_csv_llong((X),(Y),66)
+#define get_csv_float_pos66(X,Y) get_csv_float((X),(Y),66)
+#define get_csv_uint_pos67(X,Y) get_csv_uint((X),(Y),67)
+#define get_csv_ullong_pos67(X,Y) get_csv_ullong((X),(Y),67)
+#define get_csv_ip_pos67(X,Y) get_csv_ip((X),(Y),67)
+#define get_csv_ipv6_pos67(X,Y) get_csv_ipv6((X),(Y),67)
+#define get_csv_string_pos67(X,Y) get_csv_string((X),(Y),67)
+#define get_csv_v_str_pos67(X,Y) get_csv_string((X),(Y),67)
+#define get_csv_bool_pos67(X,Y) get_csv_bool((X),(Y),67)
+#define get_csv_int_pos67(X,Y) get_csv_int((X),(Y),67)
+#define get_csv_llong_pos67(X,Y) get_csv_llong((X),(Y),67)
+#define get_csv_float_pos67(X,Y) get_csv_float((X),(Y),67)
+#define get_csv_uint_pos68(X,Y) get_csv_uint((X),(Y),68)
+#define get_csv_ullong_pos68(X,Y) get_csv_ullong((X),(Y),68)
+#define get_csv_ip_pos68(X,Y) get_csv_ip((X),(Y),68)
+#define get_csv_ipv6_pos68(X,Y) get_csv_ipv6((X),(Y),68)
+#define get_csv_string_pos68(X,Y) get_csv_string((X),(Y),68)
+#define get_csv_v_str_pos68(X,Y) get_csv_string((X),(Y),68)
+#define get_csv_bool_pos68(X,Y) get_csv_bool((X),(Y),68)
+#define get_csv_int_pos68(X,Y) get_csv_int((X),(Y),68)
+#define get_csv_llong_pos68(X,Y) get_csv_llong((X),(Y),68)
+#define get_csv_float_pos68(X,Y) get_csv_float((X),(Y),68)
+#define get_csv_uint_pos69(X,Y) get_csv_uint((X),(Y),69)
+#define get_csv_ullong_pos69(X,Y) get_csv_ullong((X),(Y),69)
+#define get_csv_ip_pos69(X,Y) get_csv_ip((X),(Y),69)
+#define get_csv_ipv6_pos69(X,Y) get_csv_ipv6((X),(Y),69)
+#define get_csv_string_pos69(X,Y) get_csv_string((X),(Y),69)
+#define get_csv_v_str_pos69(X,Y) get_csv_string((X),(Y),69)
+#define get_csv_bool_pos69(X,Y) get_csv_bool((X),(Y),69)
+#define get_csv_int_pos69(X,Y) get_csv_int((X),(Y),69)
+#define get_csv_llong_pos69(X,Y) get_csv_llong((X),(Y),69)
+#define get_csv_float_pos69(X,Y) get_csv_float((X),(Y),69)
+#define get_csv_uint_pos70(X,Y) get_csv_uint((X),(Y),70)
+#define get_csv_ullong_pos70(X,Y) get_csv_ullong((X),(Y),70)
+#define get_csv_ip_pos70(X,Y) get_csv_ip((X),(Y),70)
+#define get_csv_ipv6_pos70(X,Y) get_csv_ipv6((X),(Y),70)
+#define get_csv_string_pos70(X,Y) get_csv_string((X),(Y),70)
+#define get_csv_v_str_pos70(X,Y) get_csv_string((X),(Y),70)
+#define get_csv_bool_pos70(X,Y) get_csv_bool((X),(Y),70)
+#define get_csv_int_pos70(X,Y) get_csv_int((X),(Y),70)
+#define get_csv_llong_pos70(X,Y) get_csv_llong((X),(Y),70)
+#define get_csv_float_pos70(X,Y) get_csv_float((X),(Y),70)
+#define get_csv_uint_pos71(X,Y) get_csv_uint((X),(Y),71)
+#define get_csv_ullong_pos71(X,Y) get_csv_ullong((X),(Y),71)
+#define get_csv_ip_pos71(X,Y) get_csv_ip((X),(Y),71)
+#define get_csv_ipv6_pos71(X,Y) get_csv_ipv6((X),(Y),71)
+#define get_csv_string_pos71(X,Y) get_csv_string((X),(Y),71)
+#define get_csv_v_str_pos71(X,Y) get_csv_string((X),(Y),71)
+#define get_csv_bool_pos71(X,Y) get_csv_bool((X),(Y),71)
+#define get_csv_int_pos71(X,Y) get_csv_int((X),(Y),71)
+#define get_csv_llong_pos71(X,Y) get_csv_llong((X),(Y),71)
+#define get_csv_float_pos71(X,Y) get_csv_float((X),(Y),71)
+#define get_csv_uint_pos72(X,Y) get_csv_uint((X),(Y),72)
+#define get_csv_ullong_pos72(X,Y) get_csv_ullong((X),(Y),72)
+#define get_csv_ip_pos72(X,Y) get_csv_ip((X),(Y),72)
+#define get_csv_ipv6_pos72(X,Y) get_csv_ipv6((X),(Y),72)
+#define get_csv_string_pos72(X,Y) get_csv_string((X),(Y),72)
+#define get_csv_v_str_pos72(X,Y) get_csv_string((X),(Y),72)
+#define get_csv_bool_pos72(X,Y) get_csv_bool((X),(Y),72)
+#define get_csv_int_pos72(X,Y) get_csv_int((X),(Y),72)
+#define get_csv_llong_pos72(X,Y) get_csv_llong((X),(Y),72)
+#define get_csv_float_pos72(X,Y) get_csv_float((X),(Y),72)
+#define get_csv_uint_pos73(X,Y) get_csv_uint((X),(Y),73)
+#define get_csv_ullong_pos73(X,Y) get_csv_ullong((X),(Y),73)
+#define get_csv_ip_pos73(X,Y) get_csv_ip((X),(Y),73)
+#define get_csv_ipv6_pos73(X,Y) get_csv_ipv6((X),(Y),73)
+#define get_csv_string_pos73(X,Y) get_csv_string((X),(Y),73)
+#define get_csv_v_str_pos73(X,Y) get_csv_string((X),(Y),73)
+#define get_csv_bool_pos73(X,Y) get_csv_bool((X),(Y),73)
+#define get_csv_int_pos73(X,Y) get_csv_int((X),(Y),73)
+#define get_csv_llong_pos73(X,Y) get_csv_llong((X),(Y),73)
+#define get_csv_float_pos73(X,Y) get_csv_float((X),(Y),73)
+#define get_csv_uint_pos74(X,Y) get_csv_uint((X),(Y),74)
+#define get_csv_ullong_pos74(X,Y) get_csv_ullong((X),(Y),74)
+#define get_csv_ip_pos74(X,Y) get_csv_ip((X),(Y),74)
+#define get_csv_ipv6_pos74(X,Y) get_csv_ipv6((X),(Y),74)
+#define get_csv_string_pos74(X,Y) get_csv_string((X),(Y),74)
+#define get_csv_v_str_pos74(X,Y) get_csv_string((X),(Y),74)
+#define get_csv_bool_pos74(X,Y) get_csv_bool((X),(Y),74)
+#define get_csv_int_pos74(X,Y) get_csv_int((X),(Y),74)
+#define get_csv_llong_pos74(X,Y) get_csv_llong((X),(Y),74)
+#define get_csv_float_pos74(X,Y) get_csv_float((X),(Y),74)
+#define get_csv_uint_pos75(X,Y) get_csv_uint((X),(Y),75)
+#define get_csv_ullong_pos75(X,Y) get_csv_ullong((X),(Y),75)
+#define get_csv_ip_pos75(X,Y) get_csv_ip((X),(Y),75)
+#define get_csv_ipv6_pos75(X,Y) get_csv_ipv6((X),(Y),75)
+#define get_csv_string_pos75(X,Y) get_csv_string((X),(Y),75)
+#define get_csv_v_str_pos75(X,Y) get_csv_string((X),(Y),75)
+#define get_csv_bool_pos75(X,Y) get_csv_bool((X),(Y),75)
+#define get_csv_int_pos75(X,Y) get_csv_int((X),(Y),75)
+#define get_csv_llong_pos75(X,Y) get_csv_llong((X),(Y),75)
+#define get_csv_float_pos75(X,Y) get_csv_float((X),(Y),75)
+#define get_csv_uint_pos76(X,Y) get_csv_uint((X),(Y),76)
+#define get_csv_ullong_pos76(X,Y) get_csv_ullong((X),(Y),76)
+#define get_csv_ip_pos76(X,Y) get_csv_ip((X),(Y),76)
+#define get_csv_ipv6_pos76(X,Y) get_csv_ipv6((X),(Y),76)
+#define get_csv_string_pos76(X,Y) get_csv_string((X),(Y),76)
+#define get_csv_v_str_pos76(X,Y) get_csv_string((X),(Y),76)
+#define get_csv_bool_pos76(X,Y) get_csv_bool((X),(Y),76)
+#define get_csv_int_pos76(X,Y) get_csv_int((X),(Y),76)
+#define get_csv_llong_pos76(X,Y) get_csv_llong((X),(Y),76)
+#define get_csv_float_pos76(X,Y) get_csv_float((X),(Y),76)
+#define get_csv_uint_pos77(X,Y) get_csv_uint((X),(Y),77)
+#define get_csv_ullong_pos77(X,Y) get_csv_ullong((X),(Y),77)
+#define get_csv_ip_pos77(X,Y) get_csv_ip((X),(Y),77)
+#define get_csv_ipv6_pos77(X,Y) get_csv_ipv6((X),(Y),77)
+#define get_csv_string_pos77(X,Y) get_csv_string((X),(Y),77)
+#define get_csv_v_str_pos77(X,Y) get_csv_string((X),(Y),77)
+#define get_csv_bool_pos77(X,Y) get_csv_bool((X),(Y),77)
+#define get_csv_int_pos77(X,Y) get_csv_int((X),(Y),77)
+#define get_csv_llong_pos77(X,Y) get_csv_llong((X),(Y),77)
+#define get_csv_float_pos77(X,Y) get_csv_float((X),(Y),77)
+#define get_csv_uint_pos78(X,Y) get_csv_uint((X),(Y),78)
+#define get_csv_ullong_pos78(X,Y) get_csv_ullong((X),(Y),78)
+#define get_csv_ip_pos78(X,Y) get_csv_ip((X),(Y),78)
+#define get_csv_ipv6_pos78(X,Y) get_csv_ipv6((X),(Y),78)
+#define get_csv_string_pos78(X,Y) get_csv_string((X),(Y),78)
+#define get_csv_v_str_pos78(X,Y) get_csv_string((X),(Y),78)
+#define get_csv_bool_pos78(X,Y) get_csv_bool((X),(Y),78)
+#define get_csv_int_pos78(X,Y) get_csv_int((X),(Y),78)
+#define get_csv_llong_pos78(X,Y) get_csv_llong((X),(Y),78)
+#define get_csv_float_pos78(X,Y) get_csv_float((X),(Y),78)
+#define get_csv_uint_pos79(X,Y) get_csv_uint((X),(Y),79)
+#define get_csv_ullong_pos79(X,Y) get_csv_ullong((X),(Y),79)
+#define get_csv_ip_pos79(X,Y) get_csv_ip((X),(Y),79)
+#define get_csv_ipv6_pos79(X,Y) get_csv_ipv6((X),(Y),79)
+#define get_csv_string_pos79(X,Y) get_csv_string((X),(Y),79)
+#define get_csv_v_str_pos79(X,Y) get_csv_string((X),(Y),79)
+#define get_csv_bool_pos79(X,Y) get_csv_bool((X),(Y),79)
+#define get_csv_int_pos79(X,Y) get_csv_int((X),(Y),79)
+#define get_csv_llong_pos79(X,Y) get_csv_llong((X),(Y),79)
+#define get_csv_float_pos79(X,Y) get_csv_float((X),(Y),79)
+#define get_csv_uint_pos80(X,Y) get_csv_uint((X),(Y),80)
+#define get_csv_ullong_pos80(X,Y) get_csv_ullong((X),(Y),80)
+#define get_csv_ip_pos80(X,Y) get_csv_ip((X),(Y),80)
+#define get_csv_ipv6_pos80(X,Y) get_csv_ipv6((X),(Y),80)
+#define get_csv_string_pos80(X,Y) get_csv_string((X),(Y),80)
+#define get_csv_v_str_pos80(X,Y) get_csv_string((X),(Y),80)
+#define get_csv_bool_pos80(X,Y) get_csv_bool((X),(Y),80)
+#define get_csv_int_pos80(X,Y) get_csv_int((X),(Y),80)
+#define get_csv_llong_pos80(X,Y) get_csv_llong((X),(Y),80)
+#define get_csv_float_pos80(X,Y) get_csv_float((X),(Y),80)
+#define get_csv_uint_pos81(X,Y) get_csv_uint((X),(Y),81)
+#define get_csv_ullong_pos81(X,Y) get_csv_ullong((X),(Y),81)
+#define get_csv_ip_pos81(X,Y) get_csv_ip((X),(Y),81)
+#define get_csv_ipv6_pos81(X,Y) get_csv_ipv6((X),(Y),81)
+#define get_csv_string_pos81(X,Y) get_csv_string((X),(Y),81)
+#define get_csv_v_str_pos81(X,Y) get_csv_string((X),(Y),81)
+#define get_csv_bool_pos81(X,Y) get_csv_bool((X),(Y),81)
+#define get_csv_int_pos81(X,Y) get_csv_int((X),(Y),81)
+#define get_csv_llong_pos81(X,Y) get_csv_llong((X),(Y),81)
+#define get_csv_float_pos81(X,Y) get_csv_float((X),(Y),81)
+#define get_csv_uint_pos82(X,Y) get_csv_uint((X),(Y),82)
+#define get_csv_ullong_pos82(X,Y) get_csv_ullong((X),(Y),82)
+#define get_csv_ip_pos82(X,Y) get_csv_ip((X),(Y),82)
+#define get_csv_ipv6_pos82(X,Y) get_csv_ipv6((X),(Y),82)
+#define get_csv_string_pos82(X,Y) get_csv_string((X),(Y),82)
+#define get_csv_v_str_pos82(X,Y) get_csv_string((X),(Y),82)
+#define get_csv_bool_pos82(X,Y) get_csv_bool((X),(Y),82)
+#define get_csv_int_pos82(X,Y) get_csv_int((X),(Y),82)
+#define get_csv_llong_pos82(X,Y) get_csv_llong((X),(Y),82)
+#define get_csv_float_pos82(X,Y) get_csv_float((X),(Y),82)
+#define get_csv_uint_pos83(X,Y) get_csv_uint((X),(Y),83)
+#define get_csv_ullong_pos83(X,Y) get_csv_ullong((X),(Y),83)
+#define get_csv_ip_pos83(X,Y) get_csv_ip((X),(Y),83)
+#define get_csv_ipv6_pos83(X,Y) get_csv_ipv6((X),(Y),83)
+#define get_csv_string_pos83(X,Y) get_csv_string((X),(Y),83)
+#define get_csv_v_str_pos83(X,Y) get_csv_string((X),(Y),83)
+#define get_csv_bool_pos83(X,Y) get_csv_bool((X),(Y),83)
+#define get_csv_int_pos83(X,Y) get_csv_int((X),(Y),83)
+#define get_csv_llong_pos83(X,Y) get_csv_llong((X),(Y),83)
+#define get_csv_float_pos83(X,Y) get_csv_float((X),(Y),83)
+#define get_csv_uint_pos84(X,Y) get_csv_uint((X),(Y),84)
+#define get_csv_ullong_pos84(X,Y) get_csv_ullong((X),(Y),84)
+#define get_csv_ip_pos84(X,Y) get_csv_ip((X),(Y),84)
+#define get_csv_ipv6_pos84(X,Y) get_csv_ipv6((X),(Y),84)
+#define get_csv_string_pos84(X,Y) get_csv_string((X),(Y),84)
+#define get_csv_v_str_pos84(X,Y) get_csv_string((X),(Y),84)
+#define get_csv_bool_pos84(X,Y) get_csv_bool((X),(Y),84)
+#define get_csv_int_pos84(X,Y) get_csv_int((X),(Y),84)
+#define get_csv_llong_pos84(X,Y) get_csv_llong((X),(Y),84)
+#define get_csv_float_pos84(X,Y) get_csv_float((X),(Y),84)
+#define get_csv_uint_pos85(X,Y) get_csv_uint((X),(Y),85)
+#define get_csv_ullong_pos85(X,Y) get_csv_ullong((X),(Y),85)
+#define get_csv_ip_pos85(X,Y) get_csv_ip((X),(Y),85)
+#define get_csv_ipv6_pos85(X,Y) get_csv_ipv6((X),(Y),85)
+#define get_csv_string_pos85(X,Y) get_csv_string((X),(Y),85)
+#define get_csv_v_str_pos85(X,Y) get_csv_string((X),(Y),85)
+#define get_csv_bool_pos85(X,Y) get_csv_bool((X),(Y),85)
+#define get_csv_int_pos85(X,Y) get_csv_int((X),(Y),85)
+#define get_csv_llong_pos85(X,Y) get_csv_llong((X),(Y),85)
+#define get_csv_float_pos85(X,Y) get_csv_float((X),(Y),85)
+#define get_csv_uint_pos86(X,Y) get_csv_uint((X),(Y),86)
+#define get_csv_ullong_pos86(X,Y) get_csv_ullong((X),(Y),86)
+#define get_csv_ip_pos86(X,Y) get_csv_ip((X),(Y),86)
+#define get_csv_ipv6_pos86(X,Y) get_csv_ipv6((X),(Y),86)
+#define get_csv_string_pos86(X,Y) get_csv_string((X),(Y),86)
+#define get_csv_v_str_pos86(X,Y) get_csv_string((X),(Y),86)
+#define get_csv_bool_pos86(X,Y) get_csv_bool((X),(Y),86)
+#define get_csv_int_pos86(X,Y) get_csv_int((X),(Y),86)
+#define get_csv_llong_pos86(X,Y) get_csv_llong((X),(Y),86)
+#define get_csv_float_pos86(X,Y) get_csv_float((X),(Y),86)
+#define get_csv_uint_pos87(X,Y) get_csv_uint((X),(Y),87)
+#define get_csv_ullong_pos87(X,Y) get_csv_ullong((X),(Y),87)
+#define get_csv_ip_pos87(X,Y) get_csv_ip((X),(Y),87)
+#define get_csv_ipv6_pos87(X,Y) get_csv_ipv6((X),(Y),87)
+#define get_csv_string_pos87(X,Y) get_csv_string((X),(Y),87)
+#define get_csv_v_str_pos87(X,Y) get_csv_string((X),(Y),87)
+#define get_csv_bool_pos87(X,Y) get_csv_bool((X),(Y),87)
+#define get_csv_int_pos87(X,Y) get_csv_int((X),(Y),87)
+#define get_csv_llong_pos87(X,Y) get_csv_llong((X),(Y),87)
+#define get_csv_float_pos87(X,Y) get_csv_float((X),(Y),87)
+#define get_csv_uint_pos88(X,Y) get_csv_uint((X),(Y),88)
+#define get_csv_ullong_pos88(X,Y) get_csv_ullong((X),(Y),88)
+#define get_csv_ip_pos88(X,Y) get_csv_ip((X),(Y),88)
+#define get_csv_ipv6_pos88(X,Y) get_csv_ipv6((X),(Y),88)
+#define get_csv_string_pos88(X,Y) get_csv_string((X),(Y),88)
+#define get_csv_v_str_pos88(X,Y) get_csv_string((X),(Y),88)
+#define get_csv_bool_pos88(X,Y) get_csv_bool((X),(Y),88)
+#define get_csv_int_pos88(X,Y) get_csv_int((X),(Y),88)
+#define get_csv_llong_pos88(X,Y) get_csv_llong((X),(Y),88)
+#define get_csv_float_pos88(X,Y) get_csv_float((X),(Y),88)
+#define get_csv_uint_pos89(X,Y) get_csv_uint((X),(Y),89)
+#define get_csv_ullong_pos89(X,Y) get_csv_ullong((X),(Y),89)
+#define get_csv_ip_pos89(X,Y) get_csv_ip((X),(Y),89)
+#define get_csv_ipv6_pos89(X,Y) get_csv_ipv6((X),(Y),89)
+#define get_csv_string_pos89(X,Y) get_csv_string((X),(Y),89)
+#define get_csv_v_str_pos89(X,Y) get_csv_string((X),(Y),89)
+#define get_csv_bool_pos89(X,Y) get_csv_bool((X),(Y),89)
+#define get_csv_int_pos89(X,Y) get_csv_int((X),(Y),89)
+#define get_csv_llong_pos89(X,Y) get_csv_llong((X),(Y),89)
+#define get_csv_float_pos89(X,Y) get_csv_float((X),(Y),89)
+#define get_csv_uint_pos90(X,Y) get_csv_uint((X),(Y),90)
+#define get_csv_ullong_pos90(X,Y) get_csv_ullong((X),(Y),90)
+#define get_csv_ip_pos90(X,Y) get_csv_ip((X),(Y),90)
+#define get_csv_ipv6_pos90(X,Y) get_csv_ipv6((X),(Y),90)
+#define get_csv_string_pos90(X,Y) get_csv_string((X),(Y),90)
+#define get_csv_v_str_pos90(X,Y) get_csv_string((X),(Y),90)
+#define get_csv_bool_pos90(X,Y) get_csv_bool((X),(Y),90)
+#define get_csv_int_pos90(X,Y) get_csv_int((X),(Y),90)
+#define get_csv_llong_pos90(X,Y) get_csv_llong((X),(Y),90)
+#define get_csv_float_pos90(X,Y) get_csv_float((X),(Y),90)
+#define get_csv_uint_pos91(X,Y) get_csv_uint((X),(Y),91)
+#define get_csv_ullong_pos91(X,Y) get_csv_ullong((X),(Y),91)
+#define get_csv_ip_pos91(X,Y) get_csv_ip((X),(Y),91)
+#define get_csv_ipv6_pos91(X,Y) get_csv_ipv6((X),(Y),91)
+#define get_csv_string_pos91(X,Y) get_csv_string((X),(Y),91)
+#define get_csv_v_str_pos91(X,Y) get_csv_string((X),(Y),91)
+#define get_csv_bool_pos91(X,Y) get_csv_bool((X),(Y),91)
+#define get_csv_int_pos91(X,Y) get_csv_int((X),(Y),91)
+#define get_csv_llong_pos91(X,Y) get_csv_llong((X),(Y),91)
+#define get_csv_float_pos91(X,Y) get_csv_float((X),(Y),91)
+#define get_csv_uint_pos92(X,Y) get_csv_uint((X),(Y),92)
+#define get_csv_ullong_pos92(X,Y) get_csv_ullong((X),(Y),92)
+#define get_csv_ip_pos92(X,Y) get_csv_ip((X),(Y),92)
+#define get_csv_ipv6_pos92(X,Y) get_csv_ipv6((X),(Y),92)
+#define get_csv_string_pos92(X,Y) get_csv_string((X),(Y),92)
+#define get_csv_v_str_pos92(X,Y) get_csv_string((X),(Y),92)
+#define get_csv_bool_pos92(X,Y) get_csv_bool((X),(Y),92)
+#define get_csv_int_pos92(X,Y) get_csv_int((X),(Y),92)
+#define get_csv_llong_pos92(X,Y) get_csv_llong((X),(Y),92)
+#define get_csv_float_pos92(X,Y) get_csv_float((X),(Y),92)
+#define get_csv_uint_pos93(X,Y) get_csv_uint((X),(Y),93)
+#define get_csv_ullong_pos93(X,Y) get_csv_ullong((X),(Y),93)
+#define get_csv_ip_pos93(X,Y) get_csv_ip((X),(Y),93)
+#define get_csv_ipv6_pos93(X,Y) get_csv_ipv6((X),(Y),93)
+#define get_csv_string_pos93(X,Y) get_csv_string((X),(Y),93)
+#define get_csv_v_str_pos93(X,Y) get_csv_string((X),(Y),93)
+#define get_csv_bool_pos93(X,Y) get_csv_bool((X),(Y),93)
+#define get_csv_int_pos93(X,Y) get_csv_int((X),(Y),93)
+#define get_csv_llong_pos93(X,Y) get_csv_llong((X),(Y),93)
+#define get_csv_float_pos93(X,Y) get_csv_float((X),(Y),93)
+#define get_csv_uint_pos94(X,Y) get_csv_uint((X),(Y),94)
+#define get_csv_ullong_pos94(X,Y) get_csv_ullong((X),(Y),94)
+#define get_csv_ip_pos94(X,Y) get_csv_ip((X),(Y),94)
+#define get_csv_ipv6_pos94(X,Y) get_csv_ipv6((X),(Y),94)
+#define get_csv_string_pos94(X,Y) get_csv_string((X),(Y),94)
+#define get_csv_v_str_pos94(X,Y) get_csv_string((X),(Y),94)
+#define get_csv_bool_pos94(X,Y) get_csv_bool((X),(Y),94)
+#define get_csv_int_pos94(X,Y) get_csv_int((X),(Y),94)
+#define get_csv_llong_pos94(X,Y) get_csv_llong((X),(Y),94)
+#define get_csv_float_pos94(X,Y) get_csv_float((X),(Y),94)
+#define get_csv_uint_pos95(X,Y) get_csv_uint((X),(Y),95)
+#define get_csv_ullong_pos95(X,Y) get_csv_ullong((X),(Y),95)
+#define get_csv_ip_pos95(X,Y) get_csv_ip((X),(Y),95)
+#define get_csv_ipv6_pos95(X,Y) get_csv_ipv6((X),(Y),95)
+#define get_csv_string_pos95(X,Y) get_csv_string((X),(Y),95)
+#define get_csv_v_str_pos95(X,Y) get_csv_string((X),(Y),95)
+#define get_csv_bool_pos95(X,Y) get_csv_bool((X),(Y),95)
+#define get_csv_int_pos95(X,Y) get_csv_int((X),(Y),95)
+#define get_csv_llong_pos95(X,Y) get_csv_llong((X),(Y),95)
+#define get_csv_float_pos95(X,Y) get_csv_float((X),(Y),95)
+#define get_csv_uint_pos96(X,Y) get_csv_uint((X),(Y),96)
+#define get_csv_ullong_pos96(X,Y) get_csv_ullong((X),(Y),96)
+#define get_csv_ip_pos96(X,Y) get_csv_ip((X),(Y),96)
+#define get_csv_ipv6_pos96(X,Y) get_csv_ipv6((X),(Y),96)
+#define get_csv_string_pos96(X,Y) get_csv_string((X),(Y),96)
+#define get_csv_v_str_pos96(X,Y) get_csv_string((X),(Y),96)
+#define get_csv_bool_pos96(X,Y) get_csv_bool((X),(Y),96)
+#define get_csv_int_pos96(X,Y) get_csv_int((X),(Y),96)
+#define get_csv_llong_pos96(X,Y) get_csv_llong((X),(Y),96)
+#define get_csv_float_pos96(X,Y) get_csv_float((X),(Y),96)
+#define get_csv_uint_pos97(X,Y) get_csv_uint((X),(Y),97)
+#define get_csv_ullong_pos97(X,Y) get_csv_ullong((X),(Y),97)
+#define get_csv_ip_pos97(X,Y) get_csv_ip((X),(Y),97)
+#define get_csv_ipv6_pos97(X,Y) get_csv_ipv6((X),(Y),97)
+#define get_csv_string_pos97(X,Y) get_csv_string((X),(Y),97)
+#define get_csv_v_str_pos97(X,Y) get_csv_string((X),(Y),97)
+#define get_csv_bool_pos97(X,Y) get_csv_bool((X),(Y),97)
+#define get_csv_int_pos97(X,Y) get_csv_int((X),(Y),97)
+#define get_csv_llong_pos97(X,Y) get_csv_llong((X),(Y),97)
+#define get_csv_float_pos97(X,Y) get_csv_float((X),(Y),97)
+#define get_csv_uint_pos98(X,Y) get_csv_uint((X),(Y),98)
+#define get_csv_ullong_pos98(X,Y) get_csv_ullong((X),(Y),98)
+#define get_csv_ip_pos98(X,Y) get_csv_ip((X),(Y),98)
+#define get_csv_ipv6_pos98(X,Y) get_csv_ipv6((X),(Y),98)
+#define get_csv_string_pos98(X,Y) get_csv_string((X),(Y),98)
+#define get_csv_v_str_pos98(X,Y) get_csv_string((X),(Y),98)
+#define get_csv_bool_pos98(X,Y) get_csv_bool((X),(Y),98)
+#define get_csv_int_pos98(X,Y) get_csv_int((X),(Y),98)
+#define get_csv_llong_pos98(X,Y) get_csv_llong((X),(Y),98)
+#define get_csv_float_pos98(X,Y) get_csv_float((X),(Y),98)
+#define get_csv_uint_pos99(X,Y) get_csv_uint((X),(Y),99)
+#define get_csv_ullong_pos99(X,Y) get_csv_ullong((X),(Y),99)
+#define get_csv_ip_pos99(X,Y) get_csv_ip((X),(Y),99)
+#define get_csv_ipv6_pos99(X,Y) get_csv_ipv6((X),(Y),99)
+#define get_csv_string_pos99(X,Y) get_csv_string((X),(Y),99)
+#define get_csv_v_str_pos99(X,Y) get_csv_string((X),(Y),99)
+#define get_csv_bool_pos99(X,Y) get_csv_bool((X),(Y),99)
+#define get_csv_int_pos99(X,Y) get_csv_int((X),(Y),99)
+#define get_csv_llong_pos99(X,Y) get_csv_llong((X),(Y),99)
+#define get_csv_float_pos99(X,Y) get_csv_float((X),(Y),99)
+#define get_csv_uint_pos100(X,Y) get_csv_uint((X),(Y),100)
+#define get_csv_ullong_pos100(X,Y) get_csv_ullong((X),(Y),100)
+#define get_csv_ip_pos100(X,Y) get_csv_ip((X),(Y),100)
+#define get_csv_ipv6_pos100(X,Y) get_csv_ipv6((X),(Y),100)
+#define get_csv_string_pos100(X,Y) get_csv_string((X),(Y),100)
+#define get_csv_v_str_pos100(X,Y) get_csv_string((X),(Y),100)
+#define get_csv_bool_pos100(X,Y) get_csv_bool((X),(Y),100)
+#define get_csv_int_pos100(X,Y) get_csv_int((X),(Y),100)
+#define get_csv_llong_pos100(X,Y) get_csv_llong((X),(Y),100)
+#define get_csv_float_pos100(X,Y) get_csv_float((X),(Y),100)
+#define get_csv_uint_pos101(X,Y) get_csv_uint((X),(Y),101)
+#define get_csv_ullong_pos101(X,Y) get_csv_ullong((X),(Y),101)
+#define get_csv_ip_pos101(X,Y) get_csv_ip((X),(Y),101)
+#define get_csv_ipv6_pos101(X,Y) get_csv_ipv6((X),(Y),101)
+#define get_csv_string_pos101(X,Y) get_csv_string((X),(Y),101)
+#define get_csv_v_str_pos101(X,Y) get_csv_string((X),(Y),101)
+#define get_csv_bool_pos101(X,Y) get_csv_bool((X),(Y),101)
+#define get_csv_int_pos101(X,Y) get_csv_int((X),(Y),101)
+#define get_csv_llong_pos101(X,Y) get_csv_llong((X),(Y),101)
+#define get_csv_float_pos101(X,Y) get_csv_float((X),(Y),101)
+#define get_csv_uint_pos102(X,Y) get_csv_uint((X),(Y),102)
+#define get_csv_ullong_pos102(X,Y) get_csv_ullong((X),(Y),102)
+#define get_csv_ip_pos102(X,Y) get_csv_ip((X),(Y),102)
+#define get_csv_ipv6_pos102(X,Y) get_csv_ipv6((X),(Y),102)
+#define get_csv_string_pos102(X,Y) get_csv_string((X),(Y),102)
+#define get_csv_v_str_pos102(X,Y) get_csv_string((X),(Y),102)
+#define get_csv_bool_pos102(X,Y) get_csv_bool((X),(Y),102)
+#define get_csv_int_pos102(X,Y) get_csv_int((X),(Y),102)
+#define get_csv_llong_pos102(X,Y) get_csv_llong((X),(Y),102)
+#define get_csv_float_pos102(X,Y) get_csv_float((X),(Y),102)
+#define get_csv_uint_pos103(X,Y) get_csv_uint((X),(Y),103)
+#define get_csv_ullong_pos103(X,Y) get_csv_ullong((X),(Y),103)
+#define get_csv_ip_pos103(X,Y) get_csv_ip((X),(Y),103)
+#define get_csv_ipv6_pos103(X,Y) get_csv_ipv6((X),(Y),103)
+#define get_csv_string_pos103(X,Y) get_csv_string((X),(Y),103)
+#define get_csv_v_str_pos103(X,Y) get_csv_string((X),(Y),103)
+#define get_csv_bool_pos103(X,Y) get_csv_bool((X),(Y),103)
+#define get_csv_int_pos103(X,Y) get_csv_int((X),(Y),103)
+#define get_csv_llong_pos103(X,Y) get_csv_llong((X),(Y),103)
+#define get_csv_float_pos103(X,Y) get_csv_float((X),(Y),103)
+#define get_csv_uint_pos104(X,Y) get_csv_uint((X),(Y),104)
+#define get_csv_ullong_pos104(X,Y) get_csv_ullong((X),(Y),104)
+#define get_csv_ip_pos104(X,Y) get_csv_ip((X),(Y),104)
+#define get_csv_ipv6_pos104(X,Y) get_csv_ipv6((X),(Y),104)
+#define get_csv_string_pos104(X,Y) get_csv_string((X),(Y),104)
+#define get_csv_v_str_pos104(X,Y) get_csv_string((X),(Y),104)
+#define get_csv_bool_pos104(X,Y) get_csv_bool((X),(Y),104)
+#define get_csv_int_pos104(X,Y) get_csv_int((X),(Y),104)
+#define get_csv_llong_pos104(X,Y) get_csv_llong((X),(Y),104)
+#define get_csv_float_pos104(X,Y) get_csv_float((X),(Y),104)
+#define get_csv_uint_pos105(X,Y) get_csv_uint((X),(Y),105)
+#define get_csv_ullong_pos105(X,Y) get_csv_ullong((X),(Y),105)
+#define get_csv_ip_pos105(X,Y) get_csv_ip((X),(Y),105)
+#define get_csv_ipv6_pos105(X,Y) get_csv_ipv6((X),(Y),105)
+#define get_csv_string_pos105(X,Y) get_csv_string((X),(Y),105)
+#define get_csv_v_str_pos105(X,Y) get_csv_string((X),(Y),105)
+#define get_csv_bool_pos105(X,Y) get_csv_bool((X),(Y),105)
+#define get_csv_int_pos105(X,Y) get_csv_int((X),(Y),105)
+#define get_csv_llong_pos105(X,Y) get_csv_llong((X),(Y),105)
+#define get_csv_float_pos105(X,Y) get_csv_float((X),(Y),105)
+#define get_csv_uint_pos106(X,Y) get_csv_uint((X),(Y),106)
+#define get_csv_ullong_pos106(X,Y) get_csv_ullong((X),(Y),106)
+#define get_csv_ip_pos106(X,Y) get_csv_ip((X),(Y),106)
+#define get_csv_ipv6_pos106(X,Y) get_csv_ipv6((X),(Y),106)
+#define get_csv_string_pos106(X,Y) get_csv_string((X),(Y),106)
+#define get_csv_v_str_pos106(X,Y) get_csv_string((X),(Y),106)
+#define get_csv_bool_pos106(X,Y) get_csv_bool((X),(Y),106)
+#define get_csv_int_pos106(X,Y) get_csv_int((X),(Y),106)
+#define get_csv_llong_pos106(X,Y) get_csv_llong((X),(Y),106)
+#define get_csv_float_pos106(X,Y) get_csv_float((X),(Y),106)
+#define get_csv_uint_pos107(X,Y) get_csv_uint((X),(Y),107)
+#define get_csv_ullong_pos107(X,Y) get_csv_ullong((X),(Y),107)
+#define get_csv_ip_pos107(X,Y) get_csv_ip((X),(Y),107)
+#define get_csv_ipv6_pos107(X,Y) get_csv_ipv6((X),(Y),107)
+#define get_csv_string_pos107(X,Y) get_csv_string((X),(Y),107)
+#define get_csv_v_str_pos107(X,Y) get_csv_string((X),(Y),107)
+#define get_csv_bool_pos107(X,Y) get_csv_bool((X),(Y),107)
+#define get_csv_int_pos107(X,Y) get_csv_int((X),(Y),107)
+#define get_csv_llong_pos107(X,Y) get_csv_llong((X),(Y),107)
+#define get_csv_float_pos107(X,Y) get_csv_float((X),(Y),107)
+#define get_csv_uint_pos108(X,Y) get_csv_uint((X),(Y),108)
+#define get_csv_ullong_pos108(X,Y) get_csv_ullong((X),(Y),108)
+#define get_csv_ip_pos108(X,Y) get_csv_ip((X),(Y),108)
+#define get_csv_ipv6_pos108(X,Y) get_csv_ipv6((X),(Y),108)
+#define get_csv_string_pos108(X,Y) get_csv_string((X),(Y),108)
+#define get_csv_v_str_pos108(X,Y) get_csv_string((X),(Y),108)
+#define get_csv_bool_pos108(X,Y) get_csv_bool((X),(Y),108)
+#define get_csv_int_pos108(X,Y) get_csv_int((X),(Y),108)
+#define get_csv_llong_pos108(X,Y) get_csv_llong((X),(Y),108)
+#define get_csv_float_pos108(X,Y) get_csv_float((X),(Y),108)
+#define get_csv_uint_pos109(X,Y) get_csv_uint((X),(Y),109)
+#define get_csv_ullong_pos109(X,Y) get_csv_ullong((X),(Y),109)
+#define get_csv_ip_pos109(X,Y) get_csv_ip((X),(Y),109)
+#define get_csv_ipv6_pos109(X,Y) get_csv_ipv6((X),(Y),109)
+#define get_csv_string_pos109(X,Y) get_csv_string((X),(Y),109)
+#define get_csv_v_str_pos109(X,Y) get_csv_string((X),(Y),109)
+#define get_csv_bool_pos109(X,Y) get_csv_bool((X),(Y),109)
+#define get_csv_int_pos109(X,Y) get_csv_int((X),(Y),109)
+#define get_csv_llong_pos109(X,Y) get_csv_llong((X),(Y),109)
+#define get_csv_float_pos109(X,Y) get_csv_float((X),(Y),109)
+#define get_csv_uint_pos110(X,Y) get_csv_uint((X),(Y),110)
+#define get_csv_ullong_pos110(X,Y) get_csv_ullong((X),(Y),110)
+#define get_csv_ip_pos110(X,Y) get_csv_ip((X),(Y),110)
+#define get_csv_ipv6_pos110(X,Y) get_csv_ipv6((X),(Y),110)
+#define get_csv_string_pos110(X,Y) get_csv_string((X),(Y),110)
+#define get_csv_v_str_pos110(X,Y) get_csv_string((X),(Y),110)
+#define get_csv_bool_pos110(X,Y) get_csv_bool((X),(Y),110)
+#define get_csv_int_pos110(X,Y) get_csv_int((X),(Y),110)
+#define get_csv_llong_pos110(X,Y) get_csv_llong((X),(Y),110)
+#define get_csv_float_pos110(X,Y) get_csv_float((X),(Y),110)
+#define get_csv_uint_pos111(X,Y) get_csv_uint((X),(Y),111)
+#define get_csv_ullong_pos111(X,Y) get_csv_ullong((X),(Y),111)
+#define get_csv_ip_pos111(X,Y) get_csv_ip((X),(Y),111)
+#define get_csv_ipv6_pos111(X,Y) get_csv_ipv6((X),(Y),111)
+#define get_csv_string_pos111(X,Y) get_csv_string((X),(Y),111)
+#define get_csv_v_str_pos111(X,Y) get_csv_string((X),(Y),111)
+#define get_csv_bool_pos111(X,Y) get_csv_bool((X),(Y),111)
+#define get_csv_int_pos111(X,Y) get_csv_int((X),(Y),111)
+#define get_csv_llong_pos111(X,Y) get_csv_llong((X),(Y),111)
+#define get_csv_float_pos111(X,Y) get_csv_float((X),(Y),111)
+#define get_csv_uint_pos112(X,Y) get_csv_uint((X),(Y),112)
+#define get_csv_ullong_pos112(X,Y) get_csv_ullong((X),(Y),112)
+#define get_csv_ip_pos112(X,Y) get_csv_ip((X),(Y),112)
+#define get_csv_ipv6_pos112(X,Y) get_csv_ipv6((X),(Y),112)
+#define get_csv_string_pos112(X,Y) get_csv_string((X),(Y),112)
+#define get_csv_v_str_pos112(X,Y) get_csv_string((X),(Y),112)
+#define get_csv_bool_pos112(X,Y) get_csv_bool((X),(Y),112)
+#define get_csv_int_pos112(X,Y) get_csv_int((X),(Y),112)
+#define get_csv_llong_pos112(X,Y) get_csv_llong((X),(Y),112)
+#define get_csv_float_pos112(X,Y) get_csv_float((X),(Y),112)
+#define get_csv_uint_pos113(X,Y) get_csv_uint((X),(Y),113)
+#define get_csv_ullong_pos113(X,Y) get_csv_ullong((X),(Y),113)
+#define get_csv_ip_pos113(X,Y) get_csv_ip((X),(Y),113)
+#define get_csv_ipv6_pos113(X,Y) get_csv_ipv6((X),(Y),113)
+#define get_csv_string_pos113(X,Y) get_csv_string((X),(Y),113)
+#define get_csv_v_str_pos113(X,Y) get_csv_string((X),(Y),113)
+#define get_csv_bool_pos113(X,Y) get_csv_bool((X),(Y),113)
+#define get_csv_int_pos113(X,Y) get_csv_int((X),(Y),113)
+#define get_csv_llong_pos113(X,Y) get_csv_llong((X),(Y),113)
+#define get_csv_float_pos113(X,Y) get_csv_float((X),(Y),113)
+#define get_csv_uint_pos114(X,Y) get_csv_uint((X),(Y),114)
+#define get_csv_ullong_pos114(X,Y) get_csv_ullong((X),(Y),114)
+#define get_csv_ip_pos114(X,Y) get_csv_ip((X),(Y),114)
+#define get_csv_ipv6_pos114(X,Y) get_csv_ipv6((X),(Y),114)
+#define get_csv_string_pos114(X,Y) get_csv_string((X),(Y),114)
+#define get_csv_v_str_pos114(X,Y) get_csv_string((X),(Y),114)
+#define get_csv_bool_pos114(X,Y) get_csv_bool((X),(Y),114)
+#define get_csv_int_pos114(X,Y) get_csv_int((X),(Y),114)
+#define get_csv_llong_pos114(X,Y) get_csv_llong((X),(Y),114)
+#define get_csv_float_pos114(X,Y) get_csv_float((X),(Y),114)
+#define get_csv_uint_pos115(X,Y) get_csv_uint((X),(Y),115)
+#define get_csv_ullong_pos115(X,Y) get_csv_ullong((X),(Y),115)
+#define get_csv_ip_pos115(X,Y) get_csv_ip((X),(Y),115)
+#define get_csv_ipv6_pos115(X,Y) get_csv_ipv6((X),(Y),115)
+#define get_csv_string_pos115(X,Y) get_csv_string((X),(Y),115)
+#define get_csv_v_str_pos115(X,Y) get_csv_string((X),(Y),115)
+#define get_csv_bool_pos115(X,Y) get_csv_bool((X),(Y),115)
+#define get_csv_int_pos115(X,Y) get_csv_int((X),(Y),115)
+#define get_csv_llong_pos115(X,Y) get_csv_llong((X),(Y),115)
+#define get_csv_float_pos115(X,Y) get_csv_float((X),(Y),115)
+#define get_csv_uint_pos116(X,Y) get_csv_uint((X),(Y),116)
+#define get_csv_ullong_pos116(X,Y) get_csv_ullong((X),(Y),116)
+#define get_csv_ip_pos116(X,Y) get_csv_ip((X),(Y),116)
+#define get_csv_ipv6_pos116(X,Y) get_csv_ipv6((X),(Y),116)
+#define get_csv_string_pos116(X,Y) get_csv_string((X),(Y),116)
+#define get_csv_v_str_pos116(X,Y) get_csv_string((X),(Y),116)
+#define get_csv_bool_pos116(X,Y) get_csv_bool((X),(Y),116)
+#define get_csv_int_pos116(X,Y) get_csv_int((X),(Y),116)
+#define get_csv_llong_pos116(X,Y) get_csv_llong((X),(Y),116)
+#define get_csv_float_pos116(X,Y) get_csv_float((X),(Y),116)
+#define get_csv_uint_pos117(X,Y) get_csv_uint((X),(Y),117)
+#define get_csv_ullong_pos117(X,Y) get_csv_ullong((X),(Y),117)
+#define get_csv_ip_pos117(X,Y) get_csv_ip((X),(Y),117)
+#define get_csv_ipv6_pos117(X,Y) get_csv_ipv6((X),(Y),117)
+#define get_csv_string_pos117(X,Y) get_csv_string((X),(Y),117)
+#define get_csv_v_str_pos117(X,Y) get_csv_string((X),(Y),117)
+#define get_csv_bool_pos117(X,Y) get_csv_bool((X),(Y),117)
+#define get_csv_int_pos117(X,Y) get_csv_int((X),(Y),117)
+#define get_csv_llong_pos117(X,Y) get_csv_llong((X),(Y),117)
+#define get_csv_float_pos117(X,Y) get_csv_float((X),(Y),117)
+#define get_csv_uint_pos118(X,Y) get_csv_uint((X),(Y),118)
+#define get_csv_ullong_pos118(X,Y) get_csv_ullong((X),(Y),118)
+#define get_csv_ip_pos118(X,Y) get_csv_ip((X),(Y),118)
+#define get_csv_ipv6_pos118(X,Y) get_csv_ipv6((X),(Y),118)
+#define get_csv_string_pos118(X,Y) get_csv_string((X),(Y),118)
+#define get_csv_v_str_pos118(X,Y) get_csv_string((X),(Y),118)
+#define get_csv_bool_pos118(X,Y) get_csv_bool((X),(Y),118)
+#define get_csv_int_pos118(X,Y) get_csv_int((X),(Y),118)
+#define get_csv_llong_pos118(X,Y) get_csv_llong((X),(Y),118)
+#define get_csv_float_pos118(X,Y) get_csv_float((X),(Y),118)
+#define get_csv_uint_pos119(X,Y) get_csv_uint((X),(Y),119)
+#define get_csv_ullong_pos119(X,Y) get_csv_ullong((X),(Y),119)
+#define get_csv_ip_pos119(X,Y) get_csv_ip((X),(Y),119)
+#define get_csv_ipv6_pos119(X,Y) get_csv_ipv6((X),(Y),119)
+#define get_csv_string_pos119(X,Y) get_csv_string((X),(Y),119)
+#define get_csv_v_str_pos119(X,Y) get_csv_string((X),(Y),119)
+#define get_csv_bool_pos119(X,Y) get_csv_bool((X),(Y),119)
+#define get_csv_int_pos119(X,Y) get_csv_int((X),(Y),119)
+#define get_csv_llong_pos119(X,Y) get_csv_llong((X),(Y),119)
+#define get_csv_float_pos119(X,Y) get_csv_float((X),(Y),119)
+#define get_csv_uint_pos120(X,Y) get_csv_uint((X),(Y),120)
+#define get_csv_ullong_pos120(X,Y) get_csv_ullong((X),(Y),120)
+#define get_csv_ip_pos120(X,Y) get_csv_ip((X),(Y),120)
+#define get_csv_ipv6_pos120(X,Y) get_csv_ipv6((X),(Y),120)
+#define get_csv_string_pos120(X,Y) get_csv_string((X),(Y),120)
+#define get_csv_v_str_pos120(X,Y) get_csv_string((X),(Y),120)
+#define get_csv_bool_pos120(X,Y) get_csv_bool((X),(Y),120)
+#define get_csv_int_pos120(X,Y) get_csv_int((X),(Y),120)
+#define get_csv_llong_pos120(X,Y) get_csv_llong((X),(Y),120)
+#define get_csv_float_pos120(X,Y) get_csv_float((X),(Y),120)
+#define get_csv_uint_pos121(X,Y) get_csv_uint((X),(Y),121)
+#define get_csv_ullong_pos121(X,Y) get_csv_ullong((X),(Y),121)
+#define get_csv_ip_pos121(X,Y) get_csv_ip((X),(Y),121)
+#define get_csv_ipv6_pos121(X,Y) get_csv_ipv6((X),(Y),121)
+#define get_csv_string_pos121(X,Y) get_csv_string((X),(Y),121)
+#define get_csv_v_str_pos121(X,Y) get_csv_string((X),(Y),121)
+#define get_csv_bool_pos121(X,Y) get_csv_bool((X),(Y),121)
+#define get_csv_int_pos121(X,Y) get_csv_int((X),(Y),121)
+#define get_csv_llong_pos121(X,Y) get_csv_llong((X),(Y),121)
+#define get_csv_float_pos121(X,Y) get_csv_float((X),(Y),121)
+#define get_csv_uint_pos122(X,Y) get_csv_uint((X),(Y),122)
+#define get_csv_ullong_pos122(X,Y) get_csv_ullong((X),(Y),122)
+#define get_csv_ip_pos122(X,Y) get_csv_ip((X),(Y),122)
+#define get_csv_ipv6_pos122(X,Y) get_csv_ipv6((X),(Y),122)
+#define get_csv_string_pos122(X,Y) get_csv_string((X),(Y),122)
+#define get_csv_v_str_pos122(X,Y) get_csv_string((X),(Y),122)
+#define get_csv_bool_pos122(X,Y) get_csv_bool((X),(Y),122)
+#define get_csv_int_pos122(X,Y) get_csv_int((X),(Y),122)
+#define get_csv_llong_pos122(X,Y) get_csv_llong((X),(Y),122)
+#define get_csv_float_pos122(X,Y) get_csv_float((X),(Y),122)
+#define get_csv_uint_pos123(X,Y) get_csv_uint((X),(Y),123)
+#define get_csv_ullong_pos123(X,Y) get_csv_ullong((X),(Y),123)
+#define get_csv_ip_pos123(X,Y) get_csv_ip((X),(Y),123)
+#define get_csv_ipv6_pos123(X,Y) get_csv_ipv6((X),(Y),123)
+#define get_csv_string_pos123(X,Y) get_csv_string((X),(Y),123)
+#define get_csv_v_str_pos123(X,Y) get_csv_string((X),(Y),123)
+#define get_csv_bool_pos123(X,Y) get_csv_bool((X),(Y),123)
+#define get_csv_int_pos123(X,Y) get_csv_int((X),(Y),123)
+#define get_csv_llong_pos123(X,Y) get_csv_llong((X),(Y),123)
+#define get_csv_float_pos123(X,Y) get_csv_float((X),(Y),123)
+#define get_csv_uint_pos124(X,Y) get_csv_uint((X),(Y),124)
+#define get_csv_ullong_pos124(X,Y) get_csv_ullong((X),(Y),124)
+#define get_csv_ip_pos124(X,Y) get_csv_ip((X),(Y),124)
+#define get_csv_ipv6_pos124(X,Y) get_csv_ipv6((X),(Y),124)
+#define get_csv_string_pos124(X,Y) get_csv_string((X),(Y),124)
+#define get_csv_v_str_pos124(X,Y) get_csv_string((X),(Y),124)
+#define get_csv_bool_pos124(X,Y) get_csv_bool((X),(Y),124)
+#define get_csv_int_pos124(X,Y) get_csv_int((X),(Y),124)
+#define get_csv_llong_pos124(X,Y) get_csv_llong((X),(Y),124)
+#define get_csv_float_pos124(X,Y) get_csv_float((X),(Y),124)
+#define get_csv_uint_pos125(X,Y) get_csv_uint((X),(Y),125)
+#define get_csv_ullong_pos125(X,Y) get_csv_ullong((X),(Y),125)
+#define get_csv_ip_pos125(X,Y) get_csv_ip((X),(Y),125)
+#define get_csv_ipv6_pos125(X,Y) get_csv_ipv6((X),(Y),125)
+#define get_csv_string_pos125(X,Y) get_csv_string((X),(Y),125)
+#define get_csv_v_str_pos125(X,Y) get_csv_string((X),(Y),125)
+#define get_csv_bool_pos125(X,Y) get_csv_bool((X),(Y),125)
+#define get_csv_int_pos125(X,Y) get_csv_int((X),(Y),125)
+#define get_csv_llong_pos125(X,Y) get_csv_llong((X),(Y),125)
+#define get_csv_float_pos125(X,Y) get_csv_float((X),(Y),125)
+#define get_csv_uint_pos126(X,Y) get_csv_uint((X),(Y),126)
+#define get_csv_ullong_pos126(X,Y) get_csv_ullong((X),(Y),126)
+#define get_csv_ip_pos126(X,Y) get_csv_ip((X),(Y),126)
+#define get_csv_ipv6_pos126(X,Y) get_csv_ipv6((X),(Y),126)
+#define get_csv_string_pos126(X,Y) get_csv_string((X),(Y),126)
+#define get_csv_v_str_pos126(X,Y) get_csv_string((X),(Y),126)
+#define get_csv_bool_pos126(X,Y) get_csv_bool((X),(Y),126)
+#define get_csv_int_pos126(X,Y) get_csv_int((X),(Y),126)
+#define get_csv_llong_pos126(X,Y) get_csv_llong((X),(Y),126)
+#define get_csv_float_pos126(X,Y) get_csv_float((X),(Y),126)
+#define get_csv_uint_pos127(X,Y) get_csv_uint((X),(Y),127)
+#define get_csv_ullong_pos127(X,Y) get_csv_ullong((X),(Y),127)
+#define get_csv_ip_pos127(X,Y) get_csv_ip((X),(Y),127)
+#define get_csv_ipv6_pos127(X,Y) get_csv_ipv6((X),(Y),127)
+#define get_csv_string_pos127(X,Y) get_csv_string((X),(Y),127)
+#define get_csv_v_str_pos127(X,Y) get_csv_string((X),(Y),127)
+#define get_csv_bool_pos127(X,Y) get_csv_bool((X),(Y),127)
+#define get_csv_int_pos127(X,Y) get_csv_int((X),(Y),127)
+#define get_csv_llong_pos127(X,Y) get_csv_llong((X),(Y),127)
+#define get_csv_float_pos127(X,Y) get_csv_float((X),(Y),127)
+#define get_csv_uint_pos128(X,Y) get_csv_uint((X),(Y),128)
+#define get_csv_ullong_pos128(X,Y) get_csv_ullong((X),(Y),128)
+#define get_csv_ip_pos128(X,Y) get_csv_ip((X),(Y),128)
+#define get_csv_ipv6_pos128(X,Y) get_csv_ipv6((X),(Y),128)
+#define get_csv_string_pos128(X,Y) get_csv_string((X),(Y),128)
+#define get_csv_v_str_pos128(X,Y) get_csv_string((X),(Y),128)
+#define get_csv_bool_pos128(X,Y) get_csv_bool((X),(Y),128)
+#define get_csv_int_pos128(X,Y) get_csv_int((X),(Y),128)
+#define get_csv_llong_pos128(X,Y) get_csv_llong((X),(Y),128)
+#define get_csv_float_pos128(X,Y) get_csv_float((X),(Y),128)
+#define get_csv_uint_pos129(X,Y) get_csv_uint((X),(Y),129)
+#define get_csv_ullong_pos129(X,Y) get_csv_ullong((X),(Y),129)
+#define get_csv_ip_pos129(X,Y) get_csv_ip((X),(Y),129)
+#define get_csv_ipv6_pos129(X,Y) get_csv_ipv6((X),(Y),129)
+#define get_csv_string_pos129(X,Y) get_csv_string((X),(Y),129)
+#define get_csv_v_str_pos129(X,Y) get_csv_string((X),(Y),129)
+#define get_csv_bool_pos129(X,Y) get_csv_bool((X),(Y),129)
+#define get_csv_int_pos129(X,Y) get_csv_int((X),(Y),129)
+#define get_csv_llong_pos129(X,Y) get_csv_llong((X),(Y),129)
+#define get_csv_float_pos129(X,Y) get_csv_float((X),(Y),129)
+#define get_csv_uint_pos130(X,Y) get_csv_uint((X),(Y),130)
+#define get_csv_ullong_pos130(X,Y) get_csv_ullong((X),(Y),130)
+#define get_csv_ip_pos130(X,Y) get_csv_ip((X),(Y),130)
+#define get_csv_ipv6_pos130(X,Y) get_csv_ipv6((X),(Y),130)
+#define get_csv_string_pos130(X,Y) get_csv_string((X),(Y),130)
+#define get_csv_v_str_pos130(X,Y) get_csv_string((X),(Y),130)
+#define get_csv_bool_pos130(X,Y) get_csv_bool((X),(Y),130)
+#define get_csv_int_pos130(X,Y) get_csv_int((X),(Y),130)
+#define get_csv_llong_pos130(X,Y) get_csv_llong((X),(Y),130)
+#define get_csv_float_pos130(X,Y) get_csv_float((X),(Y),130)
+#define get_csv_uint_pos131(X,Y) get_csv_uint((X),(Y),131)
+#define get_csv_ullong_pos131(X,Y) get_csv_ullong((X),(Y),131)
+#define get_csv_ip_pos131(X,Y) get_csv_ip((X),(Y),131)
+#define get_csv_ipv6_pos131(X,Y) get_csv_ipv6((X),(Y),131)
+#define get_csv_string_pos131(X,Y) get_csv_string((X),(Y),131)
+#define get_csv_v_str_pos131(X,Y) get_csv_string((X),(Y),131)
+#define get_csv_bool_pos131(X,Y) get_csv_bool((X),(Y),131)
+#define get_csv_int_pos131(X,Y) get_csv_int((X),(Y),131)
+#define get_csv_llong_pos131(X,Y) get_csv_llong((X),(Y),131)
+#define get_csv_float_pos131(X,Y) get_csv_float((X),(Y),131)
+#define get_csv_uint_pos132(X,Y) get_csv_uint((X),(Y),132)
+#define get_csv_ullong_pos132(X,Y) get_csv_ullong((X),(Y),132)
+#define get_csv_ip_pos132(X,Y) get_csv_ip((X),(Y),132)
+#define get_csv_ipv6_pos132(X,Y) get_csv_ipv6((X),(Y),132)
+#define get_csv_string_pos132(X,Y) get_csv_string((X),(Y),132)
+#define get_csv_v_str_pos132(X,Y) get_csv_string((X),(Y),132)
+#define get_csv_bool_pos132(X,Y) get_csv_bool((X),(Y),132)
+#define get_csv_int_pos132(X,Y) get_csv_int((X),(Y),132)
+#define get_csv_llong_pos132(X,Y) get_csv_llong((X),(Y),132)
+#define get_csv_float_pos132(X,Y) get_csv_float((X),(Y),132)
+#define get_csv_uint_pos133(X,Y) get_csv_uint((X),(Y),133)
+#define get_csv_ullong_pos133(X,Y) get_csv_ullong((X),(Y),133)
+#define get_csv_ip_pos133(X,Y) get_csv_ip((X),(Y),133)
+#define get_csv_ipv6_pos133(X,Y) get_csv_ipv6((X),(Y),133)
+#define get_csv_string_pos133(X,Y) get_csv_string((X),(Y),133)
+#define get_csv_v_str_pos133(X,Y) get_csv_string((X),(Y),133)
+#define get_csv_bool_pos133(X,Y) get_csv_bool((X),(Y),133)
+#define get_csv_int_pos133(X,Y) get_csv_int((X),(Y),133)
+#define get_csv_llong_pos133(X,Y) get_csv_llong((X),(Y),133)
+#define get_csv_float_pos133(X,Y) get_csv_float((X),(Y),133)
+#define get_csv_uint_pos134(X,Y) get_csv_uint((X),(Y),134)
+#define get_csv_ullong_pos134(X,Y) get_csv_ullong((X),(Y),134)
+#define get_csv_ip_pos134(X,Y) get_csv_ip((X),(Y),134)
+#define get_csv_ipv6_pos134(X,Y) get_csv_ipv6((X),(Y),134)
+#define get_csv_string_pos134(X,Y) get_csv_string((X),(Y),134)
+#define get_csv_v_str_pos134(X,Y) get_csv_string((X),(Y),134)
+#define get_csv_bool_pos134(X,Y) get_csv_bool((X),(Y),134)
+#define get_csv_int_pos134(X,Y) get_csv_int((X),(Y),134)
+#define get_csv_llong_pos134(X,Y) get_csv_llong((X),(Y),134)
+#define get_csv_float_pos134(X,Y) get_csv_float((X),(Y),134)
+#define get_csv_uint_pos135(X,Y) get_csv_uint((X),(Y),135)
+#define get_csv_ullong_pos135(X,Y) get_csv_ullong((X),(Y),135)
+#define get_csv_ip_pos135(X,Y) get_csv_ip((X),(Y),135)
+#define get_csv_ipv6_pos135(X,Y) get_csv_ipv6((X),(Y),135)
+#define get_csv_string_pos135(X,Y) get_csv_string((X),(Y),135)
+#define get_csv_v_str_pos135(X,Y) get_csv_string((X),(Y),135)
+#define get_csv_bool_pos135(X,Y) get_csv_bool((X),(Y),135)
+#define get_csv_int_pos135(X,Y) get_csv_int((X),(Y),135)
+#define get_csv_llong_pos135(X,Y) get_csv_llong((X),(Y),135)
+#define get_csv_float_pos135(X,Y) get_csv_float((X),(Y),135)
+#define get_csv_uint_pos136(X,Y) get_csv_uint((X),(Y),136)
+#define get_csv_ullong_pos136(X,Y) get_csv_ullong((X),(Y),136)
+#define get_csv_ip_pos136(X,Y) get_csv_ip((X),(Y),136)
+#define get_csv_ipv6_pos136(X,Y) get_csv_ipv6((X),(Y),136)
+#define get_csv_string_pos136(X,Y) get_csv_string((X),(Y),136)
+#define get_csv_v_str_pos136(X,Y) get_csv_string((X),(Y),136)
+#define get_csv_bool_pos136(X,Y) get_csv_bool((X),(Y),136)
+#define get_csv_int_pos136(X,Y) get_csv_int((X),(Y),136)
+#define get_csv_llong_pos136(X,Y) get_csv_llong((X),(Y),136)
+#define get_csv_float_pos136(X,Y) get_csv_float((X),(Y),136)
+#define get_csv_uint_pos137(X,Y) get_csv_uint((X),(Y),137)
+#define get_csv_ullong_pos137(X,Y) get_csv_ullong((X),(Y),137)
+#define get_csv_ip_pos137(X,Y) get_csv_ip((X),(Y),137)
+#define get_csv_ipv6_pos137(X,Y) get_csv_ipv6((X),(Y),137)
+#define get_csv_string_pos137(X,Y) get_csv_string((X),(Y),137)
+#define get_csv_v_str_pos137(X,Y) get_csv_string((X),(Y),137)
+#define get_csv_bool_pos137(X,Y) get_csv_bool((X),(Y),137)
+#define get_csv_int_pos137(X,Y) get_csv_int((X),(Y),137)
+#define get_csv_llong_pos137(X,Y) get_csv_llong((X),(Y),137)
+#define get_csv_float_pos137(X,Y) get_csv_float((X),(Y),137)
+#define get_csv_uint_pos138(X,Y) get_csv_uint((X),(Y),138)
+#define get_csv_ullong_pos138(X,Y) get_csv_ullong((X),(Y),138)
+#define get_csv_ip_pos138(X,Y) get_csv_ip((X),(Y),138)
+#define get_csv_ipv6_pos138(X,Y) get_csv_ipv6((X),(Y),138)
+#define get_csv_string_pos138(X,Y) get_csv_string((X),(Y),138)
+#define get_csv_v_str_pos138(X,Y) get_csv_string((X),(Y),138)
+#define get_csv_bool_pos138(X,Y) get_csv_bool((X),(Y),138)
+#define get_csv_int_pos138(X,Y) get_csv_int((X),(Y),138)
+#define get_csv_llong_pos138(X,Y) get_csv_llong((X),(Y),138)
+#define get_csv_float_pos138(X,Y) get_csv_float((X),(Y),138)
+#define get_csv_uint_pos139(X,Y) get_csv_uint((X),(Y),139)
+#define get_csv_ullong_pos139(X,Y) get_csv_ullong((X),(Y),139)
+#define get_csv_ip_pos139(X,Y) get_csv_ip((X),(Y),139)
+#define get_csv_ipv6_pos139(X,Y) get_csv_ipv6((X),(Y),139)
+#define get_csv_string_pos139(X,Y) get_csv_string((X),(Y),139)
+#define get_csv_v_str_pos139(X,Y) get_csv_string((X),(Y),139)
+#define get_csv_bool_pos139(X,Y) get_csv_bool((X),(Y),139)
+#define get_csv_int_pos139(X,Y) get_csv_int((X),(Y),139)
+#define get_csv_llong_pos139(X,Y) get_csv_llong((X),(Y),139)
+#define get_csv_float_pos139(X,Y) get_csv_float((X),(Y),139)
+#define get_csv_uint_pos140(X,Y) get_csv_uint((X),(Y),140)
+#define get_csv_ullong_pos140(X,Y) get_csv_ullong((X),(Y),140)
+#define get_csv_ip_pos140(X,Y) get_csv_ip((X),(Y),140)
+#define get_csv_ipv6_pos140(X,Y) get_csv_ipv6((X),(Y),140)
+#define get_csv_string_pos140(X,Y) get_csv_string((X),(Y),140)
+#define get_csv_v_str_pos140(X,Y) get_csv_string((X),(Y),140)
+#define get_csv_bool_pos140(X,Y) get_csv_bool((X),(Y),140)
+#define get_csv_int_pos140(X,Y) get_csv_int((X),(Y),140)
+#define get_csv_llong_pos140(X,Y) get_csv_llong((X),(Y),140)
+#define get_csv_float_pos140(X,Y) get_csv_float((X),(Y),140)
+#define get_csv_uint_pos141(X,Y) get_csv_uint((X),(Y),141)
+#define get_csv_ullong_pos141(X,Y) get_csv_ullong((X),(Y),141)
+#define get_csv_ip_pos141(X,Y) get_csv_ip((X),(Y),141)
+#define get_csv_ipv6_pos141(X,Y) get_csv_ipv6((X),(Y),141)
+#define get_csv_string_pos141(X,Y) get_csv_string((X),(Y),141)
+#define get_csv_v_str_pos141(X,Y) get_csv_string((X),(Y),141)
+#define get_csv_bool_pos141(X,Y) get_csv_bool((X),(Y),141)
+#define get_csv_int_pos141(X,Y) get_csv_int((X),(Y),141)
+#define get_csv_llong_pos141(X,Y) get_csv_llong((X),(Y),141)
+#define get_csv_float_pos141(X,Y) get_csv_float((X),(Y),141)
+#define get_csv_uint_pos142(X,Y) get_csv_uint((X),(Y),142)
+#define get_csv_ullong_pos142(X,Y) get_csv_ullong((X),(Y),142)
+#define get_csv_ip_pos142(X,Y) get_csv_ip((X),(Y),142)
+#define get_csv_ipv6_pos142(X,Y) get_csv_ipv6((X),(Y),142)
+#define get_csv_string_pos142(X,Y) get_csv_string((X),(Y),142)
+#define get_csv_v_str_pos142(X,Y) get_csv_string((X),(Y),142)
+#define get_csv_bool_pos142(X,Y) get_csv_bool((X),(Y),142)
+#define get_csv_int_pos142(X,Y) get_csv_int((X),(Y),142)
+#define get_csv_llong_pos142(X,Y) get_csv_llong((X),(Y),142)
+#define get_csv_float_pos142(X,Y) get_csv_float((X),(Y),142)
+#define get_csv_uint_pos143(X,Y) get_csv_uint((X),(Y),143)
+#define get_csv_ullong_pos143(X,Y) get_csv_ullong((X),(Y),143)
+#define get_csv_ip_pos143(X,Y) get_csv_ip((X),(Y),143)
+#define get_csv_ipv6_pos143(X,Y) get_csv_ipv6((X),(Y),143)
+#define get_csv_string_pos143(X,Y) get_csv_string((X),(Y),143)
+#define get_csv_v_str_pos143(X,Y) get_csv_string((X),(Y),143)
+#define get_csv_bool_pos143(X,Y) get_csv_bool((X),(Y),143)
+#define get_csv_int_pos143(X,Y) get_csv_int((X),(Y),143)
+#define get_csv_llong_pos143(X,Y) get_csv_llong((X),(Y),143)
+#define get_csv_float_pos143(X,Y) get_csv_float((X),(Y),143)
+#define get_csv_uint_pos144(X,Y) get_csv_uint((X),(Y),144)
+#define get_csv_ullong_pos144(X,Y) get_csv_ullong((X),(Y),144)
+#define get_csv_ip_pos144(X,Y) get_csv_ip((X),(Y),144)
+#define get_csv_ipv6_pos144(X,Y) get_csv_ipv6((X),(Y),144)
+#define get_csv_string_pos144(X,Y) get_csv_string((X),(Y),144)
+#define get_csv_v_str_pos144(X,Y) get_csv_string((X),(Y),144)
+#define get_csv_bool_pos144(X,Y) get_csv_bool((X),(Y),144)
+#define get_csv_int_pos144(X,Y) get_csv_int((X),(Y),144)
+#define get_csv_llong_pos144(X,Y) get_csv_llong((X),(Y),144)
+#define get_csv_float_pos144(X,Y) get_csv_float((X),(Y),144)
+#define get_csv_uint_pos145(X,Y) get_csv_uint((X),(Y),145)
+#define get_csv_ullong_pos145(X,Y) get_csv_ullong((X),(Y),145)
+#define get_csv_ip_pos145(X,Y) get_csv_ip((X),(Y),145)
+#define get_csv_ipv6_pos145(X,Y) get_csv_ipv6((X),(Y),145)
+#define get_csv_string_pos145(X,Y) get_csv_string((X),(Y),145)
+#define get_csv_v_str_pos145(X,Y) get_csv_string((X),(Y),145)
+#define get_csv_bool_pos145(X,Y) get_csv_bool((X),(Y),145)
+#define get_csv_int_pos145(X,Y) get_csv_int((X),(Y),145)
+#define get_csv_llong_pos145(X,Y) get_csv_llong((X),(Y),145)
+#define get_csv_float_pos145(X,Y) get_csv_float((X),(Y),145)
+#define get_csv_uint_pos146(X,Y) get_csv_uint((X),(Y),146)
+#define get_csv_ullong_pos146(X,Y) get_csv_ullong((X),(Y),146)
+#define get_csv_ip_pos146(X,Y) get_csv_ip((X),(Y),146)
+#define get_csv_ipv6_pos146(X,Y) get_csv_ipv6((X),(Y),146)
+#define get_csv_string_pos146(X,Y) get_csv_string((X),(Y),146)
+#define get_csv_v_str_pos146(X,Y) get_csv_string((X),(Y),146)
+#define get_csv_bool_pos146(X,Y) get_csv_bool((X),(Y),146)
+#define get_csv_int_pos146(X,Y) get_csv_int((X),(Y),146)
+#define get_csv_llong_pos146(X,Y) get_csv_llong((X),(Y),146)
+#define get_csv_float_pos146(X,Y) get_csv_float((X),(Y),146)
+#define get_csv_uint_pos147(X,Y) get_csv_uint((X),(Y),147)
+#define get_csv_ullong_pos147(X,Y) get_csv_ullong((X),(Y),147)
+#define get_csv_ip_pos147(X,Y) get_csv_ip((X),(Y),147)
+#define get_csv_ipv6_pos147(X,Y) get_csv_ipv6((X),(Y),147)
+#define get_csv_string_pos147(X,Y) get_csv_string((X),(Y),147)
+#define get_csv_v_str_pos147(X,Y) get_csv_string((X),(Y),147)
+#define get_csv_bool_pos147(X,Y) get_csv_bool((X),(Y),147)
+#define get_csv_int_pos147(X,Y) get_csv_int((X),(Y),147)
+#define get_csv_llong_pos147(X,Y) get_csv_llong((X),(Y),147)
+#define get_csv_float_pos147(X,Y) get_csv_float((X),(Y),147)
+#define get_csv_uint_pos148(X,Y) get_csv_uint((X),(Y),148)
+#define get_csv_ullong_pos148(X,Y) get_csv_ullong((X),(Y),148)
+#define get_csv_ip_pos148(X,Y) get_csv_ip((X),(Y),148)
+#define get_csv_ipv6_pos148(X,Y) get_csv_ipv6((X),(Y),148)
+#define get_csv_string_pos148(X,Y) get_csv_string((X),(Y),148)
+#define get_csv_v_str_pos148(X,Y) get_csv_string((X),(Y),148)
+#define get_csv_bool_pos148(X,Y) get_csv_bool((X),(Y),148)
+#define get_csv_int_pos148(X,Y) get_csv_int((X),(Y),148)
+#define get_csv_llong_pos148(X,Y) get_csv_llong((X),(Y),148)
+#define get_csv_float_pos148(X,Y) get_csv_float((X),(Y),148)
+#define get_csv_uint_pos149(X,Y) get_csv_uint((X),(Y),149)
+#define get_csv_ullong_pos149(X,Y) get_csv_ullong((X),(Y),149)
+#define get_csv_ip_pos149(X,Y) get_csv_ip((X),(Y),149)
+#define get_csv_ipv6_pos149(X,Y) get_csv_ipv6((X),(Y),149)
+#define get_csv_string_pos149(X,Y) get_csv_string((X),(Y),149)
+#define get_csv_v_str_pos149(X,Y) get_csv_string((X),(Y),149)
+#define get_csv_bool_pos149(X,Y) get_csv_bool((X),(Y),149)
+#define get_csv_int_pos149(X,Y) get_csv_int((X),(Y),149)
+#define get_csv_llong_pos149(X,Y) get_csv_llong((X),(Y),149)
+#define get_csv_float_pos149(X,Y) get_csv_float((X),(Y),149)
+#define get_csv_uint_pos150(X,Y) get_csv_uint((X),(Y),150)
+#define get_csv_ullong_pos150(X,Y) get_csv_ullong((X),(Y),150)
+#define get_csv_ip_pos150(X,Y) get_csv_ip((X),(Y),150)
+#define get_csv_ipv6_pos150(X,Y) get_csv_ipv6((X),(Y),150)
+#define get_csv_string_pos150(X,Y) get_csv_string((X),(Y),150)
+#define get_csv_v_str_pos150(X,Y) get_csv_string((X),(Y),150)
+#define get_csv_bool_pos150(X,Y) get_csv_bool((X),(Y),150)
+#define get_csv_int_pos150(X,Y) get_csv_int((X),(Y),150)
+#define get_csv_llong_pos150(X,Y) get_csv_llong((X),(Y),150)
+#define get_csv_float_pos150(X,Y) get_csv_float((X),(Y),150)
+#define get_csv_uint_pos151(X,Y) get_csv_uint((X),(Y),151)
+#define get_csv_ullong_pos151(X,Y) get_csv_ullong((X),(Y),151)
+#define get_csv_ip_pos151(X,Y) get_csv_ip((X),(Y),151)
+#define get_csv_ipv6_pos151(X,Y) get_csv_ipv6((X),(Y),151)
+#define get_csv_string_pos151(X,Y) get_csv_string((X),(Y),151)
+#define get_csv_v_str_pos151(X,Y) get_csv_string((X),(Y),151)
+#define get_csv_bool_pos151(X,Y) get_csv_bool((X),(Y),151)
+#define get_csv_int_pos151(X,Y) get_csv_int((X),(Y),151)
+#define get_csv_llong_pos151(X,Y) get_csv_llong((X),(Y),151)
+#define get_csv_float_pos151(X,Y) get_csv_float((X),(Y),151)
+#define get_csv_uint_pos152(X,Y) get_csv_uint((X),(Y),152)
+#define get_csv_ullong_pos152(X,Y) get_csv_ullong((X),(Y),152)
+#define get_csv_ip_pos152(X,Y) get_csv_ip((X),(Y),152)
+#define get_csv_ipv6_pos152(X,Y) get_csv_ipv6((X),(Y),152)
+#define get_csv_string_pos152(X,Y) get_csv_string((X),(Y),152)
+#define get_csv_v_str_pos152(X,Y) get_csv_string((X),(Y),152)
+#define get_csv_bool_pos152(X,Y) get_csv_bool((X),(Y),152)
+#define get_csv_int_pos152(X,Y) get_csv_int((X),(Y),152)
+#define get_csv_llong_pos152(X,Y) get_csv_llong((X),(Y),152)
+#define get_csv_float_pos152(X,Y) get_csv_float((X),(Y),152)
+#define get_csv_uint_pos153(X,Y) get_csv_uint((X),(Y),153)
+#define get_csv_ullong_pos153(X,Y) get_csv_ullong((X),(Y),153)
+#define get_csv_ip_pos153(X,Y) get_csv_ip((X),(Y),153)
+#define get_csv_ipv6_pos153(X,Y) get_csv_ipv6((X),(Y),153)
+#define get_csv_string_pos153(X,Y) get_csv_string((X),(Y),153)
+#define get_csv_v_str_pos153(X,Y) get_csv_string((X),(Y),153)
+#define get_csv_bool_pos153(X,Y) get_csv_bool((X),(Y),153)
+#define get_csv_int_pos153(X,Y) get_csv_int((X),(Y),153)
+#define get_csv_llong_pos153(X,Y) get_csv_llong((X),(Y),153)
+#define get_csv_float_pos153(X,Y) get_csv_float((X),(Y),153)
+#define get_csv_uint_pos154(X,Y) get_csv_uint((X),(Y),154)
+#define get_csv_ullong_pos154(X,Y) get_csv_ullong((X),(Y),154)
+#define get_csv_ip_pos154(X,Y) get_csv_ip((X),(Y),154)
+#define get_csv_ipv6_pos154(X,Y) get_csv_ipv6((X),(Y),154)
+#define get_csv_string_pos154(X,Y) get_csv_string((X),(Y),154)
+#define get_csv_v_str_pos154(X,Y) get_csv_string((X),(Y),154)
+#define get_csv_bool_pos154(X,Y) get_csv_bool((X),(Y),154)
+#define get_csv_int_pos154(X,Y) get_csv_int((X),(Y),154)
+#define get_csv_llong_pos154(X,Y) get_csv_llong((X),(Y),154)
+#define get_csv_float_pos154(X,Y) get_csv_float((X),(Y),154)
+#define get_csv_uint_pos155(X,Y) get_csv_uint((X),(Y),155)
+#define get_csv_ullong_pos155(X,Y) get_csv_ullong((X),(Y),155)
+#define get_csv_ip_pos155(X,Y) get_csv_ip((X),(Y),155)
+#define get_csv_ipv6_pos155(X,Y) get_csv_ipv6((X),(Y),155)
+#define get_csv_string_pos155(X,Y) get_csv_string((X),(Y),155)
+#define get_csv_v_str_pos155(X,Y) get_csv_string((X),(Y),155)
+#define get_csv_bool_pos155(X,Y) get_csv_bool((X),(Y),155)
+#define get_csv_int_pos155(X,Y) get_csv_int((X),(Y),155)
+#define get_csv_llong_pos155(X,Y) get_csv_llong((X),(Y),155)
+#define get_csv_float_pos155(X,Y) get_csv_float((X),(Y),155)
+#define get_csv_uint_pos156(X,Y) get_csv_uint((X),(Y),156)
+#define get_csv_ullong_pos156(X,Y) get_csv_ullong((X),(Y),156)
+#define get_csv_ip_pos156(X,Y) get_csv_ip((X),(Y),156)
+#define get_csv_ipv6_pos156(X,Y) get_csv_ipv6((X),(Y),156)
+#define get_csv_string_pos156(X,Y) get_csv_string((X),(Y),156)
+#define get_csv_v_str_pos156(X,Y) get_csv_string((X),(Y),156)
+#define get_csv_bool_pos156(X,Y) get_csv_bool((X),(Y),156)
+#define get_csv_int_pos156(X,Y) get_csv_int((X),(Y),156)
+#define get_csv_llong_pos156(X,Y) get_csv_llong((X),(Y),156)
+#define get_csv_float_pos156(X,Y) get_csv_float((X),(Y),156)
+#define get_csv_uint_pos157(X,Y) get_csv_uint((X),(Y),157)
+#define get_csv_ullong_pos157(X,Y) get_csv_ullong((X),(Y),157)
+#define get_csv_ip_pos157(X,Y) get_csv_ip((X),(Y),157)
+#define get_csv_ipv6_pos157(X,Y) get_csv_ipv6((X),(Y),157)
+#define get_csv_string_pos157(X,Y) get_csv_string((X),(Y),157)
+#define get_csv_v_str_pos157(X,Y) get_csv_string((X),(Y),157)
+#define get_csv_bool_pos157(X,Y) get_csv_bool((X),(Y),157)
+#define get_csv_int_pos157(X,Y) get_csv_int((X),(Y),157)
+#define get_csv_llong_pos157(X,Y) get_csv_llong((X),(Y),157)
+#define get_csv_float_pos157(X,Y) get_csv_float((X),(Y),157)
+#define get_csv_uint_pos158(X,Y) get_csv_uint((X),(Y),158)
+#define get_csv_ullong_pos158(X,Y) get_csv_ullong((X),(Y),158)
+#define get_csv_ip_pos158(X,Y) get_csv_ip((X),(Y),158)
+#define get_csv_ipv6_pos158(X,Y) get_csv_ipv6((X),(Y),158)
+#define get_csv_string_pos158(X,Y) get_csv_string((X),(Y),158)
+#define get_csv_v_str_pos158(X,Y) get_csv_string((X),(Y),158)
+#define get_csv_bool_pos158(X,Y) get_csv_bool((X),(Y),158)
+#define get_csv_int_pos158(X,Y) get_csv_int((X),(Y),158)
+#define get_csv_llong_pos158(X,Y) get_csv_llong((X),(Y),158)
+#define get_csv_float_pos158(X,Y) get_csv_float((X),(Y),158)
+#define get_csv_uint_pos159(X,Y) get_csv_uint((X),(Y),159)
+#define get_csv_ullong_pos159(X,Y) get_csv_ullong((X),(Y),159)
+#define get_csv_ip_pos159(X,Y) get_csv_ip((X),(Y),159)
+#define get_csv_ipv6_pos159(X,Y) get_csv_ipv6((X),(Y),159)
+#define get_csv_string_pos159(X,Y) get_csv_string((X),(Y),159)
+#define get_csv_v_str_pos159(X,Y) get_csv_string((X),(Y),159)
+#define get_csv_bool_pos159(X,Y) get_csv_bool((X),(Y),159)
+#define get_csv_int_pos159(X,Y) get_csv_int((X),(Y),159)
+#define get_csv_llong_pos159(X,Y) get_csv_llong((X),(Y),159)
+#define get_csv_float_pos159(X,Y) get_csv_float((X),(Y),159)
+#define get_csv_uint_pos160(X,Y) get_csv_uint((X),(Y),160)
+#define get_csv_ullong_pos160(X,Y) get_csv_ullong((X),(Y),160)
+#define get_csv_ip_pos160(X,Y) get_csv_ip((X),(Y),160)
+#define get_csv_ipv6_pos160(X,Y) get_csv_ipv6((X),(Y),160)
+#define get_csv_string_pos160(X,Y) get_csv_string((X),(Y),160)
+#define get_csv_v_str_pos160(X,Y) get_csv_string((X),(Y),160)
+#define get_csv_bool_pos160(X,Y) get_csv_bool((X),(Y),160)
+#define get_csv_int_pos160(X,Y) get_csv_int((X),(Y),160)
+#define get_csv_llong_pos160(X,Y) get_csv_llong((X),(Y),160)
+#define get_csv_float_pos160(X,Y) get_csv_float((X),(Y),160)
+#define get_csv_uint_pos161(X,Y) get_csv_uint((X),(Y),161)
+#define get_csv_ullong_pos161(X,Y) get_csv_ullong((X),(Y),161)
+#define get_csv_ip_pos161(X,Y) get_csv_ip((X),(Y),161)
+#define get_csv_ipv6_pos161(X,Y) get_csv_ipv6((X),(Y),161)
+#define get_csv_string_pos161(X,Y) get_csv_string((X),(Y),161)
+#define get_csv_v_str_pos161(X,Y) get_csv_string((X),(Y),161)
+#define get_csv_bool_pos161(X,Y) get_csv_bool((X),(Y),161)
+#define get_csv_int_pos161(X,Y) get_csv_int((X),(Y),161)
+#define get_csv_llong_pos161(X,Y) get_csv_llong((X),(Y),161)
+#define get_csv_float_pos161(X,Y) get_csv_float((X),(Y),161)
+#define get_csv_uint_pos162(X,Y) get_csv_uint((X),(Y),162)
+#define get_csv_ullong_pos162(X,Y) get_csv_ullong((X),(Y),162)
+#define get_csv_ip_pos162(X,Y) get_csv_ip((X),(Y),162)
+#define get_csv_ipv6_pos162(X,Y) get_csv_ipv6((X),(Y),162)
+#define get_csv_string_pos162(X,Y) get_csv_string((X),(Y),162)
+#define get_csv_v_str_pos162(X,Y) get_csv_string((X),(Y),162)
+#define get_csv_bool_pos162(X,Y) get_csv_bool((X),(Y),162)
+#define get_csv_int_pos162(X,Y) get_csv_int((X),(Y),162)
+#define get_csv_llong_pos162(X,Y) get_csv_llong((X),(Y),162)
+#define get_csv_float_pos162(X,Y) get_csv_float((X),(Y),162)
+#define get_csv_uint_pos163(X,Y) get_csv_uint((X),(Y),163)
+#define get_csv_ullong_pos163(X,Y) get_csv_ullong((X),(Y),163)
+#define get_csv_ip_pos163(X,Y) get_csv_ip((X),(Y),163)
+#define get_csv_ipv6_pos163(X,Y) get_csv_ipv6((X),(Y),163)
+#define get_csv_string_pos163(X,Y) get_csv_string((X),(Y),163)
+#define get_csv_v_str_pos163(X,Y) get_csv_string((X),(Y),163)
+#define get_csv_bool_pos163(X,Y) get_csv_bool((X),(Y),163)
+#define get_csv_int_pos163(X,Y) get_csv_int((X),(Y),163)
+#define get_csv_llong_pos163(X,Y) get_csv_llong((X),(Y),163)
+#define get_csv_float_pos163(X,Y) get_csv_float((X),(Y),163)
+#define get_csv_uint_pos164(X,Y) get_csv_uint((X),(Y),164)
+#define get_csv_ullong_pos164(X,Y) get_csv_ullong((X),(Y),164)
+#define get_csv_ip_pos164(X,Y) get_csv_ip((X),(Y),164)
+#define get_csv_ipv6_pos164(X,Y) get_csv_ipv6((X),(Y),164)
+#define get_csv_string_pos164(X,Y) get_csv_string((X),(Y),164)
+#define get_csv_v_str_pos164(X,Y) get_csv_string((X),(Y),164)
+#define get_csv_bool_pos164(X,Y) get_csv_bool((X),(Y),164)
+#define get_csv_int_pos164(X,Y) get_csv_int((X),(Y),164)
+#define get_csv_llong_pos164(X,Y) get_csv_llong((X),(Y),164)
+#define get_csv_float_pos164(X,Y) get_csv_float((X),(Y),164)
+#define get_csv_uint_pos165(X,Y) get_csv_uint((X),(Y),165)
+#define get_csv_ullong_pos165(X,Y) get_csv_ullong((X),(Y),165)
+#define get_csv_ip_pos165(X,Y) get_csv_ip((X),(Y),165)
+#define get_csv_ipv6_pos165(X,Y) get_csv_ipv6((X),(Y),165)
+#define get_csv_string_pos165(X,Y) get_csv_string((X),(Y),165)
+#define get_csv_v_str_pos165(X,Y) get_csv_string((X),(Y),165)
+#define get_csv_bool_pos165(X,Y) get_csv_bool((X),(Y),165)
+#define get_csv_int_pos165(X,Y) get_csv_int((X),(Y),165)
+#define get_csv_llong_pos165(X,Y) get_csv_llong((X),(Y),165)
+#define get_csv_float_pos165(X,Y) get_csv_float((X),(Y),165)
+#define get_csv_uint_pos166(X,Y) get_csv_uint((X),(Y),166)
+#define get_csv_ullong_pos166(X,Y) get_csv_ullong((X),(Y),166)
+#define get_csv_ip_pos166(X,Y) get_csv_ip((X),(Y),166)
+#define get_csv_ipv6_pos166(X,Y) get_csv_ipv6((X),(Y),166)
+#define get_csv_string_pos166(X,Y) get_csv_string((X),(Y),166)
+#define get_csv_v_str_pos166(X,Y) get_csv_string((X),(Y),166)
+#define get_csv_bool_pos166(X,Y) get_csv_bool((X),(Y),166)
+#define get_csv_int_pos166(X,Y) get_csv_int((X),(Y),166)
+#define get_csv_llong_pos166(X,Y) get_csv_llong((X),(Y),166)
+#define get_csv_float_pos166(X,Y) get_csv_float((X),(Y),166)
+#define get_csv_uint_pos167(X,Y) get_csv_uint((X),(Y),167)
+#define get_csv_ullong_pos167(X,Y) get_csv_ullong((X),(Y),167)
+#define get_csv_ip_pos167(X,Y) get_csv_ip((X),(Y),167)
+#define get_csv_ipv6_pos167(X,Y) get_csv_ipv6((X),(Y),167)
+#define get_csv_string_pos167(X,Y) get_csv_string((X),(Y),167)
+#define get_csv_v_str_pos167(X,Y) get_csv_string((X),(Y),167)
+#define get_csv_bool_pos167(X,Y) get_csv_bool((X),(Y),167)
+#define get_csv_int_pos167(X,Y) get_csv_int((X),(Y),167)
+#define get_csv_llong_pos167(X,Y) get_csv_llong((X),(Y),167)
+#define get_csv_float_pos167(X,Y) get_csv_float((X),(Y),167)
+#define get_csv_uint_pos168(X,Y) get_csv_uint((X),(Y),168)
+#define get_csv_ullong_pos168(X,Y) get_csv_ullong((X),(Y),168)
+#define get_csv_ip_pos168(X,Y) get_csv_ip((X),(Y),168)
+#define get_csv_ipv6_pos168(X,Y) get_csv_ipv6((X),(Y),168)
+#define get_csv_string_pos168(X,Y) get_csv_string((X),(Y),168)
+#define get_csv_v_str_pos168(X,Y) get_csv_string((X),(Y),168)
+#define get_csv_bool_pos168(X,Y) get_csv_bool((X),(Y),168)
+#define get_csv_int_pos168(X,Y) get_csv_int((X),(Y),168)
+#define get_csv_llong_pos168(X,Y) get_csv_llong((X),(Y),168)
+#define get_csv_float_pos168(X,Y) get_csv_float((X),(Y),168)
+#define get_csv_uint_pos169(X,Y) get_csv_uint((X),(Y),169)
+#define get_csv_ullong_pos169(X,Y) get_csv_ullong((X),(Y),169)
+#define get_csv_ip_pos169(X,Y) get_csv_ip((X),(Y),169)
+#define get_csv_ipv6_pos169(X,Y) get_csv_ipv6((X),(Y),169)
+#define get_csv_string_pos169(X,Y) get_csv_string((X),(Y),169)
+#define get_csv_v_str_pos169(X,Y) get_csv_string((X),(Y),169)
+#define get_csv_bool_pos169(X,Y) get_csv_bool((X),(Y),169)
+#define get_csv_int_pos169(X,Y) get_csv_int((X),(Y),169)
+#define get_csv_llong_pos169(X,Y) get_csv_llong((X),(Y),169)
+#define get_csv_float_pos169(X,Y) get_csv_float((X),(Y),169)
+#define get_csv_uint_pos170(X,Y) get_csv_uint((X),(Y),170)
+#define get_csv_ullong_pos170(X,Y) get_csv_ullong((X),(Y),170)
+#define get_csv_ip_pos170(X,Y) get_csv_ip((X),(Y),170)
+#define get_csv_ipv6_pos170(X,Y) get_csv_ipv6((X),(Y),170)
+#define get_csv_string_pos170(X,Y) get_csv_string((X),(Y),170)
+#define get_csv_v_str_pos170(X,Y) get_csv_string((X),(Y),170)
+#define get_csv_bool_pos170(X,Y) get_csv_bool((X),(Y),170)
+#define get_csv_int_pos170(X,Y) get_csv_int((X),(Y),170)
+#define get_csv_llong_pos170(X,Y) get_csv_llong((X),(Y),170)
+#define get_csv_float_pos170(X,Y) get_csv_float((X),(Y),170)
+#define get_csv_uint_pos171(X,Y) get_csv_uint((X),(Y),171)
+#define get_csv_ullong_pos171(X,Y) get_csv_ullong((X),(Y),171)
+#define get_csv_ip_pos171(X,Y) get_csv_ip((X),(Y),171)
+#define get_csv_ipv6_pos171(X,Y) get_csv_ipv6((X),(Y),171)
+#define get_csv_string_pos171(X,Y) get_csv_string((X),(Y),171)
+#define get_csv_v_str_pos171(X,Y) get_csv_string((X),(Y),171)
+#define get_csv_bool_pos171(X,Y) get_csv_bool((X),(Y),171)
+#define get_csv_int_pos171(X,Y) get_csv_int((X),(Y),171)
+#define get_csv_llong_pos171(X,Y) get_csv_llong((X),(Y),171)
+#define get_csv_float_pos171(X,Y) get_csv_float((X),(Y),171)
+#define get_csv_uint_pos172(X,Y) get_csv_uint((X),(Y),172)
+#define get_csv_ullong_pos172(X,Y) get_csv_ullong((X),(Y),172)
+#define get_csv_ip_pos172(X,Y) get_csv_ip((X),(Y),172)
+#define get_csv_ipv6_pos172(X,Y) get_csv_ipv6((X),(Y),172)
+#define get_csv_string_pos172(X,Y) get_csv_string((X),(Y),172)
+#define get_csv_v_str_pos172(X,Y) get_csv_string((X),(Y),172)
+#define get_csv_bool_pos172(X,Y) get_csv_bool((X),(Y),172)
+#define get_csv_int_pos172(X,Y) get_csv_int((X),(Y),172)
+#define get_csv_llong_pos172(X,Y) get_csv_llong((X),(Y),172)
+#define get_csv_float_pos172(X,Y) get_csv_float((X),(Y),172)
+#define get_csv_uint_pos173(X,Y) get_csv_uint((X),(Y),173)
+#define get_csv_ullong_pos173(X,Y) get_csv_ullong((X),(Y),173)
+#define get_csv_ip_pos173(X,Y) get_csv_ip((X),(Y),173)
+#define get_csv_ipv6_pos173(X,Y) get_csv_ipv6((X),(Y),173)
+#define get_csv_string_pos173(X,Y) get_csv_string((X),(Y),173)
+#define get_csv_v_str_pos173(X,Y) get_csv_string((X),(Y),173)
+#define get_csv_bool_pos173(X,Y) get_csv_bool((X),(Y),173)
+#define get_csv_int_pos173(X,Y) get_csv_int((X),(Y),173)
+#define get_csv_llong_pos173(X,Y) get_csv_llong((X),(Y),173)
+#define get_csv_float_pos173(X,Y) get_csv_float((X),(Y),173)
+#define get_csv_uint_pos174(X,Y) get_csv_uint((X),(Y),174)
+#define get_csv_ullong_pos174(X,Y) get_csv_ullong((X),(Y),174)
+#define get_csv_ip_pos174(X,Y) get_csv_ip((X),(Y),174)
+#define get_csv_ipv6_pos174(X,Y) get_csv_ipv6((X),(Y),174)
+#define get_csv_string_pos174(X,Y) get_csv_string((X),(Y),174)
+#define get_csv_v_str_pos174(X,Y) get_csv_string((X),(Y),174)
+#define get_csv_bool_pos174(X,Y) get_csv_bool((X),(Y),174)
+#define get_csv_int_pos174(X,Y) get_csv_int((X),(Y),174)
+#define get_csv_llong_pos174(X,Y) get_csv_llong((X),(Y),174)
+#define get_csv_float_pos174(X,Y) get_csv_float((X),(Y),174)
+#define get_csv_uint_pos175(X,Y) get_csv_uint((X),(Y),175)
+#define get_csv_ullong_pos175(X,Y) get_csv_ullong((X),(Y),175)
+#define get_csv_ip_pos175(X,Y) get_csv_ip((X),(Y),175)
+#define get_csv_ipv6_pos175(X,Y) get_csv_ipv6((X),(Y),175)
+#define get_csv_string_pos175(X,Y) get_csv_string((X),(Y),175)
+#define get_csv_v_str_pos175(X,Y) get_csv_string((X),(Y),175)
+#define get_csv_bool_pos175(X,Y) get_csv_bool((X),(Y),175)
+#define get_csv_int_pos175(X,Y) get_csv_int((X),(Y),175)
+#define get_csv_llong_pos175(X,Y) get_csv_llong((X),(Y),175)
+#define get_csv_float_pos175(X,Y) get_csv_float((X),(Y),175)
+#define get_csv_uint_pos176(X,Y) get_csv_uint((X),(Y),176)
+#define get_csv_ullong_pos176(X,Y) get_csv_ullong((X),(Y),176)
+#define get_csv_ip_pos176(X,Y) get_csv_ip((X),(Y),176)
+#define get_csv_ipv6_pos176(X,Y) get_csv_ipv6((X),(Y),176)
+#define get_csv_string_pos176(X,Y) get_csv_string((X),(Y),176)
+#define get_csv_v_str_pos176(X,Y) get_csv_string((X),(Y),176)
+#define get_csv_bool_pos176(X,Y) get_csv_bool((X),(Y),176)
+#define get_csv_int_pos176(X,Y) get_csv_int((X),(Y),176)
+#define get_csv_llong_pos176(X,Y) get_csv_llong((X),(Y),176)
+#define get_csv_float_pos176(X,Y) get_csv_float((X),(Y),176)
+#define get_csv_uint_pos177(X,Y) get_csv_uint((X),(Y),177)
+#define get_csv_ullong_pos177(X,Y) get_csv_ullong((X),(Y),177)
+#define get_csv_ip_pos177(X,Y) get_csv_ip((X),(Y),177)
+#define get_csv_ipv6_pos177(X,Y) get_csv_ipv6((X),(Y),177)
+#define get_csv_string_pos177(X,Y) get_csv_string((X),(Y),177)
+#define get_csv_v_str_pos177(X,Y) get_csv_string((X),(Y),177)
+#define get_csv_bool_pos177(X,Y) get_csv_bool((X),(Y),177)
+#define get_csv_int_pos177(X,Y) get_csv_int((X),(Y),177)
+#define get_csv_llong_pos177(X,Y) get_csv_llong((X),(Y),177)
+#define get_csv_float_pos177(X,Y) get_csv_float((X),(Y),177)
+#define get_csv_uint_pos178(X,Y) get_csv_uint((X),(Y),178)
+#define get_csv_ullong_pos178(X,Y) get_csv_ullong((X),(Y),178)
+#define get_csv_ip_pos178(X,Y) get_csv_ip((X),(Y),178)
+#define get_csv_ipv6_pos178(X,Y) get_csv_ipv6((X),(Y),178)
+#define get_csv_string_pos178(X,Y) get_csv_string((X),(Y),178)
+#define get_csv_v_str_pos178(X,Y) get_csv_string((X),(Y),178)
+#define get_csv_bool_pos178(X,Y) get_csv_bool((X),(Y),178)
+#define get_csv_int_pos178(X,Y) get_csv_int((X),(Y),178)
+#define get_csv_llong_pos178(X,Y) get_csv_llong((X),(Y),178)
+#define get_csv_float_pos178(X,Y) get_csv_float((X),(Y),178)
+#define get_csv_uint_pos179(X,Y) get_csv_uint((X),(Y),179)
+#define get_csv_ullong_pos179(X,Y) get_csv_ullong((X),(Y),179)
+#define get_csv_ip_pos179(X,Y) get_csv_ip((X),(Y),179)
+#define get_csv_ipv6_pos179(X,Y) get_csv_ipv6((X),(Y),179)
+#define get_csv_string_pos179(X,Y) get_csv_string((X),(Y),179)
+#define get_csv_v_str_pos179(X,Y) get_csv_string((X),(Y),179)
+#define get_csv_bool_pos179(X,Y) get_csv_bool((X),(Y),179)
+#define get_csv_int_pos179(X,Y) get_csv_int((X),(Y),179)
+#define get_csv_llong_pos179(X,Y) get_csv_llong((X),(Y),179)
+#define get_csv_float_pos179(X,Y) get_csv_float((X),(Y),179)
+#define get_csv_uint_pos180(X,Y) get_csv_uint((X),(Y),180)
+#define get_csv_ullong_pos180(X,Y) get_csv_ullong((X),(Y),180)
+#define get_csv_ip_pos180(X,Y) get_csv_ip((X),(Y),180)
+#define get_csv_ipv6_pos180(X,Y) get_csv_ipv6((X),(Y),180)
+#define get_csv_string_pos180(X,Y) get_csv_string((X),(Y),180)
+#define get_csv_v_str_pos180(X,Y) get_csv_string((X),(Y),180)
+#define get_csv_bool_pos180(X,Y) get_csv_bool((X),(Y),180)
+#define get_csv_int_pos180(X,Y) get_csv_int((X),(Y),180)
+#define get_csv_llong_pos180(X,Y) get_csv_llong((X),(Y),180)
+#define get_csv_float_pos180(X,Y) get_csv_float((X),(Y),180)
+#define get_csv_uint_pos181(X,Y) get_csv_uint((X),(Y),181)
+#define get_csv_ullong_pos181(X,Y) get_csv_ullong((X),(Y),181)
+#define get_csv_ip_pos181(X,Y) get_csv_ip((X),(Y),181)
+#define get_csv_ipv6_pos181(X,Y) get_csv_ipv6((X),(Y),181)
+#define get_csv_string_pos181(X,Y) get_csv_string((X),(Y),181)
+#define get_csv_v_str_pos181(X,Y) get_csv_string((X),(Y),181)
+#define get_csv_bool_pos181(X,Y) get_csv_bool((X),(Y),181)
+#define get_csv_int_pos181(X,Y) get_csv_int((X),(Y),181)
+#define get_csv_llong_pos181(X,Y) get_csv_llong((X),(Y),181)
+#define get_csv_float_pos181(X,Y) get_csv_float((X),(Y),181)
+#define get_csv_uint_pos182(X,Y) get_csv_uint((X),(Y),182)
+#define get_csv_ullong_pos182(X,Y) get_csv_ullong((X),(Y),182)
+#define get_csv_ip_pos182(X,Y) get_csv_ip((X),(Y),182)
+#define get_csv_ipv6_pos182(X,Y) get_csv_ipv6((X),(Y),182)
+#define get_csv_string_pos182(X,Y) get_csv_string((X),(Y),182)
+#define get_csv_v_str_pos182(X,Y) get_csv_string((X),(Y),182)
+#define get_csv_bool_pos182(X,Y) get_csv_bool((X),(Y),182)
+#define get_csv_int_pos182(X,Y) get_csv_int((X),(Y),182)
+#define get_csv_llong_pos182(X,Y) get_csv_llong((X),(Y),182)
+#define get_csv_float_pos182(X,Y) get_csv_float((X),(Y),182)
+#define get_csv_uint_pos183(X,Y) get_csv_uint((X),(Y),183)
+#define get_csv_ullong_pos183(X,Y) get_csv_ullong((X),(Y),183)
+#define get_csv_ip_pos183(X,Y) get_csv_ip((X),(Y),183)
+#define get_csv_ipv6_pos183(X,Y) get_csv_ipv6((X),(Y),183)
+#define get_csv_string_pos183(X,Y) get_csv_string((X),(Y),183)
+#define get_csv_v_str_pos183(X,Y) get_csv_string((X),(Y),183)
+#define get_csv_bool_pos183(X,Y) get_csv_bool((X),(Y),183)
+#define get_csv_int_pos183(X,Y) get_csv_int((X),(Y),183)
+#define get_csv_llong_pos183(X,Y) get_csv_llong((X),(Y),183)
+#define get_csv_float_pos183(X,Y) get_csv_float((X),(Y),183)
+#define get_csv_uint_pos184(X,Y) get_csv_uint((X),(Y),184)
+#define get_csv_ullong_pos184(X,Y) get_csv_ullong((X),(Y),184)
+#define get_csv_ip_pos184(X,Y) get_csv_ip((X),(Y),184)
+#define get_csv_ipv6_pos184(X,Y) get_csv_ipv6((X),(Y),184)
+#define get_csv_string_pos184(X,Y) get_csv_string((X),(Y),184)
+#define get_csv_v_str_pos184(X,Y) get_csv_string((X),(Y),184)
+#define get_csv_bool_pos184(X,Y) get_csv_bool((X),(Y),184)
+#define get_csv_int_pos184(X,Y) get_csv_int((X),(Y),184)
+#define get_csv_llong_pos184(X,Y) get_csv_llong((X),(Y),184)
+#define get_csv_float_pos184(X,Y) get_csv_float((X),(Y),184)
+#define get_csv_uint_pos185(X,Y) get_csv_uint((X),(Y),185)
+#define get_csv_ullong_pos185(X,Y) get_csv_ullong((X),(Y),185)
+#define get_csv_ip_pos185(X,Y) get_csv_ip((X),(Y),185)
+#define get_csv_ipv6_pos185(X,Y) get_csv_ipv6((X),(Y),185)
+#define get_csv_string_pos185(X,Y) get_csv_string((X),(Y),185)
+#define get_csv_v_str_pos185(X,Y) get_csv_string((X),(Y),185)
+#define get_csv_bool_pos185(X,Y) get_csv_bool((X),(Y),185)
+#define get_csv_int_pos185(X,Y) get_csv_int((X),(Y),185)
+#define get_csv_llong_pos185(X,Y) get_csv_llong((X),(Y),185)
+#define get_csv_float_pos185(X,Y) get_csv_float((X),(Y),185)
+#define get_csv_uint_pos186(X,Y) get_csv_uint((X),(Y),186)
+#define get_csv_ullong_pos186(X,Y) get_csv_ullong((X),(Y),186)
+#define get_csv_ip_pos186(X,Y) get_csv_ip((X),(Y),186)
+#define get_csv_ipv6_pos186(X,Y) get_csv_ipv6((X),(Y),186)
+#define get_csv_string_pos186(X,Y) get_csv_string((X),(Y),186)
+#define get_csv_v_str_pos186(X,Y) get_csv_string((X),(Y),186)
+#define get_csv_bool_pos186(X,Y) get_csv_bool((X),(Y),186)
+#define get_csv_int_pos186(X,Y) get_csv_int((X),(Y),186)
+#define get_csv_llong_pos186(X,Y) get_csv_llong((X),(Y),186)
+#define get_csv_float_pos186(X,Y) get_csv_float((X),(Y),186)
+#define get_csv_uint_pos187(X,Y) get_csv_uint((X),(Y),187)
+#define get_csv_ullong_pos187(X,Y) get_csv_ullong((X),(Y),187)
+#define get_csv_ip_pos187(X,Y) get_csv_ip((X),(Y),187)
+#define get_csv_ipv6_pos187(X,Y) get_csv_ipv6((X),(Y),187)
+#define get_csv_string_pos187(X,Y) get_csv_string((X),(Y),187)
+#define get_csv_v_str_pos187(X,Y) get_csv_string((X),(Y),187)
+#define get_csv_bool_pos187(X,Y) get_csv_bool((X),(Y),187)
+#define get_csv_int_pos187(X,Y) get_csv_int((X),(Y),187)
+#define get_csv_llong_pos187(X,Y) get_csv_llong((X),(Y),187)
+#define get_csv_float_pos187(X,Y) get_csv_float((X),(Y),187)
+#define get_csv_uint_pos188(X,Y) get_csv_uint((X),(Y),188)
+#define get_csv_ullong_pos188(X,Y) get_csv_ullong((X),(Y),188)
+#define get_csv_ip_pos188(X,Y) get_csv_ip((X),(Y),188)
+#define get_csv_ipv6_pos188(X,Y) get_csv_ipv6((X),(Y),188)
+#define get_csv_string_pos188(X,Y) get_csv_string((X),(Y),188)
+#define get_csv_v_str_pos188(X,Y) get_csv_string((X),(Y),188)
+#define get_csv_bool_pos188(X,Y) get_csv_bool((X),(Y),188)
+#define get_csv_int_pos188(X,Y) get_csv_int((X),(Y),188)
+#define get_csv_llong_pos188(X,Y) get_csv_llong((X),(Y),188)
+#define get_csv_float_pos188(X,Y) get_csv_float((X),(Y),188)
+#define get_csv_uint_pos189(X,Y) get_csv_uint((X),(Y),189)
+#define get_csv_ullong_pos189(X,Y) get_csv_ullong((X),(Y),189)
+#define get_csv_ip_pos189(X,Y) get_csv_ip((X),(Y),189)
+#define get_csv_ipv6_pos189(X,Y) get_csv_ipv6((X),(Y),189)
+#define get_csv_string_pos189(X,Y) get_csv_string((X),(Y),189)
+#define get_csv_v_str_pos189(X,Y) get_csv_string((X),(Y),189)
+#define get_csv_bool_pos189(X,Y) get_csv_bool((X),(Y),189)
+#define get_csv_int_pos189(X,Y) get_csv_int((X),(Y),189)
+#define get_csv_llong_pos189(X,Y) get_csv_llong((X),(Y),189)
+#define get_csv_float_pos189(X,Y) get_csv_float((X),(Y),189)
+#define get_csv_uint_pos190(X,Y) get_csv_uint((X),(Y),190)
+#define get_csv_ullong_pos190(X,Y) get_csv_ullong((X),(Y),190)
+#define get_csv_ip_pos190(X,Y) get_csv_ip((X),(Y),190)
+#define get_csv_ipv6_pos190(X,Y) get_csv_ipv6((X),(Y),190)
+#define get_csv_string_pos190(X,Y) get_csv_string((X),(Y),190)
+#define get_csv_v_str_pos190(X,Y) get_csv_string((X),(Y),190)
+#define get_csv_bool_pos190(X,Y) get_csv_bool((X),(Y),190)
+#define get_csv_int_pos190(X,Y) get_csv_int((X),(Y),190)
+#define get_csv_llong_pos190(X,Y) get_csv_llong((X),(Y),190)
+#define get_csv_float_pos190(X,Y) get_csv_float((X),(Y),190)
+#define get_csv_uint_pos191(X,Y) get_csv_uint((X),(Y),191)
+#define get_csv_ullong_pos191(X,Y) get_csv_ullong((X),(Y),191)
+#define get_csv_ip_pos191(X,Y) get_csv_ip((X),(Y),191)
+#define get_csv_ipv6_pos191(X,Y) get_csv_ipv6((X),(Y),191)
+#define get_csv_string_pos191(X,Y) get_csv_string((X),(Y),191)
+#define get_csv_v_str_pos191(X,Y) get_csv_string((X),(Y),191)
+#define get_csv_bool_pos191(X,Y) get_csv_bool((X),(Y),191)
+#define get_csv_int_pos191(X,Y) get_csv_int((X),(Y),191)
+#define get_csv_llong_pos191(X,Y) get_csv_llong((X),(Y),191)
+#define get_csv_float_pos191(X,Y) get_csv_float((X),(Y),191)
+#define get_csv_uint_pos192(X,Y) get_csv_uint((X),(Y),192)
+#define get_csv_ullong_pos192(X,Y) get_csv_ullong((X),(Y),192)
+#define get_csv_ip_pos192(X,Y) get_csv_ip((X),(Y),192)
+#define get_csv_ipv6_pos192(X,Y) get_csv_ipv6((X),(Y),192)
+#define get_csv_string_pos192(X,Y) get_csv_string((X),(Y),192)
+#define get_csv_v_str_pos192(X,Y) get_csv_string((X),(Y),192)
+#define get_csv_bool_pos192(X,Y) get_csv_bool((X),(Y),192)
+#define get_csv_int_pos192(X,Y) get_csv_int((X),(Y),192)
+#define get_csv_llong_pos192(X,Y) get_csv_llong((X),(Y),192)
+#define get_csv_float_pos192(X,Y) get_csv_float((X),(Y),192)
+#define get_csv_uint_pos193(X,Y) get_csv_uint((X),(Y),193)
+#define get_csv_ullong_pos193(X,Y) get_csv_ullong((X),(Y),193)
+#define get_csv_ip_pos193(X,Y) get_csv_ip((X),(Y),193)
+#define get_csv_ipv6_pos193(X,Y) get_csv_ipv6((X),(Y),193)
+#define get_csv_string_pos193(X,Y) get_csv_string((X),(Y),193)
+#define get_csv_v_str_pos193(X,Y) get_csv_string((X),(Y),193)
+#define get_csv_bool_pos193(X,Y) get_csv_bool((X),(Y),193)
+#define get_csv_int_pos193(X,Y) get_csv_int((X),(Y),193)
+#define get_csv_llong_pos193(X,Y) get_csv_llong((X),(Y),193)
+#define get_csv_float_pos193(X,Y) get_csv_float((X),(Y),193)
+#define get_csv_uint_pos194(X,Y) get_csv_uint((X),(Y),194)
+#define get_csv_ullong_pos194(X,Y) get_csv_ullong((X),(Y),194)
+#define get_csv_ip_pos194(X,Y) get_csv_ip((X),(Y),194)
+#define get_csv_ipv6_pos194(X,Y) get_csv_ipv6((X),(Y),194)
+#define get_csv_string_pos194(X,Y) get_csv_string((X),(Y),194)
+#define get_csv_v_str_pos194(X,Y) get_csv_string((X),(Y),194)
+#define get_csv_bool_pos194(X,Y) get_csv_bool((X),(Y),194)
+#define get_csv_int_pos194(X,Y) get_csv_int((X),(Y),194)
+#define get_csv_llong_pos194(X,Y) get_csv_llong((X),(Y),194)
+#define get_csv_float_pos194(X,Y) get_csv_float((X),(Y),194)
+#define get_csv_uint_pos195(X,Y) get_csv_uint((X),(Y),195)
+#define get_csv_ullong_pos195(X,Y) get_csv_ullong((X),(Y),195)
+#define get_csv_ip_pos195(X,Y) get_csv_ip((X),(Y),195)
+#define get_csv_ipv6_pos195(X,Y) get_csv_ipv6((X),(Y),195)
+#define get_csv_string_pos195(X,Y) get_csv_string((X),(Y),195)
+#define get_csv_v_str_pos195(X,Y) get_csv_string((X),(Y),195)
+#define get_csv_bool_pos195(X,Y) get_csv_bool((X),(Y),195)
+#define get_csv_int_pos195(X,Y) get_csv_int((X),(Y),195)
+#define get_csv_llong_pos195(X,Y) get_csv_llong((X),(Y),195)
+#define get_csv_float_pos195(X,Y) get_csv_float((X),(Y),195)
+#define get_csv_uint_pos196(X,Y) get_csv_uint((X),(Y),196)
+#define get_csv_ullong_pos196(X,Y) get_csv_ullong((X),(Y),196)
+#define get_csv_ip_pos196(X,Y) get_csv_ip((X),(Y),196)
+#define get_csv_ipv6_pos196(X,Y) get_csv_ipv6((X),(Y),196)
+#define get_csv_string_pos196(X,Y) get_csv_string((X),(Y),196)
+#define get_csv_v_str_pos196(X,Y) get_csv_string((X),(Y),196)
+#define get_csv_bool_pos196(X,Y) get_csv_bool((X),(Y),196)
+#define get_csv_int_pos196(X,Y) get_csv_int((X),(Y),196)
+#define get_csv_llong_pos196(X,Y) get_csv_llong((X),(Y),196)
+#define get_csv_float_pos196(X,Y) get_csv_float((X),(Y),196)
+#define get_csv_uint_pos197(X,Y) get_csv_uint((X),(Y),197)
+#define get_csv_ullong_pos197(X,Y) get_csv_ullong((X),(Y),197)
+#define get_csv_ip_pos197(X,Y) get_csv_ip((X),(Y),197)
+#define get_csv_ipv6_pos197(X,Y) get_csv_ipv6((X),(Y),197)
+#define get_csv_string_pos197(X,Y) get_csv_string((X),(Y),197)
+#define get_csv_v_str_pos197(X,Y) get_csv_string((X),(Y),197)
+#define get_csv_bool_pos197(X,Y) get_csv_bool((X),(Y),197)
+#define get_csv_int_pos197(X,Y) get_csv_int((X),(Y),197)
+#define get_csv_llong_pos197(X,Y) get_csv_llong((X),(Y),197)
+#define get_csv_float_pos197(X,Y) get_csv_float((X),(Y),197)
+#define get_csv_uint_pos198(X,Y) get_csv_uint((X),(Y),198)
+#define get_csv_ullong_pos198(X,Y) get_csv_ullong((X),(Y),198)
+#define get_csv_ip_pos198(X,Y) get_csv_ip((X),(Y),198)
+#define get_csv_ipv6_pos198(X,Y) get_csv_ipv6((X),(Y),198)
+#define get_csv_string_pos198(X,Y) get_csv_string((X),(Y),198)
+#define get_csv_v_str_pos198(X,Y) get_csv_string((X),(Y),198)
+#define get_csv_bool_pos198(X,Y) get_csv_bool((X),(Y),198)
+#define get_csv_int_pos198(X,Y) get_csv_int((X),(Y),198)
+#define get_csv_llong_pos198(X,Y) get_csv_llong((X),(Y),198)
+#define get_csv_float_pos198(X,Y) get_csv_float((X),(Y),198)
+#define get_csv_uint_pos199(X,Y) get_csv_uint((X),(Y),199)
+#define get_csv_ullong_pos199(X,Y) get_csv_ullong((X),(Y),199)
+#define get_csv_ip_pos199(X,Y) get_csv_ip((X),(Y),199)
+#define get_csv_ipv6_pos199(X,Y) get_csv_ipv6((X),(Y),199)
+#define get_csv_string_pos199(X,Y) get_csv_string((X),(Y),199)
+#define get_csv_v_str_pos199(X,Y) get_csv_string((X),(Y),199)
+#define get_csv_bool_pos199(X,Y) get_csv_bool((X),(Y),199)
+#define get_csv_int_pos199(X,Y) get_csv_int((X),(Y),199)
+#define get_csv_llong_pos199(X,Y) get_csv_llong((X),(Y),199)
+#define get_csv_float_pos199(X,Y) get_csv_float((X),(Y),199)
+#define get_csv_uint_pos200(X,Y) get_csv_uint((X),(Y),200)
+#define get_csv_ullong_pos200(X,Y) get_csv_ullong((X),(Y),200)
+#define get_csv_ip_pos200(X,Y) get_csv_ip((X),(Y),200)
+#define get_csv_ipv6_pos200(X,Y) get_csv_ipv6((X),(Y),200)
+#define get_csv_string_pos200(X,Y) get_csv_string((X),(Y),200)
+#define get_csv_v_str_pos200(X,Y) get_csv_string((X),(Y),200)
+#define get_csv_bool_pos200(X,Y) get_csv_bool((X),(Y),200)
+#define get_csv_int_pos200(X,Y) get_csv_int((X),(Y),200)
+#define get_csv_llong_pos200(X,Y) get_csv_llong((X),(Y),200)
+#define get_csv_float_pos200(X,Y) get_csv_float((X),(Y),200)
+#define get_csv_uint_pos201(X,Y) get_csv_uint((X),(Y),201)
+#define get_csv_ullong_pos201(X,Y) get_csv_ullong((X),(Y),201)
+#define get_csv_ip_pos201(X,Y) get_csv_ip((X),(Y),201)
+#define get_csv_ipv6_pos201(X,Y) get_csv_ipv6((X),(Y),201)
+#define get_csv_string_pos201(X,Y) get_csv_string((X),(Y),201)
+#define get_csv_v_str_pos201(X,Y) get_csv_string((X),(Y),201)
+#define get_csv_bool_pos201(X,Y) get_csv_bool((X),(Y),201)
+#define get_csv_int_pos201(X,Y) get_csv_int((X),(Y),201)
+#define get_csv_llong_pos201(X,Y) get_csv_llong((X),(Y),201)
+#define get_csv_float_pos201(X,Y) get_csv_float((X),(Y),201)
+#define get_csv_uint_pos202(X,Y) get_csv_uint((X),(Y),202)
+#define get_csv_ullong_pos202(X,Y) get_csv_ullong((X),(Y),202)
+#define get_csv_ip_pos202(X,Y) get_csv_ip((X),(Y),202)
+#define get_csv_ipv6_pos202(X,Y) get_csv_ipv6((X),(Y),202)
+#define get_csv_string_pos202(X,Y) get_csv_string((X),(Y),202)
+#define get_csv_v_str_pos202(X,Y) get_csv_string((X),(Y),202)
+#define get_csv_bool_pos202(X,Y) get_csv_bool((X),(Y),202)
+#define get_csv_int_pos202(X,Y) get_csv_int((X),(Y),202)
+#define get_csv_llong_pos202(X,Y) get_csv_llong((X),(Y),202)
+#define get_csv_float_pos202(X,Y) get_csv_float((X),(Y),202)
+#define get_csv_uint_pos203(X,Y) get_csv_uint((X),(Y),203)
+#define get_csv_ullong_pos203(X,Y) get_csv_ullong((X),(Y),203)
+#define get_csv_ip_pos203(X,Y) get_csv_ip((X),(Y),203)
+#define get_csv_ipv6_pos203(X,Y) get_csv_ipv6((X),(Y),203)
+#define get_csv_string_pos203(X,Y) get_csv_string((X),(Y),203)
+#define get_csv_v_str_pos203(X,Y) get_csv_string((X),(Y),203)
+#define get_csv_bool_pos203(X,Y) get_csv_bool((X),(Y),203)
+#define get_csv_int_pos203(X,Y) get_csv_int((X),(Y),203)
+#define get_csv_llong_pos203(X,Y) get_csv_llong((X),(Y),203)
+#define get_csv_float_pos203(X,Y) get_csv_float((X),(Y),203)
+#define get_csv_uint_pos204(X,Y) get_csv_uint((X),(Y),204)
+#define get_csv_ullong_pos204(X,Y) get_csv_ullong((X),(Y),204)
+#define get_csv_ip_pos204(X,Y) get_csv_ip((X),(Y),204)
+#define get_csv_ipv6_pos204(X,Y) get_csv_ipv6((X),(Y),204)
+#define get_csv_string_pos204(X,Y) get_csv_string((X),(Y),204)
+#define get_csv_v_str_pos204(X,Y) get_csv_string((X),(Y),204)
+#define get_csv_bool_pos204(X,Y) get_csv_bool((X),(Y),204)
+#define get_csv_int_pos204(X,Y) get_csv_int((X),(Y),204)
+#define get_csv_llong_pos204(X,Y) get_csv_llong((X),(Y),204)
+#define get_csv_float_pos204(X,Y) get_csv_float((X),(Y),204)
+#define get_csv_uint_pos205(X,Y) get_csv_uint((X),(Y),205)
+#define get_csv_ullong_pos205(X,Y) get_csv_ullong((X),(Y),205)
+#define get_csv_ip_pos205(X,Y) get_csv_ip((X),(Y),205)
+#define get_csv_ipv6_pos205(X,Y) get_csv_ipv6((X),(Y),205)
+#define get_csv_string_pos205(X,Y) get_csv_string((X),(Y),205)
+#define get_csv_v_str_pos205(X,Y) get_csv_string((X),(Y),205)
+#define get_csv_bool_pos205(X,Y) get_csv_bool((X),(Y),205)
+#define get_csv_int_pos205(X,Y) get_csv_int((X),(Y),205)
+#define get_csv_llong_pos205(X,Y) get_csv_llong((X),(Y),205)
+#define get_csv_float_pos205(X,Y) get_csv_float((X),(Y),205)
+#define get_csv_uint_pos206(X,Y) get_csv_uint((X),(Y),206)
+#define get_csv_ullong_pos206(X,Y) get_csv_ullong((X),(Y),206)
+#define get_csv_ip_pos206(X,Y) get_csv_ip((X),(Y),206)
+#define get_csv_ipv6_pos206(X,Y) get_csv_ipv6((X),(Y),206)
+#define get_csv_string_pos206(X,Y) get_csv_string((X),(Y),206)
+#define get_csv_v_str_pos206(X,Y) get_csv_string((X),(Y),206)
+#define get_csv_bool_pos206(X,Y) get_csv_bool((X),(Y),206)
+#define get_csv_int_pos206(X,Y) get_csv_int((X),(Y),206)
+#define get_csv_llong_pos206(X,Y) get_csv_llong((X),(Y),206)
+#define get_csv_float_pos206(X,Y) get_csv_float((X),(Y),206)
+#define get_csv_uint_pos207(X,Y) get_csv_uint((X),(Y),207)
+#define get_csv_ullong_pos207(X,Y) get_csv_ullong((X),(Y),207)
+#define get_csv_ip_pos207(X,Y) get_csv_ip((X),(Y),207)
+#define get_csv_ipv6_pos207(X,Y) get_csv_ipv6((X),(Y),207)
+#define get_csv_string_pos207(X,Y) get_csv_string((X),(Y),207)
+#define get_csv_v_str_pos207(X,Y) get_csv_string((X),(Y),207)
+#define get_csv_bool_pos207(X,Y) get_csv_bool((X),(Y),207)
+#define get_csv_int_pos207(X,Y) get_csv_int((X),(Y),207)
+#define get_csv_llong_pos207(X,Y) get_csv_llong((X),(Y),207)
+#define get_csv_float_pos207(X,Y) get_csv_float((X),(Y),207)
+#define get_csv_uint_pos208(X,Y) get_csv_uint((X),(Y),208)
+#define get_csv_ullong_pos208(X,Y) get_csv_ullong((X),(Y),208)
+#define get_csv_ip_pos208(X,Y) get_csv_ip((X),(Y),208)
+#define get_csv_ipv6_pos208(X,Y) get_csv_ipv6((X),(Y),208)
+#define get_csv_string_pos208(X,Y) get_csv_string((X),(Y),208)
+#define get_csv_v_str_pos208(X,Y) get_csv_string((X),(Y),208)
+#define get_csv_bool_pos208(X,Y) get_csv_bool((X),(Y),208)
+#define get_csv_int_pos208(X,Y) get_csv_int((X),(Y),208)
+#define get_csv_llong_pos208(X,Y) get_csv_llong((X),(Y),208)
+#define get_csv_float_pos208(X,Y) get_csv_float((X),(Y),208)
+#define get_csv_uint_pos209(X,Y) get_csv_uint((X),(Y),209)
+#define get_csv_ullong_pos209(X,Y) get_csv_ullong((X),(Y),209)
+#define get_csv_ip_pos209(X,Y) get_csv_ip((X),(Y),209)
+#define get_csv_ipv6_pos209(X,Y) get_csv_ipv6((X),(Y),209)
+#define get_csv_string_pos209(X,Y) get_csv_string((X),(Y),209)
+#define get_csv_v_str_pos209(X,Y) get_csv_string((X),(Y),209)
+#define get_csv_bool_pos209(X,Y) get_csv_bool((X),(Y),209)
+#define get_csv_int_pos209(X,Y) get_csv_int((X),(Y),209)
+#define get_csv_llong_pos209(X,Y) get_csv_llong((X),(Y),209)
+#define get_csv_float_pos209(X,Y) get_csv_float((X),(Y),209)
+#define get_csv_uint_pos210(X,Y) get_csv_uint((X),(Y),210)
+#define get_csv_ullong_pos210(X,Y) get_csv_ullong((X),(Y),210)
+#define get_csv_ip_pos210(X,Y) get_csv_ip((X),(Y),210)
+#define get_csv_ipv6_pos210(X,Y) get_csv_ipv6((X),(Y),210)
+#define get_csv_string_pos210(X,Y) get_csv_string((X),(Y),210)
+#define get_csv_v_str_pos210(X,Y) get_csv_string((X),(Y),210)
+#define get_csv_bool_pos210(X,Y) get_csv_bool((X),(Y),210)
+#define get_csv_int_pos210(X,Y) get_csv_int((X),(Y),210)
+#define get_csv_llong_pos210(X,Y) get_csv_llong((X),(Y),210)
+#define get_csv_float_pos210(X,Y) get_csv_float((X),(Y),210)
+#define get_csv_uint_pos211(X,Y) get_csv_uint((X),(Y),211)
+#define get_csv_ullong_pos211(X,Y) get_csv_ullong((X),(Y),211)
+#define get_csv_ip_pos211(X,Y) get_csv_ip((X),(Y),211)
+#define get_csv_ipv6_pos211(X,Y) get_csv_ipv6((X),(Y),211)
+#define get_csv_string_pos211(X,Y) get_csv_string((X),(Y),211)
+#define get_csv_v_str_pos211(X,Y) get_csv_string((X),(Y),211)
+#define get_csv_bool_pos211(X,Y) get_csv_bool((X),(Y),211)
+#define get_csv_int_pos211(X,Y) get_csv_int((X),(Y),211)
+#define get_csv_llong_pos211(X,Y) get_csv_llong((X),(Y),211)
+#define get_csv_float_pos211(X,Y) get_csv_float((X),(Y),211)
+#define get_csv_uint_pos212(X,Y) get_csv_uint((X),(Y),212)
+#define get_csv_ullong_pos212(X,Y) get_csv_ullong((X),(Y),212)
+#define get_csv_ip_pos212(X,Y) get_csv_ip((X),(Y),212)
+#define get_csv_ipv6_pos212(X,Y) get_csv_ipv6((X),(Y),212)
+#define get_csv_string_pos212(X,Y) get_csv_string((X),(Y),212)
+#define get_csv_v_str_pos212(X,Y) get_csv_string((X),(Y),212)
+#define get_csv_bool_pos212(X,Y) get_csv_bool((X),(Y),212)
+#define get_csv_int_pos212(X,Y) get_csv_int((X),(Y),212)
+#define get_csv_llong_pos212(X,Y) get_csv_llong((X),(Y),212)
+#define get_csv_float_pos212(X,Y) get_csv_float((X),(Y),212)
+#define get_csv_uint_pos213(X,Y) get_csv_uint((X),(Y),213)
+#define get_csv_ullong_pos213(X,Y) get_csv_ullong((X),(Y),213)
+#define get_csv_ip_pos213(X,Y) get_csv_ip((X),(Y),213)
+#define get_csv_ipv6_pos213(X,Y) get_csv_ipv6((X),(Y),213)
+#define get_csv_string_pos213(X,Y) get_csv_string((X),(Y),213)
+#define get_csv_v_str_pos213(X,Y) get_csv_string((X),(Y),213)
+#define get_csv_bool_pos213(X,Y) get_csv_bool((X),(Y),213)
+#define get_csv_int_pos213(X,Y) get_csv_int((X),(Y),213)
+#define get_csv_llong_pos213(X,Y) get_csv_llong((X),(Y),213)
+#define get_csv_float_pos213(X,Y) get_csv_float((X),(Y),213)
+#define get_csv_uint_pos214(X,Y) get_csv_uint((X),(Y),214)
+#define get_csv_ullong_pos214(X,Y) get_csv_ullong((X),(Y),214)
+#define get_csv_ip_pos214(X,Y) get_csv_ip((X),(Y),214)
+#define get_csv_ipv6_pos214(X,Y) get_csv_ipv6((X),(Y),214)
+#define get_csv_string_pos214(X,Y) get_csv_string((X),(Y),214)
+#define get_csv_v_str_pos214(X,Y) get_csv_string((X),(Y),214)
+#define get_csv_bool_pos214(X,Y) get_csv_bool((X),(Y),214)
+#define get_csv_int_pos214(X,Y) get_csv_int((X),(Y),214)
+#define get_csv_llong_pos214(X,Y) get_csv_llong((X),(Y),214)
+#define get_csv_float_pos214(X,Y) get_csv_float((X),(Y),214)
+#define get_csv_uint_pos215(X,Y) get_csv_uint((X),(Y),215)
+#define get_csv_ullong_pos215(X,Y) get_csv_ullong((X),(Y),215)
+#define get_csv_ip_pos215(X,Y) get_csv_ip((X),(Y),215)
+#define get_csv_ipv6_pos215(X,Y) get_csv_ipv6((X),(Y),215)
+#define get_csv_string_pos215(X,Y) get_csv_string((X),(Y),215)
+#define get_csv_v_str_pos215(X,Y) get_csv_string((X),(Y),215)
+#define get_csv_bool_pos215(X,Y) get_csv_bool((X),(Y),215)
+#define get_csv_int_pos215(X,Y) get_csv_int((X),(Y),215)
+#define get_csv_llong_pos215(X,Y) get_csv_llong((X),(Y),215)
+#define get_csv_float_pos215(X,Y) get_csv_float((X),(Y),215)
+#define get_csv_uint_pos216(X,Y) get_csv_uint((X),(Y),216)
+#define get_csv_ullong_pos216(X,Y) get_csv_ullong((X),(Y),216)
+#define get_csv_ip_pos216(X,Y) get_csv_ip((X),(Y),216)
+#define get_csv_ipv6_pos216(X,Y) get_csv_ipv6((X),(Y),216)
+#define get_csv_string_pos216(X,Y) get_csv_string((X),(Y),216)
+#define get_csv_v_str_pos216(X,Y) get_csv_string((X),(Y),216)
+#define get_csv_bool_pos216(X,Y) get_csv_bool((X),(Y),216)
+#define get_csv_int_pos216(X,Y) get_csv_int((X),(Y),216)
+#define get_csv_llong_pos216(X,Y) get_csv_llong((X),(Y),216)
+#define get_csv_float_pos216(X,Y) get_csv_float((X),(Y),216)
+#define get_csv_uint_pos217(X,Y) get_csv_uint((X),(Y),217)
+#define get_csv_ullong_pos217(X,Y) get_csv_ullong((X),(Y),217)
+#define get_csv_ip_pos217(X,Y) get_csv_ip((X),(Y),217)
+#define get_csv_ipv6_pos217(X,Y) get_csv_ipv6((X),(Y),217)
+#define get_csv_string_pos217(X,Y) get_csv_string((X),(Y),217)
+#define get_csv_v_str_pos217(X,Y) get_csv_string((X),(Y),217)
+#define get_csv_bool_pos217(X,Y) get_csv_bool((X),(Y),217)
+#define get_csv_int_pos217(X,Y) get_csv_int((X),(Y),217)
+#define get_csv_llong_pos217(X,Y) get_csv_llong((X),(Y),217)
+#define get_csv_float_pos217(X,Y) get_csv_float((X),(Y),217)
+#define get_csv_uint_pos218(X,Y) get_csv_uint((X),(Y),218)
+#define get_csv_ullong_pos218(X,Y) get_csv_ullong((X),(Y),218)
+#define get_csv_ip_pos218(X,Y) get_csv_ip((X),(Y),218)
+#define get_csv_ipv6_pos218(X,Y) get_csv_ipv6((X),(Y),218)
+#define get_csv_string_pos218(X,Y) get_csv_string((X),(Y),218)
+#define get_csv_v_str_pos218(X,Y) get_csv_string((X),(Y),218)
+#define get_csv_bool_pos218(X,Y) get_csv_bool((X),(Y),218)
+#define get_csv_int_pos218(X,Y) get_csv_int((X),(Y),218)
+#define get_csv_llong_pos218(X,Y) get_csv_llong((X),(Y),218)
+#define get_csv_float_pos218(X,Y) get_csv_float((X),(Y),218)
+#define get_csv_uint_pos219(X,Y) get_csv_uint((X),(Y),219)
+#define get_csv_ullong_pos219(X,Y) get_csv_ullong((X),(Y),219)
+#define get_csv_ip_pos219(X,Y) get_csv_ip((X),(Y),219)
+#define get_csv_ipv6_pos219(X,Y) get_csv_ipv6((X),(Y),219)
+#define get_csv_string_pos219(X,Y) get_csv_string((X),(Y),219)
+#define get_csv_v_str_pos219(X,Y) get_csv_string((X),(Y),219)
+#define get_csv_bool_pos219(X,Y) get_csv_bool((X),(Y),219)
+#define get_csv_int_pos219(X,Y) get_csv_int((X),(Y),219)
+#define get_csv_llong_pos219(X,Y) get_csv_llong((X),(Y),219)
+#define get_csv_float_pos219(X,Y) get_csv_float((X),(Y),219)
+#define get_csv_uint_pos220(X,Y) get_csv_uint((X),(Y),220)
+#define get_csv_ullong_pos220(X,Y) get_csv_ullong((X),(Y),220)
+#define get_csv_ip_pos220(X,Y) get_csv_ip((X),(Y),220)
+#define get_csv_ipv6_pos220(X,Y) get_csv_ipv6((X),(Y),220)
+#define get_csv_string_pos220(X,Y) get_csv_string((X),(Y),220)
+#define get_csv_v_str_pos220(X,Y) get_csv_string((X),(Y),220)
+#define get_csv_bool_pos220(X,Y) get_csv_bool((X),(Y),220)
+#define get_csv_int_pos220(X,Y) get_csv_int((X),(Y),220)
+#define get_csv_llong_pos220(X,Y) get_csv_llong((X),(Y),220)
+#define get_csv_float_pos220(X,Y) get_csv_float((X),(Y),220)
+#define get_csv_uint_pos221(X,Y) get_csv_uint((X),(Y),221)
+#define get_csv_ullong_pos221(X,Y) get_csv_ullong((X),(Y),221)
+#define get_csv_ip_pos221(X,Y) get_csv_ip((X),(Y),221)
+#define get_csv_ipv6_pos221(X,Y) get_csv_ipv6((X),(Y),221)
+#define get_csv_string_pos221(X,Y) get_csv_string((X),(Y),221)
+#define get_csv_v_str_pos221(X,Y) get_csv_string((X),(Y),221)
+#define get_csv_bool_pos221(X,Y) get_csv_bool((X),(Y),221)
+#define get_csv_int_pos221(X,Y) get_csv_int((X),(Y),221)
+#define get_csv_llong_pos221(X,Y) get_csv_llong((X),(Y),221)
+#define get_csv_float_pos221(X,Y) get_csv_float((X),(Y),221)
+#define get_csv_uint_pos222(X,Y) get_csv_uint((X),(Y),222)
+#define get_csv_ullong_pos222(X,Y) get_csv_ullong((X),(Y),222)
+#define get_csv_ip_pos222(X,Y) get_csv_ip((X),(Y),222)
+#define get_csv_ipv6_pos222(X,Y) get_csv_ipv6((X),(Y),222)
+#define get_csv_string_pos222(X,Y) get_csv_string((X),(Y),222)
+#define get_csv_v_str_pos222(X,Y) get_csv_string((X),(Y),222)
+#define get_csv_bool_pos222(X,Y) get_csv_bool((X),(Y),222)
+#define get_csv_int_pos222(X,Y) get_csv_int((X),(Y),222)
+#define get_csv_llong_pos222(X,Y) get_csv_llong((X),(Y),222)
+#define get_csv_float_pos222(X,Y) get_csv_float((X),(Y),222)
+#define get_csv_uint_pos223(X,Y) get_csv_uint((X),(Y),223)
+#define get_csv_ullong_pos223(X,Y) get_csv_ullong((X),(Y),223)
+#define get_csv_ip_pos223(X,Y) get_csv_ip((X),(Y),223)
+#define get_csv_ipv6_pos223(X,Y) get_csv_ipv6((X),(Y),223)
+#define get_csv_string_pos223(X,Y) get_csv_string((X),(Y),223)
+#define get_csv_v_str_pos223(X,Y) get_csv_string((X),(Y),223)
+#define get_csv_bool_pos223(X,Y) get_csv_bool((X),(Y),223)
+#define get_csv_int_pos223(X,Y) get_csv_int((X),(Y),223)
+#define get_csv_llong_pos223(X,Y) get_csv_llong((X),(Y),223)
+#define get_csv_float_pos223(X,Y) get_csv_float((X),(Y),223)
+#define get_csv_uint_pos224(X,Y) get_csv_uint((X),(Y),224)
+#define get_csv_ullong_pos224(X,Y) get_csv_ullong((X),(Y),224)
+#define get_csv_ip_pos224(X,Y) get_csv_ip((X),(Y),224)
+#define get_csv_ipv6_pos224(X,Y) get_csv_ipv6((X),(Y),224)
+#define get_csv_string_pos224(X,Y) get_csv_string((X),(Y),224)
+#define get_csv_v_str_pos224(X,Y) get_csv_string((X),(Y),224)
+#define get_csv_bool_pos224(X,Y) get_csv_bool((X),(Y),224)
+#define get_csv_int_pos224(X,Y) get_csv_int((X),(Y),224)
+#define get_csv_llong_pos224(X,Y) get_csv_llong((X),(Y),224)
+#define get_csv_float_pos224(X,Y) get_csv_float((X),(Y),224)
+#define get_csv_uint_pos225(X,Y) get_csv_uint((X),(Y),225)
+#define get_csv_ullong_pos225(X,Y) get_csv_ullong((X),(Y),225)
+#define get_csv_ip_pos225(X,Y) get_csv_ip((X),(Y),225)
+#define get_csv_ipv6_pos225(X,Y) get_csv_ipv6((X),(Y),225)
+#define get_csv_string_pos225(X,Y) get_csv_string((X),(Y),225)
+#define get_csv_v_str_pos225(X,Y) get_csv_string((X),(Y),225)
+#define get_csv_bool_pos225(X,Y) get_csv_bool((X),(Y),225)
+#define get_csv_int_pos225(X,Y) get_csv_int((X),(Y),225)
+#define get_csv_llong_pos225(X,Y) get_csv_llong((X),(Y),225)
+#define get_csv_float_pos225(X,Y) get_csv_float((X),(Y),225)
+#define get_csv_uint_pos226(X,Y) get_csv_uint((X),(Y),226)
+#define get_csv_ullong_pos226(X,Y) get_csv_ullong((X),(Y),226)
+#define get_csv_ip_pos226(X,Y) get_csv_ip((X),(Y),226)
+#define get_csv_ipv6_pos226(X,Y) get_csv_ipv6((X),(Y),226)
+#define get_csv_string_pos226(X,Y) get_csv_string((X),(Y),226)
+#define get_csv_v_str_pos226(X,Y) get_csv_string((X),(Y),226)
+#define get_csv_bool_pos226(X,Y) get_csv_bool((X),(Y),226)
+#define get_csv_int_pos226(X,Y) get_csv_int((X),(Y),226)
+#define get_csv_llong_pos226(X,Y) get_csv_llong((X),(Y),226)
+#define get_csv_float_pos226(X,Y) get_csv_float((X),(Y),226)
+#define get_csv_uint_pos227(X,Y) get_csv_uint((X),(Y),227)
+#define get_csv_ullong_pos227(X,Y) get_csv_ullong((X),(Y),227)
+#define get_csv_ip_pos227(X,Y) get_csv_ip((X),(Y),227)
+#define get_csv_ipv6_pos227(X,Y) get_csv_ipv6((X),(Y),227)
+#define get_csv_string_pos227(X,Y) get_csv_string((X),(Y),227)
+#define get_csv_v_str_pos227(X,Y) get_csv_string((X),(Y),227)
+#define get_csv_bool_pos227(X,Y) get_csv_bool((X),(Y),227)
+#define get_csv_int_pos227(X,Y) get_csv_int((X),(Y),227)
+#define get_csv_llong_pos227(X,Y) get_csv_llong((X),(Y),227)
+#define get_csv_float_pos227(X,Y) get_csv_float((X),(Y),227)
+#define get_csv_uint_pos228(X,Y) get_csv_uint((X),(Y),228)
+#define get_csv_ullong_pos228(X,Y) get_csv_ullong((X),(Y),228)
+#define get_csv_ip_pos228(X,Y) get_csv_ip((X),(Y),228)
+#define get_csv_ipv6_pos228(X,Y) get_csv_ipv6((X),(Y),228)
+#define get_csv_string_pos228(X,Y) get_csv_string((X),(Y),228)
+#define get_csv_v_str_pos228(X,Y) get_csv_string((X),(Y),228)
+#define get_csv_bool_pos228(X,Y) get_csv_bool((X),(Y),228)
+#define get_csv_int_pos228(X,Y) get_csv_int((X),(Y),228)
+#define get_csv_llong_pos228(X,Y) get_csv_llong((X),(Y),228)
+#define get_csv_float_pos228(X,Y) get_csv_float((X),(Y),228)
+#define get_csv_uint_pos229(X,Y) get_csv_uint((X),(Y),229)
+#define get_csv_ullong_pos229(X,Y) get_csv_ullong((X),(Y),229)
+#define get_csv_ip_pos229(X,Y) get_csv_ip((X),(Y),229)
+#define get_csv_ipv6_pos229(X,Y) get_csv_ipv6((X),(Y),229)
+#define get_csv_string_pos229(X,Y) get_csv_string((X),(Y),229)
+#define get_csv_v_str_pos229(X,Y) get_csv_string((X),(Y),229)
+#define get_csv_bool_pos229(X,Y) get_csv_bool((X),(Y),229)
+#define get_csv_int_pos229(X,Y) get_csv_int((X),(Y),229)
+#define get_csv_llong_pos229(X,Y) get_csv_llong((X),(Y),229)
+#define get_csv_float_pos229(X,Y) get_csv_float((X),(Y),229)
+#define get_csv_uint_pos230(X,Y) get_csv_uint((X),(Y),230)
+#define get_csv_ullong_pos230(X,Y) get_csv_ullong((X),(Y),230)
+#define get_csv_ip_pos230(X,Y) get_csv_ip((X),(Y),230)
+#define get_csv_ipv6_pos230(X,Y) get_csv_ipv6((X),(Y),230)
+#define get_csv_string_pos230(X,Y) get_csv_string((X),(Y),230)
+#define get_csv_v_str_pos230(X,Y) get_csv_string((X),(Y),230)
+#define get_csv_bool_pos230(X,Y) get_csv_bool((X),(Y),230)
+#define get_csv_int_pos230(X,Y) get_csv_int((X),(Y),230)
+#define get_csv_llong_pos230(X,Y) get_csv_llong((X),(Y),230)
+#define get_csv_float_pos230(X,Y) get_csv_float((X),(Y),230)
+#define get_csv_uint_pos231(X,Y) get_csv_uint((X),(Y),231)
+#define get_csv_ullong_pos231(X,Y) get_csv_ullong((X),(Y),231)
+#define get_csv_ip_pos231(X,Y) get_csv_ip((X),(Y),231)
+#define get_csv_ipv6_pos231(X,Y) get_csv_ipv6((X),(Y),231)
+#define get_csv_string_pos231(X,Y) get_csv_string((X),(Y),231)
+#define get_csv_v_str_pos231(X,Y) get_csv_string((X),(Y),231)
+#define get_csv_bool_pos231(X,Y) get_csv_bool((X),(Y),231)
+#define get_csv_int_pos231(X,Y) get_csv_int((X),(Y),231)
+#define get_csv_llong_pos231(X,Y) get_csv_llong((X),(Y),231)
+#define get_csv_float_pos231(X,Y) get_csv_float((X),(Y),231)
+#define get_csv_uint_pos232(X,Y) get_csv_uint((X),(Y),232)
+#define get_csv_ullong_pos232(X,Y) get_csv_ullong((X),(Y),232)
+#define get_csv_ip_pos232(X,Y) get_csv_ip((X),(Y),232)
+#define get_csv_ipv6_pos232(X,Y) get_csv_ipv6((X),(Y),232)
+#define get_csv_string_pos232(X,Y) get_csv_string((X),(Y),232)
+#define get_csv_v_str_pos232(X,Y) get_csv_string((X),(Y),232)
+#define get_csv_bool_pos232(X,Y) get_csv_bool((X),(Y),232)
+#define get_csv_int_pos232(X,Y) get_csv_int((X),(Y),232)
+#define get_csv_llong_pos232(X,Y) get_csv_llong((X),(Y),232)
+#define get_csv_float_pos232(X,Y) get_csv_float((X),(Y),232)
+#define get_csv_uint_pos233(X,Y) get_csv_uint((X),(Y),233)
+#define get_csv_ullong_pos233(X,Y) get_csv_ullong((X),(Y),233)
+#define get_csv_ip_pos233(X,Y) get_csv_ip((X),(Y),233)
+#define get_csv_ipv6_pos233(X,Y) get_csv_ipv6((X),(Y),233)
+#define get_csv_string_pos233(X,Y) get_csv_string((X),(Y),233)
+#define get_csv_v_str_pos233(X,Y) get_csv_string((X),(Y),233)
+#define get_csv_bool_pos233(X,Y) get_csv_bool((X),(Y),233)
+#define get_csv_int_pos233(X,Y) get_csv_int((X),(Y),233)
+#define get_csv_llong_pos233(X,Y) get_csv_llong((X),(Y),233)
+#define get_csv_float_pos233(X,Y) get_csv_float((X),(Y),233)
+#define get_csv_uint_pos234(X,Y) get_csv_uint((X),(Y),234)
+#define get_csv_ullong_pos234(X,Y) get_csv_ullong((X),(Y),234)
+#define get_csv_ip_pos234(X,Y) get_csv_ip((X),(Y),234)
+#define get_csv_ipv6_pos234(X,Y) get_csv_ipv6((X),(Y),234)
+#define get_csv_string_pos234(X,Y) get_csv_string((X),(Y),234)
+#define get_csv_v_str_pos234(X,Y) get_csv_string((X),(Y),234)
+#define get_csv_bool_pos234(X,Y) get_csv_bool((X),(Y),234)
+#define get_csv_int_pos234(X,Y) get_csv_int((X),(Y),234)
+#define get_csv_llong_pos234(X,Y) get_csv_llong((X),(Y),234)
+#define get_csv_float_pos234(X,Y) get_csv_float((X),(Y),234)
+#define get_csv_uint_pos235(X,Y) get_csv_uint((X),(Y),235)
+#define get_csv_ullong_pos235(X,Y) get_csv_ullong((X),(Y),235)
+#define get_csv_ip_pos235(X,Y) get_csv_ip((X),(Y),235)
+#define get_csv_ipv6_pos235(X,Y) get_csv_ipv6((X),(Y),235)
+#define get_csv_string_pos235(X,Y) get_csv_string((X),(Y),235)
+#define get_csv_v_str_pos235(X,Y) get_csv_string((X),(Y),235)
+#define get_csv_bool_pos235(X,Y) get_csv_bool((X),(Y),235)
+#define get_csv_int_pos235(X,Y) get_csv_int((X),(Y),235)
+#define get_csv_llong_pos235(X,Y) get_csv_llong((X),(Y),235)
+#define get_csv_float_pos235(X,Y) get_csv_float((X),(Y),235)
+#define get_csv_uint_pos236(X,Y) get_csv_uint((X),(Y),236)
+#define get_csv_ullong_pos236(X,Y) get_csv_ullong((X),(Y),236)
+#define get_csv_ip_pos236(X,Y) get_csv_ip((X),(Y),236)
+#define get_csv_ipv6_pos236(X,Y) get_csv_ipv6((X),(Y),236)
+#define get_csv_string_pos236(X,Y) get_csv_string((X),(Y),236)
+#define get_csv_v_str_pos236(X,Y) get_csv_string((X),(Y),236)
+#define get_csv_bool_pos236(X,Y) get_csv_bool((X),(Y),236)
+#define get_csv_int_pos236(X,Y) get_csv_int((X),(Y),236)
+#define get_csv_llong_pos236(X,Y) get_csv_llong((X),(Y),236)
+#define get_csv_float_pos236(X,Y) get_csv_float((X),(Y),236)
+#define get_csv_uint_pos237(X,Y) get_csv_uint((X),(Y),237)
+#define get_csv_ullong_pos237(X,Y) get_csv_ullong((X),(Y),237)
+#define get_csv_ip_pos237(X,Y) get_csv_ip((X),(Y),237)
+#define get_csv_ipv6_pos237(X,Y) get_csv_ipv6((X),(Y),237)
+#define get_csv_string_pos237(X,Y) get_csv_string((X),(Y),237)
+#define get_csv_v_str_pos237(X,Y) get_csv_string((X),(Y),237)
+#define get_csv_bool_pos237(X,Y) get_csv_bool((X),(Y),237)
+#define get_csv_int_pos237(X,Y) get_csv_int((X),(Y),237)
+#define get_csv_llong_pos237(X,Y) get_csv_llong((X),(Y),237)
+#define get_csv_float_pos237(X,Y) get_csv_float((X),(Y),237)
+#define get_csv_uint_pos238(X,Y) get_csv_uint((X),(Y),238)
+#define get_csv_ullong_pos238(X,Y) get_csv_ullong((X),(Y),238)
+#define get_csv_ip_pos238(X,Y) get_csv_ip((X),(Y),238)
+#define get_csv_ipv6_pos238(X,Y) get_csv_ipv6((X),(Y),238)
+#define get_csv_string_pos238(X,Y) get_csv_string((X),(Y),238)
+#define get_csv_v_str_pos238(X,Y) get_csv_string((X),(Y),238)
+#define get_csv_bool_pos238(X,Y) get_csv_bool((X),(Y),238)
+#define get_csv_int_pos238(X,Y) get_csv_int((X),(Y),238)
+#define get_csv_llong_pos238(X,Y) get_csv_llong((X),(Y),238)
+#define get_csv_float_pos238(X,Y) get_csv_float((X),(Y),238)
+#define get_csv_uint_pos239(X,Y) get_csv_uint((X),(Y),239)
+#define get_csv_ullong_pos239(X,Y) get_csv_ullong((X),(Y),239)
+#define get_csv_ip_pos239(X,Y) get_csv_ip((X),(Y),239)
+#define get_csv_ipv6_pos239(X,Y) get_csv_ipv6((X),(Y),239)
+#define get_csv_string_pos239(X,Y) get_csv_string((X),(Y),239)
+#define get_csv_v_str_pos239(X,Y) get_csv_string((X),(Y),239)
+#define get_csv_bool_pos239(X,Y) get_csv_bool((X),(Y),239)
+#define get_csv_int_pos239(X,Y) get_csv_int((X),(Y),239)
+#define get_csv_llong_pos239(X,Y) get_csv_llong((X),(Y),239)
+#define get_csv_float_pos239(X,Y) get_csv_float((X),(Y),239)
+#define get_csv_uint_pos240(X,Y) get_csv_uint((X),(Y),240)
+#define get_csv_ullong_pos240(X,Y) get_csv_ullong((X),(Y),240)
+#define get_csv_ip_pos240(X,Y) get_csv_ip((X),(Y),240)
+#define get_csv_ipv6_pos240(X,Y) get_csv_ipv6((X),(Y),240)
+#define get_csv_string_pos240(X,Y) get_csv_string((X),(Y),240)
+#define get_csv_v_str_pos240(X,Y) get_csv_string((X),(Y),240)
+#define get_csv_bool_pos240(X,Y) get_csv_bool((X),(Y),240)
+#define get_csv_int_pos240(X,Y) get_csv_int((X),(Y),240)
+#define get_csv_llong_pos240(X,Y) get_csv_llong((X),(Y),240)
+#define get_csv_float_pos240(X,Y) get_csv_float((X),(Y),240)
+#define get_csv_uint_pos241(X,Y) get_csv_uint((X),(Y),241)
+#define get_csv_ullong_pos241(X,Y) get_csv_ullong((X),(Y),241)
+#define get_csv_ip_pos241(X,Y) get_csv_ip((X),(Y),241)
+#define get_csv_ipv6_pos241(X,Y) get_csv_ipv6((X),(Y),241)
+#define get_csv_string_pos241(X,Y) get_csv_string((X),(Y),241)
+#define get_csv_v_str_pos241(X,Y) get_csv_string((X),(Y),241)
+#define get_csv_bool_pos241(X,Y) get_csv_bool((X),(Y),241)
+#define get_csv_int_pos241(X,Y) get_csv_int((X),(Y),241)
+#define get_csv_llong_pos241(X,Y) get_csv_llong((X),(Y),241)
+#define get_csv_float_pos241(X,Y) get_csv_float((X),(Y),241)
+#define get_csv_uint_pos242(X,Y) get_csv_uint((X),(Y),242)
+#define get_csv_ullong_pos242(X,Y) get_csv_ullong((X),(Y),242)
+#define get_csv_ip_pos242(X,Y) get_csv_ip((X),(Y),242)
+#define get_csv_ipv6_pos242(X,Y) get_csv_ipv6((X),(Y),242)
+#define get_csv_string_pos242(X,Y) get_csv_string((X),(Y),242)
+#define get_csv_v_str_pos242(X,Y) get_csv_string((X),(Y),242)
+#define get_csv_bool_pos242(X,Y) get_csv_bool((X),(Y),242)
+#define get_csv_int_pos242(X,Y) get_csv_int((X),(Y),242)
+#define get_csv_llong_pos242(X,Y) get_csv_llong((X),(Y),242)
+#define get_csv_float_pos242(X,Y) get_csv_float((X),(Y),242)
+#define get_csv_uint_pos243(X,Y) get_csv_uint((X),(Y),243)
+#define get_csv_ullong_pos243(X,Y) get_csv_ullong((X),(Y),243)
+#define get_csv_ip_pos243(X,Y) get_csv_ip((X),(Y),243)
+#define get_csv_ipv6_pos243(X,Y) get_csv_ipv6((X),(Y),243)
+#define get_csv_string_pos243(X,Y) get_csv_string((X),(Y),243)
+#define get_csv_v_str_pos243(X,Y) get_csv_string((X),(Y),243)
+#define get_csv_bool_pos243(X,Y) get_csv_bool((X),(Y),243)
+#define get_csv_int_pos243(X,Y) get_csv_int((X),(Y),243)
+#define get_csv_llong_pos243(X,Y) get_csv_llong((X),(Y),243)
+#define get_csv_float_pos243(X,Y) get_csv_float((X),(Y),243)
+#define get_csv_uint_pos244(X,Y) get_csv_uint((X),(Y),244)
+#define get_csv_ullong_pos244(X,Y) get_csv_ullong((X),(Y),244)
+#define get_csv_ip_pos244(X,Y) get_csv_ip((X),(Y),244)
+#define get_csv_ipv6_pos244(X,Y) get_csv_ipv6((X),(Y),244)
+#define get_csv_string_pos244(X,Y) get_csv_string((X),(Y),244)
+#define get_csv_v_str_pos244(X,Y) get_csv_string((X),(Y),244)
+#define get_csv_bool_pos244(X,Y) get_csv_bool((X),(Y),244)
+#define get_csv_int_pos244(X,Y) get_csv_int((X),(Y),244)
+#define get_csv_llong_pos244(X,Y) get_csv_llong((X),(Y),244)
+#define get_csv_float_pos244(X,Y) get_csv_float((X),(Y),244)
+#define get_csv_uint_pos245(X,Y) get_csv_uint((X),(Y),245)
+#define get_csv_ullong_pos245(X,Y) get_csv_ullong((X),(Y),245)
+#define get_csv_ip_pos245(X,Y) get_csv_ip((X),(Y),245)
+#define get_csv_ipv6_pos245(X,Y) get_csv_ipv6((X),(Y),245)
+#define get_csv_string_pos245(X,Y) get_csv_string((X),(Y),245)
+#define get_csv_v_str_pos245(X,Y) get_csv_string((X),(Y),245)
+#define get_csv_bool_pos245(X,Y) get_csv_bool((X),(Y),245)
+#define get_csv_int_pos245(X,Y) get_csv_int((X),(Y),245)
+#define get_csv_llong_pos245(X,Y) get_csv_llong((X),(Y),245)
+#define get_csv_float_pos245(X,Y) get_csv_float((X),(Y),245)
+#define get_csv_uint_pos246(X,Y) get_csv_uint((X),(Y),246)
+#define get_csv_ullong_pos246(X,Y) get_csv_ullong((X),(Y),246)
+#define get_csv_ip_pos246(X,Y) get_csv_ip((X),(Y),246)
+#define get_csv_ipv6_pos246(X,Y) get_csv_ipv6((X),(Y),246)
+#define get_csv_string_pos246(X,Y) get_csv_string((X),(Y),246)
+#define get_csv_v_str_pos246(X,Y) get_csv_string((X),(Y),246)
+#define get_csv_bool_pos246(X,Y) get_csv_bool((X),(Y),246)
+#define get_csv_int_pos246(X,Y) get_csv_int((X),(Y),246)
+#define get_csv_llong_pos246(X,Y) get_csv_llong((X),(Y),246)
+#define get_csv_float_pos246(X,Y) get_csv_float((X),(Y),246)
+#define get_csv_uint_pos247(X,Y) get_csv_uint((X),(Y),247)
+#define get_csv_ullong_pos247(X,Y) get_csv_ullong((X),(Y),247)
+#define get_csv_ip_pos247(X,Y) get_csv_ip((X),(Y),247)
+#define get_csv_ipv6_pos247(X,Y) get_csv_ipv6((X),(Y),247)
+#define get_csv_string_pos247(X,Y) get_csv_string((X),(Y),247)
+#define get_csv_v_str_pos247(X,Y) get_csv_string((X),(Y),247)
+#define get_csv_bool_pos247(X,Y) get_csv_bool((X),(Y),247)
+#define get_csv_int_pos247(X,Y) get_csv_int((X),(Y),247)
+#define get_csv_llong_pos247(X,Y) get_csv_llong((X),(Y),247)
+#define get_csv_float_pos247(X,Y) get_csv_float((X),(Y),247)
+#define get_csv_uint_pos248(X,Y) get_csv_uint((X),(Y),248)
+#define get_csv_ullong_pos248(X,Y) get_csv_ullong((X),(Y),248)
+#define get_csv_ip_pos248(X,Y) get_csv_ip((X),(Y),248)
+#define get_csv_ipv6_pos248(X,Y) get_csv_ipv6((X),(Y),248)
+#define get_csv_string_pos248(X,Y) get_csv_string((X),(Y),248)
+#define get_csv_v_str_pos248(X,Y) get_csv_string((X),(Y),248)
+#define get_csv_bool_pos248(X,Y) get_csv_bool((X),(Y),248)
+#define get_csv_int_pos248(X,Y) get_csv_int((X),(Y),248)
+#define get_csv_llong_pos248(X,Y) get_csv_llong((X),(Y),248)
+#define get_csv_float_pos248(X,Y) get_csv_float((X),(Y),248)
+#define get_csv_uint_pos249(X,Y) get_csv_uint((X),(Y),249)
+#define get_csv_ullong_pos249(X,Y) get_csv_ullong((X),(Y),249)
+#define get_csv_ip_pos249(X,Y) get_csv_ip((X),(Y),249)
+#define get_csv_ipv6_pos249(X,Y) get_csv_ipv6((X),(Y),249)
+#define get_csv_string_pos249(X,Y) get_csv_string((X),(Y),249)
+#define get_csv_v_str_pos249(X,Y) get_csv_string((X),(Y),249)
+#define get_csv_bool_pos249(X,Y) get_csv_bool((X),(Y),249)
+#define get_csv_int_pos249(X,Y) get_csv_int((X),(Y),249)
+#define get_csv_llong_pos249(X,Y) get_csv_llong((X),(Y),249)
+#define get_csv_float_pos249(X,Y) get_csv_float((X),(Y),249)
+#define get_csv_uint_pos250(X,Y) get_csv_uint((X),(Y),250)
+#define get_csv_ullong_pos250(X,Y) get_csv_ullong((X),(Y),250)
+#define get_csv_ip_pos250(X,Y) get_csv_ip((X),(Y),250)
+#define get_csv_ipv6_pos250(X,Y) get_csv_ipv6((X),(Y),250)
+#define get_csv_string_pos250(X,Y) get_csv_string((X),(Y),250)
+#define get_csv_v_str_pos250(X,Y) get_csv_string((X),(Y),250)
+#define get_csv_bool_pos250(X,Y) get_csv_bool((X),(Y),250)
+#define get_csv_int_pos250(X,Y) get_csv_int((X),(Y),250)
+#define get_csv_llong_pos250(X,Y) get_csv_llong((X),(Y),250)
+#define get_csv_float_pos250(X,Y) get_csv_float((X),(Y),250)
+#define get_csv_uint_pos251(X,Y) get_csv_uint((X),(Y),251)
+#define get_csv_ullong_pos251(X,Y) get_csv_ullong((X),(Y),251)
+#define get_csv_ip_pos251(X,Y) get_csv_ip((X),(Y),251)
+#define get_csv_ipv6_pos251(X,Y) get_csv_ipv6((X),(Y),251)
+#define get_csv_string_pos251(X,Y) get_csv_string((X),(Y),251)
+#define get_csv_v_str_pos251(X,Y) get_csv_string((X),(Y),251)
+#define get_csv_bool_pos251(X,Y) get_csv_bool((X),(Y),251)
+#define get_csv_int_pos251(X,Y) get_csv_int((X),(Y),251)
+#define get_csv_llong_pos251(X,Y) get_csv_llong((X),(Y),251)
+#define get_csv_float_pos251(X,Y) get_csv_float((X),(Y),251)
+#define get_csv_uint_pos252(X,Y) get_csv_uint((X),(Y),252)
+#define get_csv_ullong_pos252(X,Y) get_csv_ullong((X),(Y),252)
+#define get_csv_ip_pos252(X,Y) get_csv_ip((X),(Y),252)
+#define get_csv_ipv6_pos252(X,Y) get_csv_ipv6((X),(Y),252)
+#define get_csv_string_pos252(X,Y) get_csv_string((X),(Y),252)
+#define get_csv_v_str_pos252(X,Y) get_csv_string((X),(Y),252)
+#define get_csv_bool_pos252(X,Y) get_csv_bool((X),(Y),252)
+#define get_csv_int_pos252(X,Y) get_csv_int((X),(Y),252)
+#define get_csv_llong_pos252(X,Y) get_csv_llong((X),(Y),252)
+#define get_csv_float_pos252(X,Y) get_csv_float((X),(Y),252)
+#define get_csv_uint_pos253(X,Y) get_csv_uint((X),(Y),253)
+#define get_csv_ullong_pos253(X,Y) get_csv_ullong((X),(Y),253)
+#define get_csv_ip_pos253(X,Y) get_csv_ip((X),(Y),253)
+#define get_csv_ipv6_pos253(X,Y) get_csv_ipv6((X),(Y),253)
+#define get_csv_string_pos253(X,Y) get_csv_string((X),(Y),253)
+#define get_csv_v_str_pos253(X,Y) get_csv_string((X),(Y),253)
+#define get_csv_bool_pos253(X,Y) get_csv_bool((X),(Y),253)
+#define get_csv_int_pos253(X,Y) get_csv_int((X),(Y),253)
+#define get_csv_llong_pos253(X,Y) get_csv_llong((X),(Y),253)
+#define get_csv_float_pos253(X,Y) get_csv_float((X),(Y),253)
+#define get_csv_uint_pos254(X,Y) get_csv_uint((X),(Y),254)
+#define get_csv_ullong_pos254(X,Y) get_csv_ullong((X),(Y),254)
+#define get_csv_ip_pos254(X,Y) get_csv_ip((X),(Y),254)
+#define get_csv_ipv6_pos254(X,Y) get_csv_ipv6((X),(Y),254)
+#define get_csv_string_pos254(X,Y) get_csv_string((X),(Y),254)
+#define get_csv_v_str_pos254(X,Y) get_csv_string((X),(Y),254)
+#define get_csv_bool_pos254(X,Y) get_csv_bool((X),(Y),254)
+#define get_csv_int_pos254(X,Y) get_csv_int((X),(Y),254)
+#define get_csv_llong_pos254(X,Y) get_csv_llong((X),(Y),254)
+#define get_csv_float_pos254(X,Y) get_csv_float((X),(Y),254)
+#define get_csv_uint_pos255(X,Y) get_csv_uint((X),(Y),255)
+#define get_csv_ullong_pos255(X,Y) get_csv_ullong((X),(Y),255)
+#define get_csv_ip_pos255(X,Y) get_csv_ip((X),(Y),255)
+#define get_csv_ipv6_pos255(X,Y) get_csv_ipv6((X),(Y),255)
+#define get_csv_string_pos255(X,Y) get_csv_string((X),(Y),255)
+#define get_csv_v_str_pos255(X,Y) get_csv_string((X),(Y),255)
+#define get_csv_bool_pos255(X,Y) get_csv_bool((X),(Y),255)
+#define get_csv_int_pos255(X,Y) get_csv_int((X),(Y),255)
+#define get_csv_llong_pos255(X,Y) get_csv_llong((X),(Y),255)
+#define get_csv_float_pos255(X,Y) get_csv_float((X),(Y),255)
+#define get_csv_uint_pos256(X,Y) get_csv_uint((X),(Y),256)
+#define get_csv_ullong_pos256(X,Y) get_csv_ullong((X),(Y),256)
+#define get_csv_ip_pos256(X,Y) get_csv_ip((X),(Y),256)
+#define get_csv_ipv6_pos256(X,Y) get_csv_ipv6((X),(Y),256)
+#define get_csv_string_pos256(X,Y) get_csv_string((X),(Y),256)
+#define get_csv_v_str_pos256(X,Y) get_csv_string((X),(Y),256)
+#define get_csv_bool_pos256(X,Y) get_csv_bool((X),(Y),256)
+#define get_csv_int_pos256(X,Y) get_csv_int((X),(Y),256)
+#define get_csv_llong_pos256(X,Y) get_csv_llong((X),(Y),256)
+#define get_csv_float_pos256(X,Y) get_csv_float((X),(Y),256)
+#define get_csv_uint_pos257(X,Y) get_csv_uint((X),(Y),257)
+#define get_csv_ullong_pos257(X,Y) get_csv_ullong((X),(Y),257)
+#define get_csv_ip_pos257(X,Y) get_csv_ip((X),(Y),257)
+#define get_csv_ipv6_pos257(X,Y) get_csv_ipv6((X),(Y),257)
+#define get_csv_string_pos257(X,Y) get_csv_string((X),(Y),257)
+#define get_csv_v_str_pos257(X,Y) get_csv_string((X),(Y),257)
+#define get_csv_bool_pos257(X,Y) get_csv_bool((X),(Y),257)
+#define get_csv_int_pos257(X,Y) get_csv_int((X),(Y),257)
+#define get_csv_llong_pos257(X,Y) get_csv_llong((X),(Y),257)
+#define get_csv_float_pos257(X,Y) get_csv_float((X),(Y),257)
+#define get_csv_uint_pos258(X,Y) get_csv_uint((X),(Y),258)
+#define get_csv_ullong_pos258(X,Y) get_csv_ullong((X),(Y),258)
+#define get_csv_ip_pos258(X,Y) get_csv_ip((X),(Y),258)
+#define get_csv_ipv6_pos258(X,Y) get_csv_ipv6((X),(Y),258)
+#define get_csv_string_pos258(X,Y) get_csv_string((X),(Y),258)
+#define get_csv_v_str_pos258(X,Y) get_csv_string((X),(Y),258)
+#define get_csv_bool_pos258(X,Y) get_csv_bool((X),(Y),258)
+#define get_csv_int_pos258(X,Y) get_csv_int((X),(Y),258)
+#define get_csv_llong_pos258(X,Y) get_csv_llong((X),(Y),258)
+#define get_csv_float_pos258(X,Y) get_csv_float((X),(Y),258)
+#define get_csv_uint_pos259(X,Y) get_csv_uint((X),(Y),259)
+#define get_csv_ullong_pos259(X,Y) get_csv_ullong((X),(Y),259)
+#define get_csv_ip_pos259(X,Y) get_csv_ip((X),(Y),259)
+#define get_csv_ipv6_pos259(X,Y) get_csv_ipv6((X),(Y),259)
+#define get_csv_string_pos259(X,Y) get_csv_string((X),(Y),259)
+#define get_csv_v_str_pos259(X,Y) get_csv_string((X),(Y),259)
+#define get_csv_bool_pos259(X,Y) get_csv_bool((X),(Y),259)
+#define get_csv_int_pos259(X,Y) get_csv_int((X),(Y),259)
+#define get_csv_llong_pos259(X,Y) get_csv_llong((X),(Y),259)
+#define get_csv_float_pos259(X,Y) get_csv_float((X),(Y),259)
+#define get_csv_uint_pos260(X,Y) get_csv_uint((X),(Y),260)
+#define get_csv_ullong_pos260(X,Y) get_csv_ullong((X),(Y),260)
+#define get_csv_ip_pos260(X,Y) get_csv_ip((X),(Y),260)
+#define get_csv_ipv6_pos260(X,Y) get_csv_ipv6((X),(Y),260)
+#define get_csv_string_pos260(X,Y) get_csv_string((X),(Y),260)
+#define get_csv_v_str_pos260(X,Y) get_csv_string((X),(Y),260)
+#define get_csv_bool_pos260(X,Y) get_csv_bool((X),(Y),260)
+#define get_csv_int_pos260(X,Y) get_csv_int((X),(Y),260)
+#define get_csv_llong_pos260(X,Y) get_csv_llong((X),(Y),260)
+#define get_csv_float_pos260(X,Y) get_csv_float((X),(Y),260)
+#define get_csv_uint_pos261(X,Y) get_csv_uint((X),(Y),261)
+#define get_csv_ullong_pos261(X,Y) get_csv_ullong((X),(Y),261)
+#define get_csv_ip_pos261(X,Y) get_csv_ip((X),(Y),261)
+#define get_csv_ipv6_pos261(X,Y) get_csv_ipv6((X),(Y),261)
+#define get_csv_string_pos261(X,Y) get_csv_string((X),(Y),261)
+#define get_csv_v_str_pos261(X,Y) get_csv_string((X),(Y),261)
+#define get_csv_bool_pos261(X,Y) get_csv_bool((X),(Y),261)
+#define get_csv_int_pos261(X,Y) get_csv_int((X),(Y),261)
+#define get_csv_llong_pos261(X,Y) get_csv_llong((X),(Y),261)
+#define get_csv_float_pos261(X,Y) get_csv_float((X),(Y),261)
+#define get_csv_uint_pos262(X,Y) get_csv_uint((X),(Y),262)
+#define get_csv_ullong_pos262(X,Y) get_csv_ullong((X),(Y),262)
+#define get_csv_ip_pos262(X,Y) get_csv_ip((X),(Y),262)
+#define get_csv_ipv6_pos262(X,Y) get_csv_ipv6((X),(Y),262)
+#define get_csv_string_pos262(X,Y) get_csv_string((X),(Y),262)
+#define get_csv_v_str_pos262(X,Y) get_csv_string((X),(Y),262)
+#define get_csv_bool_pos262(X,Y) get_csv_bool((X),(Y),262)
+#define get_csv_int_pos262(X,Y) get_csv_int((X),(Y),262)
+#define get_csv_llong_pos262(X,Y) get_csv_llong((X),(Y),262)
+#define get_csv_float_pos262(X,Y) get_csv_float((X),(Y),262)
+#define get_csv_uint_pos263(X,Y) get_csv_uint((X),(Y),263)
+#define get_csv_ullong_pos263(X,Y) get_csv_ullong((X),(Y),263)
+#define get_csv_ip_pos263(X,Y) get_csv_ip((X),(Y),263)
+#define get_csv_ipv6_pos263(X,Y) get_csv_ipv6((X),(Y),263)
+#define get_csv_string_pos263(X,Y) get_csv_string((X),(Y),263)
+#define get_csv_v_str_pos263(X,Y) get_csv_string((X),(Y),263)
+#define get_csv_bool_pos263(X,Y) get_csv_bool((X),(Y),263)
+#define get_csv_int_pos263(X,Y) get_csv_int((X),(Y),263)
+#define get_csv_llong_pos263(X,Y) get_csv_llong((X),(Y),263)
+#define get_csv_float_pos263(X,Y) get_csv_float((X),(Y),263)
+#define get_csv_uint_pos264(X,Y) get_csv_uint((X),(Y),264)
+#define get_csv_ullong_pos264(X,Y) get_csv_ullong((X),(Y),264)
+#define get_csv_ip_pos264(X,Y) get_csv_ip((X),(Y),264)
+#define get_csv_ipv6_pos264(X,Y) get_csv_ipv6((X),(Y),264)
+#define get_csv_string_pos264(X,Y) get_csv_string((X),(Y),264)
+#define get_csv_v_str_pos264(X,Y) get_csv_string((X),(Y),264)
+#define get_csv_bool_pos264(X,Y) get_csv_bool((X),(Y),264)
+#define get_csv_int_pos264(X,Y) get_csv_int((X),(Y),264)
+#define get_csv_llong_pos264(X,Y) get_csv_llong((X),(Y),264)
+#define get_csv_float_pos264(X,Y) get_csv_float((X),(Y),264)
+#define get_csv_uint_pos265(X,Y) get_csv_uint((X),(Y),265)
+#define get_csv_ullong_pos265(X,Y) get_csv_ullong((X),(Y),265)
+#define get_csv_ip_pos265(X,Y) get_csv_ip((X),(Y),265)
+#define get_csv_ipv6_pos265(X,Y) get_csv_ipv6((X),(Y),265)
+#define get_csv_string_pos265(X,Y) get_csv_string((X),(Y),265)
+#define get_csv_v_str_pos265(X,Y) get_csv_string((X),(Y),265)
+#define get_csv_bool_pos265(X,Y) get_csv_bool((X),(Y),265)
+#define get_csv_int_pos265(X,Y) get_csv_int((X),(Y),265)
+#define get_csv_llong_pos265(X,Y) get_csv_llong((X),(Y),265)
+#define get_csv_float_pos265(X,Y) get_csv_float((X),(Y),265)
+#define get_csv_uint_pos266(X,Y) get_csv_uint((X),(Y),266)
+#define get_csv_ullong_pos266(X,Y) get_csv_ullong((X),(Y),266)
+#define get_csv_ip_pos266(X,Y) get_csv_ip((X),(Y),266)
+#define get_csv_ipv6_pos266(X,Y) get_csv_ipv6((X),(Y),266)
+#define get_csv_string_pos266(X,Y) get_csv_string((X),(Y),266)
+#define get_csv_v_str_pos266(X,Y) get_csv_string((X),(Y),266)
+#define get_csv_bool_pos266(X,Y) get_csv_bool((X),(Y),266)
+#define get_csv_int_pos266(X,Y) get_csv_int((X),(Y),266)
+#define get_csv_llong_pos266(X,Y) get_csv_llong((X),(Y),266)
+#define get_csv_float_pos266(X,Y) get_csv_float((X),(Y),266)
+#define get_csv_uint_pos267(X,Y) get_csv_uint((X),(Y),267)
+#define get_csv_ullong_pos267(X,Y) get_csv_ullong((X),(Y),267)
+#define get_csv_ip_pos267(X,Y) get_csv_ip((X),(Y),267)
+#define get_csv_ipv6_pos267(X,Y) get_csv_ipv6((X),(Y),267)
+#define get_csv_string_pos267(X,Y) get_csv_string((X),(Y),267)
+#define get_csv_v_str_pos267(X,Y) get_csv_string((X),(Y),267)
+#define get_csv_bool_pos267(X,Y) get_csv_bool((X),(Y),267)
+#define get_csv_int_pos267(X,Y) get_csv_int((X),(Y),267)
+#define get_csv_llong_pos267(X,Y) get_csv_llong((X),(Y),267)
+#define get_csv_float_pos267(X,Y) get_csv_float((X),(Y),267)
+#define get_csv_uint_pos268(X,Y) get_csv_uint((X),(Y),268)
+#define get_csv_ullong_pos268(X,Y) get_csv_ullong((X),(Y),268)
+#define get_csv_ip_pos268(X,Y) get_csv_ip((X),(Y),268)
+#define get_csv_ipv6_pos268(X,Y) get_csv_ipv6((X),(Y),268)
+#define get_csv_string_pos268(X,Y) get_csv_string((X),(Y),268)
+#define get_csv_v_str_pos268(X,Y) get_csv_string((X),(Y),268)
+#define get_csv_bool_pos268(X,Y) get_csv_bool((X),(Y),268)
+#define get_csv_int_pos268(X,Y) get_csv_int((X),(Y),268)
+#define get_csv_llong_pos268(X,Y) get_csv_llong((X),(Y),268)
+#define get_csv_float_pos268(X,Y) get_csv_float((X),(Y),268)
+#define get_csv_uint_pos269(X,Y) get_csv_uint((X),(Y),269)
+#define get_csv_ullong_pos269(X,Y) get_csv_ullong((X),(Y),269)
+#define get_csv_ip_pos269(X,Y) get_csv_ip((X),(Y),269)
+#define get_csv_ipv6_pos269(X,Y) get_csv_ipv6((X),(Y),269)
+#define get_csv_string_pos269(X,Y) get_csv_string((X),(Y),269)
+#define get_csv_v_str_pos269(X,Y) get_csv_string((X),(Y),269)
+#define get_csv_bool_pos269(X,Y) get_csv_bool((X),(Y),269)
+#define get_csv_int_pos269(X,Y) get_csv_int((X),(Y),269)
+#define get_csv_llong_pos269(X,Y) get_csv_llong((X),(Y),269)
+#define get_csv_float_pos269(X,Y) get_csv_float((X),(Y),269)
+#define get_csv_uint_pos270(X,Y) get_csv_uint((X),(Y),270)
+#define get_csv_ullong_pos270(X,Y) get_csv_ullong((X),(Y),270)
+#define get_csv_ip_pos270(X,Y) get_csv_ip((X),(Y),270)
+#define get_csv_ipv6_pos270(X,Y) get_csv_ipv6((X),(Y),270)
+#define get_csv_string_pos270(X,Y) get_csv_string((X),(Y),270)
+#define get_csv_v_str_pos270(X,Y) get_csv_string((X),(Y),270)
+#define get_csv_bool_pos270(X,Y) get_csv_bool((X),(Y),270)
+#define get_csv_int_pos270(X,Y) get_csv_int((X),(Y),270)
+#define get_csv_llong_pos270(X,Y) get_csv_llong((X),(Y),270)
+#define get_csv_float_pos270(X,Y) get_csv_float((X),(Y),270)
+#define get_csv_uint_pos271(X,Y) get_csv_uint((X),(Y),271)
+#define get_csv_ullong_pos271(X,Y) get_csv_ullong((X),(Y),271)
+#define get_csv_ip_pos271(X,Y) get_csv_ip((X),(Y),271)
+#define get_csv_ipv6_pos271(X,Y) get_csv_ipv6((X),(Y),271)
+#define get_csv_string_pos271(X,Y) get_csv_string((X),(Y),271)
+#define get_csv_v_str_pos271(X,Y) get_csv_string((X),(Y),271)
+#define get_csv_bool_pos271(X,Y) get_csv_bool((X),(Y),271)
+#define get_csv_int_pos271(X,Y) get_csv_int((X),(Y),271)
+#define get_csv_llong_pos271(X,Y) get_csv_llong((X),(Y),271)
+#define get_csv_float_pos271(X,Y) get_csv_float((X),(Y),271)
+#define get_csv_uint_pos272(X,Y) get_csv_uint((X),(Y),272)
+#define get_csv_ullong_pos272(X,Y) get_csv_ullong((X),(Y),272)
+#define get_csv_ip_pos272(X,Y) get_csv_ip((X),(Y),272)
+#define get_csv_ipv6_pos272(X,Y) get_csv_ipv6((X),(Y),272)
+#define get_csv_string_pos272(X,Y) get_csv_string((X),(Y),272)
+#define get_csv_v_str_pos272(X,Y) get_csv_string((X),(Y),272)
+#define get_csv_bool_pos272(X,Y) get_csv_bool((X),(Y),272)
+#define get_csv_int_pos272(X,Y) get_csv_int((X),(Y),272)
+#define get_csv_llong_pos272(X,Y) get_csv_llong((X),(Y),272)
+#define get_csv_float_pos272(X,Y) get_csv_float((X),(Y),272)
+#define get_csv_uint_pos273(X,Y) get_csv_uint((X),(Y),273)
+#define get_csv_ullong_pos273(X,Y) get_csv_ullong((X),(Y),273)
+#define get_csv_ip_pos273(X,Y) get_csv_ip((X),(Y),273)
+#define get_csv_ipv6_pos273(X,Y) get_csv_ipv6((X),(Y),273)
+#define get_csv_string_pos273(X,Y) get_csv_string((X),(Y),273)
+#define get_csv_v_str_pos273(X,Y) get_csv_string((X),(Y),273)
+#define get_csv_bool_pos273(X,Y) get_csv_bool((X),(Y),273)
+#define get_csv_int_pos273(X,Y) get_csv_int((X),(Y),273)
+#define get_csv_llong_pos273(X,Y) get_csv_llong((X),(Y),273)
+#define get_csv_float_pos273(X,Y) get_csv_float((X),(Y),273)
+#define get_csv_uint_pos274(X,Y) get_csv_uint((X),(Y),274)
+#define get_csv_ullong_pos274(X,Y) get_csv_ullong((X),(Y),274)
+#define get_csv_ip_pos274(X,Y) get_csv_ip((X),(Y),274)
+#define get_csv_ipv6_pos274(X,Y) get_csv_ipv6((X),(Y),274)
+#define get_csv_string_pos274(X,Y) get_csv_string((X),(Y),274)
+#define get_csv_v_str_pos274(X,Y) get_csv_string((X),(Y),274)
+#define get_csv_bool_pos274(X,Y) get_csv_bool((X),(Y),274)
+#define get_csv_int_pos274(X,Y) get_csv_int((X),(Y),274)
+#define get_csv_llong_pos274(X,Y) get_csv_llong((X),(Y),274)
+#define get_csv_float_pos274(X,Y) get_csv_float((X),(Y),274)
+#define get_csv_uint_pos275(X,Y) get_csv_uint((X),(Y),275)
+#define get_csv_ullong_pos275(X,Y) get_csv_ullong((X),(Y),275)
+#define get_csv_ip_pos275(X,Y) get_csv_ip((X),(Y),275)
+#define get_csv_ipv6_pos275(X,Y) get_csv_ipv6((X),(Y),275)
+#define get_csv_string_pos275(X,Y) get_csv_string((X),(Y),275)
+#define get_csv_v_str_pos275(X,Y) get_csv_string((X),(Y),275)
+#define get_csv_bool_pos275(X,Y) get_csv_bool((X),(Y),275)
+#define get_csv_int_pos275(X,Y) get_csv_int((X),(Y),275)
+#define get_csv_llong_pos275(X,Y) get_csv_llong((X),(Y),275)
+#define get_csv_float_pos275(X,Y) get_csv_float((X),(Y),275)
+#define get_csv_uint_pos276(X,Y) get_csv_uint((X),(Y),276)
+#define get_csv_ullong_pos276(X,Y) get_csv_ullong((X),(Y),276)
+#define get_csv_ip_pos276(X,Y) get_csv_ip((X),(Y),276)
+#define get_csv_ipv6_pos276(X,Y) get_csv_ipv6((X),(Y),276)
+#define get_csv_string_pos276(X,Y) get_csv_string((X),(Y),276)
+#define get_csv_v_str_pos276(X,Y) get_csv_string((X),(Y),276)
+#define get_csv_bool_pos276(X,Y) get_csv_bool((X),(Y),276)
+#define get_csv_int_pos276(X,Y) get_csv_int((X),(Y),276)
+#define get_csv_llong_pos276(X,Y) get_csv_llong((X),(Y),276)
+#define get_csv_float_pos276(X,Y) get_csv_float((X),(Y),276)
+#define get_csv_uint_pos277(X,Y) get_csv_uint((X),(Y),277)
+#define get_csv_ullong_pos277(X,Y) get_csv_ullong((X),(Y),277)
+#define get_csv_ip_pos277(X,Y) get_csv_ip((X),(Y),277)
+#define get_csv_ipv6_pos277(X,Y) get_csv_ipv6((X),(Y),277)
+#define get_csv_string_pos277(X,Y) get_csv_string((X),(Y),277)
+#define get_csv_v_str_pos277(X,Y) get_csv_string((X),(Y),277)
+#define get_csv_bool_pos277(X,Y) get_csv_bool((X),(Y),277)
+#define get_csv_int_pos277(X,Y) get_csv_int((X),(Y),277)
+#define get_csv_llong_pos277(X,Y) get_csv_llong((X),(Y),277)
+#define get_csv_float_pos277(X,Y) get_csv_float((X),(Y),277)
+#define get_csv_uint_pos278(X,Y) get_csv_uint((X),(Y),278)
+#define get_csv_ullong_pos278(X,Y) get_csv_ullong((X),(Y),278)
+#define get_csv_ip_pos278(X,Y) get_csv_ip((X),(Y),278)
+#define get_csv_ipv6_pos278(X,Y) get_csv_ipv6((X),(Y),278)
+#define get_csv_string_pos278(X,Y) get_csv_string((X),(Y),278)
+#define get_csv_v_str_pos278(X,Y) get_csv_string((X),(Y),278)
+#define get_csv_bool_pos278(X,Y) get_csv_bool((X),(Y),278)
+#define get_csv_int_pos278(X,Y) get_csv_int((X),(Y),278)
+#define get_csv_llong_pos278(X,Y) get_csv_llong((X),(Y),278)
+#define get_csv_float_pos278(X,Y) get_csv_float((X),(Y),278)
+#define get_csv_uint_pos279(X,Y) get_csv_uint((X),(Y),279)
+#define get_csv_ullong_pos279(X,Y) get_csv_ullong((X),(Y),279)
+#define get_csv_ip_pos279(X,Y) get_csv_ip((X),(Y),279)
+#define get_csv_ipv6_pos279(X,Y) get_csv_ipv6((X),(Y),279)
+#define get_csv_string_pos279(X,Y) get_csv_string((X),(Y),279)
+#define get_csv_v_str_pos279(X,Y) get_csv_string((X),(Y),279)
+#define get_csv_bool_pos279(X,Y) get_csv_bool((X),(Y),279)
+#define get_csv_int_pos279(X,Y) get_csv_int((X),(Y),279)
+#define get_csv_llong_pos279(X,Y) get_csv_llong((X),(Y),279)
+#define get_csv_float_pos279(X,Y) get_csv_float((X),(Y),279)
+#define get_csv_uint_pos280(X,Y) get_csv_uint((X),(Y),280)
+#define get_csv_ullong_pos280(X,Y) get_csv_ullong((X),(Y),280)
+#define get_csv_ip_pos280(X,Y) get_csv_ip((X),(Y),280)
+#define get_csv_ipv6_pos280(X,Y) get_csv_ipv6((X),(Y),280)
+#define get_csv_string_pos280(X,Y) get_csv_string((X),(Y),280)
+#define get_csv_v_str_pos280(X,Y) get_csv_string((X),(Y),280)
+#define get_csv_bool_pos280(X,Y) get_csv_bool((X),(Y),280)
+#define get_csv_int_pos280(X,Y) get_csv_int((X),(Y),280)
+#define get_csv_llong_pos280(X,Y) get_csv_llong((X),(Y),280)
+#define get_csv_float_pos280(X,Y) get_csv_float((X),(Y),280)
+#define get_csv_uint_pos281(X,Y) get_csv_uint((X),(Y),281)
+#define get_csv_ullong_pos281(X,Y) get_csv_ullong((X),(Y),281)
+#define get_csv_ip_pos281(X,Y) get_csv_ip((X),(Y),281)
+#define get_csv_ipv6_pos281(X,Y) get_csv_ipv6((X),(Y),281)
+#define get_csv_string_pos281(X,Y) get_csv_string((X),(Y),281)
+#define get_csv_v_str_pos281(X,Y) get_csv_string((X),(Y),281)
+#define get_csv_bool_pos281(X,Y) get_csv_bool((X),(Y),281)
+#define get_csv_int_pos281(X,Y) get_csv_int((X),(Y),281)
+#define get_csv_llong_pos281(X,Y) get_csv_llong((X),(Y),281)
+#define get_csv_float_pos281(X,Y) get_csv_float((X),(Y),281)
+#define get_csv_uint_pos282(X,Y) get_csv_uint((X),(Y),282)
+#define get_csv_ullong_pos282(X,Y) get_csv_ullong((X),(Y),282)
+#define get_csv_ip_pos282(X,Y) get_csv_ip((X),(Y),282)
+#define get_csv_ipv6_pos282(X,Y) get_csv_ipv6((X),(Y),282)
+#define get_csv_string_pos282(X,Y) get_csv_string((X),(Y),282)
+#define get_csv_v_str_pos282(X,Y) get_csv_string((X),(Y),282)
+#define get_csv_bool_pos282(X,Y) get_csv_bool((X),(Y),282)
+#define get_csv_int_pos282(X,Y) get_csv_int((X),(Y),282)
+#define get_csv_llong_pos282(X,Y) get_csv_llong((X),(Y),282)
+#define get_csv_float_pos282(X,Y) get_csv_float((X),(Y),282)
+#define get_csv_uint_pos283(X,Y) get_csv_uint((X),(Y),283)
+#define get_csv_ullong_pos283(X,Y) get_csv_ullong((X),(Y),283)
+#define get_csv_ip_pos283(X,Y) get_csv_ip((X),(Y),283)
+#define get_csv_ipv6_pos283(X,Y) get_csv_ipv6((X),(Y),283)
+#define get_csv_string_pos283(X,Y) get_csv_string((X),(Y),283)
+#define get_csv_v_str_pos283(X,Y) get_csv_string((X),(Y),283)
+#define get_csv_bool_pos283(X,Y) get_csv_bool((X),(Y),283)
+#define get_csv_int_pos283(X,Y) get_csv_int((X),(Y),283)
+#define get_csv_llong_pos283(X,Y) get_csv_llong((X),(Y),283)
+#define get_csv_float_pos283(X,Y) get_csv_float((X),(Y),283)
+#define get_csv_uint_pos284(X,Y) get_csv_uint((X),(Y),284)
+#define get_csv_ullong_pos284(X,Y) get_csv_ullong((X),(Y),284)
+#define get_csv_ip_pos284(X,Y) get_csv_ip((X),(Y),284)
+#define get_csv_ipv6_pos284(X,Y) get_csv_ipv6((X),(Y),284)
+#define get_csv_string_pos284(X,Y) get_csv_string((X),(Y),284)
+#define get_csv_v_str_pos284(X,Y) get_csv_string((X),(Y),284)
+#define get_csv_bool_pos284(X,Y) get_csv_bool((X),(Y),284)
+#define get_csv_int_pos284(X,Y) get_csv_int((X),(Y),284)
+#define get_csv_llong_pos284(X,Y) get_csv_llong((X),(Y),284)
+#define get_csv_float_pos284(X,Y) get_csv_float((X),(Y),284)
+#define get_csv_uint_pos285(X,Y) get_csv_uint((X),(Y),285)
+#define get_csv_ullong_pos285(X,Y) get_csv_ullong((X),(Y),285)
+#define get_csv_ip_pos285(X,Y) get_csv_ip((X),(Y),285)
+#define get_csv_ipv6_pos285(X,Y) get_csv_ipv6((X),(Y),285)
+#define get_csv_string_pos285(X,Y) get_csv_string((X),(Y),285)
+#define get_csv_v_str_pos285(X,Y) get_csv_string((X),(Y),285)
+#define get_csv_bool_pos285(X,Y) get_csv_bool((X),(Y),285)
+#define get_csv_int_pos285(X,Y) get_csv_int((X),(Y),285)
+#define get_csv_llong_pos285(X,Y) get_csv_llong((X),(Y),285)
+#define get_csv_float_pos285(X,Y) get_csv_float((X),(Y),285)
+#define get_csv_uint_pos286(X,Y) get_csv_uint((X),(Y),286)
+#define get_csv_ullong_pos286(X,Y) get_csv_ullong((X),(Y),286)
+#define get_csv_ip_pos286(X,Y) get_csv_ip((X),(Y),286)
+#define get_csv_ipv6_pos286(X,Y) get_csv_ipv6((X),(Y),286)
+#define get_csv_string_pos286(X,Y) get_csv_string((X),(Y),286)
+#define get_csv_v_str_pos286(X,Y) get_csv_string((X),(Y),286)
+#define get_csv_bool_pos286(X,Y) get_csv_bool((X),(Y),286)
+#define get_csv_int_pos286(X,Y) get_csv_int((X),(Y),286)
+#define get_csv_llong_pos286(X,Y) get_csv_llong((X),(Y),286)
+#define get_csv_float_pos286(X,Y) get_csv_float((X),(Y),286)
+#define get_csv_uint_pos287(X,Y) get_csv_uint((X),(Y),287)
+#define get_csv_ullong_pos287(X,Y) get_csv_ullong((X),(Y),287)
+#define get_csv_ip_pos287(X,Y) get_csv_ip((X),(Y),287)
+#define get_csv_ipv6_pos287(X,Y) get_csv_ipv6((X),(Y),287)
+#define get_csv_string_pos287(X,Y) get_csv_string((X),(Y),287)
+#define get_csv_v_str_pos287(X,Y) get_csv_string((X),(Y),287)
+#define get_csv_bool_pos287(X,Y) get_csv_bool((X),(Y),287)
+#define get_csv_int_pos287(X,Y) get_csv_int((X),(Y),287)
+#define get_csv_llong_pos287(X,Y) get_csv_llong((X),(Y),287)
+#define get_csv_float_pos287(X,Y) get_csv_float((X),(Y),287)
+#define get_csv_uint_pos288(X,Y) get_csv_uint((X),(Y),288)
+#define get_csv_ullong_pos288(X,Y) get_csv_ullong((X),(Y),288)
+#define get_csv_ip_pos288(X,Y) get_csv_ip((X),(Y),288)
+#define get_csv_ipv6_pos288(X,Y) get_csv_ipv6((X),(Y),288)
+#define get_csv_string_pos288(X,Y) get_csv_string((X),(Y),288)
+#define get_csv_v_str_pos288(X,Y) get_csv_string((X),(Y),288)
+#define get_csv_bool_pos288(X,Y) get_csv_bool((X),(Y),288)
+#define get_csv_int_pos288(X,Y) get_csv_int((X),(Y),288)
+#define get_csv_llong_pos288(X,Y) get_csv_llong((X),(Y),288)
+#define get_csv_float_pos288(X,Y) get_csv_float((X),(Y),288)
+#define get_csv_uint_pos289(X,Y) get_csv_uint((X),(Y),289)
+#define get_csv_ullong_pos289(X,Y) get_csv_ullong((X),(Y),289)
+#define get_csv_ip_pos289(X,Y) get_csv_ip((X),(Y),289)
+#define get_csv_ipv6_pos289(X,Y) get_csv_ipv6((X),(Y),289)
+#define get_csv_string_pos289(X,Y) get_csv_string((X),(Y),289)
+#define get_csv_v_str_pos289(X,Y) get_csv_string((X),(Y),289)
+#define get_csv_bool_pos289(X,Y) get_csv_bool((X),(Y),289)
+#define get_csv_int_pos289(X,Y) get_csv_int((X),(Y),289)
+#define get_csv_llong_pos289(X,Y) get_csv_llong((X),(Y),289)
+#define get_csv_float_pos289(X,Y) get_csv_float((X),(Y),289)
+#define get_csv_uint_pos290(X,Y) get_csv_uint((X),(Y),290)
+#define get_csv_ullong_pos290(X,Y) get_csv_ullong((X),(Y),290)
+#define get_csv_ip_pos290(X,Y) get_csv_ip((X),(Y),290)
+#define get_csv_ipv6_pos290(X,Y) get_csv_ipv6((X),(Y),290)
+#define get_csv_string_pos290(X,Y) get_csv_string((X),(Y),290)
+#define get_csv_v_str_pos290(X,Y) get_csv_string((X),(Y),290)
+#define get_csv_bool_pos290(X,Y) get_csv_bool((X),(Y),290)
+#define get_csv_int_pos290(X,Y) get_csv_int((X),(Y),290)
+#define get_csv_llong_pos290(X,Y) get_csv_llong((X),(Y),290)
+#define get_csv_float_pos290(X,Y) get_csv_float((X),(Y),290)
+#define get_csv_uint_pos291(X,Y) get_csv_uint((X),(Y),291)
+#define get_csv_ullong_pos291(X,Y) get_csv_ullong((X),(Y),291)
+#define get_csv_ip_pos291(X,Y) get_csv_ip((X),(Y),291)
+#define get_csv_ipv6_pos291(X,Y) get_csv_ipv6((X),(Y),291)
+#define get_csv_string_pos291(X,Y) get_csv_string((X),(Y),291)
+#define get_csv_v_str_pos291(X,Y) get_csv_string((X),(Y),291)
+#define get_csv_bool_pos291(X,Y) get_csv_bool((X),(Y),291)
+#define get_csv_int_pos291(X,Y) get_csv_int((X),(Y),291)
+#define get_csv_llong_pos291(X,Y) get_csv_llong((X),(Y),291)
+#define get_csv_float_pos291(X,Y) get_csv_float((X),(Y),291)
+#define get_csv_uint_pos292(X,Y) get_csv_uint((X),(Y),292)
+#define get_csv_ullong_pos292(X,Y) get_csv_ullong((X),(Y),292)
+#define get_csv_ip_pos292(X,Y) get_csv_ip((X),(Y),292)
+#define get_csv_ipv6_pos292(X,Y) get_csv_ipv6((X),(Y),292)
+#define get_csv_string_pos292(X,Y) get_csv_string((X),(Y),292)
+#define get_csv_v_str_pos292(X,Y) get_csv_string((X),(Y),292)
+#define get_csv_bool_pos292(X,Y) get_csv_bool((X),(Y),292)
+#define get_csv_int_pos292(X,Y) get_csv_int((X),(Y),292)
+#define get_csv_llong_pos292(X,Y) get_csv_llong((X),(Y),292)
+#define get_csv_float_pos292(X,Y) get_csv_float((X),(Y),292)
+#define get_csv_uint_pos293(X,Y) get_csv_uint((X),(Y),293)
+#define get_csv_ullong_pos293(X,Y) get_csv_ullong((X),(Y),293)
+#define get_csv_ip_pos293(X,Y) get_csv_ip((X),(Y),293)
+#define get_csv_ipv6_pos293(X,Y) get_csv_ipv6((X),(Y),293)
+#define get_csv_string_pos293(X,Y) get_csv_string((X),(Y),293)
+#define get_csv_v_str_pos293(X,Y) get_csv_string((X),(Y),293)
+#define get_csv_bool_pos293(X,Y) get_csv_bool((X),(Y),293)
+#define get_csv_int_pos293(X,Y) get_csv_int((X),(Y),293)
+#define get_csv_llong_pos293(X,Y) get_csv_llong((X),(Y),293)
+#define get_csv_float_pos293(X,Y) get_csv_float((X),(Y),293)
+#define get_csv_uint_pos294(X,Y) get_csv_uint((X),(Y),294)
+#define get_csv_ullong_pos294(X,Y) get_csv_ullong((X),(Y),294)
+#define get_csv_ip_pos294(X,Y) get_csv_ip((X),(Y),294)
+#define get_csv_ipv6_pos294(X,Y) get_csv_ipv6((X),(Y),294)
+#define get_csv_string_pos294(X,Y) get_csv_string((X),(Y),294)
+#define get_csv_v_str_pos294(X,Y) get_csv_string((X),(Y),294)
+#define get_csv_bool_pos294(X,Y) get_csv_bool((X),(Y),294)
+#define get_csv_int_pos294(X,Y) get_csv_int((X),(Y),294)
+#define get_csv_llong_pos294(X,Y) get_csv_llong((X),(Y),294)
+#define get_csv_float_pos294(X,Y) get_csv_float((X),(Y),294)
+#define get_csv_uint_pos295(X,Y) get_csv_uint((X),(Y),295)
+#define get_csv_ullong_pos295(X,Y) get_csv_ullong((X),(Y),295)
+#define get_csv_ip_pos295(X,Y) get_csv_ip((X),(Y),295)
+#define get_csv_ipv6_pos295(X,Y) get_csv_ipv6((X),(Y),295)
+#define get_csv_string_pos295(X,Y) get_csv_string((X),(Y),295)
+#define get_csv_v_str_pos295(X,Y) get_csv_string((X),(Y),295)
+#define get_csv_bool_pos295(X,Y) get_csv_bool((X),(Y),295)
+#define get_csv_int_pos295(X,Y) get_csv_int((X),(Y),295)
+#define get_csv_llong_pos295(X,Y) get_csv_llong((X),(Y),295)
+#define get_csv_float_pos295(X,Y) get_csv_float((X),(Y),295)
+#define get_csv_uint_pos296(X,Y) get_csv_uint((X),(Y),296)
+#define get_csv_ullong_pos296(X,Y) get_csv_ullong((X),(Y),296)
+#define get_csv_ip_pos296(X,Y) get_csv_ip((X),(Y),296)
+#define get_csv_ipv6_pos296(X,Y) get_csv_ipv6((X),(Y),296)
+#define get_csv_string_pos296(X,Y) get_csv_string((X),(Y),296)
+#define get_csv_v_str_pos296(X,Y) get_csv_string((X),(Y),296)
+#define get_csv_bool_pos296(X,Y) get_csv_bool((X),(Y),296)
+#define get_csv_int_pos296(X,Y) get_csv_int((X),(Y),296)
+#define get_csv_llong_pos296(X,Y) get_csv_llong((X),(Y),296)
+#define get_csv_float_pos296(X,Y) get_csv_float((X),(Y),296)
+#define get_csv_uint_pos297(X,Y) get_csv_uint((X),(Y),297)
+#define get_csv_ullong_pos297(X,Y) get_csv_ullong((X),(Y),297)
+#define get_csv_ip_pos297(X,Y) get_csv_ip((X),(Y),297)
+#define get_csv_ipv6_pos297(X,Y) get_csv_ipv6((X),(Y),297)
+#define get_csv_string_pos297(X,Y) get_csv_string((X),(Y),297)
+#define get_csv_v_str_pos297(X,Y) get_csv_string((X),(Y),297)
+#define get_csv_bool_pos297(X,Y) get_csv_bool((X),(Y),297)
+#define get_csv_int_pos297(X,Y) get_csv_int((X),(Y),297)
+#define get_csv_llong_pos297(X,Y) get_csv_llong((X),(Y),297)
+#define get_csv_float_pos297(X,Y) get_csv_float((X),(Y),297)
+#define get_csv_uint_pos298(X,Y) get_csv_uint((X),(Y),298)
+#define get_csv_ullong_pos298(X,Y) get_csv_ullong((X),(Y),298)
+#define get_csv_ip_pos298(X,Y) get_csv_ip((X),(Y),298)
+#define get_csv_ipv6_pos298(X,Y) get_csv_ipv6((X),(Y),298)
+#define get_csv_string_pos298(X,Y) get_csv_string((X),(Y),298)
+#define get_csv_v_str_pos298(X,Y) get_csv_string((X),(Y),298)
+#define get_csv_bool_pos298(X,Y) get_csv_bool((X),(Y),298)
+#define get_csv_int_pos298(X,Y) get_csv_int((X),(Y),298)
+#define get_csv_llong_pos298(X,Y) get_csv_llong((X),(Y),298)
+#define get_csv_float_pos298(X,Y) get_csv_float((X),(Y),298)
+#define get_csv_uint_pos299(X,Y) get_csv_uint((X),(Y),299)
+#define get_csv_ullong_pos299(X,Y) get_csv_ullong((X),(Y),299)
+#define get_csv_ip_pos299(X,Y) get_csv_ip((X),(Y),299)
+#define get_csv_ipv6_pos299(X,Y) get_csv_ipv6((X),(Y),299)
+#define get_csv_string_pos299(X,Y) get_csv_string((X),(Y),299)
+#define get_csv_v_str_pos299(X,Y) get_csv_string((X),(Y),299)
+#define get_csv_bool_pos299(X,Y) get_csv_bool((X),(Y),299)
+#define get_csv_int_pos299(X,Y) get_csv_int((X),(Y),299)
+#define get_csv_llong_pos299(X,Y) get_csv_llong((X),(Y),299)
+#define get_csv_float_pos299(X,Y) get_csv_float((X),(Y),299)
+#define get_csv_uint_pos300(X,Y) get_csv_uint((X),(Y),300)
+#define get_csv_ullong_pos300(X,Y) get_csv_ullong((X),(Y),300)
+#define get_csv_ip_pos300(X,Y) get_csv_ip((X),(Y),300)
+#define get_csv_ipv6_pos300(X,Y) get_csv_ipv6((X),(Y),300)
+#define get_csv_string_pos300(X,Y) get_csv_string((X),(Y),300)
+#define get_csv_v_str_pos300(X,Y) get_csv_string((X),(Y),300)
+#define get_csv_bool_pos300(X,Y) get_csv_bool((X),(Y),300)
+#define get_csv_int_pos300(X,Y) get_csv_int((X),(Y),300)
+#define get_csv_llong_pos300(X,Y) get_csv_llong((X),(Y),300)
+#define get_csv_float_pos300(X,Y) get_csv_float((X),(Y),300)
+#define get_csv_uint_pos301(X,Y) get_csv_uint((X),(Y),301)
+#define get_csv_ullong_pos301(X,Y) get_csv_ullong((X),(Y),301)
+#define get_csv_ip_pos301(X,Y) get_csv_ip((X),(Y),301)
+#define get_csv_ipv6_pos301(X,Y) get_csv_ipv6((X),(Y),301)
+#define get_csv_string_pos301(X,Y) get_csv_string((X),(Y),301)
+#define get_csv_v_str_pos301(X,Y) get_csv_string((X),(Y),301)
+#define get_csv_bool_pos301(X,Y) get_csv_bool((X),(Y),301)
+#define get_csv_int_pos301(X,Y) get_csv_int((X),(Y),301)
+#define get_csv_llong_pos301(X,Y) get_csv_llong((X),(Y),301)
+#define get_csv_float_pos301(X,Y) get_csv_float((X),(Y),301)
+#define get_csv_uint_pos302(X,Y) get_csv_uint((X),(Y),302)
+#define get_csv_ullong_pos302(X,Y) get_csv_ullong((X),(Y),302)
+#define get_csv_ip_pos302(X,Y) get_csv_ip((X),(Y),302)
+#define get_csv_ipv6_pos302(X,Y) get_csv_ipv6((X),(Y),302)
+#define get_csv_string_pos302(X,Y) get_csv_string((X),(Y),302)
+#define get_csv_v_str_pos302(X,Y) get_csv_string((X),(Y),302)
+#define get_csv_bool_pos302(X,Y) get_csv_bool((X),(Y),302)
+#define get_csv_int_pos302(X,Y) get_csv_int((X),(Y),302)
+#define get_csv_llong_pos302(X,Y) get_csv_llong((X),(Y),302)
+#define get_csv_float_pos302(X,Y) get_csv_float((X),(Y),302)
+#define get_csv_uint_pos303(X,Y) get_csv_uint((X),(Y),303)
+#define get_csv_ullong_pos303(X,Y) get_csv_ullong((X),(Y),303)
+#define get_csv_ip_pos303(X,Y) get_csv_ip((X),(Y),303)
+#define get_csv_ipv6_pos303(X,Y) get_csv_ipv6((X),(Y),303)
+#define get_csv_string_pos303(X,Y) get_csv_string((X),(Y),303)
+#define get_csv_v_str_pos303(X,Y) get_csv_string((X),(Y),303)
+#define get_csv_bool_pos303(X,Y) get_csv_bool((X),(Y),303)
+#define get_csv_int_pos303(X,Y) get_csv_int((X),(Y),303)
+#define get_csv_llong_pos303(X,Y) get_csv_llong((X),(Y),303)
+#define get_csv_float_pos303(X,Y) get_csv_float((X),(Y),303)
+#define get_csv_uint_pos304(X,Y) get_csv_uint((X),(Y),304)
+#define get_csv_ullong_pos304(X,Y) get_csv_ullong((X),(Y),304)
+#define get_csv_ip_pos304(X,Y) get_csv_ip((X),(Y),304)
+#define get_csv_ipv6_pos304(X,Y) get_csv_ipv6((X),(Y),304)
+#define get_csv_string_pos304(X,Y) get_csv_string((X),(Y),304)
+#define get_csv_v_str_pos304(X,Y) get_csv_string((X),(Y),304)
+#define get_csv_bool_pos304(X,Y) get_csv_bool((X),(Y),304)
+#define get_csv_int_pos304(X,Y) get_csv_int((X),(Y),304)
+#define get_csv_llong_pos304(X,Y) get_csv_llong((X),(Y),304)
+#define get_csv_float_pos304(X,Y) get_csv_float((X),(Y),304)
+#define get_csv_uint_pos305(X,Y) get_csv_uint((X),(Y),305)
+#define get_csv_ullong_pos305(X,Y) get_csv_ullong((X),(Y),305)
+#define get_csv_ip_pos305(X,Y) get_csv_ip((X),(Y),305)
+#define get_csv_ipv6_pos305(X,Y) get_csv_ipv6((X),(Y),305)
+#define get_csv_string_pos305(X,Y) get_csv_string((X),(Y),305)
+#define get_csv_v_str_pos305(X,Y) get_csv_string((X),(Y),305)
+#define get_csv_bool_pos305(X,Y) get_csv_bool((X),(Y),305)
+#define get_csv_int_pos305(X,Y) get_csv_int((X),(Y),305)
+#define get_csv_llong_pos305(X,Y) get_csv_llong((X),(Y),305)
+#define get_csv_float_pos305(X,Y) get_csv_float((X),(Y),305)
+#define get_csv_uint_pos306(X,Y) get_csv_uint((X),(Y),306)
+#define get_csv_ullong_pos306(X,Y) get_csv_ullong((X),(Y),306)
+#define get_csv_ip_pos306(X,Y) get_csv_ip((X),(Y),306)
+#define get_csv_ipv6_pos306(X,Y) get_csv_ipv6((X),(Y),306)
+#define get_csv_string_pos306(X,Y) get_csv_string((X),(Y),306)
+#define get_csv_v_str_pos306(X,Y) get_csv_string((X),(Y),306)
+#define get_csv_bool_pos306(X,Y) get_csv_bool((X),(Y),306)
+#define get_csv_int_pos306(X,Y) get_csv_int((X),(Y),306)
+#define get_csv_llong_pos306(X,Y) get_csv_llong((X),(Y),306)
+#define get_csv_float_pos306(X,Y) get_csv_float((X),(Y),306)
+#define get_csv_uint_pos307(X,Y) get_csv_uint((X),(Y),307)
+#define get_csv_ullong_pos307(X,Y) get_csv_ullong((X),(Y),307)
+#define get_csv_ip_pos307(X,Y) get_csv_ip((X),(Y),307)
+#define get_csv_ipv6_pos307(X,Y) get_csv_ipv6((X),(Y),307)
+#define get_csv_string_pos307(X,Y) get_csv_string((X),(Y),307)
+#define get_csv_v_str_pos307(X,Y) get_csv_string((X),(Y),307)
+#define get_csv_bool_pos307(X,Y) get_csv_bool((X),(Y),307)
+#define get_csv_int_pos307(X,Y) get_csv_int((X),(Y),307)
+#define get_csv_llong_pos307(X,Y) get_csv_llong((X),(Y),307)
+#define get_csv_float_pos307(X,Y) get_csv_float((X),(Y),307)
+#define get_csv_uint_pos308(X,Y) get_csv_uint((X),(Y),308)
+#define get_csv_ullong_pos308(X,Y) get_csv_ullong((X),(Y),308)
+#define get_csv_ip_pos308(X,Y) get_csv_ip((X),(Y),308)
+#define get_csv_ipv6_pos308(X,Y) get_csv_ipv6((X),(Y),308)
+#define get_csv_string_pos308(X,Y) get_csv_string((X),(Y),308)
+#define get_csv_v_str_pos308(X,Y) get_csv_string((X),(Y),308)
+#define get_csv_bool_pos308(X,Y) get_csv_bool((X),(Y),308)
+#define get_csv_int_pos308(X,Y) get_csv_int((X),(Y),308)
+#define get_csv_llong_pos308(X,Y) get_csv_llong((X),(Y),308)
+#define get_csv_float_pos308(X,Y) get_csv_float((X),(Y),308)
+#define get_csv_uint_pos309(X,Y) get_csv_uint((X),(Y),309)
+#define get_csv_ullong_pos309(X,Y) get_csv_ullong((X),(Y),309)
+#define get_csv_ip_pos309(X,Y) get_csv_ip((X),(Y),309)
+#define get_csv_ipv6_pos309(X,Y) get_csv_ipv6((X),(Y),309)
+#define get_csv_string_pos309(X,Y) get_csv_string((X),(Y),309)
+#define get_csv_v_str_pos309(X,Y) get_csv_string((X),(Y),309)
+#define get_csv_bool_pos309(X,Y) get_csv_bool((X),(Y),309)
+#define get_csv_int_pos309(X,Y) get_csv_int((X),(Y),309)
+#define get_csv_llong_pos309(X,Y) get_csv_llong((X),(Y),309)
+#define get_csv_float_pos309(X,Y) get_csv_float((X),(Y),309)
+#define get_csv_uint_pos310(X,Y) get_csv_uint((X),(Y),310)
+#define get_csv_ullong_pos310(X,Y) get_csv_ullong((X),(Y),310)
+#define get_csv_ip_pos310(X,Y) get_csv_ip((X),(Y),310)
+#define get_csv_ipv6_pos310(X,Y) get_csv_ipv6((X),(Y),310)
+#define get_csv_string_pos310(X,Y) get_csv_string((X),(Y),310)
+#define get_csv_v_str_pos310(X,Y) get_csv_string((X),(Y),310)
+#define get_csv_bool_pos310(X,Y) get_csv_bool((X),(Y),310)
+#define get_csv_int_pos310(X,Y) get_csv_int((X),(Y),310)
+#define get_csv_llong_pos310(X,Y) get_csv_llong((X),(Y),310)
+#define get_csv_float_pos310(X,Y) get_csv_float((X),(Y),310)
+#define get_csv_uint_pos311(X,Y) get_csv_uint((X),(Y),311)
+#define get_csv_ullong_pos311(X,Y) get_csv_ullong((X),(Y),311)
+#define get_csv_ip_pos311(X,Y) get_csv_ip((X),(Y),311)
+#define get_csv_ipv6_pos311(X,Y) get_csv_ipv6((X),(Y),311)
+#define get_csv_string_pos311(X,Y) get_csv_string((X),(Y),311)
+#define get_csv_v_str_pos311(X,Y) get_csv_string((X),(Y),311)
+#define get_csv_bool_pos311(X,Y) get_csv_bool((X),(Y),311)
+#define get_csv_int_pos311(X,Y) get_csv_int((X),(Y),311)
+#define get_csv_llong_pos311(X,Y) get_csv_llong((X),(Y),311)
+#define get_csv_float_pos311(X,Y) get_csv_float((X),(Y),311)
+#define get_csv_uint_pos312(X,Y) get_csv_uint((X),(Y),312)
+#define get_csv_ullong_pos312(X,Y) get_csv_ullong((X),(Y),312)
+#define get_csv_ip_pos312(X,Y) get_csv_ip((X),(Y),312)
+#define get_csv_ipv6_pos312(X,Y) get_csv_ipv6((X),(Y),312)
+#define get_csv_string_pos312(X,Y) get_csv_string((X),(Y),312)
+#define get_csv_v_str_pos312(X,Y) get_csv_string((X),(Y),312)
+#define get_csv_bool_pos312(X,Y) get_csv_bool((X),(Y),312)
+#define get_csv_int_pos312(X,Y) get_csv_int((X),(Y),312)
+#define get_csv_llong_pos312(X,Y) get_csv_llong((X),(Y),312)
+#define get_csv_float_pos312(X,Y) get_csv_float((X),(Y),312)
+#define get_csv_uint_pos313(X,Y) get_csv_uint((X),(Y),313)
+#define get_csv_ullong_pos313(X,Y) get_csv_ullong((X),(Y),313)
+#define get_csv_ip_pos313(X,Y) get_csv_ip((X),(Y),313)
+#define get_csv_ipv6_pos313(X,Y) get_csv_ipv6((X),(Y),313)
+#define get_csv_string_pos313(X,Y) get_csv_string((X),(Y),313)
+#define get_csv_v_str_pos313(X,Y) get_csv_string((X),(Y),313)
+#define get_csv_bool_pos313(X,Y) get_csv_bool((X),(Y),313)
+#define get_csv_int_pos313(X,Y) get_csv_int((X),(Y),313)
+#define get_csv_llong_pos313(X,Y) get_csv_llong((X),(Y),313)
+#define get_csv_float_pos313(X,Y) get_csv_float((X),(Y),313)
+#define get_csv_uint_pos314(X,Y) get_csv_uint((X),(Y),314)
+#define get_csv_ullong_pos314(X,Y) get_csv_ullong((X),(Y),314)
+#define get_csv_ip_pos314(X,Y) get_csv_ip((X),(Y),314)
+#define get_csv_ipv6_pos314(X,Y) get_csv_ipv6((X),(Y),314)
+#define get_csv_string_pos314(X,Y) get_csv_string((X),(Y),314)
+#define get_csv_v_str_pos314(X,Y) get_csv_string((X),(Y),314)
+#define get_csv_bool_pos314(X,Y) get_csv_bool((X),(Y),314)
+#define get_csv_int_pos314(X,Y) get_csv_int((X),(Y),314)
+#define get_csv_llong_pos314(X,Y) get_csv_llong((X),(Y),314)
+#define get_csv_float_pos314(X,Y) get_csv_float((X),(Y),314)
+#define get_csv_uint_pos315(X,Y) get_csv_uint((X),(Y),315)
+#define get_csv_ullong_pos315(X,Y) get_csv_ullong((X),(Y),315)
+#define get_csv_ip_pos315(X,Y) get_csv_ip((X),(Y),315)
+#define get_csv_ipv6_pos315(X,Y) get_csv_ipv6((X),(Y),315)
+#define get_csv_string_pos315(X,Y) get_csv_string((X),(Y),315)
+#define get_csv_v_str_pos315(X,Y) get_csv_string((X),(Y),315)
+#define get_csv_bool_pos315(X,Y) get_csv_bool((X),(Y),315)
+#define get_csv_int_pos315(X,Y) get_csv_int((X),(Y),315)
+#define get_csv_llong_pos315(X,Y) get_csv_llong((X),(Y),315)
+#define get_csv_float_pos315(X,Y) get_csv_float((X),(Y),315)
+#define get_csv_uint_pos316(X,Y) get_csv_uint((X),(Y),316)
+#define get_csv_ullong_pos316(X,Y) get_csv_ullong((X),(Y),316)
+#define get_csv_ip_pos316(X,Y) get_csv_ip((X),(Y),316)
+#define get_csv_ipv6_pos316(X,Y) get_csv_ipv6((X),(Y),316)
+#define get_csv_string_pos316(X,Y) get_csv_string((X),(Y),316)
+#define get_csv_v_str_pos316(X,Y) get_csv_string((X),(Y),316)
+#define get_csv_bool_pos316(X,Y) get_csv_bool((X),(Y),316)
+#define get_csv_int_pos316(X,Y) get_csv_int((X),(Y),316)
+#define get_csv_llong_pos316(X,Y) get_csv_llong((X),(Y),316)
+#define get_csv_float_pos316(X,Y) get_csv_float((X),(Y),316)
+#define get_csv_uint_pos317(X,Y) get_csv_uint((X),(Y),317)
+#define get_csv_ullong_pos317(X,Y) get_csv_ullong((X),(Y),317)
+#define get_csv_ip_pos317(X,Y) get_csv_ip((X),(Y),317)
+#define get_csv_ipv6_pos317(X,Y) get_csv_ipv6((X),(Y),317)
+#define get_csv_string_pos317(X,Y) get_csv_string((X),(Y),317)
+#define get_csv_v_str_pos317(X,Y) get_csv_string((X),(Y),317)
+#define get_csv_bool_pos317(X,Y) get_csv_bool((X),(Y),317)
+#define get_csv_int_pos317(X,Y) get_csv_int((X),(Y),317)
+#define get_csv_llong_pos317(X,Y) get_csv_llong((X),(Y),317)
+#define get_csv_float_pos317(X,Y) get_csv_float((X),(Y),317)
+#define get_csv_uint_pos318(X,Y) get_csv_uint((X),(Y),318)
+#define get_csv_ullong_pos318(X,Y) get_csv_ullong((X),(Y),318)
+#define get_csv_ip_pos318(X,Y) get_csv_ip((X),(Y),318)
+#define get_csv_ipv6_pos318(X,Y) get_csv_ipv6((X),(Y),318)
+#define get_csv_string_pos318(X,Y) get_csv_string((X),(Y),318)
+#define get_csv_v_str_pos318(X,Y) get_csv_string((X),(Y),318)
+#define get_csv_bool_pos318(X,Y) get_csv_bool((X),(Y),318)
+#define get_csv_int_pos318(X,Y) get_csv_int((X),(Y),318)
+#define get_csv_llong_pos318(X,Y) get_csv_llong((X),(Y),318)
+#define get_csv_float_pos318(X,Y) get_csv_float((X),(Y),318)
+#define get_csv_uint_pos319(X,Y) get_csv_uint((X),(Y),319)
+#define get_csv_ullong_pos319(X,Y) get_csv_ullong((X),(Y),319)
+#define get_csv_ip_pos319(X,Y) get_csv_ip((X),(Y),319)
+#define get_csv_ipv6_pos319(X,Y) get_csv_ipv6((X),(Y),319)
+#define get_csv_string_pos319(X,Y) get_csv_string((X),(Y),319)
+#define get_csv_v_str_pos319(X,Y) get_csv_string((X),(Y),319)
+#define get_csv_bool_pos319(X,Y) get_csv_bool((X),(Y),319)
+#define get_csv_int_pos319(X,Y) get_csv_int((X),(Y),319)
+#define get_csv_llong_pos319(X,Y) get_csv_llong((X),(Y),319)
+#define get_csv_float_pos319(X,Y) get_csv_float((X),(Y),319)
+#define get_csv_uint_pos320(X,Y) get_csv_uint((X),(Y),320)
+#define get_csv_ullong_pos320(X,Y) get_csv_ullong((X),(Y),320)
+#define get_csv_ip_pos320(X,Y) get_csv_ip((X),(Y),320)
+#define get_csv_ipv6_pos320(X,Y) get_csv_ipv6((X),(Y),320)
+#define get_csv_string_pos320(X,Y) get_csv_string((X),(Y),320)
+#define get_csv_v_str_pos320(X,Y) get_csv_string((X),(Y),320)
+#define get_csv_bool_pos320(X,Y) get_csv_bool((X),(Y),320)
+#define get_csv_int_pos320(X,Y) get_csv_int((X),(Y),320)
+#define get_csv_llong_pos320(X,Y) get_csv_llong((X),(Y),320)
+#define get_csv_float_pos320(X,Y) get_csv_float((X),(Y),320)
+#define get_csv_uint_pos321(X,Y) get_csv_uint((X),(Y),321)
+#define get_csv_ullong_pos321(X,Y) get_csv_ullong((X),(Y),321)
+#define get_csv_ip_pos321(X,Y) get_csv_ip((X),(Y),321)
+#define get_csv_ipv6_pos321(X,Y) get_csv_ipv6((X),(Y),321)
+#define get_csv_string_pos321(X,Y) get_csv_string((X),(Y),321)
+#define get_csv_v_str_pos321(X,Y) get_csv_string((X),(Y),321)
+#define get_csv_bool_pos321(X,Y) get_csv_bool((X),(Y),321)
+#define get_csv_int_pos321(X,Y) get_csv_int((X),(Y),321)
+#define get_csv_llong_pos321(X,Y) get_csv_llong((X),(Y),321)
+#define get_csv_float_pos321(X,Y) get_csv_float((X),(Y),321)
+#define get_csv_uint_pos322(X,Y) get_csv_uint((X),(Y),322)
+#define get_csv_ullong_pos322(X,Y) get_csv_ullong((X),(Y),322)
+#define get_csv_ip_pos322(X,Y) get_csv_ip((X),(Y),322)
+#define get_csv_ipv6_pos322(X,Y) get_csv_ipv6((X),(Y),322)
+#define get_csv_string_pos322(X,Y) get_csv_string((X),(Y),322)
+#define get_csv_v_str_pos322(X,Y) get_csv_string((X),(Y),322)
+#define get_csv_bool_pos322(X,Y) get_csv_bool((X),(Y),322)
+#define get_csv_int_pos322(X,Y) get_csv_int((X),(Y),322)
+#define get_csv_llong_pos322(X,Y) get_csv_llong((X),(Y),322)
+#define get_csv_float_pos322(X,Y) get_csv_float((X),(Y),322)
+#define get_csv_uint_pos323(X,Y) get_csv_uint((X),(Y),323)
+#define get_csv_ullong_pos323(X,Y) get_csv_ullong((X),(Y),323)
+#define get_csv_ip_pos323(X,Y) get_csv_ip((X),(Y),323)
+#define get_csv_ipv6_pos323(X,Y) get_csv_ipv6((X),(Y),323)
+#define get_csv_string_pos323(X,Y) get_csv_string((X),(Y),323)
+#define get_csv_v_str_pos323(X,Y) get_csv_string((X),(Y),323)
+#define get_csv_bool_pos323(X,Y) get_csv_bool((X),(Y),323)
+#define get_csv_int_pos323(X,Y) get_csv_int((X),(Y),323)
+#define get_csv_llong_pos323(X,Y) get_csv_llong((X),(Y),323)
+#define get_csv_float_pos323(X,Y) get_csv_float((X),(Y),323)
+#define get_csv_uint_pos324(X,Y) get_csv_uint((X),(Y),324)
+#define get_csv_ullong_pos324(X,Y) get_csv_ullong((X),(Y),324)
+#define get_csv_ip_pos324(X,Y) get_csv_ip((X),(Y),324)
+#define get_csv_ipv6_pos324(X,Y) get_csv_ipv6((X),(Y),324)
+#define get_csv_string_pos324(X,Y) get_csv_string((X),(Y),324)
+#define get_csv_v_str_pos324(X,Y) get_csv_string((X),(Y),324)
+#define get_csv_bool_pos324(X,Y) get_csv_bool((X),(Y),324)
+#define get_csv_int_pos324(X,Y) get_csv_int((X),(Y),324)
+#define get_csv_llong_pos324(X,Y) get_csv_llong((X),(Y),324)
+#define get_csv_float_pos324(X,Y) get_csv_float((X),(Y),324)
+#define get_csv_uint_pos325(X,Y) get_csv_uint((X),(Y),325)
+#define get_csv_ullong_pos325(X,Y) get_csv_ullong((X),(Y),325)
+#define get_csv_ip_pos325(X,Y) get_csv_ip((X),(Y),325)
+#define get_csv_ipv6_pos325(X,Y) get_csv_ipv6((X),(Y),325)
+#define get_csv_string_pos325(X,Y) get_csv_string((X),(Y),325)
+#define get_csv_v_str_pos325(X,Y) get_csv_string((X),(Y),325)
+#define get_csv_bool_pos325(X,Y) get_csv_bool((X),(Y),325)
+#define get_csv_int_pos325(X,Y) get_csv_int((X),(Y),325)
+#define get_csv_llong_pos325(X,Y) get_csv_llong((X),(Y),325)
+#define get_csv_float_pos325(X,Y) get_csv_float((X),(Y),325)
+#define get_csv_uint_pos326(X,Y) get_csv_uint((X),(Y),326)
+#define get_csv_ullong_pos326(X,Y) get_csv_ullong((X),(Y),326)
+#define get_csv_ip_pos326(X,Y) get_csv_ip((X),(Y),326)
+#define get_csv_ipv6_pos326(X,Y) get_csv_ipv6((X),(Y),326)
+#define get_csv_string_pos326(X,Y) get_csv_string((X),(Y),326)
+#define get_csv_v_str_pos326(X,Y) get_csv_string((X),(Y),326)
+#define get_csv_bool_pos326(X,Y) get_csv_bool((X),(Y),326)
+#define get_csv_int_pos326(X,Y) get_csv_int((X),(Y),326)
+#define get_csv_llong_pos326(X,Y) get_csv_llong((X),(Y),326)
+#define get_csv_float_pos326(X,Y) get_csv_float((X),(Y),326)
+#define get_csv_uint_pos327(X,Y) get_csv_uint((X),(Y),327)
+#define get_csv_ullong_pos327(X,Y) get_csv_ullong((X),(Y),327)
+#define get_csv_ip_pos327(X,Y) get_csv_ip((X),(Y),327)
+#define get_csv_ipv6_pos327(X,Y) get_csv_ipv6((X),(Y),327)
+#define get_csv_string_pos327(X,Y) get_csv_string((X),(Y),327)
+#define get_csv_v_str_pos327(X,Y) get_csv_string((X),(Y),327)
+#define get_csv_bool_pos327(X,Y) get_csv_bool((X),(Y),327)
+#define get_csv_int_pos327(X,Y) get_csv_int((X),(Y),327)
+#define get_csv_llong_pos327(X,Y) get_csv_llong((X),(Y),327)
+#define get_csv_float_pos327(X,Y) get_csv_float((X),(Y),327)
+#define get_csv_uint_pos328(X,Y) get_csv_uint((X),(Y),328)
+#define get_csv_ullong_pos328(X,Y) get_csv_ullong((X),(Y),328)
+#define get_csv_ip_pos328(X,Y) get_csv_ip((X),(Y),328)
+#define get_csv_ipv6_pos328(X,Y) get_csv_ipv6((X),(Y),328)
+#define get_csv_string_pos328(X,Y) get_csv_string((X),(Y),328)
+#define get_csv_v_str_pos328(X,Y) get_csv_string((X),(Y),328)
+#define get_csv_bool_pos328(X,Y) get_csv_bool((X),(Y),328)
+#define get_csv_int_pos328(X,Y) get_csv_int((X),(Y),328)
+#define get_csv_llong_pos328(X,Y) get_csv_llong((X),(Y),328)
+#define get_csv_float_pos328(X,Y) get_csv_float((X),(Y),328)
+#define get_csv_uint_pos329(X,Y) get_csv_uint((X),(Y),329)
+#define get_csv_ullong_pos329(X,Y) get_csv_ullong((X),(Y),329)
+#define get_csv_ip_pos329(X,Y) get_csv_ip((X),(Y),329)
+#define get_csv_ipv6_pos329(X,Y) get_csv_ipv6((X),(Y),329)
+#define get_csv_string_pos329(X,Y) get_csv_string((X),(Y),329)
+#define get_csv_v_str_pos329(X,Y) get_csv_string((X),(Y),329)
+#define get_csv_bool_pos329(X,Y) get_csv_bool((X),(Y),329)
+#define get_csv_int_pos329(X,Y) get_csv_int((X),(Y),329)
+#define get_csv_llong_pos329(X,Y) get_csv_llong((X),(Y),329)
+#define get_csv_float_pos329(X,Y) get_csv_float((X),(Y),329)
+#define get_csv_uint_pos330(X,Y) get_csv_uint((X),(Y),330)
+#define get_csv_ullong_pos330(X,Y) get_csv_ullong((X),(Y),330)
+#define get_csv_ip_pos330(X,Y) get_csv_ip((X),(Y),330)
+#define get_csv_ipv6_pos330(X,Y) get_csv_ipv6((X),(Y),330)
+#define get_csv_string_pos330(X,Y) get_csv_string((X),(Y),330)
+#define get_csv_v_str_pos330(X,Y) get_csv_string((X),(Y),330)
+#define get_csv_bool_pos330(X,Y) get_csv_bool((X),(Y),330)
+#define get_csv_int_pos330(X,Y) get_csv_int((X),(Y),330)
+#define get_csv_llong_pos330(X,Y) get_csv_llong((X),(Y),330)
+#define get_csv_float_pos330(X,Y) get_csv_float((X),(Y),330)
+#define get_csv_uint_pos331(X,Y) get_csv_uint((X),(Y),331)
+#define get_csv_ullong_pos331(X,Y) get_csv_ullong((X),(Y),331)
+#define get_csv_ip_pos331(X,Y) get_csv_ip((X),(Y),331)
+#define get_csv_ipv6_pos331(X,Y) get_csv_ipv6((X),(Y),331)
+#define get_csv_string_pos331(X,Y) get_csv_string((X),(Y),331)
+#define get_csv_v_str_pos331(X,Y) get_csv_string((X),(Y),331)
+#define get_csv_bool_pos331(X,Y) get_csv_bool((X),(Y),331)
+#define get_csv_int_pos331(X,Y) get_csv_int((X),(Y),331)
+#define get_csv_llong_pos331(X,Y) get_csv_llong((X),(Y),331)
+#define get_csv_float_pos331(X,Y) get_csv_float((X),(Y),331)
+#define get_csv_uint_pos332(X,Y) get_csv_uint((X),(Y),332)
+#define get_csv_ullong_pos332(X,Y) get_csv_ullong((X),(Y),332)
+#define get_csv_ip_pos332(X,Y) get_csv_ip((X),(Y),332)
+#define get_csv_ipv6_pos332(X,Y) get_csv_ipv6((X),(Y),332)
+#define get_csv_string_pos332(X,Y) get_csv_string((X),(Y),332)
+#define get_csv_v_str_pos332(X,Y) get_csv_string((X),(Y),332)
+#define get_csv_bool_pos332(X,Y) get_csv_bool((X),(Y),332)
+#define get_csv_int_pos332(X,Y) get_csv_int((X),(Y),332)
+#define get_csv_llong_pos332(X,Y) get_csv_llong((X),(Y),332)
+#define get_csv_float_pos332(X,Y) get_csv_float((X),(Y),332)
+#define get_csv_uint_pos333(X,Y) get_csv_uint((X),(Y),333)
+#define get_csv_ullong_pos333(X,Y) get_csv_ullong((X),(Y),333)
+#define get_csv_ip_pos333(X,Y) get_csv_ip((X),(Y),333)
+#define get_csv_ipv6_pos333(X,Y) get_csv_ipv6((X),(Y),333)
+#define get_csv_string_pos333(X,Y) get_csv_string((X),(Y),333)
+#define get_csv_v_str_pos333(X,Y) get_csv_string((X),(Y),333)
+#define get_csv_bool_pos333(X,Y) get_csv_bool((X),(Y),333)
+#define get_csv_int_pos333(X,Y) get_csv_int((X),(Y),333)
+#define get_csv_llong_pos333(X,Y) get_csv_llong((X),(Y),333)
+#define get_csv_float_pos333(X,Y) get_csv_float((X),(Y),333)
+#define get_csv_uint_pos334(X,Y) get_csv_uint((X),(Y),334)
+#define get_csv_ullong_pos334(X,Y) get_csv_ullong((X),(Y),334)
+#define get_csv_ip_pos334(X,Y) get_csv_ip((X),(Y),334)
+#define get_csv_ipv6_pos334(X,Y) get_csv_ipv6((X),(Y),334)
+#define get_csv_string_pos334(X,Y) get_csv_string((X),(Y),334)
+#define get_csv_v_str_pos334(X,Y) get_csv_string((X),(Y),334)
+#define get_csv_bool_pos334(X,Y) get_csv_bool((X),(Y),334)
+#define get_csv_int_pos334(X,Y) get_csv_int((X),(Y),334)
+#define get_csv_llong_pos334(X,Y) get_csv_llong((X),(Y),334)
+#define get_csv_float_pos334(X,Y) get_csv_float((X),(Y),334)
+#define get_csv_uint_pos335(X,Y) get_csv_uint((X),(Y),335)
+#define get_csv_ullong_pos335(X,Y) get_csv_ullong((X),(Y),335)
+#define get_csv_ip_pos335(X,Y) get_csv_ip((X),(Y),335)
+#define get_csv_ipv6_pos335(X,Y) get_csv_ipv6((X),(Y),335)
+#define get_csv_string_pos335(X,Y) get_csv_string((X),(Y),335)
+#define get_csv_v_str_pos335(X,Y) get_csv_string((X),(Y),335)
+#define get_csv_bool_pos335(X,Y) get_csv_bool((X),(Y),335)
+#define get_csv_int_pos335(X,Y) get_csv_int((X),(Y),335)
+#define get_csv_llong_pos335(X,Y) get_csv_llong((X),(Y),335)
+#define get_csv_float_pos335(X,Y) get_csv_float((X),(Y),335)
+#define get_csv_uint_pos336(X,Y) get_csv_uint((X),(Y),336)
+#define get_csv_ullong_pos336(X,Y) get_csv_ullong((X),(Y),336)
+#define get_csv_ip_pos336(X,Y) get_csv_ip((X),(Y),336)
+#define get_csv_ipv6_pos336(X,Y) get_csv_ipv6((X),(Y),336)
+#define get_csv_string_pos336(X,Y) get_csv_string((X),(Y),336)
+#define get_csv_v_str_pos336(X,Y) get_csv_string((X),(Y),336)
+#define get_csv_bool_pos336(X,Y) get_csv_bool((X),(Y),336)
+#define get_csv_int_pos336(X,Y) get_csv_int((X),(Y),336)
+#define get_csv_llong_pos336(X,Y) get_csv_llong((X),(Y),336)
+#define get_csv_float_pos336(X,Y) get_csv_float((X),(Y),336)
+#define get_csv_uint_pos337(X,Y) get_csv_uint((X),(Y),337)
+#define get_csv_ullong_pos337(X,Y) get_csv_ullong((X),(Y),337)
+#define get_csv_ip_pos337(X,Y) get_csv_ip((X),(Y),337)
+#define get_csv_ipv6_pos337(X,Y) get_csv_ipv6((X),(Y),337)
+#define get_csv_string_pos337(X,Y) get_csv_string((X),(Y),337)
+#define get_csv_v_str_pos337(X,Y) get_csv_string((X),(Y),337)
+#define get_csv_bool_pos337(X,Y) get_csv_bool((X),(Y),337)
+#define get_csv_int_pos337(X,Y) get_csv_int((X),(Y),337)
+#define get_csv_llong_pos337(X,Y) get_csv_llong((X),(Y),337)
+#define get_csv_float_pos337(X,Y) get_csv_float((X),(Y),337)
+#define get_csv_uint_pos338(X,Y) get_csv_uint((X),(Y),338)
+#define get_csv_ullong_pos338(X,Y) get_csv_ullong((X),(Y),338)
+#define get_csv_ip_pos338(X,Y) get_csv_ip((X),(Y),338)
+#define get_csv_ipv6_pos338(X,Y) get_csv_ipv6((X),(Y),338)
+#define get_csv_string_pos338(X,Y) get_csv_string((X),(Y),338)
+#define get_csv_v_str_pos338(X,Y) get_csv_string((X),(Y),338)
+#define get_csv_bool_pos338(X,Y) get_csv_bool((X),(Y),338)
+#define get_csv_int_pos338(X,Y) get_csv_int((X),(Y),338)
+#define get_csv_llong_pos338(X,Y) get_csv_llong((X),(Y),338)
+#define get_csv_float_pos338(X,Y) get_csv_float((X),(Y),338)
+#define get_csv_uint_pos339(X,Y) get_csv_uint((X),(Y),339)
+#define get_csv_ullong_pos339(X,Y) get_csv_ullong((X),(Y),339)
+#define get_csv_ip_pos339(X,Y) get_csv_ip((X),(Y),339)
+#define get_csv_ipv6_pos339(X,Y) get_csv_ipv6((X),(Y),339)
+#define get_csv_string_pos339(X,Y) get_csv_string((X),(Y),339)
+#define get_csv_v_str_pos339(X,Y) get_csv_string((X),(Y),339)
+#define get_csv_bool_pos339(X,Y) get_csv_bool((X),(Y),339)
+#define get_csv_int_pos339(X,Y) get_csv_int((X),(Y),339)
+#define get_csv_llong_pos339(X,Y) get_csv_llong((X),(Y),339)
+#define get_csv_float_pos339(X,Y) get_csv_float((X),(Y),339)
+#define get_csv_uint_pos340(X,Y) get_csv_uint((X),(Y),340)
+#define get_csv_ullong_pos340(X,Y) get_csv_ullong((X),(Y),340)
+#define get_csv_ip_pos340(X,Y) get_csv_ip((X),(Y),340)
+#define get_csv_ipv6_pos340(X,Y) get_csv_ipv6((X),(Y),340)
+#define get_csv_string_pos340(X,Y) get_csv_string((X),(Y),340)
+#define get_csv_v_str_pos340(X,Y) get_csv_string((X),(Y),340)
+#define get_csv_bool_pos340(X,Y) get_csv_bool((X),(Y),340)
+#define get_csv_int_pos340(X,Y) get_csv_int((X),(Y),340)
+#define get_csv_llong_pos340(X,Y) get_csv_llong((X),(Y),340)
+#define get_csv_float_pos340(X,Y) get_csv_float((X),(Y),340)
+#define get_csv_uint_pos341(X,Y) get_csv_uint((X),(Y),341)
+#define get_csv_ullong_pos341(X,Y) get_csv_ullong((X),(Y),341)
+#define get_csv_ip_pos341(X,Y) get_csv_ip((X),(Y),341)
+#define get_csv_ipv6_pos341(X,Y) get_csv_ipv6((X),(Y),341)
+#define get_csv_string_pos341(X,Y) get_csv_string((X),(Y),341)
+#define get_csv_v_str_pos341(X,Y) get_csv_string((X),(Y),341)
+#define get_csv_bool_pos341(X,Y) get_csv_bool((X),(Y),341)
+#define get_csv_int_pos341(X,Y) get_csv_int((X),(Y),341)
+#define get_csv_llong_pos341(X,Y) get_csv_llong((X),(Y),341)
+#define get_csv_float_pos341(X,Y) get_csv_float((X),(Y),341)
+#define get_csv_uint_pos342(X,Y) get_csv_uint((X),(Y),342)
+#define get_csv_ullong_pos342(X,Y) get_csv_ullong((X),(Y),342)
+#define get_csv_ip_pos342(X,Y) get_csv_ip((X),(Y),342)
+#define get_csv_ipv6_pos342(X,Y) get_csv_ipv6((X),(Y),342)
+#define get_csv_string_pos342(X,Y) get_csv_string((X),(Y),342)
+#define get_csv_v_str_pos342(X,Y) get_csv_string((X),(Y),342)
+#define get_csv_bool_pos342(X,Y) get_csv_bool((X),(Y),342)
+#define get_csv_int_pos342(X,Y) get_csv_int((X),(Y),342)
+#define get_csv_llong_pos342(X,Y) get_csv_llong((X),(Y),342)
+#define get_csv_float_pos342(X,Y) get_csv_float((X),(Y),342)
+#define get_csv_uint_pos343(X,Y) get_csv_uint((X),(Y),343)
+#define get_csv_ullong_pos343(X,Y) get_csv_ullong((X),(Y),343)
+#define get_csv_ip_pos343(X,Y) get_csv_ip((X),(Y),343)
+#define get_csv_ipv6_pos343(X,Y) get_csv_ipv6((X),(Y),343)
+#define get_csv_string_pos343(X,Y) get_csv_string((X),(Y),343)
+#define get_csv_v_str_pos343(X,Y) get_csv_string((X),(Y),343)
+#define get_csv_bool_pos343(X,Y) get_csv_bool((X),(Y),343)
+#define get_csv_int_pos343(X,Y) get_csv_int((X),(Y),343)
+#define get_csv_llong_pos343(X,Y) get_csv_llong((X),(Y),343)
+#define get_csv_float_pos343(X,Y) get_csv_float((X),(Y),343)
+#define get_csv_uint_pos344(X,Y) get_csv_uint((X),(Y),344)
+#define get_csv_ullong_pos344(X,Y) get_csv_ullong((X),(Y),344)
+#define get_csv_ip_pos344(X,Y) get_csv_ip((X),(Y),344)
+#define get_csv_ipv6_pos344(X,Y) get_csv_ipv6((X),(Y),344)
+#define get_csv_string_pos344(X,Y) get_csv_string((X),(Y),344)
+#define get_csv_v_str_pos344(X,Y) get_csv_string((X),(Y),344)
+#define get_csv_bool_pos344(X,Y) get_csv_bool((X),(Y),344)
+#define get_csv_int_pos344(X,Y) get_csv_int((X),(Y),344)
+#define get_csv_llong_pos344(X,Y) get_csv_llong((X),(Y),344)
+#define get_csv_float_pos344(X,Y) get_csv_float((X),(Y),344)
+#define get_csv_uint_pos345(X,Y) get_csv_uint((X),(Y),345)
+#define get_csv_ullong_pos345(X,Y) get_csv_ullong((X),(Y),345)
+#define get_csv_ip_pos345(X,Y) get_csv_ip((X),(Y),345)
+#define get_csv_ipv6_pos345(X,Y) get_csv_ipv6((X),(Y),345)
+#define get_csv_string_pos345(X,Y) get_csv_string((X),(Y),345)
+#define get_csv_v_str_pos345(X,Y) get_csv_string((X),(Y),345)
+#define get_csv_bool_pos345(X,Y) get_csv_bool((X),(Y),345)
+#define get_csv_int_pos345(X,Y) get_csv_int((X),(Y),345)
+#define get_csv_llong_pos345(X,Y) get_csv_llong((X),(Y),345)
+#define get_csv_float_pos345(X,Y) get_csv_float((X),(Y),345)
+#define get_csv_uint_pos346(X,Y) get_csv_uint((X),(Y),346)
+#define get_csv_ullong_pos346(X,Y) get_csv_ullong((X),(Y),346)
+#define get_csv_ip_pos346(X,Y) get_csv_ip((X),(Y),346)
+#define get_csv_ipv6_pos346(X,Y) get_csv_ipv6((X),(Y),346)
+#define get_csv_string_pos346(X,Y) get_csv_string((X),(Y),346)
+#define get_csv_v_str_pos346(X,Y) get_csv_string((X),(Y),346)
+#define get_csv_bool_pos346(X,Y) get_csv_bool((X),(Y),346)
+#define get_csv_int_pos346(X,Y) get_csv_int((X),(Y),346)
+#define get_csv_llong_pos346(X,Y) get_csv_llong((X),(Y),346)
+#define get_csv_float_pos346(X,Y) get_csv_float((X),(Y),346)
+#define get_csv_uint_pos347(X,Y) get_csv_uint((X),(Y),347)
+#define get_csv_ullong_pos347(X,Y) get_csv_ullong((X),(Y),347)
+#define get_csv_ip_pos347(X,Y) get_csv_ip((X),(Y),347)
+#define get_csv_ipv6_pos347(X,Y) get_csv_ipv6((X),(Y),347)
+#define get_csv_string_pos347(X,Y) get_csv_string((X),(Y),347)
+#define get_csv_v_str_pos347(X,Y) get_csv_string((X),(Y),347)
+#define get_csv_bool_pos347(X,Y) get_csv_bool((X),(Y),347)
+#define get_csv_int_pos347(X,Y) get_csv_int((X),(Y),347)
+#define get_csv_llong_pos347(X,Y) get_csv_llong((X),(Y),347)
+#define get_csv_float_pos347(X,Y) get_csv_float((X),(Y),347)
+#define get_csv_uint_pos348(X,Y) get_csv_uint((X),(Y),348)
+#define get_csv_ullong_pos348(X,Y) get_csv_ullong((X),(Y),348)
+#define get_csv_ip_pos348(X,Y) get_csv_ip((X),(Y),348)
+#define get_csv_ipv6_pos348(X,Y) get_csv_ipv6((X),(Y),348)
+#define get_csv_string_pos348(X,Y) get_csv_string((X),(Y),348)
+#define get_csv_v_str_pos348(X,Y) get_csv_string((X),(Y),348)
+#define get_csv_bool_pos348(X,Y) get_csv_bool((X),(Y),348)
+#define get_csv_int_pos348(X,Y) get_csv_int((X),(Y),348)
+#define get_csv_llong_pos348(X,Y) get_csv_llong((X),(Y),348)
+#define get_csv_float_pos348(X,Y) get_csv_float((X),(Y),348)
+#define get_csv_uint_pos349(X,Y) get_csv_uint((X),(Y),349)
+#define get_csv_ullong_pos349(X,Y) get_csv_ullong((X),(Y),349)
+#define get_csv_ip_pos349(X,Y) get_csv_ip((X),(Y),349)
+#define get_csv_ipv6_pos349(X,Y) get_csv_ipv6((X),(Y),349)
+#define get_csv_string_pos349(X,Y) get_csv_string((X),(Y),349)
+#define get_csv_v_str_pos349(X,Y) get_csv_string((X),(Y),349)
+#define get_csv_bool_pos349(X,Y) get_csv_bool((X),(Y),349)
+#define get_csv_int_pos349(X,Y) get_csv_int((X),(Y),349)
+#define get_csv_llong_pos349(X,Y) get_csv_llong((X),(Y),349)
+#define get_csv_float_pos349(X,Y) get_csv_float((X),(Y),349)
+#define get_csv_uint_pos350(X,Y) get_csv_uint((X),(Y),350)
+#define get_csv_ullong_pos350(X,Y) get_csv_ullong((X),(Y),350)
+#define get_csv_ip_pos350(X,Y) get_csv_ip((X),(Y),350)
+#define get_csv_ipv6_pos350(X,Y) get_csv_ipv6((X),(Y),350)
+#define get_csv_string_pos350(X,Y) get_csv_string((X),(Y),350)
+#define get_csv_v_str_pos350(X,Y) get_csv_string((X),(Y),350)
+#define get_csv_bool_pos350(X,Y) get_csv_bool((X),(Y),350)
+#define get_csv_int_pos350(X,Y) get_csv_int((X),(Y),350)
+#define get_csv_llong_pos350(X,Y) get_csv_llong((X),(Y),350)
+#define get_csv_float_pos350(X,Y) get_csv_float((X),(Y),350)
+#define get_csv_uint_pos351(X,Y) get_csv_uint((X),(Y),351)
+#define get_csv_ullong_pos351(X,Y) get_csv_ullong((X),(Y),351)
+#define get_csv_ip_pos351(X,Y) get_csv_ip((X),(Y),351)
+#define get_csv_ipv6_pos351(X,Y) get_csv_ipv6((X),(Y),351)
+#define get_csv_string_pos351(X,Y) get_csv_string((X),(Y),351)
+#define get_csv_v_str_pos351(X,Y) get_csv_string((X),(Y),351)
+#define get_csv_bool_pos351(X,Y) get_csv_bool((X),(Y),351)
+#define get_csv_int_pos351(X,Y) get_csv_int((X),(Y),351)
+#define get_csv_llong_pos351(X,Y) get_csv_llong((X),(Y),351)
+#define get_csv_float_pos351(X,Y) get_csv_float((X),(Y),351)
+#define get_csv_uint_pos352(X,Y) get_csv_uint((X),(Y),352)
+#define get_csv_ullong_pos352(X,Y) get_csv_ullong((X),(Y),352)
+#define get_csv_ip_pos352(X,Y) get_csv_ip((X),(Y),352)
+#define get_csv_ipv6_pos352(X,Y) get_csv_ipv6((X),(Y),352)
+#define get_csv_string_pos352(X,Y) get_csv_string((X),(Y),352)
+#define get_csv_v_str_pos352(X,Y) get_csv_string((X),(Y),352)
+#define get_csv_bool_pos352(X,Y) get_csv_bool((X),(Y),352)
+#define get_csv_int_pos352(X,Y) get_csv_int((X),(Y),352)
+#define get_csv_llong_pos352(X,Y) get_csv_llong((X),(Y),352)
+#define get_csv_float_pos352(X,Y) get_csv_float((X),(Y),352)
+#define get_csv_uint_pos353(X,Y) get_csv_uint((X),(Y),353)
+#define get_csv_ullong_pos353(X,Y) get_csv_ullong((X),(Y),353)
+#define get_csv_ip_pos353(X,Y) get_csv_ip((X),(Y),353)
+#define get_csv_ipv6_pos353(X,Y) get_csv_ipv6((X),(Y),353)
+#define get_csv_string_pos353(X,Y) get_csv_string((X),(Y),353)
+#define get_csv_v_str_pos353(X,Y) get_csv_string((X),(Y),353)
+#define get_csv_bool_pos353(X,Y) get_csv_bool((X),(Y),353)
+#define get_csv_int_pos353(X,Y) get_csv_int((X),(Y),353)
+#define get_csv_llong_pos353(X,Y) get_csv_llong((X),(Y),353)
+#define get_csv_float_pos353(X,Y) get_csv_float((X),(Y),353)
+#define get_csv_uint_pos354(X,Y) get_csv_uint((X),(Y),354)
+#define get_csv_ullong_pos354(X,Y) get_csv_ullong((X),(Y),354)
+#define get_csv_ip_pos354(X,Y) get_csv_ip((X),(Y),354)
+#define get_csv_ipv6_pos354(X,Y) get_csv_ipv6((X),(Y),354)
+#define get_csv_string_pos354(X,Y) get_csv_string((X),(Y),354)
+#define get_csv_v_str_pos354(X,Y) get_csv_string((X),(Y),354)
+#define get_csv_bool_pos354(X,Y) get_csv_bool((X),(Y),354)
+#define get_csv_int_pos354(X,Y) get_csv_int((X),(Y),354)
+#define get_csv_llong_pos354(X,Y) get_csv_llong((X),(Y),354)
+#define get_csv_float_pos354(X,Y) get_csv_float((X),(Y),354)
+#define get_csv_uint_pos355(X,Y) get_csv_uint((X),(Y),355)
+#define get_csv_ullong_pos355(X,Y) get_csv_ullong((X),(Y),355)
+#define get_csv_ip_pos355(X,Y) get_csv_ip((X),(Y),355)
+#define get_csv_ipv6_pos355(X,Y) get_csv_ipv6((X),(Y),355)
+#define get_csv_string_pos355(X,Y) get_csv_string((X),(Y),355)
+#define get_csv_v_str_pos355(X,Y) get_csv_string((X),(Y),355)
+#define get_csv_bool_pos355(X,Y) get_csv_bool((X),(Y),355)
+#define get_csv_int_pos355(X,Y) get_csv_int((X),(Y),355)
+#define get_csv_llong_pos355(X,Y) get_csv_llong((X),(Y),355)
+#define get_csv_float_pos355(X,Y) get_csv_float((X),(Y),355)
+#define get_csv_uint_pos356(X,Y) get_csv_uint((X),(Y),356)
+#define get_csv_ullong_pos356(X,Y) get_csv_ullong((X),(Y),356)
+#define get_csv_ip_pos356(X,Y) get_csv_ip((X),(Y),356)
+#define get_csv_ipv6_pos356(X,Y) get_csv_ipv6((X),(Y),356)
+#define get_csv_string_pos356(X,Y) get_csv_string((X),(Y),356)
+#define get_csv_v_str_pos356(X,Y) get_csv_string((X),(Y),356)
+#define get_csv_bool_pos356(X,Y) get_csv_bool((X),(Y),356)
+#define get_csv_int_pos356(X,Y) get_csv_int((X),(Y),356)
+#define get_csv_llong_pos356(X,Y) get_csv_llong((X),(Y),356)
+#define get_csv_float_pos356(X,Y) get_csv_float((X),(Y),356)
+#define get_csv_uint_pos357(X,Y) get_csv_uint((X),(Y),357)
+#define get_csv_ullong_pos357(X,Y) get_csv_ullong((X),(Y),357)
+#define get_csv_ip_pos357(X,Y) get_csv_ip((X),(Y),357)
+#define get_csv_ipv6_pos357(X,Y) get_csv_ipv6((X),(Y),357)
+#define get_csv_string_pos357(X,Y) get_csv_string((X),(Y),357)
+#define get_csv_v_str_pos357(X,Y) get_csv_string((X),(Y),357)
+#define get_csv_bool_pos357(X,Y) get_csv_bool((X),(Y),357)
+#define get_csv_int_pos357(X,Y) get_csv_int((X),(Y),357)
+#define get_csv_llong_pos357(X,Y) get_csv_llong((X),(Y),357)
+#define get_csv_float_pos357(X,Y) get_csv_float((X),(Y),357)
+#define get_csv_uint_pos358(X,Y) get_csv_uint((X),(Y),358)
+#define get_csv_ullong_pos358(X,Y) get_csv_ullong((X),(Y),358)
+#define get_csv_ip_pos358(X,Y) get_csv_ip((X),(Y),358)
+#define get_csv_ipv6_pos358(X,Y) get_csv_ipv6((X),(Y),358)
+#define get_csv_string_pos358(X,Y) get_csv_string((X),(Y),358)
+#define get_csv_v_str_pos358(X,Y) get_csv_string((X),(Y),358)
+#define get_csv_bool_pos358(X,Y) get_csv_bool((X),(Y),358)
+#define get_csv_int_pos358(X,Y) get_csv_int((X),(Y),358)
+#define get_csv_llong_pos358(X,Y) get_csv_llong((X),(Y),358)
+#define get_csv_float_pos358(X,Y) get_csv_float((X),(Y),358)
+#define get_csv_uint_pos359(X,Y) get_csv_uint((X),(Y),359)
+#define get_csv_ullong_pos359(X,Y) get_csv_ullong((X),(Y),359)
+#define get_csv_ip_pos359(X,Y) get_csv_ip((X),(Y),359)
+#define get_csv_ipv6_pos359(X,Y) get_csv_ipv6((X),(Y),359)
+#define get_csv_string_pos359(X,Y) get_csv_string((X),(Y),359)
+#define get_csv_v_str_pos359(X,Y) get_csv_string((X),(Y),359)
+#define get_csv_bool_pos359(X,Y) get_csv_bool((X),(Y),359)
+#define get_csv_int_pos359(X,Y) get_csv_int((X),(Y),359)
+#define get_csv_llong_pos359(X,Y) get_csv_llong((X),(Y),359)
+#define get_csv_float_pos359(X,Y) get_csv_float((X),(Y),359)
+#define get_csv_uint_pos360(X,Y) get_csv_uint((X),(Y),360)
+#define get_csv_ullong_pos360(X,Y) get_csv_ullong((X),(Y),360)
+#define get_csv_ip_pos360(X,Y) get_csv_ip((X),(Y),360)
+#define get_csv_ipv6_pos360(X,Y) get_csv_ipv6((X),(Y),360)
+#define get_csv_string_pos360(X,Y) get_csv_string((X),(Y),360)
+#define get_csv_v_str_pos360(X,Y) get_csv_string((X),(Y),360)
+#define get_csv_bool_pos360(X,Y) get_csv_bool((X),(Y),360)
+#define get_csv_int_pos360(X,Y) get_csv_int((X),(Y),360)
+#define get_csv_llong_pos360(X,Y) get_csv_llong((X),(Y),360)
+#define get_csv_float_pos360(X,Y) get_csv_float((X),(Y),360)
+#define get_csv_uint_pos361(X,Y) get_csv_uint((X),(Y),361)
+#define get_csv_ullong_pos361(X,Y) get_csv_ullong((X),(Y),361)
+#define get_csv_ip_pos361(X,Y) get_csv_ip((X),(Y),361)
+#define get_csv_ipv6_pos361(X,Y) get_csv_ipv6((X),(Y),361)
+#define get_csv_string_pos361(X,Y) get_csv_string((X),(Y),361)
+#define get_csv_v_str_pos361(X,Y) get_csv_string((X),(Y),361)
+#define get_csv_bool_pos361(X,Y) get_csv_bool((X),(Y),361)
+#define get_csv_int_pos361(X,Y) get_csv_int((X),(Y),361)
+#define get_csv_llong_pos361(X,Y) get_csv_llong((X),(Y),361)
+#define get_csv_float_pos361(X,Y) get_csv_float((X),(Y),361)
+#define get_csv_uint_pos362(X,Y) get_csv_uint((X),(Y),362)
+#define get_csv_ullong_pos362(X,Y) get_csv_ullong((X),(Y),362)
+#define get_csv_ip_pos362(X,Y) get_csv_ip((X),(Y),362)
+#define get_csv_ipv6_pos362(X,Y) get_csv_ipv6((X),(Y),362)
+#define get_csv_string_pos362(X,Y) get_csv_string((X),(Y),362)
+#define get_csv_v_str_pos362(X,Y) get_csv_string((X),(Y),362)
+#define get_csv_bool_pos362(X,Y) get_csv_bool((X),(Y),362)
+#define get_csv_int_pos362(X,Y) get_csv_int((X),(Y),362)
+#define get_csv_llong_pos362(X,Y) get_csv_llong((X),(Y),362)
+#define get_csv_float_pos362(X,Y) get_csv_float((X),(Y),362)
+#define get_csv_uint_pos363(X,Y) get_csv_uint((X),(Y),363)
+#define get_csv_ullong_pos363(X,Y) get_csv_ullong((X),(Y),363)
+#define get_csv_ip_pos363(X,Y) get_csv_ip((X),(Y),363)
+#define get_csv_ipv6_pos363(X,Y) get_csv_ipv6((X),(Y),363)
+#define get_csv_string_pos363(X,Y) get_csv_string((X),(Y),363)
+#define get_csv_v_str_pos363(X,Y) get_csv_string((X),(Y),363)
+#define get_csv_bool_pos363(X,Y) get_csv_bool((X),(Y),363)
+#define get_csv_int_pos363(X,Y) get_csv_int((X),(Y),363)
+#define get_csv_llong_pos363(X,Y) get_csv_llong((X),(Y),363)
+#define get_csv_float_pos363(X,Y) get_csv_float((X),(Y),363)
+#define get_csv_uint_pos364(X,Y) get_csv_uint((X),(Y),364)
+#define get_csv_ullong_pos364(X,Y) get_csv_ullong((X),(Y),364)
+#define get_csv_ip_pos364(X,Y) get_csv_ip((X),(Y),364)
+#define get_csv_ipv6_pos364(X,Y) get_csv_ipv6((X),(Y),364)
+#define get_csv_string_pos364(X,Y) get_csv_string((X),(Y),364)
+#define get_csv_v_str_pos364(X,Y) get_csv_string((X),(Y),364)
+#define get_csv_bool_pos364(X,Y) get_csv_bool((X),(Y),364)
+#define get_csv_int_pos364(X,Y) get_csv_int((X),(Y),364)
+#define get_csv_llong_pos364(X,Y) get_csv_llong((X),(Y),364)
+#define get_csv_float_pos364(X,Y) get_csv_float((X),(Y),364)
+#define get_csv_uint_pos365(X,Y) get_csv_uint((X),(Y),365)
+#define get_csv_ullong_pos365(X,Y) get_csv_ullong((X),(Y),365)
+#define get_csv_ip_pos365(X,Y) get_csv_ip((X),(Y),365)
+#define get_csv_ipv6_pos365(X,Y) get_csv_ipv6((X),(Y),365)
+#define get_csv_string_pos365(X,Y) get_csv_string((X),(Y),365)
+#define get_csv_v_str_pos365(X,Y) get_csv_string((X),(Y),365)
+#define get_csv_bool_pos365(X,Y) get_csv_bool((X),(Y),365)
+#define get_csv_int_pos365(X,Y) get_csv_int((X),(Y),365)
+#define get_csv_llong_pos365(X,Y) get_csv_llong((X),(Y),365)
+#define get_csv_float_pos365(X,Y) get_csv_float((X),(Y),365)
+#define get_csv_uint_pos366(X,Y) get_csv_uint((X),(Y),366)
+#define get_csv_ullong_pos366(X,Y) get_csv_ullong((X),(Y),366)
+#define get_csv_ip_pos366(X,Y) get_csv_ip((X),(Y),366)
+#define get_csv_ipv6_pos366(X,Y) get_csv_ipv6((X),(Y),366)
+#define get_csv_string_pos366(X,Y) get_csv_string((X),(Y),366)
+#define get_csv_v_str_pos366(X,Y) get_csv_string((X),(Y),366)
+#define get_csv_bool_pos366(X,Y) get_csv_bool((X),(Y),366)
+#define get_csv_int_pos366(X,Y) get_csv_int((X),(Y),366)
+#define get_csv_llong_pos366(X,Y) get_csv_llong((X),(Y),366)
+#define get_csv_float_pos366(X,Y) get_csv_float((X),(Y),366)
+#define get_csv_uint_pos367(X,Y) get_csv_uint((X),(Y),367)
+#define get_csv_ullong_pos367(X,Y) get_csv_ullong((X),(Y),367)
+#define get_csv_ip_pos367(X,Y) get_csv_ip((X),(Y),367)
+#define get_csv_ipv6_pos367(X,Y) get_csv_ipv6((X),(Y),367)
+#define get_csv_string_pos367(X,Y) get_csv_string((X),(Y),367)
+#define get_csv_v_str_pos367(X,Y) get_csv_string((X),(Y),367)
+#define get_csv_bool_pos367(X,Y) get_csv_bool((X),(Y),367)
+#define get_csv_int_pos367(X,Y) get_csv_int((X),(Y),367)
+#define get_csv_llong_pos367(X,Y) get_csv_llong((X),(Y),367)
+#define get_csv_float_pos367(X,Y) get_csv_float((X),(Y),367)
+#define get_csv_uint_pos368(X,Y) get_csv_uint((X),(Y),368)
+#define get_csv_ullong_pos368(X,Y) get_csv_ullong((X),(Y),368)
+#define get_csv_ip_pos368(X,Y) get_csv_ip((X),(Y),368)
+#define get_csv_ipv6_pos368(X,Y) get_csv_ipv6((X),(Y),368)
+#define get_csv_string_pos368(X,Y) get_csv_string((X),(Y),368)
+#define get_csv_v_str_pos368(X,Y) get_csv_string((X),(Y),368)
+#define get_csv_bool_pos368(X,Y) get_csv_bool((X),(Y),368)
+#define get_csv_int_pos368(X,Y) get_csv_int((X),(Y),368)
+#define get_csv_llong_pos368(X,Y) get_csv_llong((X),(Y),368)
+#define get_csv_float_pos368(X,Y) get_csv_float((X),(Y),368)
+#define get_csv_uint_pos369(X,Y) get_csv_uint((X),(Y),369)
+#define get_csv_ullong_pos369(X,Y) get_csv_ullong((X),(Y),369)
+#define get_csv_ip_pos369(X,Y) get_csv_ip((X),(Y),369)
+#define get_csv_ipv6_pos369(X,Y) get_csv_ipv6((X),(Y),369)
+#define get_csv_string_pos369(X,Y) get_csv_string((X),(Y),369)
+#define get_csv_v_str_pos369(X,Y) get_csv_string((X),(Y),369)
+#define get_csv_bool_pos369(X,Y) get_csv_bool((X),(Y),369)
+#define get_csv_int_pos369(X,Y) get_csv_int((X),(Y),369)
+#define get_csv_llong_pos369(X,Y) get_csv_llong((X),(Y),369)
+#define get_csv_float_pos369(X,Y) get_csv_float((X),(Y),369)
+#define get_csv_uint_pos370(X,Y) get_csv_uint((X),(Y),370)
+#define get_csv_ullong_pos370(X,Y) get_csv_ullong((X),(Y),370)
+#define get_csv_ip_pos370(X,Y) get_csv_ip((X),(Y),370)
+#define get_csv_ipv6_pos370(X,Y) get_csv_ipv6((X),(Y),370)
+#define get_csv_string_pos370(X,Y) get_csv_string((X),(Y),370)
+#define get_csv_v_str_pos370(X,Y) get_csv_string((X),(Y),370)
+#define get_csv_bool_pos370(X,Y) get_csv_bool((X),(Y),370)
+#define get_csv_int_pos370(X,Y) get_csv_int((X),(Y),370)
+#define get_csv_llong_pos370(X,Y) get_csv_llong((X),(Y),370)
+#define get_csv_float_pos370(X,Y) get_csv_float((X),(Y),370)
+#define get_csv_uint_pos371(X,Y) get_csv_uint((X),(Y),371)
+#define get_csv_ullong_pos371(X,Y) get_csv_ullong((X),(Y),371)
+#define get_csv_ip_pos371(X,Y) get_csv_ip((X),(Y),371)
+#define get_csv_ipv6_pos371(X,Y) get_csv_ipv6((X),(Y),371)
+#define get_csv_string_pos371(X,Y) get_csv_string((X),(Y),371)
+#define get_csv_v_str_pos371(X,Y) get_csv_string((X),(Y),371)
+#define get_csv_bool_pos371(X,Y) get_csv_bool((X),(Y),371)
+#define get_csv_int_pos371(X,Y) get_csv_int((X),(Y),371)
+#define get_csv_llong_pos371(X,Y) get_csv_llong((X),(Y),371)
+#define get_csv_float_pos371(X,Y) get_csv_float((X),(Y),371)
+#define get_csv_uint_pos372(X,Y) get_csv_uint((X),(Y),372)
+#define get_csv_ullong_pos372(X,Y) get_csv_ullong((X),(Y),372)
+#define get_csv_ip_pos372(X,Y) get_csv_ip((X),(Y),372)
+#define get_csv_ipv6_pos372(X,Y) get_csv_ipv6((X),(Y),372)
+#define get_csv_string_pos372(X,Y) get_csv_string((X),(Y),372)
+#define get_csv_v_str_pos372(X,Y) get_csv_string((X),(Y),372)
+#define get_csv_bool_pos372(X,Y) get_csv_bool((X),(Y),372)
+#define get_csv_int_pos372(X,Y) get_csv_int((X),(Y),372)
+#define get_csv_llong_pos372(X,Y) get_csv_llong((X),(Y),372)
+#define get_csv_float_pos372(X,Y) get_csv_float((X),(Y),372)
+#define get_csv_uint_pos373(X,Y) get_csv_uint((X),(Y),373)
+#define get_csv_ullong_pos373(X,Y) get_csv_ullong((X),(Y),373)
+#define get_csv_ip_pos373(X,Y) get_csv_ip((X),(Y),373)
+#define get_csv_ipv6_pos373(X,Y) get_csv_ipv6((X),(Y),373)
+#define get_csv_string_pos373(X,Y) get_csv_string((X),(Y),373)
+#define get_csv_v_str_pos373(X,Y) get_csv_string((X),(Y),373)
+#define get_csv_bool_pos373(X,Y) get_csv_bool((X),(Y),373)
+#define get_csv_int_pos373(X,Y) get_csv_int((X),(Y),373)
+#define get_csv_llong_pos373(X,Y) get_csv_llong((X),(Y),373)
+#define get_csv_float_pos373(X,Y) get_csv_float((X),(Y),373)
+#define get_csv_uint_pos374(X,Y) get_csv_uint((X),(Y),374)
+#define get_csv_ullong_pos374(X,Y) get_csv_ullong((X),(Y),374)
+#define get_csv_ip_pos374(X,Y) get_csv_ip((X),(Y),374)
+#define get_csv_ipv6_pos374(X,Y) get_csv_ipv6((X),(Y),374)
+#define get_csv_string_pos374(X,Y) get_csv_string((X),(Y),374)
+#define get_csv_v_str_pos374(X,Y) get_csv_string((X),(Y),374)
+#define get_csv_bool_pos374(X,Y) get_csv_bool((X),(Y),374)
+#define get_csv_int_pos374(X,Y) get_csv_int((X),(Y),374)
+#define get_csv_llong_pos374(X,Y) get_csv_llong((X),(Y),374)
+#define get_csv_float_pos374(X,Y) get_csv_float((X),(Y),374)
+#define get_csv_uint_pos375(X,Y) get_csv_uint((X),(Y),375)
+#define get_csv_ullong_pos375(X,Y) get_csv_ullong((X),(Y),375)
+#define get_csv_ip_pos375(X,Y) get_csv_ip((X),(Y),375)
+#define get_csv_ipv6_pos375(X,Y) get_csv_ipv6((X),(Y),375)
+#define get_csv_string_pos375(X,Y) get_csv_string((X),(Y),375)
+#define get_csv_v_str_pos375(X,Y) get_csv_string((X),(Y),375)
+#define get_csv_bool_pos375(X,Y) get_csv_bool((X),(Y),375)
+#define get_csv_int_pos375(X,Y) get_csv_int((X),(Y),375)
+#define get_csv_llong_pos375(X,Y) get_csv_llong((X),(Y),375)
+#define get_csv_float_pos375(X,Y) get_csv_float((X),(Y),375)
+#define get_csv_uint_pos376(X,Y) get_csv_uint((X),(Y),376)
+#define get_csv_ullong_pos376(X,Y) get_csv_ullong((X),(Y),376)
+#define get_csv_ip_pos376(X,Y) get_csv_ip((X),(Y),376)
+#define get_csv_ipv6_pos376(X,Y) get_csv_ipv6((X),(Y),376)
+#define get_csv_string_pos376(X,Y) get_csv_string((X),(Y),376)
+#define get_csv_v_str_pos376(X,Y) get_csv_string((X),(Y),376)
+#define get_csv_bool_pos376(X,Y) get_csv_bool((X),(Y),376)
+#define get_csv_int_pos376(X,Y) get_csv_int((X),(Y),376)
+#define get_csv_llong_pos376(X,Y) get_csv_llong((X),(Y),376)
+#define get_csv_float_pos376(X,Y) get_csv_float((X),(Y),376)
+#define get_csv_uint_pos377(X,Y) get_csv_uint((X),(Y),377)
+#define get_csv_ullong_pos377(X,Y) get_csv_ullong((X),(Y),377)
+#define get_csv_ip_pos377(X,Y) get_csv_ip((X),(Y),377)
+#define get_csv_ipv6_pos377(X,Y) get_csv_ipv6((X),(Y),377)
+#define get_csv_string_pos377(X,Y) get_csv_string((X),(Y),377)
+#define get_csv_v_str_pos377(X,Y) get_csv_string((X),(Y),377)
+#define get_csv_bool_pos377(X,Y) get_csv_bool((X),(Y),377)
+#define get_csv_int_pos377(X,Y) get_csv_int((X),(Y),377)
+#define get_csv_llong_pos377(X,Y) get_csv_llong((X),(Y),377)
+#define get_csv_float_pos377(X,Y) get_csv_float((X),(Y),377)
+#define get_csv_uint_pos378(X,Y) get_csv_uint((X),(Y),378)
+#define get_csv_ullong_pos378(X,Y) get_csv_ullong((X),(Y),378)
+#define get_csv_ip_pos378(X,Y) get_csv_ip((X),(Y),378)
+#define get_csv_ipv6_pos378(X,Y) get_csv_ipv6((X),(Y),378)
+#define get_csv_string_pos378(X,Y) get_csv_string((X),(Y),378)
+#define get_csv_v_str_pos378(X,Y) get_csv_string((X),(Y),378)
+#define get_csv_bool_pos378(X,Y) get_csv_bool((X),(Y),378)
+#define get_csv_int_pos378(X,Y) get_csv_int((X),(Y),378)
+#define get_csv_llong_pos378(X,Y) get_csv_llong((X),(Y),378)
+#define get_csv_float_pos378(X,Y) get_csv_float((X),(Y),378)
+#define get_csv_uint_pos379(X,Y) get_csv_uint((X),(Y),379)
+#define get_csv_ullong_pos379(X,Y) get_csv_ullong((X),(Y),379)
+#define get_csv_ip_pos379(X,Y) get_csv_ip((X),(Y),379)
+#define get_csv_ipv6_pos379(X,Y) get_csv_ipv6((X),(Y),379)
+#define get_csv_string_pos379(X,Y) get_csv_string((X),(Y),379)
+#define get_csv_v_str_pos379(X,Y) get_csv_string((X),(Y),379)
+#define get_csv_bool_pos379(X,Y) get_csv_bool((X),(Y),379)
+#define get_csv_int_pos379(X,Y) get_csv_int((X),(Y),379)
+#define get_csv_llong_pos379(X,Y) get_csv_llong((X),(Y),379)
+#define get_csv_float_pos379(X,Y) get_csv_float((X),(Y),379)
+#define get_csv_uint_pos380(X,Y) get_csv_uint((X),(Y),380)
+#define get_csv_ullong_pos380(X,Y) get_csv_ullong((X),(Y),380)
+#define get_csv_ip_pos380(X,Y) get_csv_ip((X),(Y),380)
+#define get_csv_ipv6_pos380(X,Y) get_csv_ipv6((X),(Y),380)
+#define get_csv_string_pos380(X,Y) get_csv_string((X),(Y),380)
+#define get_csv_v_str_pos380(X,Y) get_csv_string((X),(Y),380)
+#define get_csv_bool_pos380(X,Y) get_csv_bool((X),(Y),380)
+#define get_csv_int_pos380(X,Y) get_csv_int((X),(Y),380)
+#define get_csv_llong_pos380(X,Y) get_csv_llong((X),(Y),380)
+#define get_csv_float_pos380(X,Y) get_csv_float((X),(Y),380)
+#define get_csv_uint_pos381(X,Y) get_csv_uint((X),(Y),381)
+#define get_csv_ullong_pos381(X,Y) get_csv_ullong((X),(Y),381)
+#define get_csv_ip_pos381(X,Y) get_csv_ip((X),(Y),381)
+#define get_csv_ipv6_pos381(X,Y) get_csv_ipv6((X),(Y),381)
+#define get_csv_string_pos381(X,Y) get_csv_string((X),(Y),381)
+#define get_csv_v_str_pos381(X,Y) get_csv_string((X),(Y),381)
+#define get_csv_bool_pos381(X,Y) get_csv_bool((X),(Y),381)
+#define get_csv_int_pos381(X,Y) get_csv_int((X),(Y),381)
+#define get_csv_llong_pos381(X,Y) get_csv_llong((X),(Y),381)
+#define get_csv_float_pos381(X,Y) get_csv_float((X),(Y),381)
+#define get_csv_uint_pos382(X,Y) get_csv_uint((X),(Y),382)
+#define get_csv_ullong_pos382(X,Y) get_csv_ullong((X),(Y),382)
+#define get_csv_ip_pos382(X,Y) get_csv_ip((X),(Y),382)
+#define get_csv_ipv6_pos382(X,Y) get_csv_ipv6((X),(Y),382)
+#define get_csv_string_pos382(X,Y) get_csv_string((X),(Y),382)
+#define get_csv_v_str_pos382(X,Y) get_csv_string((X),(Y),382)
+#define get_csv_bool_pos382(X,Y) get_csv_bool((X),(Y),382)
+#define get_csv_int_pos382(X,Y) get_csv_int((X),(Y),382)
+#define get_csv_llong_pos382(X,Y) get_csv_llong((X),(Y),382)
+#define get_csv_float_pos382(X,Y) get_csv_float((X),(Y),382)
+#define get_csv_uint_pos383(X,Y) get_csv_uint((X),(Y),383)
+#define get_csv_ullong_pos383(X,Y) get_csv_ullong((X),(Y),383)
+#define get_csv_ip_pos383(X,Y) get_csv_ip((X),(Y),383)
+#define get_csv_ipv6_pos383(X,Y) get_csv_ipv6((X),(Y),383)
+#define get_csv_string_pos383(X,Y) get_csv_string((X),(Y),383)
+#define get_csv_v_str_pos383(X,Y) get_csv_string((X),(Y),383)
+#define get_csv_bool_pos383(X,Y) get_csv_bool((X),(Y),383)
+#define get_csv_int_pos383(X,Y) get_csv_int((X),(Y),383)
+#define get_csv_llong_pos383(X,Y) get_csv_llong((X),(Y),383)
+#define get_csv_float_pos383(X,Y) get_csv_float((X),(Y),383)
+#define get_csv_uint_pos384(X,Y) get_csv_uint((X),(Y),384)
+#define get_csv_ullong_pos384(X,Y) get_csv_ullong((X),(Y),384)
+#define get_csv_ip_pos384(X,Y) get_csv_ip((X),(Y),384)
+#define get_csv_ipv6_pos384(X,Y) get_csv_ipv6((X),(Y),384)
+#define get_csv_string_pos384(X,Y) get_csv_string((X),(Y),384)
+#define get_csv_v_str_pos384(X,Y) get_csv_string((X),(Y),384)
+#define get_csv_bool_pos384(X,Y) get_csv_bool((X),(Y),384)
+#define get_csv_int_pos384(X,Y) get_csv_int((X),(Y),384)
+#define get_csv_llong_pos384(X,Y) get_csv_llong((X),(Y),384)
+#define get_csv_float_pos384(X,Y) get_csv_float((X),(Y),384)
+#define get_csv_uint_pos385(X,Y) get_csv_uint((X),(Y),385)
+#define get_csv_ullong_pos385(X,Y) get_csv_ullong((X),(Y),385)
+#define get_csv_ip_pos385(X,Y) get_csv_ip((X),(Y),385)
+#define get_csv_ipv6_pos385(X,Y) get_csv_ipv6((X),(Y),385)
+#define get_csv_string_pos385(X,Y) get_csv_string((X),(Y),385)
+#define get_csv_v_str_pos385(X,Y) get_csv_string((X),(Y),385)
+#define get_csv_bool_pos385(X,Y) get_csv_bool((X),(Y),385)
+#define get_csv_int_pos385(X,Y) get_csv_int((X),(Y),385)
+#define get_csv_llong_pos385(X,Y) get_csv_llong((X),(Y),385)
+#define get_csv_float_pos385(X,Y) get_csv_float((X),(Y),385)
+#define get_csv_uint_pos386(X,Y) get_csv_uint((X),(Y),386)
+#define get_csv_ullong_pos386(X,Y) get_csv_ullong((X),(Y),386)
+#define get_csv_ip_pos386(X,Y) get_csv_ip((X),(Y),386)
+#define get_csv_ipv6_pos386(X,Y) get_csv_ipv6((X),(Y),386)
+#define get_csv_string_pos386(X,Y) get_csv_string((X),(Y),386)
+#define get_csv_v_str_pos386(X,Y) get_csv_string((X),(Y),386)
+#define get_csv_bool_pos386(X,Y) get_csv_bool((X),(Y),386)
+#define get_csv_int_pos386(X,Y) get_csv_int((X),(Y),386)
+#define get_csv_llong_pos386(X,Y) get_csv_llong((X),(Y),386)
+#define get_csv_float_pos386(X,Y) get_csv_float((X),(Y),386)
+#define get_csv_uint_pos387(X,Y) get_csv_uint((X),(Y),387)
+#define get_csv_ullong_pos387(X,Y) get_csv_ullong((X),(Y),387)
+#define get_csv_ip_pos387(X,Y) get_csv_ip((X),(Y),387)
+#define get_csv_ipv6_pos387(X,Y) get_csv_ipv6((X),(Y),387)
+#define get_csv_string_pos387(X,Y) get_csv_string((X),(Y),387)
+#define get_csv_v_str_pos387(X,Y) get_csv_string((X),(Y),387)
+#define get_csv_bool_pos387(X,Y) get_csv_bool((X),(Y),387)
+#define get_csv_int_pos387(X,Y) get_csv_int((X),(Y),387)
+#define get_csv_llong_pos387(X,Y) get_csv_llong((X),(Y),387)
+#define get_csv_float_pos387(X,Y) get_csv_float((X),(Y),387)
+#define get_csv_uint_pos388(X,Y) get_csv_uint((X),(Y),388)
+#define get_csv_ullong_pos388(X,Y) get_csv_ullong((X),(Y),388)
+#define get_csv_ip_pos388(X,Y) get_csv_ip((X),(Y),388)
+#define get_csv_ipv6_pos388(X,Y) get_csv_ipv6((X),(Y),388)
+#define get_csv_string_pos388(X,Y) get_csv_string((X),(Y),388)
+#define get_csv_v_str_pos388(X,Y) get_csv_string((X),(Y),388)
+#define get_csv_bool_pos388(X,Y) get_csv_bool((X),(Y),388)
+#define get_csv_int_pos388(X,Y) get_csv_int((X),(Y),388)
+#define get_csv_llong_pos388(X,Y) get_csv_llong((X),(Y),388)
+#define get_csv_float_pos388(X,Y) get_csv_float((X),(Y),388)
+#define get_csv_uint_pos389(X,Y) get_csv_uint((X),(Y),389)
+#define get_csv_ullong_pos389(X,Y) get_csv_ullong((X),(Y),389)
+#define get_csv_ip_pos389(X,Y) get_csv_ip((X),(Y),389)
+#define get_csv_ipv6_pos389(X,Y) get_csv_ipv6((X),(Y),389)
+#define get_csv_string_pos389(X,Y) get_csv_string((X),(Y),389)
+#define get_csv_v_str_pos389(X,Y) get_csv_string((X),(Y),389)
+#define get_csv_bool_pos389(X,Y) get_csv_bool((X),(Y),389)
+#define get_csv_int_pos389(X,Y) get_csv_int((X),(Y),389)
+#define get_csv_llong_pos389(X,Y) get_csv_llong((X),(Y),389)
+#define get_csv_float_pos389(X,Y) get_csv_float((X),(Y),389)
+#define get_csv_uint_pos390(X,Y) get_csv_uint((X),(Y),390)
+#define get_csv_ullong_pos390(X,Y) get_csv_ullong((X),(Y),390)
+#define get_csv_ip_pos390(X,Y) get_csv_ip((X),(Y),390)
+#define get_csv_ipv6_pos390(X,Y) get_csv_ipv6((X),(Y),390)
+#define get_csv_string_pos390(X,Y) get_csv_string((X),(Y),390)
+#define get_csv_v_str_pos390(X,Y) get_csv_string((X),(Y),390)
+#define get_csv_bool_pos390(X,Y) get_csv_bool((X),(Y),390)
+#define get_csv_int_pos390(X,Y) get_csv_int((X),(Y),390)
+#define get_csv_llong_pos390(X,Y) get_csv_llong((X),(Y),390)
+#define get_csv_float_pos390(X,Y) get_csv_float((X),(Y),390)
+#define get_csv_uint_pos391(X,Y) get_csv_uint((X),(Y),391)
+#define get_csv_ullong_pos391(X,Y) get_csv_ullong((X),(Y),391)
+#define get_csv_ip_pos391(X,Y) get_csv_ip((X),(Y),391)
+#define get_csv_ipv6_pos391(X,Y) get_csv_ipv6((X),(Y),391)
+#define get_csv_string_pos391(X,Y) get_csv_string((X),(Y),391)
+#define get_csv_v_str_pos391(X,Y) get_csv_string((X),(Y),391)
+#define get_csv_bool_pos391(X,Y) get_csv_bool((X),(Y),391)
+#define get_csv_int_pos391(X,Y) get_csv_int((X),(Y),391)
+#define get_csv_llong_pos391(X,Y) get_csv_llong((X),(Y),391)
+#define get_csv_float_pos391(X,Y) get_csv_float((X),(Y),391)
+#define get_csv_uint_pos392(X,Y) get_csv_uint((X),(Y),392)
+#define get_csv_ullong_pos392(X,Y) get_csv_ullong((X),(Y),392)
+#define get_csv_ip_pos392(X,Y) get_csv_ip((X),(Y),392)
+#define get_csv_ipv6_pos392(X,Y) get_csv_ipv6((X),(Y),392)
+#define get_csv_string_pos392(X,Y) get_csv_string((X),(Y),392)
+#define get_csv_v_str_pos392(X,Y) get_csv_string((X),(Y),392)
+#define get_csv_bool_pos392(X,Y) get_csv_bool((X),(Y),392)
+#define get_csv_int_pos392(X,Y) get_csv_int((X),(Y),392)
+#define get_csv_llong_pos392(X,Y) get_csv_llong((X),(Y),392)
+#define get_csv_float_pos392(X,Y) get_csv_float((X),(Y),392)
+#define get_csv_uint_pos393(X,Y) get_csv_uint((X),(Y),393)
+#define get_csv_ullong_pos393(X,Y) get_csv_ullong((X),(Y),393)
+#define get_csv_ip_pos393(X,Y) get_csv_ip((X),(Y),393)
+#define get_csv_ipv6_pos393(X,Y) get_csv_ipv6((X),(Y),393)
+#define get_csv_string_pos393(X,Y) get_csv_string((X),(Y),393)
+#define get_csv_v_str_pos393(X,Y) get_csv_string((X),(Y),393)
+#define get_csv_bool_pos393(X,Y) get_csv_bool((X),(Y),393)
+#define get_csv_int_pos393(X,Y) get_csv_int((X),(Y),393)
+#define get_csv_llong_pos393(X,Y) get_csv_llong((X),(Y),393)
+#define get_csv_float_pos393(X,Y) get_csv_float((X),(Y),393)
+#define get_csv_uint_pos394(X,Y) get_csv_uint((X),(Y),394)
+#define get_csv_ullong_pos394(X,Y) get_csv_ullong((X),(Y),394)
+#define get_csv_ip_pos394(X,Y) get_csv_ip((X),(Y),394)
+#define get_csv_ipv6_pos394(X,Y) get_csv_ipv6((X),(Y),394)
+#define get_csv_string_pos394(X,Y) get_csv_string((X),(Y),394)
+#define get_csv_v_str_pos394(X,Y) get_csv_string((X),(Y),394)
+#define get_csv_bool_pos394(X,Y) get_csv_bool((X),(Y),394)
+#define get_csv_int_pos394(X,Y) get_csv_int((X),(Y),394)
+#define get_csv_llong_pos394(X,Y) get_csv_llong((X),(Y),394)
+#define get_csv_float_pos394(X,Y) get_csv_float((X),(Y),394)
+#define get_csv_uint_pos395(X,Y) get_csv_uint((X),(Y),395)
+#define get_csv_ullong_pos395(X,Y) get_csv_ullong((X),(Y),395)
+#define get_csv_ip_pos395(X,Y) get_csv_ip((X),(Y),395)
+#define get_csv_ipv6_pos395(X,Y) get_csv_ipv6((X),(Y),395)
+#define get_csv_string_pos395(X,Y) get_csv_string((X),(Y),395)
+#define get_csv_v_str_pos395(X,Y) get_csv_string((X),(Y),395)
+#define get_csv_bool_pos395(X,Y) get_csv_bool((X),(Y),395)
+#define get_csv_int_pos395(X,Y) get_csv_int((X),(Y),395)
+#define get_csv_llong_pos395(X,Y) get_csv_llong((X),(Y),395)
+#define get_csv_float_pos395(X,Y) get_csv_float((X),(Y),395)
+#define get_csv_uint_pos396(X,Y) get_csv_uint((X),(Y),396)
+#define get_csv_ullong_pos396(X,Y) get_csv_ullong((X),(Y),396)
+#define get_csv_ip_pos396(X,Y) get_csv_ip((X),(Y),396)
+#define get_csv_ipv6_pos396(X,Y) get_csv_ipv6((X),(Y),396)
+#define get_csv_string_pos396(X,Y) get_csv_string((X),(Y),396)
+#define get_csv_v_str_pos396(X,Y) get_csv_string((X),(Y),396)
+#define get_csv_bool_pos396(X,Y) get_csv_bool((X),(Y),396)
+#define get_csv_int_pos396(X,Y) get_csv_int((X),(Y),396)
+#define get_csv_llong_pos396(X,Y) get_csv_llong((X),(Y),396)
+#define get_csv_float_pos396(X,Y) get_csv_float((X),(Y),396)
+#define get_csv_uint_pos397(X,Y) get_csv_uint((X),(Y),397)
+#define get_csv_ullong_pos397(X,Y) get_csv_ullong((X),(Y),397)
+#define get_csv_ip_pos397(X,Y) get_csv_ip((X),(Y),397)
+#define get_csv_ipv6_pos397(X,Y) get_csv_ipv6((X),(Y),397)
+#define get_csv_string_pos397(X,Y) get_csv_string((X),(Y),397)
+#define get_csv_v_str_pos397(X,Y) get_csv_string((X),(Y),397)
+#define get_csv_bool_pos397(X,Y) get_csv_bool((X),(Y),397)
+#define get_csv_int_pos397(X,Y) get_csv_int((X),(Y),397)
+#define get_csv_llong_pos397(X,Y) get_csv_llong((X),(Y),397)
+#define get_csv_float_pos397(X,Y) get_csv_float((X),(Y),397)
+#define get_csv_uint_pos398(X,Y) get_csv_uint((X),(Y),398)
+#define get_csv_ullong_pos398(X,Y) get_csv_ullong((X),(Y),398)
+#define get_csv_ip_pos398(X,Y) get_csv_ip((X),(Y),398)
+#define get_csv_ipv6_pos398(X,Y) get_csv_ipv6((X),(Y),398)
+#define get_csv_string_pos398(X,Y) get_csv_string((X),(Y),398)
+#define get_csv_v_str_pos398(X,Y) get_csv_string((X),(Y),398)
+#define get_csv_bool_pos398(X,Y) get_csv_bool((X),(Y),398)
+#define get_csv_int_pos398(X,Y) get_csv_int((X),(Y),398)
+#define get_csv_llong_pos398(X,Y) get_csv_llong((X),(Y),398)
+#define get_csv_float_pos398(X,Y) get_csv_float((X),(Y),398)
+#define get_csv_uint_pos399(X,Y) get_csv_uint((X),(Y),399)
+#define get_csv_ullong_pos399(X,Y) get_csv_ullong((X),(Y),399)
+#define get_csv_ip_pos399(X,Y) get_csv_ip((X),(Y),399)
+#define get_csv_ipv6_pos399(X,Y) get_csv_ipv6((X),(Y),399)
+#define get_csv_string_pos399(X,Y) get_csv_string((X),(Y),399)
+#define get_csv_v_str_pos399(X,Y) get_csv_string((X),(Y),399)
+#define get_csv_bool_pos399(X,Y) get_csv_bool((X),(Y),399)
+#define get_csv_int_pos399(X,Y) get_csv_int((X),(Y),399)
+#define get_csv_llong_pos399(X,Y) get_csv_llong((X),(Y),399)
+#define get_csv_float_pos399(X,Y) get_csv_float((X),(Y),399)
+#define get_csv_uint_pos400(X,Y) get_csv_uint((X),(Y),400)
+#define get_csv_ullong_pos400(X,Y) get_csv_ullong((X),(Y),400)
+#define get_csv_ip_pos400(X,Y) get_csv_ip((X),(Y),400)
+#define get_csv_ipv6_pos400(X,Y) get_csv_ipv6((X),(Y),400)
+#define get_csv_string_pos400(X,Y) get_csv_string((X),(Y),400)
+#define get_csv_v_str_pos400(X,Y) get_csv_string((X),(Y),400)
+#define get_csv_bool_pos400(X,Y) get_csv_bool((X),(Y),400)
+#define get_csv_int_pos400(X,Y) get_csv_int((X),(Y),400)
+#define get_csv_llong_pos400(X,Y) get_csv_llong((X),(Y),400)
+#define get_csv_float_pos400(X,Y) get_csv_float((X),(Y),400)
+#define get_csv_uint_pos401(X,Y) get_csv_uint((X),(Y),401)
+#define get_csv_ullong_pos401(X,Y) get_csv_ullong((X),(Y),401)
+#define get_csv_ip_pos401(X,Y) get_csv_ip((X),(Y),401)
+#define get_csv_ipv6_pos401(X,Y) get_csv_ipv6((X),(Y),401)
+#define get_csv_string_pos401(X,Y) get_csv_string((X),(Y),401)
+#define get_csv_v_str_pos401(X,Y) get_csv_string((X),(Y),401)
+#define get_csv_bool_pos401(X,Y) get_csv_bool((X),(Y),401)
+#define get_csv_int_pos401(X,Y) get_csv_int((X),(Y),401)
+#define get_csv_llong_pos401(X,Y) get_csv_llong((X),(Y),401)
+#define get_csv_float_pos401(X,Y) get_csv_float((X),(Y),401)
+#define get_csv_uint_pos402(X,Y) get_csv_uint((X),(Y),402)
+#define get_csv_ullong_pos402(X,Y) get_csv_ullong((X),(Y),402)
+#define get_csv_ip_pos402(X,Y) get_csv_ip((X),(Y),402)
+#define get_csv_ipv6_pos402(X,Y) get_csv_ipv6((X),(Y),402)
+#define get_csv_string_pos402(X,Y) get_csv_string((X),(Y),402)
+#define get_csv_v_str_pos402(X,Y) get_csv_string((X),(Y),402)
+#define get_csv_bool_pos402(X,Y) get_csv_bool((X),(Y),402)
+#define get_csv_int_pos402(X,Y) get_csv_int((X),(Y),402)
+#define get_csv_llong_pos402(X,Y) get_csv_llong((X),(Y),402)
+#define get_csv_float_pos402(X,Y) get_csv_float((X),(Y),402)
+#define get_csv_uint_pos403(X,Y) get_csv_uint((X),(Y),403)
+#define get_csv_ullong_pos403(X,Y) get_csv_ullong((X),(Y),403)
+#define get_csv_ip_pos403(X,Y) get_csv_ip((X),(Y),403)
+#define get_csv_ipv6_pos403(X,Y) get_csv_ipv6((X),(Y),403)
+#define get_csv_string_pos403(X,Y) get_csv_string((X),(Y),403)
+#define get_csv_v_str_pos403(X,Y) get_csv_string((X),(Y),403)
+#define get_csv_bool_pos403(X,Y) get_csv_bool((X),(Y),403)
+#define get_csv_int_pos403(X,Y) get_csv_int((X),(Y),403)
+#define get_csv_llong_pos403(X,Y) get_csv_llong((X),(Y),403)
+#define get_csv_float_pos403(X,Y) get_csv_float((X),(Y),403)
+#define get_csv_uint_pos404(X,Y) get_csv_uint((X),(Y),404)
+#define get_csv_ullong_pos404(X,Y) get_csv_ullong((X),(Y),404)
+#define get_csv_ip_pos404(X,Y) get_csv_ip((X),(Y),404)
+#define get_csv_ipv6_pos404(X,Y) get_csv_ipv6((X),(Y),404)
+#define get_csv_string_pos404(X,Y) get_csv_string((X),(Y),404)
+#define get_csv_v_str_pos404(X,Y) get_csv_string((X),(Y),404)
+#define get_csv_bool_pos404(X,Y) get_csv_bool((X),(Y),404)
+#define get_csv_int_pos404(X,Y) get_csv_int((X),(Y),404)
+#define get_csv_llong_pos404(X,Y) get_csv_llong((X),(Y),404)
+#define get_csv_float_pos404(X,Y) get_csv_float((X),(Y),404)
+#define get_csv_uint_pos405(X,Y) get_csv_uint((X),(Y),405)
+#define get_csv_ullong_pos405(X,Y) get_csv_ullong((X),(Y),405)
+#define get_csv_ip_pos405(X,Y) get_csv_ip((X),(Y),405)
+#define get_csv_ipv6_pos405(X,Y) get_csv_ipv6((X),(Y),405)
+#define get_csv_string_pos405(X,Y) get_csv_string((X),(Y),405)
+#define get_csv_v_str_pos405(X,Y) get_csv_string((X),(Y),405)
+#define get_csv_bool_pos405(X,Y) get_csv_bool((X),(Y),405)
+#define get_csv_int_pos405(X,Y) get_csv_int((X),(Y),405)
+#define get_csv_llong_pos405(X,Y) get_csv_llong((X),(Y),405)
+#define get_csv_float_pos405(X,Y) get_csv_float((X),(Y),405)
+#define get_csv_uint_pos406(X,Y) get_csv_uint((X),(Y),406)
+#define get_csv_ullong_pos406(X,Y) get_csv_ullong((X),(Y),406)
+#define get_csv_ip_pos406(X,Y) get_csv_ip((X),(Y),406)
+#define get_csv_ipv6_pos406(X,Y) get_csv_ipv6((X),(Y),406)
+#define get_csv_string_pos406(X,Y) get_csv_string((X),(Y),406)
+#define get_csv_v_str_pos406(X,Y) get_csv_string((X),(Y),406)
+#define get_csv_bool_pos406(X,Y) get_csv_bool((X),(Y),406)
+#define get_csv_int_pos406(X,Y) get_csv_int((X),(Y),406)
+#define get_csv_llong_pos406(X,Y) get_csv_llong((X),(Y),406)
+#define get_csv_float_pos406(X,Y) get_csv_float((X),(Y),406)
+#define get_csv_uint_pos407(X,Y) get_csv_uint((X),(Y),407)
+#define get_csv_ullong_pos407(X,Y) get_csv_ullong((X),(Y),407)
+#define get_csv_ip_pos407(X,Y) get_csv_ip((X),(Y),407)
+#define get_csv_ipv6_pos407(X,Y) get_csv_ipv6((X),(Y),407)
+#define get_csv_string_pos407(X,Y) get_csv_string((X),(Y),407)
+#define get_csv_v_str_pos407(X,Y) get_csv_string((X),(Y),407)
+#define get_csv_bool_pos407(X,Y) get_csv_bool((X),(Y),407)
+#define get_csv_int_pos407(X,Y) get_csv_int((X),(Y),407)
+#define get_csv_llong_pos407(X,Y) get_csv_llong((X),(Y),407)
+#define get_csv_float_pos407(X,Y) get_csv_float((X),(Y),407)
+#define get_csv_uint_pos408(X,Y) get_csv_uint((X),(Y),408)
+#define get_csv_ullong_pos408(X,Y) get_csv_ullong((X),(Y),408)
+#define get_csv_ip_pos408(X,Y) get_csv_ip((X),(Y),408)
+#define get_csv_ipv6_pos408(X,Y) get_csv_ipv6((X),(Y),408)
+#define get_csv_string_pos408(X,Y) get_csv_string((X),(Y),408)
+#define get_csv_v_str_pos408(X,Y) get_csv_string((X),(Y),408)
+#define get_csv_bool_pos408(X,Y) get_csv_bool((X),(Y),408)
+#define get_csv_int_pos408(X,Y) get_csv_int((X),(Y),408)
+#define get_csv_llong_pos408(X,Y) get_csv_llong((X),(Y),408)
+#define get_csv_float_pos408(X,Y) get_csv_float((X),(Y),408)
+#define get_csv_uint_pos409(X,Y) get_csv_uint((X),(Y),409)
+#define get_csv_ullong_pos409(X,Y) get_csv_ullong((X),(Y),409)
+#define get_csv_ip_pos409(X,Y) get_csv_ip((X),(Y),409)
+#define get_csv_ipv6_pos409(X,Y) get_csv_ipv6((X),(Y),409)
+#define get_csv_string_pos409(X,Y) get_csv_string((X),(Y),409)
+#define get_csv_v_str_pos409(X,Y) get_csv_string((X),(Y),409)
+#define get_csv_bool_pos409(X,Y) get_csv_bool((X),(Y),409)
+#define get_csv_int_pos409(X,Y) get_csv_int((X),(Y),409)
+#define get_csv_llong_pos409(X,Y) get_csv_llong((X),(Y),409)
+#define get_csv_float_pos409(X,Y) get_csv_float((X),(Y),409)
+#define get_csv_uint_pos410(X,Y) get_csv_uint((X),(Y),410)
+#define get_csv_ullong_pos410(X,Y) get_csv_ullong((X),(Y),410)
+#define get_csv_ip_pos410(X,Y) get_csv_ip((X),(Y),410)
+#define get_csv_ipv6_pos410(X,Y) get_csv_ipv6((X),(Y),410)
+#define get_csv_string_pos410(X,Y) get_csv_string((X),(Y),410)
+#define get_csv_v_str_pos410(X,Y) get_csv_string((X),(Y),410)
+#define get_csv_bool_pos410(X,Y) get_csv_bool((X),(Y),410)
+#define get_csv_int_pos410(X,Y) get_csv_int((X),(Y),410)
+#define get_csv_llong_pos410(X,Y) get_csv_llong((X),(Y),410)
+#define get_csv_float_pos410(X,Y) get_csv_float((X),(Y),410)
+#define get_csv_uint_pos411(X,Y) get_csv_uint((X),(Y),411)
+#define get_csv_ullong_pos411(X,Y) get_csv_ullong((X),(Y),411)
+#define get_csv_ip_pos411(X,Y) get_csv_ip((X),(Y),411)
+#define get_csv_ipv6_pos411(X,Y) get_csv_ipv6((X),(Y),411)
+#define get_csv_string_pos411(X,Y) get_csv_string((X),(Y),411)
+#define get_csv_v_str_pos411(X,Y) get_csv_string((X),(Y),411)
+#define get_csv_bool_pos411(X,Y) get_csv_bool((X),(Y),411)
+#define get_csv_int_pos411(X,Y) get_csv_int((X),(Y),411)
+#define get_csv_llong_pos411(X,Y) get_csv_llong((X),(Y),411)
+#define get_csv_float_pos411(X,Y) get_csv_float((X),(Y),411)
+#define get_csv_uint_pos412(X,Y) get_csv_uint((X),(Y),412)
+#define get_csv_ullong_pos412(X,Y) get_csv_ullong((X),(Y),412)
+#define get_csv_ip_pos412(X,Y) get_csv_ip((X),(Y),412)
+#define get_csv_ipv6_pos412(X,Y) get_csv_ipv6((X),(Y),412)
+#define get_csv_string_pos412(X,Y) get_csv_string((X),(Y),412)
+#define get_csv_v_str_pos412(X,Y) get_csv_string((X),(Y),412)
+#define get_csv_bool_pos412(X,Y) get_csv_bool((X),(Y),412)
+#define get_csv_int_pos412(X,Y) get_csv_int((X),(Y),412)
+#define get_csv_llong_pos412(X,Y) get_csv_llong((X),(Y),412)
+#define get_csv_float_pos412(X,Y) get_csv_float((X),(Y),412)
+#define get_csv_uint_pos413(X,Y) get_csv_uint((X),(Y),413)
+#define get_csv_ullong_pos413(X,Y) get_csv_ullong((X),(Y),413)
+#define get_csv_ip_pos413(X,Y) get_csv_ip((X),(Y),413)
+#define get_csv_ipv6_pos413(X,Y) get_csv_ipv6((X),(Y),413)
+#define get_csv_string_pos413(X,Y) get_csv_string((X),(Y),413)
+#define get_csv_v_str_pos413(X,Y) get_csv_string((X),(Y),413)
+#define get_csv_bool_pos413(X,Y) get_csv_bool((X),(Y),413)
+#define get_csv_int_pos413(X,Y) get_csv_int((X),(Y),413)
+#define get_csv_llong_pos413(X,Y) get_csv_llong((X),(Y),413)
+#define get_csv_float_pos413(X,Y) get_csv_float((X),(Y),413)
+#define get_csv_uint_pos414(X,Y) get_csv_uint((X),(Y),414)
+#define get_csv_ullong_pos414(X,Y) get_csv_ullong((X),(Y),414)
+#define get_csv_ip_pos414(X,Y) get_csv_ip((X),(Y),414)
+#define get_csv_ipv6_pos414(X,Y) get_csv_ipv6((X),(Y),414)
+#define get_csv_string_pos414(X,Y) get_csv_string((X),(Y),414)
+#define get_csv_v_str_pos414(X,Y) get_csv_string((X),(Y),414)
+#define get_csv_bool_pos414(X,Y) get_csv_bool((X),(Y),414)
+#define get_csv_int_pos414(X,Y) get_csv_int((X),(Y),414)
+#define get_csv_llong_pos414(X,Y) get_csv_llong((X),(Y),414)
+#define get_csv_float_pos414(X,Y) get_csv_float((X),(Y),414)
+#define get_csv_uint_pos415(X,Y) get_csv_uint((X),(Y),415)
+#define get_csv_ullong_pos415(X,Y) get_csv_ullong((X),(Y),415)
+#define get_csv_ip_pos415(X,Y) get_csv_ip((X),(Y),415)
+#define get_csv_ipv6_pos415(X,Y) get_csv_ipv6((X),(Y),415)
+#define get_csv_string_pos415(X,Y) get_csv_string((X),(Y),415)
+#define get_csv_v_str_pos415(X,Y) get_csv_string((X),(Y),415)
+#define get_csv_bool_pos415(X,Y) get_csv_bool((X),(Y),415)
+#define get_csv_int_pos415(X,Y) get_csv_int((X),(Y),415)
+#define get_csv_llong_pos415(X,Y) get_csv_llong((X),(Y),415)
+#define get_csv_float_pos415(X,Y) get_csv_float((X),(Y),415)
+#define get_csv_uint_pos416(X,Y) get_csv_uint((X),(Y),416)
+#define get_csv_ullong_pos416(X,Y) get_csv_ullong((X),(Y),416)
+#define get_csv_ip_pos416(X,Y) get_csv_ip((X),(Y),416)
+#define get_csv_ipv6_pos416(X,Y) get_csv_ipv6((X),(Y),416)
+#define get_csv_string_pos416(X,Y) get_csv_string((X),(Y),416)
+#define get_csv_v_str_pos416(X,Y) get_csv_string((X),(Y),416)
+#define get_csv_bool_pos416(X,Y) get_csv_bool((X),(Y),416)
+#define get_csv_int_pos416(X,Y) get_csv_int((X),(Y),416)
+#define get_csv_llong_pos416(X,Y) get_csv_llong((X),(Y),416)
+#define get_csv_float_pos416(X,Y) get_csv_float((X),(Y),416)
+#define get_csv_uint_pos417(X,Y) get_csv_uint((X),(Y),417)
+#define get_csv_ullong_pos417(X,Y) get_csv_ullong((X),(Y),417)
+#define get_csv_ip_pos417(X,Y) get_csv_ip((X),(Y),417)
+#define get_csv_ipv6_pos417(X,Y) get_csv_ipv6((X),(Y),417)
+#define get_csv_string_pos417(X,Y) get_csv_string((X),(Y),417)
+#define get_csv_v_str_pos417(X,Y) get_csv_string((X),(Y),417)
+#define get_csv_bool_pos417(X,Y) get_csv_bool((X),(Y),417)
+#define get_csv_int_pos417(X,Y) get_csv_int((X),(Y),417)
+#define get_csv_llong_pos417(X,Y) get_csv_llong((X),(Y),417)
+#define get_csv_float_pos417(X,Y) get_csv_float((X),(Y),417)
+#define get_csv_uint_pos418(X,Y) get_csv_uint((X),(Y),418)
+#define get_csv_ullong_pos418(X,Y) get_csv_ullong((X),(Y),418)
+#define get_csv_ip_pos418(X,Y) get_csv_ip((X),(Y),418)
+#define get_csv_ipv6_pos418(X,Y) get_csv_ipv6((X),(Y),418)
+#define get_csv_string_pos418(X,Y) get_csv_string((X),(Y),418)
+#define get_csv_v_str_pos418(X,Y) get_csv_string((X),(Y),418)
+#define get_csv_bool_pos418(X,Y) get_csv_bool((X),(Y),418)
+#define get_csv_int_pos418(X,Y) get_csv_int((X),(Y),418)
+#define get_csv_llong_pos418(X,Y) get_csv_llong((X),(Y),418)
+#define get_csv_float_pos418(X,Y) get_csv_float((X),(Y),418)
+#define get_csv_uint_pos419(X,Y) get_csv_uint((X),(Y),419)
+#define get_csv_ullong_pos419(X,Y) get_csv_ullong((X),(Y),419)
+#define get_csv_ip_pos419(X,Y) get_csv_ip((X),(Y),419)
+#define get_csv_ipv6_pos419(X,Y) get_csv_ipv6((X),(Y),419)
+#define get_csv_string_pos419(X,Y) get_csv_string((X),(Y),419)
+#define get_csv_v_str_pos419(X,Y) get_csv_string((X),(Y),419)
+#define get_csv_bool_pos419(X,Y) get_csv_bool((X),(Y),419)
+#define get_csv_int_pos419(X,Y) get_csv_int((X),(Y),419)
+#define get_csv_llong_pos419(X,Y) get_csv_llong((X),(Y),419)
+#define get_csv_float_pos419(X,Y) get_csv_float((X),(Y),419)
+#define get_csv_uint_pos420(X,Y) get_csv_uint((X),(Y),420)
+#define get_csv_ullong_pos420(X,Y) get_csv_ullong((X),(Y),420)
+#define get_csv_ip_pos420(X,Y) get_csv_ip((X),(Y),420)
+#define get_csv_ipv6_pos420(X,Y) get_csv_ipv6((X),(Y),420)
+#define get_csv_string_pos420(X,Y) get_csv_string((X),(Y),420)
+#define get_csv_v_str_pos420(X,Y) get_csv_string((X),(Y),420)
+#define get_csv_bool_pos420(X,Y) get_csv_bool((X),(Y),420)
+#define get_csv_int_pos420(X,Y) get_csv_int((X),(Y),420)
+#define get_csv_llong_pos420(X,Y) get_csv_llong((X),(Y),420)
+#define get_csv_float_pos420(X,Y) get_csv_float((X),(Y),420)
+#define get_csv_uint_pos421(X,Y) get_csv_uint((X),(Y),421)
+#define get_csv_ullong_pos421(X,Y) get_csv_ullong((X),(Y),421)
+#define get_csv_ip_pos421(X,Y) get_csv_ip((X),(Y),421)
+#define get_csv_ipv6_pos421(X,Y) get_csv_ipv6((X),(Y),421)
+#define get_csv_string_pos421(X,Y) get_csv_string((X),(Y),421)
+#define get_csv_v_str_pos421(X,Y) get_csv_string((X),(Y),421)
+#define get_csv_bool_pos421(X,Y) get_csv_bool((X),(Y),421)
+#define get_csv_int_pos421(X,Y) get_csv_int((X),(Y),421)
+#define get_csv_llong_pos421(X,Y) get_csv_llong((X),(Y),421)
+#define get_csv_float_pos421(X,Y) get_csv_float((X),(Y),421)
+#define get_csv_uint_pos422(X,Y) get_csv_uint((X),(Y),422)
+#define get_csv_ullong_pos422(X,Y) get_csv_ullong((X),(Y),422)
+#define get_csv_ip_pos422(X,Y) get_csv_ip((X),(Y),422)
+#define get_csv_ipv6_pos422(X,Y) get_csv_ipv6((X),(Y),422)
+#define get_csv_string_pos422(X,Y) get_csv_string((X),(Y),422)
+#define get_csv_v_str_pos422(X,Y) get_csv_string((X),(Y),422)
+#define get_csv_bool_pos422(X,Y) get_csv_bool((X),(Y),422)
+#define get_csv_int_pos422(X,Y) get_csv_int((X),(Y),422)
+#define get_csv_llong_pos422(X,Y) get_csv_llong((X),(Y),422)
+#define get_csv_float_pos422(X,Y) get_csv_float((X),(Y),422)
+#define get_csv_uint_pos423(X,Y) get_csv_uint((X),(Y),423)
+#define get_csv_ullong_pos423(X,Y) get_csv_ullong((X),(Y),423)
+#define get_csv_ip_pos423(X,Y) get_csv_ip((X),(Y),423)
+#define get_csv_ipv6_pos423(X,Y) get_csv_ipv6((X),(Y),423)
+#define get_csv_string_pos423(X,Y) get_csv_string((X),(Y),423)
+#define get_csv_v_str_pos423(X,Y) get_csv_string((X),(Y),423)
+#define get_csv_bool_pos423(X,Y) get_csv_bool((X),(Y),423)
+#define get_csv_int_pos423(X,Y) get_csv_int((X),(Y),423)
+#define get_csv_llong_pos423(X,Y) get_csv_llong((X),(Y),423)
+#define get_csv_float_pos423(X,Y) get_csv_float((X),(Y),423)
+#define get_csv_uint_pos424(X,Y) get_csv_uint((X),(Y),424)
+#define get_csv_ullong_pos424(X,Y) get_csv_ullong((X),(Y),424)
+#define get_csv_ip_pos424(X,Y) get_csv_ip((X),(Y),424)
+#define get_csv_ipv6_pos424(X,Y) get_csv_ipv6((X),(Y),424)
+#define get_csv_string_pos424(X,Y) get_csv_string((X),(Y),424)
+#define get_csv_v_str_pos424(X,Y) get_csv_string((X),(Y),424)
+#define get_csv_bool_pos424(X,Y) get_csv_bool((X),(Y),424)
+#define get_csv_int_pos424(X,Y) get_csv_int((X),(Y),424)
+#define get_csv_llong_pos424(X,Y) get_csv_llong((X),(Y),424)
+#define get_csv_float_pos424(X,Y) get_csv_float((X),(Y),424)
+#define get_csv_uint_pos425(X,Y) get_csv_uint((X),(Y),425)
+#define get_csv_ullong_pos425(X,Y) get_csv_ullong((X),(Y),425)
+#define get_csv_ip_pos425(X,Y) get_csv_ip((X),(Y),425)
+#define get_csv_ipv6_pos425(X,Y) get_csv_ipv6((X),(Y),425)
+#define get_csv_string_pos425(X,Y) get_csv_string((X),(Y),425)
+#define get_csv_v_str_pos425(X,Y) get_csv_string((X),(Y),425)
+#define get_csv_bool_pos425(X,Y) get_csv_bool((X),(Y),425)
+#define get_csv_int_pos425(X,Y) get_csv_int((X),(Y),425)
+#define get_csv_llong_pos425(X,Y) get_csv_llong((X),(Y),425)
+#define get_csv_float_pos425(X,Y) get_csv_float((X),(Y),425)
+#define get_csv_uint_pos426(X,Y) get_csv_uint((X),(Y),426)
+#define get_csv_ullong_pos426(X,Y) get_csv_ullong((X),(Y),426)
+#define get_csv_ip_pos426(X,Y) get_csv_ip((X),(Y),426)
+#define get_csv_ipv6_pos426(X,Y) get_csv_ipv6((X),(Y),426)
+#define get_csv_string_pos426(X,Y) get_csv_string((X),(Y),426)
+#define get_csv_v_str_pos426(X,Y) get_csv_string((X),(Y),426)
+#define get_csv_bool_pos426(X,Y) get_csv_bool((X),(Y),426)
+#define get_csv_int_pos426(X,Y) get_csv_int((X),(Y),426)
+#define get_csv_llong_pos426(X,Y) get_csv_llong((X),(Y),426)
+#define get_csv_float_pos426(X,Y) get_csv_float((X),(Y),426)
+#define get_csv_uint_pos427(X,Y) get_csv_uint((X),(Y),427)
+#define get_csv_ullong_pos427(X,Y) get_csv_ullong((X),(Y),427)
+#define get_csv_ip_pos427(X,Y) get_csv_ip((X),(Y),427)
+#define get_csv_ipv6_pos427(X,Y) get_csv_ipv6((X),(Y),427)
+#define get_csv_string_pos427(X,Y) get_csv_string((X),(Y),427)
+#define get_csv_v_str_pos427(X,Y) get_csv_string((X),(Y),427)
+#define get_csv_bool_pos427(X,Y) get_csv_bool((X),(Y),427)
+#define get_csv_int_pos427(X,Y) get_csv_int((X),(Y),427)
+#define get_csv_llong_pos427(X,Y) get_csv_llong((X),(Y),427)
+#define get_csv_float_pos427(X,Y) get_csv_float((X),(Y),427)
+#define get_csv_uint_pos428(X,Y) get_csv_uint((X),(Y),428)
+#define get_csv_ullong_pos428(X,Y) get_csv_ullong((X),(Y),428)
+#define get_csv_ip_pos428(X,Y) get_csv_ip((X),(Y),428)
+#define get_csv_ipv6_pos428(X,Y) get_csv_ipv6((X),(Y),428)
+#define get_csv_string_pos428(X,Y) get_csv_string((X),(Y),428)
+#define get_csv_v_str_pos428(X,Y) get_csv_string((X),(Y),428)
+#define get_csv_bool_pos428(X,Y) get_csv_bool((X),(Y),428)
+#define get_csv_int_pos428(X,Y) get_csv_int((X),(Y),428)
+#define get_csv_llong_pos428(X,Y) get_csv_llong((X),(Y),428)
+#define get_csv_float_pos428(X,Y) get_csv_float((X),(Y),428)
+#define get_csv_uint_pos429(X,Y) get_csv_uint((X),(Y),429)
+#define get_csv_ullong_pos429(X,Y) get_csv_ullong((X),(Y),429)
+#define get_csv_ip_pos429(X,Y) get_csv_ip((X),(Y),429)
+#define get_csv_ipv6_pos429(X,Y) get_csv_ipv6((X),(Y),429)
+#define get_csv_string_pos429(X,Y) get_csv_string((X),(Y),429)
+#define get_csv_v_str_pos429(X,Y) get_csv_string((X),(Y),429)
+#define get_csv_bool_pos429(X,Y) get_csv_bool((X),(Y),429)
+#define get_csv_int_pos429(X,Y) get_csv_int((X),(Y),429)
+#define get_csv_llong_pos429(X,Y) get_csv_llong((X),(Y),429)
+#define get_csv_float_pos429(X,Y) get_csv_float((X),(Y),429)
+#define get_csv_uint_pos430(X,Y) get_csv_uint((X),(Y),430)
+#define get_csv_ullong_pos430(X,Y) get_csv_ullong((X),(Y),430)
+#define get_csv_ip_pos430(X,Y) get_csv_ip((X),(Y),430)
+#define get_csv_ipv6_pos430(X,Y) get_csv_ipv6((X),(Y),430)
+#define get_csv_string_pos430(X,Y) get_csv_string((X),(Y),430)
+#define get_csv_v_str_pos430(X,Y) get_csv_string((X),(Y),430)
+#define get_csv_bool_pos430(X,Y) get_csv_bool((X),(Y),430)
+#define get_csv_int_pos430(X,Y) get_csv_int((X),(Y),430)
+#define get_csv_llong_pos430(X,Y) get_csv_llong((X),(Y),430)
+#define get_csv_float_pos430(X,Y) get_csv_float((X),(Y),430)
+#define get_csv_uint_pos431(X,Y) get_csv_uint((X),(Y),431)
+#define get_csv_ullong_pos431(X,Y) get_csv_ullong((X),(Y),431)
+#define get_csv_ip_pos431(X,Y) get_csv_ip((X),(Y),431)
+#define get_csv_ipv6_pos431(X,Y) get_csv_ipv6((X),(Y),431)
+#define get_csv_string_pos431(X,Y) get_csv_string((X),(Y),431)
+#define get_csv_v_str_pos431(X,Y) get_csv_string((X),(Y),431)
+#define get_csv_bool_pos431(X,Y) get_csv_bool((X),(Y),431)
+#define get_csv_int_pos431(X,Y) get_csv_int((X),(Y),431)
+#define get_csv_llong_pos431(X,Y) get_csv_llong((X),(Y),431)
+#define get_csv_float_pos431(X,Y) get_csv_float((X),(Y),431)
+#define get_csv_uint_pos432(X,Y) get_csv_uint((X),(Y),432)
+#define get_csv_ullong_pos432(X,Y) get_csv_ullong((X),(Y),432)
+#define get_csv_ip_pos432(X,Y) get_csv_ip((X),(Y),432)
+#define get_csv_ipv6_pos432(X,Y) get_csv_ipv6((X),(Y),432)
+#define get_csv_string_pos432(X,Y) get_csv_string((X),(Y),432)
+#define get_csv_v_str_pos432(X,Y) get_csv_string((X),(Y),432)
+#define get_csv_bool_pos432(X,Y) get_csv_bool((X),(Y),432)
+#define get_csv_int_pos432(X,Y) get_csv_int((X),(Y),432)
+#define get_csv_llong_pos432(X,Y) get_csv_llong((X),(Y),432)
+#define get_csv_float_pos432(X,Y) get_csv_float((X),(Y),432)
+#define get_csv_uint_pos433(X,Y) get_csv_uint((X),(Y),433)
+#define get_csv_ullong_pos433(X,Y) get_csv_ullong((X),(Y),433)
+#define get_csv_ip_pos433(X,Y) get_csv_ip((X),(Y),433)
+#define get_csv_ipv6_pos433(X,Y) get_csv_ipv6((X),(Y),433)
+#define get_csv_string_pos433(X,Y) get_csv_string((X),(Y),433)
+#define get_csv_v_str_pos433(X,Y) get_csv_string((X),(Y),433)
+#define get_csv_bool_pos433(X,Y) get_csv_bool((X),(Y),433)
+#define get_csv_int_pos433(X,Y) get_csv_int((X),(Y),433)
+#define get_csv_llong_pos433(X,Y) get_csv_llong((X),(Y),433)
+#define get_csv_float_pos433(X,Y) get_csv_float((X),(Y),433)
+#define get_csv_uint_pos434(X,Y) get_csv_uint((X),(Y),434)
+#define get_csv_ullong_pos434(X,Y) get_csv_ullong((X),(Y),434)
+#define get_csv_ip_pos434(X,Y) get_csv_ip((X),(Y),434)
+#define get_csv_ipv6_pos434(X,Y) get_csv_ipv6((X),(Y),434)
+#define get_csv_string_pos434(X,Y) get_csv_string((X),(Y),434)
+#define get_csv_v_str_pos434(X,Y) get_csv_string((X),(Y),434)
+#define get_csv_bool_pos434(X,Y) get_csv_bool((X),(Y),434)
+#define get_csv_int_pos434(X,Y) get_csv_int((X),(Y),434)
+#define get_csv_llong_pos434(X,Y) get_csv_llong((X),(Y),434)
+#define get_csv_float_pos434(X,Y) get_csv_float((X),(Y),434)
+#define get_csv_uint_pos435(X,Y) get_csv_uint((X),(Y),435)
+#define get_csv_ullong_pos435(X,Y) get_csv_ullong((X),(Y),435)
+#define get_csv_ip_pos435(X,Y) get_csv_ip((X),(Y),435)
+#define get_csv_ipv6_pos435(X,Y) get_csv_ipv6((X),(Y),435)
+#define get_csv_string_pos435(X,Y) get_csv_string((X),(Y),435)
+#define get_csv_v_str_pos435(X,Y) get_csv_string((X),(Y),435)
+#define get_csv_bool_pos435(X,Y) get_csv_bool((X),(Y),435)
+#define get_csv_int_pos435(X,Y) get_csv_int((X),(Y),435)
+#define get_csv_llong_pos435(X,Y) get_csv_llong((X),(Y),435)
+#define get_csv_float_pos435(X,Y) get_csv_float((X),(Y),435)
+#define get_csv_uint_pos436(X,Y) get_csv_uint((X),(Y),436)
+#define get_csv_ullong_pos436(X,Y) get_csv_ullong((X),(Y),436)
+#define get_csv_ip_pos436(X,Y) get_csv_ip((X),(Y),436)
+#define get_csv_ipv6_pos436(X,Y) get_csv_ipv6((X),(Y),436)
+#define get_csv_string_pos436(X,Y) get_csv_string((X),(Y),436)
+#define get_csv_v_str_pos436(X,Y) get_csv_string((X),(Y),436)
+#define get_csv_bool_pos436(X,Y) get_csv_bool((X),(Y),436)
+#define get_csv_int_pos436(X,Y) get_csv_int((X),(Y),436)
+#define get_csv_llong_pos436(X,Y) get_csv_llong((X),(Y),436)
+#define get_csv_float_pos436(X,Y) get_csv_float((X),(Y),436)
+#define get_csv_uint_pos437(X,Y) get_csv_uint((X),(Y),437)
+#define get_csv_ullong_pos437(X,Y) get_csv_ullong((X),(Y),437)
+#define get_csv_ip_pos437(X,Y) get_csv_ip((X),(Y),437)
+#define get_csv_ipv6_pos437(X,Y) get_csv_ipv6((X),(Y),437)
+#define get_csv_string_pos437(X,Y) get_csv_string((X),(Y),437)
+#define get_csv_v_str_pos437(X,Y) get_csv_string((X),(Y),437)
+#define get_csv_bool_pos437(X,Y) get_csv_bool((X),(Y),437)
+#define get_csv_int_pos437(X,Y) get_csv_int((X),(Y),437)
+#define get_csv_llong_pos437(X,Y) get_csv_llong((X),(Y),437)
+#define get_csv_float_pos437(X,Y) get_csv_float((X),(Y),437)
+#define get_csv_uint_pos438(X,Y) get_csv_uint((X),(Y),438)
+#define get_csv_ullong_pos438(X,Y) get_csv_ullong((X),(Y),438)
+#define get_csv_ip_pos438(X,Y) get_csv_ip((X),(Y),438)
+#define get_csv_ipv6_pos438(X,Y) get_csv_ipv6((X),(Y),438)
+#define get_csv_string_pos438(X,Y) get_csv_string((X),(Y),438)
+#define get_csv_v_str_pos438(X,Y) get_csv_string((X),(Y),438)
+#define get_csv_bool_pos438(X,Y) get_csv_bool((X),(Y),438)
+#define get_csv_int_pos438(X,Y) get_csv_int((X),(Y),438)
+#define get_csv_llong_pos438(X,Y) get_csv_llong((X),(Y),438)
+#define get_csv_float_pos438(X,Y) get_csv_float((X),(Y),438)
+#define get_csv_uint_pos439(X,Y) get_csv_uint((X),(Y),439)
+#define get_csv_ullong_pos439(X,Y) get_csv_ullong((X),(Y),439)
+#define get_csv_ip_pos439(X,Y) get_csv_ip((X),(Y),439)
+#define get_csv_ipv6_pos439(X,Y) get_csv_ipv6((X),(Y),439)
+#define get_csv_string_pos439(X,Y) get_csv_string((X),(Y),439)
+#define get_csv_v_str_pos439(X,Y) get_csv_string((X),(Y),439)
+#define get_csv_bool_pos439(X,Y) get_csv_bool((X),(Y),439)
+#define get_csv_int_pos439(X,Y) get_csv_int((X),(Y),439)
+#define get_csv_llong_pos439(X,Y) get_csv_llong((X),(Y),439)
+#define get_csv_float_pos439(X,Y) get_csv_float((X),(Y),439)
+#define get_csv_uint_pos440(X,Y) get_csv_uint((X),(Y),440)
+#define get_csv_ullong_pos440(X,Y) get_csv_ullong((X),(Y),440)
+#define get_csv_ip_pos440(X,Y) get_csv_ip((X),(Y),440)
+#define get_csv_ipv6_pos440(X,Y) get_csv_ipv6((X),(Y),440)
+#define get_csv_string_pos440(X,Y) get_csv_string((X),(Y),440)
+#define get_csv_v_str_pos440(X,Y) get_csv_string((X),(Y),440)
+#define get_csv_bool_pos440(X,Y) get_csv_bool((X),(Y),440)
+#define get_csv_int_pos440(X,Y) get_csv_int((X),(Y),440)
+#define get_csv_llong_pos440(X,Y) get_csv_llong((X),(Y),440)
+#define get_csv_float_pos440(X,Y) get_csv_float((X),(Y),440)
+#define get_csv_uint_pos441(X,Y) get_csv_uint((X),(Y),441)
+#define get_csv_ullong_pos441(X,Y) get_csv_ullong((X),(Y),441)
+#define get_csv_ip_pos441(X,Y) get_csv_ip((X),(Y),441)
+#define get_csv_ipv6_pos441(X,Y) get_csv_ipv6((X),(Y),441)
+#define get_csv_string_pos441(X,Y) get_csv_string((X),(Y),441)
+#define get_csv_v_str_pos441(X,Y) get_csv_string((X),(Y),441)
+#define get_csv_bool_pos441(X,Y) get_csv_bool((X),(Y),441)
+#define get_csv_int_pos441(X,Y) get_csv_int((X),(Y),441)
+#define get_csv_llong_pos441(X,Y) get_csv_llong((X),(Y),441)
+#define get_csv_float_pos441(X,Y) get_csv_float((X),(Y),441)
+#define get_csv_uint_pos442(X,Y) get_csv_uint((X),(Y),442)
+#define get_csv_ullong_pos442(X,Y) get_csv_ullong((X),(Y),442)
+#define get_csv_ip_pos442(X,Y) get_csv_ip((X),(Y),442)
+#define get_csv_ipv6_pos442(X,Y) get_csv_ipv6((X),(Y),442)
+#define get_csv_string_pos442(X,Y) get_csv_string((X),(Y),442)
+#define get_csv_v_str_pos442(X,Y) get_csv_string((X),(Y),442)
+#define get_csv_bool_pos442(X,Y) get_csv_bool((X),(Y),442)
+#define get_csv_int_pos442(X,Y) get_csv_int((X),(Y),442)
+#define get_csv_llong_pos442(X,Y) get_csv_llong((X),(Y),442)
+#define get_csv_float_pos442(X,Y) get_csv_float((X),(Y),442)
+#define get_csv_uint_pos443(X,Y) get_csv_uint((X),(Y),443)
+#define get_csv_ullong_pos443(X,Y) get_csv_ullong((X),(Y),443)
+#define get_csv_ip_pos443(X,Y) get_csv_ip((X),(Y),443)
+#define get_csv_ipv6_pos443(X,Y) get_csv_ipv6((X),(Y),443)
+#define get_csv_string_pos443(X,Y) get_csv_string((X),(Y),443)
+#define get_csv_v_str_pos443(X,Y) get_csv_string((X),(Y),443)
+#define get_csv_bool_pos443(X,Y) get_csv_bool((X),(Y),443)
+#define get_csv_int_pos443(X,Y) get_csv_int((X),(Y),443)
+#define get_csv_llong_pos443(X,Y) get_csv_llong((X),(Y),443)
+#define get_csv_float_pos443(X,Y) get_csv_float((X),(Y),443)
+#define get_csv_uint_pos444(X,Y) get_csv_uint((X),(Y),444)
+#define get_csv_ullong_pos444(X,Y) get_csv_ullong((X),(Y),444)
+#define get_csv_ip_pos444(X,Y) get_csv_ip((X),(Y),444)
+#define get_csv_ipv6_pos444(X,Y) get_csv_ipv6((X),(Y),444)
+#define get_csv_string_pos444(X,Y) get_csv_string((X),(Y),444)
+#define get_csv_v_str_pos444(X,Y) get_csv_string((X),(Y),444)
+#define get_csv_bool_pos444(X,Y) get_csv_bool((X),(Y),444)
+#define get_csv_int_pos444(X,Y) get_csv_int((X),(Y),444)
+#define get_csv_llong_pos444(X,Y) get_csv_llong((X),(Y),444)
+#define get_csv_float_pos444(X,Y) get_csv_float((X),(Y),444)
+#define get_csv_uint_pos445(X,Y) get_csv_uint((X),(Y),445)
+#define get_csv_ullong_pos445(X,Y) get_csv_ullong((X),(Y),445)
+#define get_csv_ip_pos445(X,Y) get_csv_ip((X),(Y),445)
+#define get_csv_ipv6_pos445(X,Y) get_csv_ipv6((X),(Y),445)
+#define get_csv_string_pos445(X,Y) get_csv_string((X),(Y),445)
+#define get_csv_v_str_pos445(X,Y) get_csv_string((X),(Y),445)
+#define get_csv_bool_pos445(X,Y) get_csv_bool((X),(Y),445)
+#define get_csv_int_pos445(X,Y) get_csv_int((X),(Y),445)
+#define get_csv_llong_pos445(X,Y) get_csv_llong((X),(Y),445)
+#define get_csv_float_pos445(X,Y) get_csv_float((X),(Y),445)
+#define get_csv_uint_pos446(X,Y) get_csv_uint((X),(Y),446)
+#define get_csv_ullong_pos446(X,Y) get_csv_ullong((X),(Y),446)
+#define get_csv_ip_pos446(X,Y) get_csv_ip((X),(Y),446)
+#define get_csv_ipv6_pos446(X,Y) get_csv_ipv6((X),(Y),446)
+#define get_csv_string_pos446(X,Y) get_csv_string((X),(Y),446)
+#define get_csv_v_str_pos446(X,Y) get_csv_string((X),(Y),446)
+#define get_csv_bool_pos446(X,Y) get_csv_bool((X),(Y),446)
+#define get_csv_int_pos446(X,Y) get_csv_int((X),(Y),446)
+#define get_csv_llong_pos446(X,Y) get_csv_llong((X),(Y),446)
+#define get_csv_float_pos446(X,Y) get_csv_float((X),(Y),446)
+#define get_csv_uint_pos447(X,Y) get_csv_uint((X),(Y),447)
+#define get_csv_ullong_pos447(X,Y) get_csv_ullong((X),(Y),447)
+#define get_csv_ip_pos447(X,Y) get_csv_ip((X),(Y),447)
+#define get_csv_ipv6_pos447(X,Y) get_csv_ipv6((X),(Y),447)
+#define get_csv_string_pos447(X,Y) get_csv_string((X),(Y),447)
+#define get_csv_v_str_pos447(X,Y) get_csv_string((X),(Y),447)
+#define get_csv_bool_pos447(X,Y) get_csv_bool((X),(Y),447)
+#define get_csv_int_pos447(X,Y) get_csv_int((X),(Y),447)
+#define get_csv_llong_pos447(X,Y) get_csv_llong((X),(Y),447)
+#define get_csv_float_pos447(X,Y) get_csv_float((X),(Y),447)
+#define get_csv_uint_pos448(X,Y) get_csv_uint((X),(Y),448)
+#define get_csv_ullong_pos448(X,Y) get_csv_ullong((X),(Y),448)
+#define get_csv_ip_pos448(X,Y) get_csv_ip((X),(Y),448)
+#define get_csv_ipv6_pos448(X,Y) get_csv_ipv6((X),(Y),448)
+#define get_csv_string_pos448(X,Y) get_csv_string((X),(Y),448)
+#define get_csv_v_str_pos448(X,Y) get_csv_string((X),(Y),448)
+#define get_csv_bool_pos448(X,Y) get_csv_bool((X),(Y),448)
+#define get_csv_int_pos448(X,Y) get_csv_int((X),(Y),448)
+#define get_csv_llong_pos448(X,Y) get_csv_llong((X),(Y),448)
+#define get_csv_float_pos448(X,Y) get_csv_float((X),(Y),448)
+#define get_csv_uint_pos449(X,Y) get_csv_uint((X),(Y),449)
+#define get_csv_ullong_pos449(X,Y) get_csv_ullong((X),(Y),449)
+#define get_csv_ip_pos449(X,Y) get_csv_ip((X),(Y),449)
+#define get_csv_ipv6_pos449(X,Y) get_csv_ipv6((X),(Y),449)
+#define get_csv_string_pos449(X,Y) get_csv_string((X),(Y),449)
+#define get_csv_v_str_pos449(X,Y) get_csv_string((X),(Y),449)
+#define get_csv_bool_pos449(X,Y) get_csv_bool((X),(Y),449)
+#define get_csv_int_pos449(X,Y) get_csv_int((X),(Y),449)
+#define get_csv_llong_pos449(X,Y) get_csv_llong((X),(Y),449)
+#define get_csv_float_pos449(X,Y) get_csv_float((X),(Y),449)
+#define get_csv_uint_pos450(X,Y) get_csv_uint((X),(Y),450)
+#define get_csv_ullong_pos450(X,Y) get_csv_ullong((X),(Y),450)
+#define get_csv_ip_pos450(X,Y) get_csv_ip((X),(Y),450)
+#define get_csv_ipv6_pos450(X,Y) get_csv_ipv6((X),(Y),450)
+#define get_csv_string_pos450(X,Y) get_csv_string((X),(Y),450)
+#define get_csv_v_str_pos450(X,Y) get_csv_string((X),(Y),450)
+#define get_csv_bool_pos450(X,Y) get_csv_bool((X),(Y),450)
+#define get_csv_int_pos450(X,Y) get_csv_int((X),(Y),450)
+#define get_csv_llong_pos450(X,Y) get_csv_llong((X),(Y),450)
+#define get_csv_float_pos450(X,Y) get_csv_float((X),(Y),450)
+#define get_csv_uint_pos451(X,Y) get_csv_uint((X),(Y),451)
+#define get_csv_ullong_pos451(X,Y) get_csv_ullong((X),(Y),451)
+#define get_csv_ip_pos451(X,Y) get_csv_ip((X),(Y),451)
+#define get_csv_ipv6_pos451(X,Y) get_csv_ipv6((X),(Y),451)
+#define get_csv_string_pos451(X,Y) get_csv_string((X),(Y),451)
+#define get_csv_v_str_pos451(X,Y) get_csv_string((X),(Y),451)
+#define get_csv_bool_pos451(X,Y) get_csv_bool((X),(Y),451)
+#define get_csv_int_pos451(X,Y) get_csv_int((X),(Y),451)
+#define get_csv_llong_pos451(X,Y) get_csv_llong((X),(Y),451)
+#define get_csv_float_pos451(X,Y) get_csv_float((X),(Y),451)
+#define get_csv_uint_pos452(X,Y) get_csv_uint((X),(Y),452)
+#define get_csv_ullong_pos452(X,Y) get_csv_ullong((X),(Y),452)
+#define get_csv_ip_pos452(X,Y) get_csv_ip((X),(Y),452)
+#define get_csv_ipv6_pos452(X,Y) get_csv_ipv6((X),(Y),452)
+#define get_csv_string_pos452(X,Y) get_csv_string((X),(Y),452)
+#define get_csv_v_str_pos452(X,Y) get_csv_string((X),(Y),452)
+#define get_csv_bool_pos452(X,Y) get_csv_bool((X),(Y),452)
+#define get_csv_int_pos452(X,Y) get_csv_int((X),(Y),452)
+#define get_csv_llong_pos452(X,Y) get_csv_llong((X),(Y),452)
+#define get_csv_float_pos452(X,Y) get_csv_float((X),(Y),452)
+#define get_csv_uint_pos453(X,Y) get_csv_uint((X),(Y),453)
+#define get_csv_ullong_pos453(X,Y) get_csv_ullong((X),(Y),453)
+#define get_csv_ip_pos453(X,Y) get_csv_ip((X),(Y),453)
+#define get_csv_ipv6_pos453(X,Y) get_csv_ipv6((X),(Y),453)
+#define get_csv_string_pos453(X,Y) get_csv_string((X),(Y),453)
+#define get_csv_v_str_pos453(X,Y) get_csv_string((X),(Y),453)
+#define get_csv_bool_pos453(X,Y) get_csv_bool((X),(Y),453)
+#define get_csv_int_pos453(X,Y) get_csv_int((X),(Y),453)
+#define get_csv_llong_pos453(X,Y) get_csv_llong((X),(Y),453)
+#define get_csv_float_pos453(X,Y) get_csv_float((X),(Y),453)
+#define get_csv_uint_pos454(X,Y) get_csv_uint((X),(Y),454)
+#define get_csv_ullong_pos454(X,Y) get_csv_ullong((X),(Y),454)
+#define get_csv_ip_pos454(X,Y) get_csv_ip((X),(Y),454)
+#define get_csv_ipv6_pos454(X,Y) get_csv_ipv6((X),(Y),454)
+#define get_csv_string_pos454(X,Y) get_csv_string((X),(Y),454)
+#define get_csv_v_str_pos454(X,Y) get_csv_string((X),(Y),454)
+#define get_csv_bool_pos454(X,Y) get_csv_bool((X),(Y),454)
+#define get_csv_int_pos454(X,Y) get_csv_int((X),(Y),454)
+#define get_csv_llong_pos454(X,Y) get_csv_llong((X),(Y),454)
+#define get_csv_float_pos454(X,Y) get_csv_float((X),(Y),454)
+#define get_csv_uint_pos455(X,Y) get_csv_uint((X),(Y),455)
+#define get_csv_ullong_pos455(X,Y) get_csv_ullong((X),(Y),455)
+#define get_csv_ip_pos455(X,Y) get_csv_ip((X),(Y),455)
+#define get_csv_ipv6_pos455(X,Y) get_csv_ipv6((X),(Y),455)
+#define get_csv_string_pos455(X,Y) get_csv_string((X),(Y),455)
+#define get_csv_v_str_pos455(X,Y) get_csv_string((X),(Y),455)
+#define get_csv_bool_pos455(X,Y) get_csv_bool((X),(Y),455)
+#define get_csv_int_pos455(X,Y) get_csv_int((X),(Y),455)
+#define get_csv_llong_pos455(X,Y) get_csv_llong((X),(Y),455)
+#define get_csv_float_pos455(X,Y) get_csv_float((X),(Y),455)
+#define get_csv_uint_pos456(X,Y) get_csv_uint((X),(Y),456)
+#define get_csv_ullong_pos456(X,Y) get_csv_ullong((X),(Y),456)
+#define get_csv_ip_pos456(X,Y) get_csv_ip((X),(Y),456)
+#define get_csv_ipv6_pos456(X,Y) get_csv_ipv6((X),(Y),456)
+#define get_csv_string_pos456(X,Y) get_csv_string((X),(Y),456)
+#define get_csv_v_str_pos456(X,Y) get_csv_string((X),(Y),456)
+#define get_csv_bool_pos456(X,Y) get_csv_bool((X),(Y),456)
+#define get_csv_int_pos456(X,Y) get_csv_int((X),(Y),456)
+#define get_csv_llong_pos456(X,Y) get_csv_llong((X),(Y),456)
+#define get_csv_float_pos456(X,Y) get_csv_float((X),(Y),456)
+#define get_csv_uint_pos457(X,Y) get_csv_uint((X),(Y),457)
+#define get_csv_ullong_pos457(X,Y) get_csv_ullong((X),(Y),457)
+#define get_csv_ip_pos457(X,Y) get_csv_ip((X),(Y),457)
+#define get_csv_ipv6_pos457(X,Y) get_csv_ipv6((X),(Y),457)
+#define get_csv_string_pos457(X,Y) get_csv_string((X),(Y),457)
+#define get_csv_v_str_pos457(X,Y) get_csv_string((X),(Y),457)
+#define get_csv_bool_pos457(X,Y) get_csv_bool((X),(Y),457)
+#define get_csv_int_pos457(X,Y) get_csv_int((X),(Y),457)
+#define get_csv_llong_pos457(X,Y) get_csv_llong((X),(Y),457)
+#define get_csv_float_pos457(X,Y) get_csv_float((X),(Y),457)
+#define get_csv_uint_pos458(X,Y) get_csv_uint((X),(Y),458)
+#define get_csv_ullong_pos458(X,Y) get_csv_ullong((X),(Y),458)
+#define get_csv_ip_pos458(X,Y) get_csv_ip((X),(Y),458)
+#define get_csv_ipv6_pos458(X,Y) get_csv_ipv6((X),(Y),458)
+#define get_csv_string_pos458(X,Y) get_csv_string((X),(Y),458)
+#define get_csv_v_str_pos458(X,Y) get_csv_string((X),(Y),458)
+#define get_csv_bool_pos458(X,Y) get_csv_bool((X),(Y),458)
+#define get_csv_int_pos458(X,Y) get_csv_int((X),(Y),458)
+#define get_csv_llong_pos458(X,Y) get_csv_llong((X),(Y),458)
+#define get_csv_float_pos458(X,Y) get_csv_float((X),(Y),458)
+#define get_csv_uint_pos459(X,Y) get_csv_uint((X),(Y),459)
+#define get_csv_ullong_pos459(X,Y) get_csv_ullong((X),(Y),459)
+#define get_csv_ip_pos459(X,Y) get_csv_ip((X),(Y),459)
+#define get_csv_ipv6_pos459(X,Y) get_csv_ipv6((X),(Y),459)
+#define get_csv_string_pos459(X,Y) get_csv_string((X),(Y),459)
+#define get_csv_v_str_pos459(X,Y) get_csv_string((X),(Y),459)
+#define get_csv_bool_pos459(X,Y) get_csv_bool((X),(Y),459)
+#define get_csv_int_pos459(X,Y) get_csv_int((X),(Y),459)
+#define get_csv_llong_pos459(X,Y) get_csv_llong((X),(Y),459)
+#define get_csv_float_pos459(X,Y) get_csv_float((X),(Y),459)
+#define get_csv_uint_pos460(X,Y) get_csv_uint((X),(Y),460)
+#define get_csv_ullong_pos460(X,Y) get_csv_ullong((X),(Y),460)
+#define get_csv_ip_pos460(X,Y) get_csv_ip((X),(Y),460)
+#define get_csv_ipv6_pos460(X,Y) get_csv_ipv6((X),(Y),460)
+#define get_csv_string_pos460(X,Y) get_csv_string((X),(Y),460)
+#define get_csv_v_str_pos460(X,Y) get_csv_string((X),(Y),460)
+#define get_csv_bool_pos460(X,Y) get_csv_bool((X),(Y),460)
+#define get_csv_int_pos460(X,Y) get_csv_int((X),(Y),460)
+#define get_csv_llong_pos460(X,Y) get_csv_llong((X),(Y),460)
+#define get_csv_float_pos460(X,Y) get_csv_float((X),(Y),460)
+#define get_csv_uint_pos461(X,Y) get_csv_uint((X),(Y),461)
+#define get_csv_ullong_pos461(X,Y) get_csv_ullong((X),(Y),461)
+#define get_csv_ip_pos461(X,Y) get_csv_ip((X),(Y),461)
+#define get_csv_ipv6_pos461(X,Y) get_csv_ipv6((X),(Y),461)
+#define get_csv_string_pos461(X,Y) get_csv_string((X),(Y),461)
+#define get_csv_v_str_pos461(X,Y) get_csv_string((X),(Y),461)
+#define get_csv_bool_pos461(X,Y) get_csv_bool((X),(Y),461)
+#define get_csv_int_pos461(X,Y) get_csv_int((X),(Y),461)
+#define get_csv_llong_pos461(X,Y) get_csv_llong((X),(Y),461)
+#define get_csv_float_pos461(X,Y) get_csv_float((X),(Y),461)
+#define get_csv_uint_pos462(X,Y) get_csv_uint((X),(Y),462)
+#define get_csv_ullong_pos462(X,Y) get_csv_ullong((X),(Y),462)
+#define get_csv_ip_pos462(X,Y) get_csv_ip((X),(Y),462)
+#define get_csv_ipv6_pos462(X,Y) get_csv_ipv6((X),(Y),462)
+#define get_csv_string_pos462(X,Y) get_csv_string((X),(Y),462)
+#define get_csv_v_str_pos462(X,Y) get_csv_string((X),(Y),462)
+#define get_csv_bool_pos462(X,Y) get_csv_bool((X),(Y),462)
+#define get_csv_int_pos462(X,Y) get_csv_int((X),(Y),462)
+#define get_csv_llong_pos462(X,Y) get_csv_llong((X),(Y),462)
+#define get_csv_float_pos462(X,Y) get_csv_float((X),(Y),462)
+#define get_csv_uint_pos463(X,Y) get_csv_uint((X),(Y),463)
+#define get_csv_ullong_pos463(X,Y) get_csv_ullong((X),(Y),463)
+#define get_csv_ip_pos463(X,Y) get_csv_ip((X),(Y),463)
+#define get_csv_ipv6_pos463(X,Y) get_csv_ipv6((X),(Y),463)
+#define get_csv_string_pos463(X,Y) get_csv_string((X),(Y),463)
+#define get_csv_v_str_pos463(X,Y) get_csv_string((X),(Y),463)
+#define get_csv_bool_pos463(X,Y) get_csv_bool((X),(Y),463)
+#define get_csv_int_pos463(X,Y) get_csv_int((X),(Y),463)
+#define get_csv_llong_pos463(X,Y) get_csv_llong((X),(Y),463)
+#define get_csv_float_pos463(X,Y) get_csv_float((X),(Y),463)
+#define get_csv_uint_pos464(X,Y) get_csv_uint((X),(Y),464)
+#define get_csv_ullong_pos464(X,Y) get_csv_ullong((X),(Y),464)
+#define get_csv_ip_pos464(X,Y) get_csv_ip((X),(Y),464)
+#define get_csv_ipv6_pos464(X,Y) get_csv_ipv6((X),(Y),464)
+#define get_csv_string_pos464(X,Y) get_csv_string((X),(Y),464)
+#define get_csv_v_str_pos464(X,Y) get_csv_string((X),(Y),464)
+#define get_csv_bool_pos464(X,Y) get_csv_bool((X),(Y),464)
+#define get_csv_int_pos464(X,Y) get_csv_int((X),(Y),464)
+#define get_csv_llong_pos464(X,Y) get_csv_llong((X),(Y),464)
+#define get_csv_float_pos464(X,Y) get_csv_float((X),(Y),464)
+#define get_csv_uint_pos465(X,Y) get_csv_uint((X),(Y),465)
+#define get_csv_ullong_pos465(X,Y) get_csv_ullong((X),(Y),465)
+#define get_csv_ip_pos465(X,Y) get_csv_ip((X),(Y),465)
+#define get_csv_ipv6_pos465(X,Y) get_csv_ipv6((X),(Y),465)
+#define get_csv_string_pos465(X,Y) get_csv_string((X),(Y),465)
+#define get_csv_v_str_pos465(X,Y) get_csv_string((X),(Y),465)
+#define get_csv_bool_pos465(X,Y) get_csv_bool((X),(Y),465)
+#define get_csv_int_pos465(X,Y) get_csv_int((X),(Y),465)
+#define get_csv_llong_pos465(X,Y) get_csv_llong((X),(Y),465)
+#define get_csv_float_pos465(X,Y) get_csv_float((X),(Y),465)
+#define get_csv_uint_pos466(X,Y) get_csv_uint((X),(Y),466)
+#define get_csv_ullong_pos466(X,Y) get_csv_ullong((X),(Y),466)
+#define get_csv_ip_pos466(X,Y) get_csv_ip((X),(Y),466)
+#define get_csv_ipv6_pos466(X,Y) get_csv_ipv6((X),(Y),466)
+#define get_csv_string_pos466(X,Y) get_csv_string((X),(Y),466)
+#define get_csv_v_str_pos466(X,Y) get_csv_string((X),(Y),466)
+#define get_csv_bool_pos466(X,Y) get_csv_bool((X),(Y),466)
+#define get_csv_int_pos466(X,Y) get_csv_int((X),(Y),466)
+#define get_csv_llong_pos466(X,Y) get_csv_llong((X),(Y),466)
+#define get_csv_float_pos466(X,Y) get_csv_float((X),(Y),466)
+#define get_csv_uint_pos467(X,Y) get_csv_uint((X),(Y),467)
+#define get_csv_ullong_pos467(X,Y) get_csv_ullong((X),(Y),467)
+#define get_csv_ip_pos467(X,Y) get_csv_ip((X),(Y),467)
+#define get_csv_ipv6_pos467(X,Y) get_csv_ipv6((X),(Y),467)
+#define get_csv_string_pos467(X,Y) get_csv_string((X),(Y),467)
+#define get_csv_v_str_pos467(X,Y) get_csv_string((X),(Y),467)
+#define get_csv_bool_pos467(X,Y) get_csv_bool((X),(Y),467)
+#define get_csv_int_pos467(X,Y) get_csv_int((X),(Y),467)
+#define get_csv_llong_pos467(X,Y) get_csv_llong((X),(Y),467)
+#define get_csv_float_pos467(X,Y) get_csv_float((X),(Y),467)
+#define get_csv_uint_pos468(X,Y) get_csv_uint((X),(Y),468)
+#define get_csv_ullong_pos468(X,Y) get_csv_ullong((X),(Y),468)
+#define get_csv_ip_pos468(X,Y) get_csv_ip((X),(Y),468)
+#define get_csv_ipv6_pos468(X,Y) get_csv_ipv6((X),(Y),468)
+#define get_csv_string_pos468(X,Y) get_csv_string((X),(Y),468)
+#define get_csv_v_str_pos468(X,Y) get_csv_string((X),(Y),468)
+#define get_csv_bool_pos468(X,Y) get_csv_bool((X),(Y),468)
+#define get_csv_int_pos468(X,Y) get_csv_int((X),(Y),468)
+#define get_csv_llong_pos468(X,Y) get_csv_llong((X),(Y),468)
+#define get_csv_float_pos468(X,Y) get_csv_float((X),(Y),468)
+#define get_csv_uint_pos469(X,Y) get_csv_uint((X),(Y),469)
+#define get_csv_ullong_pos469(X,Y) get_csv_ullong((X),(Y),469)
+#define get_csv_ip_pos469(X,Y) get_csv_ip((X),(Y),469)
+#define get_csv_ipv6_pos469(X,Y) get_csv_ipv6((X),(Y),469)
+#define get_csv_string_pos469(X,Y) get_csv_string((X),(Y),469)
+#define get_csv_v_str_pos469(X,Y) get_csv_string((X),(Y),469)
+#define get_csv_bool_pos469(X,Y) get_csv_bool((X),(Y),469)
+#define get_csv_int_pos469(X,Y) get_csv_int((X),(Y),469)
+#define get_csv_llong_pos469(X,Y) get_csv_llong((X),(Y),469)
+#define get_csv_float_pos469(X,Y) get_csv_float((X),(Y),469)
+#define get_csv_uint_pos470(X,Y) get_csv_uint((X),(Y),470)
+#define get_csv_ullong_pos470(X,Y) get_csv_ullong((X),(Y),470)
+#define get_csv_ip_pos470(X,Y) get_csv_ip((X),(Y),470)
+#define get_csv_ipv6_pos470(X,Y) get_csv_ipv6((X),(Y),470)
+#define get_csv_string_pos470(X,Y) get_csv_string((X),(Y),470)
+#define get_csv_v_str_pos470(X,Y) get_csv_string((X),(Y),470)
+#define get_csv_bool_pos470(X,Y) get_csv_bool((X),(Y),470)
+#define get_csv_int_pos470(X,Y) get_csv_int((X),(Y),470)
+#define get_csv_llong_pos470(X,Y) get_csv_llong((X),(Y),470)
+#define get_csv_float_pos470(X,Y) get_csv_float((X),(Y),470)
+#define get_csv_uint_pos471(X,Y) get_csv_uint((X),(Y),471)
+#define get_csv_ullong_pos471(X,Y) get_csv_ullong((X),(Y),471)
+#define get_csv_ip_pos471(X,Y) get_csv_ip((X),(Y),471)
+#define get_csv_ipv6_pos471(X,Y) get_csv_ipv6((X),(Y),471)
+#define get_csv_string_pos471(X,Y) get_csv_string((X),(Y),471)
+#define get_csv_v_str_pos471(X,Y) get_csv_string((X),(Y),471)
+#define get_csv_bool_pos471(X,Y) get_csv_bool((X),(Y),471)
+#define get_csv_int_pos471(X,Y) get_csv_int((X),(Y),471)
+#define get_csv_llong_pos471(X,Y) get_csv_llong((X),(Y),471)
+#define get_csv_float_pos471(X,Y) get_csv_float((X),(Y),471)
+#define get_csv_uint_pos472(X,Y) get_csv_uint((X),(Y),472)
+#define get_csv_ullong_pos472(X,Y) get_csv_ullong((X),(Y),472)
+#define get_csv_ip_pos472(X,Y) get_csv_ip((X),(Y),472)
+#define get_csv_ipv6_pos472(X,Y) get_csv_ipv6((X),(Y),472)
+#define get_csv_string_pos472(X,Y) get_csv_string((X),(Y),472)
+#define get_csv_v_str_pos472(X,Y) get_csv_string((X),(Y),472)
+#define get_csv_bool_pos472(X,Y) get_csv_bool((X),(Y),472)
+#define get_csv_int_pos472(X,Y) get_csv_int((X),(Y),472)
+#define get_csv_llong_pos472(X,Y) get_csv_llong((X),(Y),472)
+#define get_csv_float_pos472(X,Y) get_csv_float((X),(Y),472)
+#define get_csv_uint_pos473(X,Y) get_csv_uint((X),(Y),473)
+#define get_csv_ullong_pos473(X,Y) get_csv_ullong((X),(Y),473)
+#define get_csv_ip_pos473(X,Y) get_csv_ip((X),(Y),473)
+#define get_csv_ipv6_pos473(X,Y) get_csv_ipv6((X),(Y),473)
+#define get_csv_string_pos473(X,Y) get_csv_string((X),(Y),473)
+#define get_csv_v_str_pos473(X,Y) get_csv_string((X),(Y),473)
+#define get_csv_bool_pos473(X,Y) get_csv_bool((X),(Y),473)
+#define get_csv_int_pos473(X,Y) get_csv_int((X),(Y),473)
+#define get_csv_llong_pos473(X,Y) get_csv_llong((X),(Y),473)
+#define get_csv_float_pos473(X,Y) get_csv_float((X),(Y),473)
+#define get_csv_uint_pos474(X,Y) get_csv_uint((X),(Y),474)
+#define get_csv_ullong_pos474(X,Y) get_csv_ullong((X),(Y),474)
+#define get_csv_ip_pos474(X,Y) get_csv_ip((X),(Y),474)
+#define get_csv_ipv6_pos474(X,Y) get_csv_ipv6((X),(Y),474)
+#define get_csv_string_pos474(X,Y) get_csv_string((X),(Y),474)
+#define get_csv_v_str_pos474(X,Y) get_csv_string((X),(Y),474)
+#define get_csv_bool_pos474(X,Y) get_csv_bool((X),(Y),474)
+#define get_csv_int_pos474(X,Y) get_csv_int((X),(Y),474)
+#define get_csv_llong_pos474(X,Y) get_csv_llong((X),(Y),474)
+#define get_csv_float_pos474(X,Y) get_csv_float((X),(Y),474)
+#define get_csv_uint_pos475(X,Y) get_csv_uint((X),(Y),475)
+#define get_csv_ullong_pos475(X,Y) get_csv_ullong((X),(Y),475)
+#define get_csv_ip_pos475(X,Y) get_csv_ip((X),(Y),475)
+#define get_csv_ipv6_pos475(X,Y) get_csv_ipv6((X),(Y),475)
+#define get_csv_string_pos475(X,Y) get_csv_string((X),(Y),475)
+#define get_csv_v_str_pos475(X,Y) get_csv_string((X),(Y),475)
+#define get_csv_bool_pos475(X,Y) get_csv_bool((X),(Y),475)
+#define get_csv_int_pos475(X,Y) get_csv_int((X),(Y),475)
+#define get_csv_llong_pos475(X,Y) get_csv_llong((X),(Y),475)
+#define get_csv_float_pos475(X,Y) get_csv_float((X),(Y),475)
+#define get_csv_uint_pos476(X,Y) get_csv_uint((X),(Y),476)
+#define get_csv_ullong_pos476(X,Y) get_csv_ullong((X),(Y),476)
+#define get_csv_ip_pos476(X,Y) get_csv_ip((X),(Y),476)
+#define get_csv_ipv6_pos476(X,Y) get_csv_ipv6((X),(Y),476)
+#define get_csv_string_pos476(X,Y) get_csv_string((X),(Y),476)
+#define get_csv_v_str_pos476(X,Y) get_csv_string((X),(Y),476)
+#define get_csv_bool_pos476(X,Y) get_csv_bool((X),(Y),476)
+#define get_csv_int_pos476(X,Y) get_csv_int((X),(Y),476)
+#define get_csv_llong_pos476(X,Y) get_csv_llong((X),(Y),476)
+#define get_csv_float_pos476(X,Y) get_csv_float((X),(Y),476)
+#define get_csv_uint_pos477(X,Y) get_csv_uint((X),(Y),477)
+#define get_csv_ullong_pos477(X,Y) get_csv_ullong((X),(Y),477)
+#define get_csv_ip_pos477(X,Y) get_csv_ip((X),(Y),477)
+#define get_csv_ipv6_pos477(X,Y) get_csv_ipv6((X),(Y),477)
+#define get_csv_string_pos477(X,Y) get_csv_string((X),(Y),477)
+#define get_csv_v_str_pos477(X,Y) get_csv_string((X),(Y),477)
+#define get_csv_bool_pos477(X,Y) get_csv_bool((X),(Y),477)
+#define get_csv_int_pos477(X,Y) get_csv_int((X),(Y),477)
+#define get_csv_llong_pos477(X,Y) get_csv_llong((X),(Y),477)
+#define get_csv_float_pos477(X,Y) get_csv_float((X),(Y),477)
+#define get_csv_uint_pos478(X,Y) get_csv_uint((X),(Y),478)
+#define get_csv_ullong_pos478(X,Y) get_csv_ullong((X),(Y),478)
+#define get_csv_ip_pos478(X,Y) get_csv_ip((X),(Y),478)
+#define get_csv_ipv6_pos478(X,Y) get_csv_ipv6((X),(Y),478)
+#define get_csv_string_pos478(X,Y) get_csv_string((X),(Y),478)
+#define get_csv_v_str_pos478(X,Y) get_csv_string((X),(Y),478)
+#define get_csv_bool_pos478(X,Y) get_csv_bool((X),(Y),478)
+#define get_csv_int_pos478(X,Y) get_csv_int((X),(Y),478)
+#define get_csv_llong_pos478(X,Y) get_csv_llong((X),(Y),478)
+#define get_csv_float_pos478(X,Y) get_csv_float((X),(Y),478)
+#define get_csv_uint_pos479(X,Y) get_csv_uint((X),(Y),479)
+#define get_csv_ullong_pos479(X,Y) get_csv_ullong((X),(Y),479)
+#define get_csv_ip_pos479(X,Y) get_csv_ip((X),(Y),479)
+#define get_csv_ipv6_pos479(X,Y) get_csv_ipv6((X),(Y),479)
+#define get_csv_string_pos479(X,Y) get_csv_string((X),(Y),479)
+#define get_csv_v_str_pos479(X,Y) get_csv_string((X),(Y),479)
+#define get_csv_bool_pos479(X,Y) get_csv_bool((X),(Y),479)
+#define get_csv_int_pos479(X,Y) get_csv_int((X),(Y),479)
+#define get_csv_llong_pos479(X,Y) get_csv_llong((X),(Y),479)
+#define get_csv_float_pos479(X,Y) get_csv_float((X),(Y),479)
+#define get_csv_uint_pos480(X,Y) get_csv_uint((X),(Y),480)
+#define get_csv_ullong_pos480(X,Y) get_csv_ullong((X),(Y),480)
+#define get_csv_ip_pos480(X,Y) get_csv_ip((X),(Y),480)
+#define get_csv_ipv6_pos480(X,Y) get_csv_ipv6((X),(Y),480)
+#define get_csv_string_pos480(X,Y) get_csv_string((X),(Y),480)
+#define get_csv_v_str_pos480(X,Y) get_csv_string((X),(Y),480)
+#define get_csv_bool_pos480(X,Y) get_csv_bool((X),(Y),480)
+#define get_csv_int_pos480(X,Y) get_csv_int((X),(Y),480)
+#define get_csv_llong_pos480(X,Y) get_csv_llong((X),(Y),480)
+#define get_csv_float_pos480(X,Y) get_csv_float((X),(Y),480)
+#define get_csv_uint_pos481(X,Y) get_csv_uint((X),(Y),481)
+#define get_csv_ullong_pos481(X,Y) get_csv_ullong((X),(Y),481)
+#define get_csv_ip_pos481(X,Y) get_csv_ip((X),(Y),481)
+#define get_csv_ipv6_pos481(X,Y) get_csv_ipv6((X),(Y),481)
+#define get_csv_string_pos481(X,Y) get_csv_string((X),(Y),481)
+#define get_csv_v_str_pos481(X,Y) get_csv_string((X),(Y),481)
+#define get_csv_bool_pos481(X,Y) get_csv_bool((X),(Y),481)
+#define get_csv_int_pos481(X,Y) get_csv_int((X),(Y),481)
+#define get_csv_llong_pos481(X,Y) get_csv_llong((X),(Y),481)
+#define get_csv_float_pos481(X,Y) get_csv_float((X),(Y),481)
+#define get_csv_uint_pos482(X,Y) get_csv_uint((X),(Y),482)
+#define get_csv_ullong_pos482(X,Y) get_csv_ullong((X),(Y),482)
+#define get_csv_ip_pos482(X,Y) get_csv_ip((X),(Y),482)
+#define get_csv_ipv6_pos482(X,Y) get_csv_ipv6((X),(Y),482)
+#define get_csv_string_pos482(X,Y) get_csv_string((X),(Y),482)
+#define get_csv_v_str_pos482(X,Y) get_csv_string((X),(Y),482)
+#define get_csv_bool_pos482(X,Y) get_csv_bool((X),(Y),482)
+#define get_csv_int_pos482(X,Y) get_csv_int((X),(Y),482)
+#define get_csv_llong_pos482(X,Y) get_csv_llong((X),(Y),482)
+#define get_csv_float_pos482(X,Y) get_csv_float((X),(Y),482)
+#define get_csv_uint_pos483(X,Y) get_csv_uint((X),(Y),483)
+#define get_csv_ullong_pos483(X,Y) get_csv_ullong((X),(Y),483)
+#define get_csv_ip_pos483(X,Y) get_csv_ip((X),(Y),483)
+#define get_csv_ipv6_pos483(X,Y) get_csv_ipv6((X),(Y),483)
+#define get_csv_string_pos483(X,Y) get_csv_string((X),(Y),483)
+#define get_csv_v_str_pos483(X,Y) get_csv_string((X),(Y),483)
+#define get_csv_bool_pos483(X,Y) get_csv_bool((X),(Y),483)
+#define get_csv_int_pos483(X,Y) get_csv_int((X),(Y),483)
+#define get_csv_llong_pos483(X,Y) get_csv_llong((X),(Y),483)
+#define get_csv_float_pos483(X,Y) get_csv_float((X),(Y),483)
+#define get_csv_uint_pos484(X,Y) get_csv_uint((X),(Y),484)
+#define get_csv_ullong_pos484(X,Y) get_csv_ullong((X),(Y),484)
+#define get_csv_ip_pos484(X,Y) get_csv_ip((X),(Y),484)
+#define get_csv_ipv6_pos484(X,Y) get_csv_ipv6((X),(Y),484)
+#define get_csv_string_pos484(X,Y) get_csv_string((X),(Y),484)
+#define get_csv_v_str_pos484(X,Y) get_csv_string((X),(Y),484)
+#define get_csv_bool_pos484(X,Y) get_csv_bool((X),(Y),484)
+#define get_csv_int_pos484(X,Y) get_csv_int((X),(Y),484)
+#define get_csv_llong_pos484(X,Y) get_csv_llong((X),(Y),484)
+#define get_csv_float_pos484(X,Y) get_csv_float((X),(Y),484)
+#define get_csv_uint_pos485(X,Y) get_csv_uint((X),(Y),485)
+#define get_csv_ullong_pos485(X,Y) get_csv_ullong((X),(Y),485)
+#define get_csv_ip_pos485(X,Y) get_csv_ip((X),(Y),485)
+#define get_csv_ipv6_pos485(X,Y) get_csv_ipv6((X),(Y),485)
+#define get_csv_string_pos485(X,Y) get_csv_string((X),(Y),485)
+#define get_csv_v_str_pos485(X,Y) get_csv_string((X),(Y),485)
+#define get_csv_bool_pos485(X,Y) get_csv_bool((X),(Y),485)
+#define get_csv_int_pos485(X,Y) get_csv_int((X),(Y),485)
+#define get_csv_llong_pos485(X,Y) get_csv_llong((X),(Y),485)
+#define get_csv_float_pos485(X,Y) get_csv_float((X),(Y),485)
+#define get_csv_uint_pos486(X,Y) get_csv_uint((X),(Y),486)
+#define get_csv_ullong_pos486(X,Y) get_csv_ullong((X),(Y),486)
+#define get_csv_ip_pos486(X,Y) get_csv_ip((X),(Y),486)
+#define get_csv_ipv6_pos486(X,Y) get_csv_ipv6((X),(Y),486)
+#define get_csv_string_pos486(X,Y) get_csv_string((X),(Y),486)
+#define get_csv_v_str_pos486(X,Y) get_csv_string((X),(Y),486)
+#define get_csv_bool_pos486(X,Y) get_csv_bool((X),(Y),486)
+#define get_csv_int_pos486(X,Y) get_csv_int((X),(Y),486)
+#define get_csv_llong_pos486(X,Y) get_csv_llong((X),(Y),486)
+#define get_csv_float_pos486(X,Y) get_csv_float((X),(Y),486)
+#define get_csv_uint_pos487(X,Y) get_csv_uint((X),(Y),487)
+#define get_csv_ullong_pos487(X,Y) get_csv_ullong((X),(Y),487)
+#define get_csv_ip_pos487(X,Y) get_csv_ip((X),(Y),487)
+#define get_csv_ipv6_pos487(X,Y) get_csv_ipv6((X),(Y),487)
+#define get_csv_string_pos487(X,Y) get_csv_string((X),(Y),487)
+#define get_csv_v_str_pos487(X,Y) get_csv_string((X),(Y),487)
+#define get_csv_bool_pos487(X,Y) get_csv_bool((X),(Y),487)
+#define get_csv_int_pos487(X,Y) get_csv_int((X),(Y),487)
+#define get_csv_llong_pos487(X,Y) get_csv_llong((X),(Y),487)
+#define get_csv_float_pos487(X,Y) get_csv_float((X),(Y),487)
+#define get_csv_uint_pos488(X,Y) get_csv_uint((X),(Y),488)
+#define get_csv_ullong_pos488(X,Y) get_csv_ullong((X),(Y),488)
+#define get_csv_ip_pos488(X,Y) get_csv_ip((X),(Y),488)
+#define get_csv_ipv6_pos488(X,Y) get_csv_ipv6((X),(Y),488)
+#define get_csv_string_pos488(X,Y) get_csv_string((X),(Y),488)
+#define get_csv_v_str_pos488(X,Y) get_csv_string((X),(Y),488)
+#define get_csv_bool_pos488(X,Y) get_csv_bool((X),(Y),488)
+#define get_csv_int_pos488(X,Y) get_csv_int((X),(Y),488)
+#define get_csv_llong_pos488(X,Y) get_csv_llong((X),(Y),488)
+#define get_csv_float_pos488(X,Y) get_csv_float((X),(Y),488)
+#define get_csv_uint_pos489(X,Y) get_csv_uint((X),(Y),489)
+#define get_csv_ullong_pos489(X,Y) get_csv_ullong((X),(Y),489)
+#define get_csv_ip_pos489(X,Y) get_csv_ip((X),(Y),489)
+#define get_csv_ipv6_pos489(X,Y) get_csv_ipv6((X),(Y),489)
+#define get_csv_string_pos489(X,Y) get_csv_string((X),(Y),489)
+#define get_csv_v_str_pos489(X,Y) get_csv_string((X),(Y),489)
+#define get_csv_bool_pos489(X,Y) get_csv_bool((X),(Y),489)
+#define get_csv_int_pos489(X,Y) get_csv_int((X),(Y),489)
+#define get_csv_llong_pos489(X,Y) get_csv_llong((X),(Y),489)
+#define get_csv_float_pos489(X,Y) get_csv_float((X),(Y),489)
+#define get_csv_uint_pos490(X,Y) get_csv_uint((X),(Y),490)
+#define get_csv_ullong_pos490(X,Y) get_csv_ullong((X),(Y),490)
+#define get_csv_ip_pos490(X,Y) get_csv_ip((X),(Y),490)
+#define get_csv_ipv6_pos490(X,Y) get_csv_ipv6((X),(Y),490)
+#define get_csv_string_pos490(X,Y) get_csv_string((X),(Y),490)
+#define get_csv_v_str_pos490(X,Y) get_csv_string((X),(Y),490)
+#define get_csv_bool_pos490(X,Y) get_csv_bool((X),(Y),490)
+#define get_csv_int_pos490(X,Y) get_csv_int((X),(Y),490)
+#define get_csv_llong_pos490(X,Y) get_csv_llong((X),(Y),490)
+#define get_csv_float_pos490(X,Y) get_csv_float((X),(Y),490)
+#define get_csv_uint_pos491(X,Y) get_csv_uint((X),(Y),491)
+#define get_csv_ullong_pos491(X,Y) get_csv_ullong((X),(Y),491)
+#define get_csv_ip_pos491(X,Y) get_csv_ip((X),(Y),491)
+#define get_csv_ipv6_pos491(X,Y) get_csv_ipv6((X),(Y),491)
+#define get_csv_string_pos491(X,Y) get_csv_string((X),(Y),491)
+#define get_csv_v_str_pos491(X,Y) get_csv_string((X),(Y),491)
+#define get_csv_bool_pos491(X,Y) get_csv_bool((X),(Y),491)
+#define get_csv_int_pos491(X,Y) get_csv_int((X),(Y),491)
+#define get_csv_llong_pos491(X,Y) get_csv_llong((X),(Y),491)
+#define get_csv_float_pos491(X,Y) get_csv_float((X),(Y),491)
+#define get_csv_uint_pos492(X,Y) get_csv_uint((X),(Y),492)
+#define get_csv_ullong_pos492(X,Y) get_csv_ullong((X),(Y),492)
+#define get_csv_ip_pos492(X,Y) get_csv_ip((X),(Y),492)
+#define get_csv_ipv6_pos492(X,Y) get_csv_ipv6((X),(Y),492)
+#define get_csv_string_pos492(X,Y) get_csv_string((X),(Y),492)
+#define get_csv_v_str_pos492(X,Y) get_csv_string((X),(Y),492)
+#define get_csv_bool_pos492(X,Y) get_csv_bool((X),(Y),492)
+#define get_csv_int_pos492(X,Y) get_csv_int((X),(Y),492)
+#define get_csv_llong_pos492(X,Y) get_csv_llong((X),(Y),492)
+#define get_csv_float_pos492(X,Y) get_csv_float((X),(Y),492)
+#define get_csv_uint_pos493(X,Y) get_csv_uint((X),(Y),493)
+#define get_csv_ullong_pos493(X,Y) get_csv_ullong((X),(Y),493)
+#define get_csv_ip_pos493(X,Y) get_csv_ip((X),(Y),493)
+#define get_csv_ipv6_pos493(X,Y) get_csv_ipv6((X),(Y),493)
+#define get_csv_string_pos493(X,Y) get_csv_string((X),(Y),493)
+#define get_csv_v_str_pos493(X,Y) get_csv_string((X),(Y),493)
+#define get_csv_bool_pos493(X,Y) get_csv_bool((X),(Y),493)
+#define get_csv_int_pos493(X,Y) get_csv_int((X),(Y),493)
+#define get_csv_llong_pos493(X,Y) get_csv_llong((X),(Y),493)
+#define get_csv_float_pos493(X,Y) get_csv_float((X),(Y),493)
+#define get_csv_uint_pos494(X,Y) get_csv_uint((X),(Y),494)
+#define get_csv_ullong_pos494(X,Y) get_csv_ullong((X),(Y),494)
+#define get_csv_ip_pos494(X,Y) get_csv_ip((X),(Y),494)
+#define get_csv_ipv6_pos494(X,Y) get_csv_ipv6((X),(Y),494)
+#define get_csv_string_pos494(X,Y) get_csv_string((X),(Y),494)
+#define get_csv_v_str_pos494(X,Y) get_csv_string((X),(Y),494)
+#define get_csv_bool_pos494(X,Y) get_csv_bool((X),(Y),494)
+#define get_csv_int_pos494(X,Y) get_csv_int((X),(Y),494)
+#define get_csv_llong_pos494(X,Y) get_csv_llong((X),(Y),494)
+#define get_csv_float_pos494(X,Y) get_csv_float((X),(Y),494)
+#define get_csv_uint_pos495(X,Y) get_csv_uint((X),(Y),495)
+#define get_csv_ullong_pos495(X,Y) get_csv_ullong((X),(Y),495)
+#define get_csv_ip_pos495(X,Y) get_csv_ip((X),(Y),495)
+#define get_csv_ipv6_pos495(X,Y) get_csv_ipv6((X),(Y),495)
+#define get_csv_string_pos495(X,Y) get_csv_string((X),(Y),495)
+#define get_csv_v_str_pos495(X,Y) get_csv_string((X),(Y),495)
+#define get_csv_bool_pos495(X,Y) get_csv_bool((X),(Y),495)
+#define get_csv_int_pos495(X,Y) get_csv_int((X),(Y),495)
+#define get_csv_llong_pos495(X,Y) get_csv_llong((X),(Y),495)
+#define get_csv_float_pos495(X,Y) get_csv_float((X),(Y),495)
+#define get_csv_uint_pos496(X,Y) get_csv_uint((X),(Y),496)
+#define get_csv_ullong_pos496(X,Y) get_csv_ullong((X),(Y),496)
+#define get_csv_ip_pos496(X,Y) get_csv_ip((X),(Y),496)
+#define get_csv_ipv6_pos496(X,Y) get_csv_ipv6((X),(Y),496)
+#define get_csv_string_pos496(X,Y) get_csv_string((X),(Y),496)
+#define get_csv_v_str_pos496(X,Y) get_csv_string((X),(Y),496)
+#define get_csv_bool_pos496(X,Y) get_csv_bool((X),(Y),496)
+#define get_csv_int_pos496(X,Y) get_csv_int((X),(Y),496)
+#define get_csv_llong_pos496(X,Y) get_csv_llong((X),(Y),496)
+#define get_csv_float_pos496(X,Y) get_csv_float((X),(Y),496)
+#define get_csv_uint_pos497(X,Y) get_csv_uint((X),(Y),497)
+#define get_csv_ullong_pos497(X,Y) get_csv_ullong((X),(Y),497)
+#define get_csv_ip_pos497(X,Y) get_csv_ip((X),(Y),497)
+#define get_csv_ipv6_pos497(X,Y) get_csv_ipv6((X),(Y),497)
+#define get_csv_string_pos497(X,Y) get_csv_string((X),(Y),497)
+#define get_csv_v_str_pos497(X,Y) get_csv_string((X),(Y),497)
+#define get_csv_bool_pos497(X,Y) get_csv_bool((X),(Y),497)
+#define get_csv_int_pos497(X,Y) get_csv_int((X),(Y),497)
+#define get_csv_llong_pos497(X,Y) get_csv_llong((X),(Y),497)
+#define get_csv_float_pos497(X,Y) get_csv_float((X),(Y),497)
+#define get_csv_uint_pos498(X,Y) get_csv_uint((X),(Y),498)
+#define get_csv_ullong_pos498(X,Y) get_csv_ullong((X),(Y),498)
+#define get_csv_ip_pos498(X,Y) get_csv_ip((X),(Y),498)
+#define get_csv_ipv6_pos498(X,Y) get_csv_ipv6((X),(Y),498)
+#define get_csv_string_pos498(X,Y) get_csv_string((X),(Y),498)
+#define get_csv_v_str_pos498(X,Y) get_csv_string((X),(Y),498)
+#define get_csv_bool_pos498(X,Y) get_csv_bool((X),(Y),498)
+#define get_csv_int_pos498(X,Y) get_csv_int((X),(Y),498)
+#define get_csv_llong_pos498(X,Y) get_csv_llong((X),(Y),498)
+#define get_csv_float_pos498(X,Y) get_csv_float((X),(Y),498)
+#define get_csv_uint_pos499(X,Y) get_csv_uint((X),(Y),499)
+#define get_csv_ullong_pos499(X,Y) get_csv_ullong((X),(Y),499)
+#define get_csv_ip_pos499(X,Y) get_csv_ip((X),(Y),499)
+#define get_csv_ipv6_pos499(X,Y) get_csv_ipv6((X),(Y),499)
+#define get_csv_string_pos499(X,Y) get_csv_string((X),(Y),499)
+#define get_csv_v_str_pos499(X,Y) get_csv_string((X),(Y),499)
+#define get_csv_bool_pos499(X,Y) get_csv_bool((X),(Y),499)
+#define get_csv_int_pos499(X,Y) get_csv_int((X),(Y),499)
+#define get_csv_llong_pos499(X,Y) get_csv_llong((X),(Y),499)
+#define get_csv_float_pos499(X,Y) get_csv_float((X),(Y),499)
+#define get_csv_uint_pos500(X,Y) get_csv_uint((X),(Y),500)
+#define get_csv_ullong_pos500(X,Y) get_csv_ullong((X),(Y),500)
+#define get_csv_ip_pos500(X,Y) get_csv_ip((X),(Y),500)
+#define get_csv_ipv6_pos500(X,Y) get_csv_ipv6((X),(Y),500)
+#define get_csv_string_pos500(X,Y) get_csv_string((X),(Y),500)
+#define get_csv_v_str_pos500(X,Y) get_csv_string((X),(Y),500)
+#define get_csv_bool_pos500(X,Y) get_csv_bool((X),(Y),500)
+#define get_csv_int_pos500(X,Y) get_csv_int((X),(Y),500)
+#define get_csv_llong_pos500(X,Y) get_csv_llong((X),(Y),500)
+#define get_csv_float_pos500(X,Y) get_csv_float((X),(Y),500)
+#define get_csv_uint_pos501(X,Y) get_csv_uint((X),(Y),501)
+#define get_csv_ullong_pos501(X,Y) get_csv_ullong((X),(Y),501)
+#define get_csv_ip_pos501(X,Y) get_csv_ip((X),(Y),501)
+#define get_csv_ipv6_pos501(X,Y) get_csv_ipv6((X),(Y),501)
+#define get_csv_string_pos501(X,Y) get_csv_string((X),(Y),501)
+#define get_csv_v_str_pos501(X,Y) get_csv_string((X),(Y),501)
+#define get_csv_bool_pos501(X,Y) get_csv_bool((X),(Y),501)
+#define get_csv_int_pos501(X,Y) get_csv_int((X),(Y),501)
+#define get_csv_llong_pos501(X,Y) get_csv_llong((X),(Y),501)
+#define get_csv_float_pos501(X,Y) get_csv_float((X),(Y),501)
+#define get_csv_uint_pos502(X,Y) get_csv_uint((X),(Y),502)
+#define get_csv_ullong_pos502(X,Y) get_csv_ullong((X),(Y),502)
+#define get_csv_ip_pos502(X,Y) get_csv_ip((X),(Y),502)
+#define get_csv_ipv6_pos502(X,Y) get_csv_ipv6((X),(Y),502)
+#define get_csv_string_pos502(X,Y) get_csv_string((X),(Y),502)
+#define get_csv_v_str_pos502(X,Y) get_csv_string((X),(Y),502)
+#define get_csv_bool_pos502(X,Y) get_csv_bool((X),(Y),502)
+#define get_csv_int_pos502(X,Y) get_csv_int((X),(Y),502)
+#define get_csv_llong_pos502(X,Y) get_csv_llong((X),(Y),502)
+#define get_csv_float_pos502(X,Y) get_csv_float((X),(Y),502)
+#define get_csv_uint_pos503(X,Y) get_csv_uint((X),(Y),503)
+#define get_csv_ullong_pos503(X,Y) get_csv_ullong((X),(Y),503)
+#define get_csv_ip_pos503(X,Y) get_csv_ip((X),(Y),503)
+#define get_csv_ipv6_pos503(X,Y) get_csv_ipv6((X),(Y),503)
+#define get_csv_string_pos503(X,Y) get_csv_string((X),(Y),503)
+#define get_csv_v_str_pos503(X,Y) get_csv_string((X),(Y),503)
+#define get_csv_bool_pos503(X,Y) get_csv_bool((X),(Y),503)
+#define get_csv_int_pos503(X,Y) get_csv_int((X),(Y),503)
+#define get_csv_llong_pos503(X,Y) get_csv_llong((X),(Y),503)
+#define get_csv_float_pos503(X,Y) get_csv_float((X),(Y),503)
+#define get_csv_uint_pos504(X,Y) get_csv_uint((X),(Y),504)
+#define get_csv_ullong_pos504(X,Y) get_csv_ullong((X),(Y),504)
+#define get_csv_ip_pos504(X,Y) get_csv_ip((X),(Y),504)
+#define get_csv_ipv6_pos504(X,Y) get_csv_ipv6((X),(Y),504)
+#define get_csv_string_pos504(X,Y) get_csv_string((X),(Y),504)
+#define get_csv_v_str_pos504(X,Y) get_csv_string((X),(Y),504)
+#define get_csv_bool_pos504(X,Y) get_csv_bool((X),(Y),504)
+#define get_csv_int_pos504(X,Y) get_csv_int((X),(Y),504)
+#define get_csv_llong_pos504(X,Y) get_csv_llong((X),(Y),504)
+#define get_csv_float_pos504(X,Y) get_csv_float((X),(Y),504)
+#define get_csv_uint_pos505(X,Y) get_csv_uint((X),(Y),505)
+#define get_csv_ullong_pos505(X,Y) get_csv_ullong((X),(Y),505)
+#define get_csv_ip_pos505(X,Y) get_csv_ip((X),(Y),505)
+#define get_csv_ipv6_pos505(X,Y) get_csv_ipv6((X),(Y),505)
+#define get_csv_string_pos505(X,Y) get_csv_string((X),(Y),505)
+#define get_csv_v_str_pos505(X,Y) get_csv_string((X),(Y),505)
+#define get_csv_bool_pos505(X,Y) get_csv_bool((X),(Y),505)
+#define get_csv_int_pos505(X,Y) get_csv_int((X),(Y),505)
+#define get_csv_llong_pos505(X,Y) get_csv_llong((X),(Y),505)
+#define get_csv_float_pos505(X,Y) get_csv_float((X),(Y),505)
+#define get_csv_uint_pos506(X,Y) get_csv_uint((X),(Y),506)
+#define get_csv_ullong_pos506(X,Y) get_csv_ullong((X),(Y),506)
+#define get_csv_ip_pos506(X,Y) get_csv_ip((X),(Y),506)
+#define get_csv_ipv6_pos506(X,Y) get_csv_ipv6((X),(Y),506)
+#define get_csv_string_pos506(X,Y) get_csv_string((X),(Y),506)
+#define get_csv_v_str_pos506(X,Y) get_csv_string((X),(Y),506)
+#define get_csv_bool_pos506(X,Y) get_csv_bool((X),(Y),506)
+#define get_csv_int_pos506(X,Y) get_csv_int((X),(Y),506)
+#define get_csv_llong_pos506(X,Y) get_csv_llong((X),(Y),506)
+#define get_csv_float_pos506(X,Y) get_csv_float((X),(Y),506)
+#define get_csv_uint_pos507(X,Y) get_csv_uint((X),(Y),507)
+#define get_csv_ullong_pos507(X,Y) get_csv_ullong((X),(Y),507)
+#define get_csv_ip_pos507(X,Y) get_csv_ip((X),(Y),507)
+#define get_csv_ipv6_pos507(X,Y) get_csv_ipv6((X),(Y),507)
+#define get_csv_string_pos507(X,Y) get_csv_string((X),(Y),507)
+#define get_csv_v_str_pos507(X,Y) get_csv_string((X),(Y),507)
+#define get_csv_bool_pos507(X,Y) get_csv_bool((X),(Y),507)
+#define get_csv_int_pos507(X,Y) get_csv_int((X),(Y),507)
+#define get_csv_llong_pos507(X,Y) get_csv_llong((X),(Y),507)
+#define get_csv_float_pos507(X,Y) get_csv_float((X),(Y),507)
+#define get_csv_uint_pos508(X,Y) get_csv_uint((X),(Y),508)
+#define get_csv_ullong_pos508(X,Y) get_csv_ullong((X),(Y),508)
+#define get_csv_ip_pos508(X,Y) get_csv_ip((X),(Y),508)
+#define get_csv_ipv6_pos508(X,Y) get_csv_ipv6((X),(Y),508)
+#define get_csv_string_pos508(X,Y) get_csv_string((X),(Y),508)
+#define get_csv_v_str_pos508(X,Y) get_csv_string((X),(Y),508)
+#define get_csv_bool_pos508(X,Y) get_csv_bool((X),(Y),508)
+#define get_csv_int_pos508(X,Y) get_csv_int((X),(Y),508)
+#define get_csv_llong_pos508(X,Y) get_csv_llong((X),(Y),508)
+#define get_csv_float_pos508(X,Y) get_csv_float((X),(Y),508)
+#define get_csv_uint_pos509(X,Y) get_csv_uint((X),(Y),509)
+#define get_csv_ullong_pos509(X,Y) get_csv_ullong((X),(Y),509)
+#define get_csv_ip_pos509(X,Y) get_csv_ip((X),(Y),509)
+#define get_csv_ipv6_pos509(X,Y) get_csv_ipv6((X),(Y),509)
+#define get_csv_string_pos509(X,Y) get_csv_string((X),(Y),509)
+#define get_csv_v_str_pos509(X,Y) get_csv_string((X),(Y),509)
+#define get_csv_bool_pos509(X,Y) get_csv_bool((X),(Y),509)
+#define get_csv_int_pos509(X,Y) get_csv_int((X),(Y),509)
+#define get_csv_llong_pos509(X,Y) get_csv_llong((X),(Y),509)
+#define get_csv_float_pos509(X,Y) get_csv_float((X),(Y),509)
+#define get_csv_uint_pos510(X,Y) get_csv_uint((X),(Y),510)
+#define get_csv_ullong_pos510(X,Y) get_csv_ullong((X),(Y),510)
+#define get_csv_ip_pos510(X,Y) get_csv_ip((X),(Y),510)
+#define get_csv_ipv6_pos510(X,Y) get_csv_ipv6((X),(Y),510)
+#define get_csv_string_pos510(X,Y) get_csv_string((X),(Y),510)
+#define get_csv_v_str_pos510(X,Y) get_csv_string((X),(Y),510)
+#define get_csv_bool_pos510(X,Y) get_csv_bool((X),(Y),510)
+#define get_csv_int_pos510(X,Y) get_csv_int((X),(Y),510)
+#define get_csv_llong_pos510(X,Y) get_csv_llong((X),(Y),510)
+#define get_csv_float_pos510(X,Y) get_csv_float((X),(Y),510)
+#define get_csv_uint_pos511(X,Y) get_csv_uint((X),(Y),511)
+#define get_csv_ullong_pos511(X,Y) get_csv_ullong((X),(Y),511)
+#define get_csv_ip_pos511(X,Y) get_csv_ip((X),(Y),511)
+#define get_csv_ipv6_pos511(X,Y) get_csv_ipv6((X),(Y),511)
+#define get_csv_string_pos511(X,Y) get_csv_string((X),(Y),511)
+#define get_csv_v_str_pos511(X,Y) get_csv_string((X),(Y),511)
+#define get_csv_bool_pos511(X,Y) get_csv_bool((X),(Y),511)
+#define get_csv_int_pos511(X,Y) get_csv_int((X),(Y),511)
+#define get_csv_llong_pos511(X,Y) get_csv_llong((X),(Y),511)
+#define get_csv_float_pos511(X,Y) get_csv_float((X),(Y),511)
+#define get_csv_uint_pos512(X,Y) get_csv_uint((X),(Y),512)
+#define get_csv_ullong_pos512(X,Y) get_csv_ullong((X),(Y),512)
+#define get_csv_ip_pos512(X,Y) get_csv_ip((X),(Y),512)
+#define get_csv_ipv6_pos512(X,Y) get_csv_ipv6((X),(Y),512)
+#define get_csv_string_pos512(X,Y) get_csv_string((X),(Y),512)
+#define get_csv_v_str_pos512(X,Y) get_csv_string((X),(Y),512)
+#define get_csv_bool_pos512(X,Y) get_csv_bool((X),(Y),512)
+#define get_csv_int_pos512(X,Y) get_csv_int((X),(Y),512)
+#define get_csv_llong_pos512(X,Y) get_csv_llong((X),(Y),512)
+#define get_csv_float_pos512(X,Y) get_csv_float((X),(Y),512)
+#define get_csv_uint_pos513(X,Y) get_csv_uint((X),(Y),513)
+#define get_csv_ullong_pos513(X,Y) get_csv_ullong((X),(Y),513)
+#define get_csv_ip_pos513(X,Y) get_csv_ip((X),(Y),513)
+#define get_csv_ipv6_pos513(X,Y) get_csv_ipv6((X),(Y),513)
+#define get_csv_string_pos513(X,Y) get_csv_string((X),(Y),513)
+#define get_csv_v_str_pos513(X,Y) get_csv_string((X),(Y),513)
+#define get_csv_bool_pos513(X,Y) get_csv_bool((X),(Y),513)
+#define get_csv_int_pos513(X,Y) get_csv_int((X),(Y),513)
+#define get_csv_llong_pos513(X,Y) get_csv_llong((X),(Y),513)
+#define get_csv_float_pos513(X,Y) get_csv_float((X),(Y),513)
+#define get_csv_uint_pos514(X,Y) get_csv_uint((X),(Y),514)
+#define get_csv_ullong_pos514(X,Y) get_csv_ullong((X),(Y),514)
+#define get_csv_ip_pos514(X,Y) get_csv_ip((X),(Y),514)
+#define get_csv_ipv6_pos514(X,Y) get_csv_ipv6((X),(Y),514)
+#define get_csv_string_pos514(X,Y) get_csv_string((X),(Y),514)
+#define get_csv_v_str_pos514(X,Y) get_csv_string((X),(Y),514)
+#define get_csv_bool_pos514(X,Y) get_csv_bool((X),(Y),514)
+#define get_csv_int_pos514(X,Y) get_csv_int((X),(Y),514)
+#define get_csv_llong_pos514(X,Y) get_csv_llong((X),(Y),514)
+#define get_csv_float_pos514(X,Y) get_csv_float((X),(Y),514)
+#define get_csv_uint_pos515(X,Y) get_csv_uint((X),(Y),515)
+#define get_csv_ullong_pos515(X,Y) get_csv_ullong((X),(Y),515)
+#define get_csv_ip_pos515(X,Y) get_csv_ip((X),(Y),515)
+#define get_csv_ipv6_pos515(X,Y) get_csv_ipv6((X),(Y),515)
+#define get_csv_string_pos515(X,Y) get_csv_string((X),(Y),515)
+#define get_csv_v_str_pos515(X,Y) get_csv_string((X),(Y),515)
+#define get_csv_bool_pos515(X,Y) get_csv_bool((X),(Y),515)
+#define get_csv_int_pos515(X,Y) get_csv_int((X),(Y),515)
+#define get_csv_llong_pos515(X,Y) get_csv_llong((X),(Y),515)
+#define get_csv_float_pos515(X,Y) get_csv_float((X),(Y),515)
+#define get_csv_uint_pos516(X,Y) get_csv_uint((X),(Y),516)
+#define get_csv_ullong_pos516(X,Y) get_csv_ullong((X),(Y),516)
+#define get_csv_ip_pos516(X,Y) get_csv_ip((X),(Y),516)
+#define get_csv_ipv6_pos516(X,Y) get_csv_ipv6((X),(Y),516)
+#define get_csv_string_pos516(X,Y) get_csv_string((X),(Y),516)
+#define get_csv_v_str_pos516(X,Y) get_csv_string((X),(Y),516)
+#define get_csv_bool_pos516(X,Y) get_csv_bool((X),(Y),516)
+#define get_csv_int_pos516(X,Y) get_csv_int((X),(Y),516)
+#define get_csv_llong_pos516(X,Y) get_csv_llong((X),(Y),516)
+#define get_csv_float_pos516(X,Y) get_csv_float((X),(Y),516)
+#define get_csv_uint_pos517(X,Y) get_csv_uint((X),(Y),517)
+#define get_csv_ullong_pos517(X,Y) get_csv_ullong((X),(Y),517)
+#define get_csv_ip_pos517(X,Y) get_csv_ip((X),(Y),517)
+#define get_csv_ipv6_pos517(X,Y) get_csv_ipv6((X),(Y),517)
+#define get_csv_string_pos517(X,Y) get_csv_string((X),(Y),517)
+#define get_csv_v_str_pos517(X,Y) get_csv_string((X),(Y),517)
+#define get_csv_bool_pos517(X,Y) get_csv_bool((X),(Y),517)
+#define get_csv_int_pos517(X,Y) get_csv_int((X),(Y),517)
+#define get_csv_llong_pos517(X,Y) get_csv_llong((X),(Y),517)
+#define get_csv_float_pos517(X,Y) get_csv_float((X),(Y),517)
+#define get_csv_uint_pos518(X,Y) get_csv_uint((X),(Y),518)
+#define get_csv_ullong_pos518(X,Y) get_csv_ullong((X),(Y),518)
+#define get_csv_ip_pos518(X,Y) get_csv_ip((X),(Y),518)
+#define get_csv_ipv6_pos518(X,Y) get_csv_ipv6((X),(Y),518)
+#define get_csv_string_pos518(X,Y) get_csv_string((X),(Y),518)
+#define get_csv_v_str_pos518(X,Y) get_csv_string((X),(Y),518)
+#define get_csv_bool_pos518(X,Y) get_csv_bool((X),(Y),518)
+#define get_csv_int_pos518(X,Y) get_csv_int((X),(Y),518)
+#define get_csv_llong_pos518(X,Y) get_csv_llong((X),(Y),518)
+#define get_csv_float_pos518(X,Y) get_csv_float((X),(Y),518)
+#define get_csv_uint_pos519(X,Y) get_csv_uint((X),(Y),519)
+#define get_csv_ullong_pos519(X,Y) get_csv_ullong((X),(Y),519)
+#define get_csv_ip_pos519(X,Y) get_csv_ip((X),(Y),519)
+#define get_csv_ipv6_pos519(X,Y) get_csv_ipv6((X),(Y),519)
+#define get_csv_string_pos519(X,Y) get_csv_string((X),(Y),519)
+#define get_csv_v_str_pos519(X,Y) get_csv_string((X),(Y),519)
+#define get_csv_bool_pos519(X,Y) get_csv_bool((X),(Y),519)
+#define get_csv_int_pos519(X,Y) get_csv_int((X),(Y),519)
+#define get_csv_llong_pos519(X,Y) get_csv_llong((X),(Y),519)
+#define get_csv_float_pos519(X,Y) get_csv_float((X),(Y),519)
+#define get_csv_uint_pos520(X,Y) get_csv_uint((X),(Y),520)
+#define get_csv_ullong_pos520(X,Y) get_csv_ullong((X),(Y),520)
+#define get_csv_ip_pos520(X,Y) get_csv_ip((X),(Y),520)
+#define get_csv_ipv6_pos520(X,Y) get_csv_ipv6((X),(Y),520)
+#define get_csv_string_pos520(X,Y) get_csv_string((X),(Y),520)
+#define get_csv_v_str_pos520(X,Y) get_csv_string((X),(Y),520)
+#define get_csv_bool_pos520(X,Y) get_csv_bool((X),(Y),520)
+#define get_csv_int_pos520(X,Y) get_csv_int((X),(Y),520)
+#define get_csv_llong_pos520(X,Y) get_csv_llong((X),(Y),520)
+#define get_csv_float_pos520(X,Y) get_csv_float((X),(Y),520)
+#define get_csv_uint_pos521(X,Y) get_csv_uint((X),(Y),521)
+#define get_csv_ullong_pos521(X,Y) get_csv_ullong((X),(Y),521)
+#define get_csv_ip_pos521(X,Y) get_csv_ip((X),(Y),521)
+#define get_csv_ipv6_pos521(X,Y) get_csv_ipv6((X),(Y),521)
+#define get_csv_string_pos521(X,Y) get_csv_string((X),(Y),521)
+#define get_csv_v_str_pos521(X,Y) get_csv_string((X),(Y),521)
+#define get_csv_bool_pos521(X,Y) get_csv_bool((X),(Y),521)
+#define get_csv_int_pos521(X,Y) get_csv_int((X),(Y),521)
+#define get_csv_llong_pos521(X,Y) get_csv_llong((X),(Y),521)
+#define get_csv_float_pos521(X,Y) get_csv_float((X),(Y),521)
+#define get_csv_uint_pos522(X,Y) get_csv_uint((X),(Y),522)
+#define get_csv_ullong_pos522(X,Y) get_csv_ullong((X),(Y),522)
+#define get_csv_ip_pos522(X,Y) get_csv_ip((X),(Y),522)
+#define get_csv_ipv6_pos522(X,Y) get_csv_ipv6((X),(Y),522)
+#define get_csv_string_pos522(X,Y) get_csv_string((X),(Y),522)
+#define get_csv_v_str_pos522(X,Y) get_csv_string((X),(Y),522)
+#define get_csv_bool_pos522(X,Y) get_csv_bool((X),(Y),522)
+#define get_csv_int_pos522(X,Y) get_csv_int((X),(Y),522)
+#define get_csv_llong_pos522(X,Y) get_csv_llong((X),(Y),522)
+#define get_csv_float_pos522(X,Y) get_csv_float((X),(Y),522)
+#define get_csv_uint_pos523(X,Y) get_csv_uint((X),(Y),523)
+#define get_csv_ullong_pos523(X,Y) get_csv_ullong((X),(Y),523)
+#define get_csv_ip_pos523(X,Y) get_csv_ip((X),(Y),523)
+#define get_csv_ipv6_pos523(X,Y) get_csv_ipv6((X),(Y),523)
+#define get_csv_string_pos523(X,Y) get_csv_string((X),(Y),523)
+#define get_csv_v_str_pos523(X,Y) get_csv_string((X),(Y),523)
+#define get_csv_bool_pos523(X,Y) get_csv_bool((X),(Y),523)
+#define get_csv_int_pos523(X,Y) get_csv_int((X),(Y),523)
+#define get_csv_llong_pos523(X,Y) get_csv_llong((X),(Y),523)
+#define get_csv_float_pos523(X,Y) get_csv_float((X),(Y),523)
+#define get_csv_uint_pos524(X,Y) get_csv_uint((X),(Y),524)
+#define get_csv_ullong_pos524(X,Y) get_csv_ullong((X),(Y),524)
+#define get_csv_ip_pos524(X,Y) get_csv_ip((X),(Y),524)
+#define get_csv_ipv6_pos524(X,Y) get_csv_ipv6((X),(Y),524)
+#define get_csv_string_pos524(X,Y) get_csv_string((X),(Y),524)
+#define get_csv_v_str_pos524(X,Y) get_csv_string((X),(Y),524)
+#define get_csv_bool_pos524(X,Y) get_csv_bool((X),(Y),524)
+#define get_csv_int_pos524(X,Y) get_csv_int((X),(Y),524)
+#define get_csv_llong_pos524(X,Y) get_csv_llong((X),(Y),524)
+#define get_csv_float_pos524(X,Y) get_csv_float((X),(Y),524)
+#define get_csv_uint_pos525(X,Y) get_csv_uint((X),(Y),525)
+#define get_csv_ullong_pos525(X,Y) get_csv_ullong((X),(Y),525)
+#define get_csv_ip_pos525(X,Y) get_csv_ip((X),(Y),525)
+#define get_csv_ipv6_pos525(X,Y) get_csv_ipv6((X),(Y),525)
+#define get_csv_string_pos525(X,Y) get_csv_string((X),(Y),525)
+#define get_csv_v_str_pos525(X,Y) get_csv_string((X),(Y),525)
+#define get_csv_bool_pos525(X,Y) get_csv_bool((X),(Y),525)
+#define get_csv_int_pos525(X,Y) get_csv_int((X),(Y),525)
+#define get_csv_llong_pos525(X,Y) get_csv_llong((X),(Y),525)
+#define get_csv_float_pos525(X,Y) get_csv_float((X),(Y),525)
+#define get_csv_uint_pos526(X,Y) get_csv_uint((X),(Y),526)
+#define get_csv_ullong_pos526(X,Y) get_csv_ullong((X),(Y),526)
+#define get_csv_ip_pos526(X,Y) get_csv_ip((X),(Y),526)
+#define get_csv_ipv6_pos526(X,Y) get_csv_ipv6((X),(Y),526)
+#define get_csv_string_pos526(X,Y) get_csv_string((X),(Y),526)
+#define get_csv_v_str_pos526(X,Y) get_csv_string((X),(Y),526)
+#define get_csv_bool_pos526(X,Y) get_csv_bool((X),(Y),526)
+#define get_csv_int_pos526(X,Y) get_csv_int((X),(Y),526)
+#define get_csv_llong_pos526(X,Y) get_csv_llong((X),(Y),526)
+#define get_csv_float_pos526(X,Y) get_csv_float((X),(Y),526)
+#define get_csv_uint_pos527(X,Y) get_csv_uint((X),(Y),527)
+#define get_csv_ullong_pos527(X,Y) get_csv_ullong((X),(Y),527)
+#define get_csv_ip_pos527(X,Y) get_csv_ip((X),(Y),527)
+#define get_csv_ipv6_pos527(X,Y) get_csv_ipv6((X),(Y),527)
+#define get_csv_string_pos527(X,Y) get_csv_string((X),(Y),527)
+#define get_csv_v_str_pos527(X,Y) get_csv_string((X),(Y),527)
+#define get_csv_bool_pos527(X,Y) get_csv_bool((X),(Y),527)
+#define get_csv_int_pos527(X,Y) get_csv_int((X),(Y),527)
+#define get_csv_llong_pos527(X,Y) get_csv_llong((X),(Y),527)
+#define get_csv_float_pos527(X,Y) get_csv_float((X),(Y),527)
+#define get_csv_uint_pos528(X,Y) get_csv_uint((X),(Y),528)
+#define get_csv_ullong_pos528(X,Y) get_csv_ullong((X),(Y),528)
+#define get_csv_ip_pos528(X,Y) get_csv_ip((X),(Y),528)
+#define get_csv_ipv6_pos528(X,Y) get_csv_ipv6((X),(Y),528)
+#define get_csv_string_pos528(X,Y) get_csv_string((X),(Y),528)
+#define get_csv_v_str_pos528(X,Y) get_csv_string((X),(Y),528)
+#define get_csv_bool_pos528(X,Y) get_csv_bool((X),(Y),528)
+#define get_csv_int_pos528(X,Y) get_csv_int((X),(Y),528)
+#define get_csv_llong_pos528(X,Y) get_csv_llong((X),(Y),528)
+#define get_csv_float_pos528(X,Y) get_csv_float((X),(Y),528)
+#define get_csv_uint_pos529(X,Y) get_csv_uint((X),(Y),529)
+#define get_csv_ullong_pos529(X,Y) get_csv_ullong((X),(Y),529)
+#define get_csv_ip_pos529(X,Y) get_csv_ip((X),(Y),529)
+#define get_csv_ipv6_pos529(X,Y) get_csv_ipv6((X),(Y),529)
+#define get_csv_string_pos529(X,Y) get_csv_string((X),(Y),529)
+#define get_csv_v_str_pos529(X,Y) get_csv_string((X),(Y),529)
+#define get_csv_bool_pos529(X,Y) get_csv_bool((X),(Y),529)
+#define get_csv_int_pos529(X,Y) get_csv_int((X),(Y),529)
+#define get_csv_llong_pos529(X,Y) get_csv_llong((X),(Y),529)
+#define get_csv_float_pos529(X,Y) get_csv_float((X),(Y),529)
+#define get_csv_uint_pos530(X,Y) get_csv_uint((X),(Y),530)
+#define get_csv_ullong_pos530(X,Y) get_csv_ullong((X),(Y),530)
+#define get_csv_ip_pos530(X,Y) get_csv_ip((X),(Y),530)
+#define get_csv_ipv6_pos530(X,Y) get_csv_ipv6((X),(Y),530)
+#define get_csv_string_pos530(X,Y) get_csv_string((X),(Y),530)
+#define get_csv_v_str_pos530(X,Y) get_csv_string((X),(Y),530)
+#define get_csv_bool_pos530(X,Y) get_csv_bool((X),(Y),530)
+#define get_csv_int_pos530(X,Y) get_csv_int((X),(Y),530)
+#define get_csv_llong_pos530(X,Y) get_csv_llong((X),(Y),530)
+#define get_csv_float_pos530(X,Y) get_csv_float((X),(Y),530)
+#define get_csv_uint_pos531(X,Y) get_csv_uint((X),(Y),531)
+#define get_csv_ullong_pos531(X,Y) get_csv_ullong((X),(Y),531)
+#define get_csv_ip_pos531(X,Y) get_csv_ip((X),(Y),531)
+#define get_csv_ipv6_pos531(X,Y) get_csv_ipv6((X),(Y),531)
+#define get_csv_string_pos531(X,Y) get_csv_string((X),(Y),531)
+#define get_csv_v_str_pos531(X,Y) get_csv_string((X),(Y),531)
+#define get_csv_bool_pos531(X,Y) get_csv_bool((X),(Y),531)
+#define get_csv_int_pos531(X,Y) get_csv_int((X),(Y),531)
+#define get_csv_llong_pos531(X,Y) get_csv_llong((X),(Y),531)
+#define get_csv_float_pos531(X,Y) get_csv_float((X),(Y),531)
+#define get_csv_uint_pos532(X,Y) get_csv_uint((X),(Y),532)
+#define get_csv_ullong_pos532(X,Y) get_csv_ullong((X),(Y),532)
+#define get_csv_ip_pos532(X,Y) get_csv_ip((X),(Y),532)
+#define get_csv_ipv6_pos532(X,Y) get_csv_ipv6((X),(Y),532)
+#define get_csv_string_pos532(X,Y) get_csv_string((X),(Y),532)
+#define get_csv_v_str_pos532(X,Y) get_csv_string((X),(Y),532)
+#define get_csv_bool_pos532(X,Y) get_csv_bool((X),(Y),532)
+#define get_csv_int_pos532(X,Y) get_csv_int((X),(Y),532)
+#define get_csv_llong_pos532(X,Y) get_csv_llong((X),(Y),532)
+#define get_csv_float_pos532(X,Y) get_csv_float((X),(Y),532)
+#define get_csv_uint_pos533(X,Y) get_csv_uint((X),(Y),533)
+#define get_csv_ullong_pos533(X,Y) get_csv_ullong((X),(Y),533)
+#define get_csv_ip_pos533(X,Y) get_csv_ip((X),(Y),533)
+#define get_csv_ipv6_pos533(X,Y) get_csv_ipv6((X),(Y),533)
+#define get_csv_string_pos533(X,Y) get_csv_string((X),(Y),533)
+#define get_csv_v_str_pos533(X,Y) get_csv_string((X),(Y),533)
+#define get_csv_bool_pos533(X,Y) get_csv_bool((X),(Y),533)
+#define get_csv_int_pos533(X,Y) get_csv_int((X),(Y),533)
+#define get_csv_llong_pos533(X,Y) get_csv_llong((X),(Y),533)
+#define get_csv_float_pos533(X,Y) get_csv_float((X),(Y),533)
+#define get_csv_uint_pos534(X,Y) get_csv_uint((X),(Y),534)
+#define get_csv_ullong_pos534(X,Y) get_csv_ullong((X),(Y),534)
+#define get_csv_ip_pos534(X,Y) get_csv_ip((X),(Y),534)
+#define get_csv_ipv6_pos534(X,Y) get_csv_ipv6((X),(Y),534)
+#define get_csv_string_pos534(X,Y) get_csv_string((X),(Y),534)
+#define get_csv_v_str_pos534(X,Y) get_csv_string((X),(Y),534)
+#define get_csv_bool_pos534(X,Y) get_csv_bool((X),(Y),534)
+#define get_csv_int_pos534(X,Y) get_csv_int((X),(Y),534)
+#define get_csv_llong_pos534(X,Y) get_csv_llong((X),(Y),534)
+#define get_csv_float_pos534(X,Y) get_csv_float((X),(Y),534)
+#define get_csv_uint_pos535(X,Y) get_csv_uint((X),(Y),535)
+#define get_csv_ullong_pos535(X,Y) get_csv_ullong((X),(Y),535)
+#define get_csv_ip_pos535(X,Y) get_csv_ip((X),(Y),535)
+#define get_csv_ipv6_pos535(X,Y) get_csv_ipv6((X),(Y),535)
+#define get_csv_string_pos535(X,Y) get_csv_string((X),(Y),535)
+#define get_csv_v_str_pos535(X,Y) get_csv_string((X),(Y),535)
+#define get_csv_bool_pos535(X,Y) get_csv_bool((X),(Y),535)
+#define get_csv_int_pos535(X,Y) get_csv_int((X),(Y),535)
+#define get_csv_llong_pos535(X,Y) get_csv_llong((X),(Y),535)
+#define get_csv_float_pos535(X,Y) get_csv_float((X),(Y),535)
+#define get_csv_uint_pos536(X,Y) get_csv_uint((X),(Y),536)
+#define get_csv_ullong_pos536(X,Y) get_csv_ullong((X),(Y),536)
+#define get_csv_ip_pos536(X,Y) get_csv_ip((X),(Y),536)
+#define get_csv_ipv6_pos536(X,Y) get_csv_ipv6((X),(Y),536)
+#define get_csv_string_pos536(X,Y) get_csv_string((X),(Y),536)
+#define get_csv_v_str_pos536(X,Y) get_csv_string((X),(Y),536)
+#define get_csv_bool_pos536(X,Y) get_csv_bool((X),(Y),536)
+#define get_csv_int_pos536(X,Y) get_csv_int((X),(Y),536)
+#define get_csv_llong_pos536(X,Y) get_csv_llong((X),(Y),536)
+#define get_csv_float_pos536(X,Y) get_csv_float((X),(Y),536)
+#define get_csv_uint_pos537(X,Y) get_csv_uint((X),(Y),537)
+#define get_csv_ullong_pos537(X,Y) get_csv_ullong((X),(Y),537)
+#define get_csv_ip_pos537(X,Y) get_csv_ip((X),(Y),537)
+#define get_csv_ipv6_pos537(X,Y) get_csv_ipv6((X),(Y),537)
+#define get_csv_string_pos537(X,Y) get_csv_string((X),(Y),537)
+#define get_csv_v_str_pos537(X,Y) get_csv_string((X),(Y),537)
+#define get_csv_bool_pos537(X,Y) get_csv_bool((X),(Y),537)
+#define get_csv_int_pos537(X,Y) get_csv_int((X),(Y),537)
+#define get_csv_llong_pos537(X,Y) get_csv_llong((X),(Y),537)
+#define get_csv_float_pos537(X,Y) get_csv_float((X),(Y),537)
+#define get_csv_uint_pos538(X,Y) get_csv_uint((X),(Y),538)
+#define get_csv_ullong_pos538(X,Y) get_csv_ullong((X),(Y),538)
+#define get_csv_ip_pos538(X,Y) get_csv_ip((X),(Y),538)
+#define get_csv_ipv6_pos538(X,Y) get_csv_ipv6((X),(Y),538)
+#define get_csv_string_pos538(X,Y) get_csv_string((X),(Y),538)
+#define get_csv_v_str_pos538(X,Y) get_csv_string((X),(Y),538)
+#define get_csv_bool_pos538(X,Y) get_csv_bool((X),(Y),538)
+#define get_csv_int_pos538(X,Y) get_csv_int((X),(Y),538)
+#define get_csv_llong_pos538(X,Y) get_csv_llong((X),(Y),538)
+#define get_csv_float_pos538(X,Y) get_csv_float((X),(Y),538)
+#define get_csv_uint_pos539(X,Y) get_csv_uint((X),(Y),539)
+#define get_csv_ullong_pos539(X,Y) get_csv_ullong((X),(Y),539)
+#define get_csv_ip_pos539(X,Y) get_csv_ip((X),(Y),539)
+#define get_csv_ipv6_pos539(X,Y) get_csv_ipv6((X),(Y),539)
+#define get_csv_string_pos539(X,Y) get_csv_string((X),(Y),539)
+#define get_csv_v_str_pos539(X,Y) get_csv_string((X),(Y),539)
+#define get_csv_bool_pos539(X,Y) get_csv_bool((X),(Y),539)
+#define get_csv_int_pos539(X,Y) get_csv_int((X),(Y),539)
+#define get_csv_llong_pos539(X,Y) get_csv_llong((X),(Y),539)
+#define get_csv_float_pos539(X,Y) get_csv_float((X),(Y),539)
+#define get_csv_uint_pos540(X,Y) get_csv_uint((X),(Y),540)
+#define get_csv_ullong_pos540(X,Y) get_csv_ullong((X),(Y),540)
+#define get_csv_ip_pos540(X,Y) get_csv_ip((X),(Y),540)
+#define get_csv_ipv6_pos540(X,Y) get_csv_ipv6((X),(Y),540)
+#define get_csv_string_pos540(X,Y) get_csv_string((X),(Y),540)
+#define get_csv_v_str_pos540(X,Y) get_csv_string((X),(Y),540)
+#define get_csv_bool_pos540(X,Y) get_csv_bool((X),(Y),540)
+#define get_csv_int_pos540(X,Y) get_csv_int((X),(Y),540)
+#define get_csv_llong_pos540(X,Y) get_csv_llong((X),(Y),540)
+#define get_csv_float_pos540(X,Y) get_csv_float((X),(Y),540)
+#define get_csv_uint_pos541(X,Y) get_csv_uint((X),(Y),541)
+#define get_csv_ullong_pos541(X,Y) get_csv_ullong((X),(Y),541)
+#define get_csv_ip_pos541(X,Y) get_csv_ip((X),(Y),541)
+#define get_csv_ipv6_pos541(X,Y) get_csv_ipv6((X),(Y),541)
+#define get_csv_string_pos541(X,Y) get_csv_string((X),(Y),541)
+#define get_csv_v_str_pos541(X,Y) get_csv_string((X),(Y),541)
+#define get_csv_bool_pos541(X,Y) get_csv_bool((X),(Y),541)
+#define get_csv_int_pos541(X,Y) get_csv_int((X),(Y),541)
+#define get_csv_llong_pos541(X,Y) get_csv_llong((X),(Y),541)
+#define get_csv_float_pos541(X,Y) get_csv_float((X),(Y),541)
+#define get_csv_uint_pos542(X,Y) get_csv_uint((X),(Y),542)
+#define get_csv_ullong_pos542(X,Y) get_csv_ullong((X),(Y),542)
+#define get_csv_ip_pos542(X,Y) get_csv_ip((X),(Y),542)
+#define get_csv_ipv6_pos542(X,Y) get_csv_ipv6((X),(Y),542)
+#define get_csv_string_pos542(X,Y) get_csv_string((X),(Y),542)
+#define get_csv_v_str_pos542(X,Y) get_csv_string((X),(Y),542)
+#define get_csv_bool_pos542(X,Y) get_csv_bool((X),(Y),542)
+#define get_csv_int_pos542(X,Y) get_csv_int((X),(Y),542)
+#define get_csv_llong_pos542(X,Y) get_csv_llong((X),(Y),542)
+#define get_csv_float_pos542(X,Y) get_csv_float((X),(Y),542)
+#define get_csv_uint_pos543(X,Y) get_csv_uint((X),(Y),543)
+#define get_csv_ullong_pos543(X,Y) get_csv_ullong((X),(Y),543)
+#define get_csv_ip_pos543(X,Y) get_csv_ip((X),(Y),543)
+#define get_csv_ipv6_pos543(X,Y) get_csv_ipv6((X),(Y),543)
+#define get_csv_string_pos543(X,Y) get_csv_string((X),(Y),543)
+#define get_csv_v_str_pos543(X,Y) get_csv_string((X),(Y),543)
+#define get_csv_bool_pos543(X,Y) get_csv_bool((X),(Y),543)
+#define get_csv_int_pos543(X,Y) get_csv_int((X),(Y),543)
+#define get_csv_llong_pos543(X,Y) get_csv_llong((X),(Y),543)
+#define get_csv_float_pos543(X,Y) get_csv_float((X),(Y),543)
+#define get_csv_uint_pos544(X,Y) get_csv_uint((X),(Y),544)
+#define get_csv_ullong_pos544(X,Y) get_csv_ullong((X),(Y),544)
+#define get_csv_ip_pos544(X,Y) get_csv_ip((X),(Y),544)
+#define get_csv_ipv6_pos544(X,Y) get_csv_ipv6((X),(Y),544)
+#define get_csv_string_pos544(X,Y) get_csv_string((X),(Y),544)
+#define get_csv_v_str_pos544(X,Y) get_csv_string((X),(Y),544)
+#define get_csv_bool_pos544(X,Y) get_csv_bool((X),(Y),544)
+#define get_csv_int_pos544(X,Y) get_csv_int((X),(Y),544)
+#define get_csv_llong_pos544(X,Y) get_csv_llong((X),(Y),544)
+#define get_csv_float_pos544(X,Y) get_csv_float((X),(Y),544)
+#define get_csv_uint_pos545(X,Y) get_csv_uint((X),(Y),545)
+#define get_csv_ullong_pos545(X,Y) get_csv_ullong((X),(Y),545)
+#define get_csv_ip_pos545(X,Y) get_csv_ip((X),(Y),545)
+#define get_csv_ipv6_pos545(X,Y) get_csv_ipv6((X),(Y),545)
+#define get_csv_string_pos545(X,Y) get_csv_string((X),(Y),545)
+#define get_csv_v_str_pos545(X,Y) get_csv_string((X),(Y),545)
+#define get_csv_bool_pos545(X,Y) get_csv_bool((X),(Y),545)
+#define get_csv_int_pos545(X,Y) get_csv_int((X),(Y),545)
+#define get_csv_llong_pos545(X,Y) get_csv_llong((X),(Y),545)
+#define get_csv_float_pos545(X,Y) get_csv_float((X),(Y),545)
+#define get_csv_uint_pos546(X,Y) get_csv_uint((X),(Y),546)
+#define get_csv_ullong_pos546(X,Y) get_csv_ullong((X),(Y),546)
+#define get_csv_ip_pos546(X,Y) get_csv_ip((X),(Y),546)
+#define get_csv_ipv6_pos546(X,Y) get_csv_ipv6((X),(Y),546)
+#define get_csv_string_pos546(X,Y) get_csv_string((X),(Y),546)
+#define get_csv_v_str_pos546(X,Y) get_csv_string((X),(Y),546)
+#define get_csv_bool_pos546(X,Y) get_csv_bool((X),(Y),546)
+#define get_csv_int_pos546(X,Y) get_csv_int((X),(Y),546)
+#define get_csv_llong_pos546(X,Y) get_csv_llong((X),(Y),546)
+#define get_csv_float_pos546(X,Y) get_csv_float((X),(Y),546)
+#define get_csv_uint_pos547(X,Y) get_csv_uint((X),(Y),547)
+#define get_csv_ullong_pos547(X,Y) get_csv_ullong((X),(Y),547)
+#define get_csv_ip_pos547(X,Y) get_csv_ip((X),(Y),547)
+#define get_csv_ipv6_pos547(X,Y) get_csv_ipv6((X),(Y),547)
+#define get_csv_string_pos547(X,Y) get_csv_string((X),(Y),547)
+#define get_csv_v_str_pos547(X,Y) get_csv_string((X),(Y),547)
+#define get_csv_bool_pos547(X,Y) get_csv_bool((X),(Y),547)
+#define get_csv_int_pos547(X,Y) get_csv_int((X),(Y),547)
+#define get_csv_llong_pos547(X,Y) get_csv_llong((X),(Y),547)
+#define get_csv_float_pos547(X,Y) get_csv_float((X),(Y),547)
+#define get_csv_uint_pos548(X,Y) get_csv_uint((X),(Y),548)
+#define get_csv_ullong_pos548(X,Y) get_csv_ullong((X),(Y),548)
+#define get_csv_ip_pos548(X,Y) get_csv_ip((X),(Y),548)
+#define get_csv_ipv6_pos548(X,Y) get_csv_ipv6((X),(Y),548)
+#define get_csv_string_pos548(X,Y) get_csv_string((X),(Y),548)
+#define get_csv_v_str_pos548(X,Y) get_csv_string((X),(Y),548)
+#define get_csv_bool_pos548(X,Y) get_csv_bool((X),(Y),548)
+#define get_csv_int_pos548(X,Y) get_csv_int((X),(Y),548)
+#define get_csv_llong_pos548(X,Y) get_csv_llong((X),(Y),548)
+#define get_csv_float_pos548(X,Y) get_csv_float((X),(Y),548)
+#define get_csv_uint_pos549(X,Y) get_csv_uint((X),(Y),549)
+#define get_csv_ullong_pos549(X,Y) get_csv_ullong((X),(Y),549)
+#define get_csv_ip_pos549(X,Y) get_csv_ip((X),(Y),549)
+#define get_csv_ipv6_pos549(X,Y) get_csv_ipv6((X),(Y),549)
+#define get_csv_string_pos549(X,Y) get_csv_string((X),(Y),549)
+#define get_csv_v_str_pos549(X,Y) get_csv_string((X),(Y),549)
+#define get_csv_bool_pos549(X,Y) get_csv_bool((X),(Y),549)
+#define get_csv_int_pos549(X,Y) get_csv_int((X),(Y),549)
+#define get_csv_llong_pos549(X,Y) get_csv_llong((X),(Y),549)
+#define get_csv_float_pos549(X,Y) get_csv_float((X),(Y),549)
+#define get_csv_uint_pos550(X,Y) get_csv_uint((X),(Y),550)
+#define get_csv_ullong_pos550(X,Y) get_csv_ullong((X),(Y),550)
+#define get_csv_ip_pos550(X,Y) get_csv_ip((X),(Y),550)
+#define get_csv_ipv6_pos550(X,Y) get_csv_ipv6((X),(Y),550)
+#define get_csv_string_pos550(X,Y) get_csv_string((X),(Y),550)
+#define get_csv_v_str_pos550(X,Y) get_csv_string((X),(Y),550)
+#define get_csv_bool_pos550(X,Y) get_csv_bool((X),(Y),550)
+#define get_csv_int_pos550(X,Y) get_csv_int((X),(Y),550)
+#define get_csv_llong_pos550(X,Y) get_csv_llong((X),(Y),550)
+#define get_csv_float_pos550(X,Y) get_csv_float((X),(Y),550)
+#define get_csv_uint_pos551(X,Y) get_csv_uint((X),(Y),551)
+#define get_csv_ullong_pos551(X,Y) get_csv_ullong((X),(Y),551)
+#define get_csv_ip_pos551(X,Y) get_csv_ip((X),(Y),551)
+#define get_csv_ipv6_pos551(X,Y) get_csv_ipv6((X),(Y),551)
+#define get_csv_string_pos551(X,Y) get_csv_string((X),(Y),551)
+#define get_csv_v_str_pos551(X,Y) get_csv_string((X),(Y),551)
+#define get_csv_bool_pos551(X,Y) get_csv_bool((X),(Y),551)
+#define get_csv_int_pos551(X,Y) get_csv_int((X),(Y),551)
+#define get_csv_llong_pos551(X,Y) get_csv_llong((X),(Y),551)
+#define get_csv_float_pos551(X,Y) get_csv_float((X),(Y),551)
+#define get_csv_uint_pos552(X,Y) get_csv_uint((X),(Y),552)
+#define get_csv_ullong_pos552(X,Y) get_csv_ullong((X),(Y),552)
+#define get_csv_ip_pos552(X,Y) get_csv_ip((X),(Y),552)
+#define get_csv_ipv6_pos552(X,Y) get_csv_ipv6((X),(Y),552)
+#define get_csv_string_pos552(X,Y) get_csv_string((X),(Y),552)
+#define get_csv_v_str_pos552(X,Y) get_csv_string((X),(Y),552)
+#define get_csv_bool_pos552(X,Y) get_csv_bool((X),(Y),552)
+#define get_csv_int_pos552(X,Y) get_csv_int((X),(Y),552)
+#define get_csv_llong_pos552(X,Y) get_csv_llong((X),(Y),552)
+#define get_csv_float_pos552(X,Y) get_csv_float((X),(Y),552)
+#define get_csv_uint_pos553(X,Y) get_csv_uint((X),(Y),553)
+#define get_csv_ullong_pos553(X,Y) get_csv_ullong((X),(Y),553)
+#define get_csv_ip_pos553(X,Y) get_csv_ip((X),(Y),553)
+#define get_csv_ipv6_pos553(X,Y) get_csv_ipv6((X),(Y),553)
+#define get_csv_string_pos553(X,Y) get_csv_string((X),(Y),553)
+#define get_csv_v_str_pos553(X,Y) get_csv_string((X),(Y),553)
+#define get_csv_bool_pos553(X,Y) get_csv_bool((X),(Y),553)
+#define get_csv_int_pos553(X,Y) get_csv_int((X),(Y),553)
+#define get_csv_llong_pos553(X,Y) get_csv_llong((X),(Y),553)
+#define get_csv_float_pos553(X,Y) get_csv_float((X),(Y),553)
+#define get_csv_uint_pos554(X,Y) get_csv_uint((X),(Y),554)
+#define get_csv_ullong_pos554(X,Y) get_csv_ullong((X),(Y),554)
+#define get_csv_ip_pos554(X,Y) get_csv_ip((X),(Y),554)
+#define get_csv_ipv6_pos554(X,Y) get_csv_ipv6((X),(Y),554)
+#define get_csv_string_pos554(X,Y) get_csv_string((X),(Y),554)
+#define get_csv_v_str_pos554(X,Y) get_csv_string((X),(Y),554)
+#define get_csv_bool_pos554(X,Y) get_csv_bool((X),(Y),554)
+#define get_csv_int_pos554(X,Y) get_csv_int((X),(Y),554)
+#define get_csv_llong_pos554(X,Y) get_csv_llong((X),(Y),554)
+#define get_csv_float_pos554(X,Y) get_csv_float((X),(Y),554)
+#define get_csv_uint_pos555(X,Y) get_csv_uint((X),(Y),555)
+#define get_csv_ullong_pos555(X,Y) get_csv_ullong((X),(Y),555)
+#define get_csv_ip_pos555(X,Y) get_csv_ip((X),(Y),555)
+#define get_csv_ipv6_pos555(X,Y) get_csv_ipv6((X),(Y),555)
+#define get_csv_string_pos555(X,Y) get_csv_string((X),(Y),555)
+#define get_csv_v_str_pos555(X,Y) get_csv_string((X),(Y),555)
+#define get_csv_bool_pos555(X,Y) get_csv_bool((X),(Y),555)
+#define get_csv_int_pos555(X,Y) get_csv_int((X),(Y),555)
+#define get_csv_llong_pos555(X,Y) get_csv_llong((X),(Y),555)
+#define get_csv_float_pos555(X,Y) get_csv_float((X),(Y),555)
+#define get_csv_uint_pos556(X,Y) get_csv_uint((X),(Y),556)
+#define get_csv_ullong_pos556(X,Y) get_csv_ullong((X),(Y),556)
+#define get_csv_ip_pos556(X,Y) get_csv_ip((X),(Y),556)
+#define get_csv_ipv6_pos556(X,Y) get_csv_ipv6((X),(Y),556)
+#define get_csv_string_pos556(X,Y) get_csv_string((X),(Y),556)
+#define get_csv_v_str_pos556(X,Y) get_csv_string((X),(Y),556)
+#define get_csv_bool_pos556(X,Y) get_csv_bool((X),(Y),556)
+#define get_csv_int_pos556(X,Y) get_csv_int((X),(Y),556)
+#define get_csv_llong_pos556(X,Y) get_csv_llong((X),(Y),556)
+#define get_csv_float_pos556(X,Y) get_csv_float((X),(Y),556)
+#define get_csv_uint_pos557(X,Y) get_csv_uint((X),(Y),557)
+#define get_csv_ullong_pos557(X,Y) get_csv_ullong((X),(Y),557)
+#define get_csv_ip_pos557(X,Y) get_csv_ip((X),(Y),557)
+#define get_csv_ipv6_pos557(X,Y) get_csv_ipv6((X),(Y),557)
+#define get_csv_string_pos557(X,Y) get_csv_string((X),(Y),557)
+#define get_csv_v_str_pos557(X,Y) get_csv_string((X),(Y),557)
+#define get_csv_bool_pos557(X,Y) get_csv_bool((X),(Y),557)
+#define get_csv_int_pos557(X,Y) get_csv_int((X),(Y),557)
+#define get_csv_llong_pos557(X,Y) get_csv_llong((X),(Y),557)
+#define get_csv_float_pos557(X,Y) get_csv_float((X),(Y),557)
+#define get_csv_uint_pos558(X,Y) get_csv_uint((X),(Y),558)
+#define get_csv_ullong_pos558(X,Y) get_csv_ullong((X),(Y),558)
+#define get_csv_ip_pos558(X,Y) get_csv_ip((X),(Y),558)
+#define get_csv_ipv6_pos558(X,Y) get_csv_ipv6((X),(Y),558)
+#define get_csv_string_pos558(X,Y) get_csv_string((X),(Y),558)
+#define get_csv_v_str_pos558(X,Y) get_csv_string((X),(Y),558)
+#define get_csv_bool_pos558(X,Y) get_csv_bool((X),(Y),558)
+#define get_csv_int_pos558(X,Y) get_csv_int((X),(Y),558)
+#define get_csv_llong_pos558(X,Y) get_csv_llong((X),(Y),558)
+#define get_csv_float_pos558(X,Y) get_csv_float((X),(Y),558)
+#define get_csv_uint_pos559(X,Y) get_csv_uint((X),(Y),559)
+#define get_csv_ullong_pos559(X,Y) get_csv_ullong((X),(Y),559)
+#define get_csv_ip_pos559(X,Y) get_csv_ip((X),(Y),559)
+#define get_csv_ipv6_pos559(X,Y) get_csv_ipv6((X),(Y),559)
+#define get_csv_string_pos559(X,Y) get_csv_string((X),(Y),559)
+#define get_csv_v_str_pos559(X,Y) get_csv_string((X),(Y),559)
+#define get_csv_bool_pos559(X,Y) get_csv_bool((X),(Y),559)
+#define get_csv_int_pos559(X,Y) get_csv_int((X),(Y),559)
+#define get_csv_llong_pos559(X,Y) get_csv_llong((X),(Y),559)
+#define get_csv_float_pos559(X,Y) get_csv_float((X),(Y),559)
+#define get_csv_uint_pos560(X,Y) get_csv_uint((X),(Y),560)
+#define get_csv_ullong_pos560(X,Y) get_csv_ullong((X),(Y),560)
+#define get_csv_ip_pos560(X,Y) get_csv_ip((X),(Y),560)
+#define get_csv_ipv6_pos560(X,Y) get_csv_ipv6((X),(Y),560)
+#define get_csv_string_pos560(X,Y) get_csv_string((X),(Y),560)
+#define get_csv_v_str_pos560(X,Y) get_csv_string((X),(Y),560)
+#define get_csv_bool_pos560(X,Y) get_csv_bool((X),(Y),560)
+#define get_csv_int_pos560(X,Y) get_csv_int((X),(Y),560)
+#define get_csv_llong_pos560(X,Y) get_csv_llong((X),(Y),560)
+#define get_csv_float_pos560(X,Y) get_csv_float((X),(Y),560)
+#define get_csv_uint_pos561(X,Y) get_csv_uint((X),(Y),561)
+#define get_csv_ullong_pos561(X,Y) get_csv_ullong((X),(Y),561)
+#define get_csv_ip_pos561(X,Y) get_csv_ip((X),(Y),561)
+#define get_csv_ipv6_pos561(X,Y) get_csv_ipv6((X),(Y),561)
+#define get_csv_string_pos561(X,Y) get_csv_string((X),(Y),561)
+#define get_csv_v_str_pos561(X,Y) get_csv_string((X),(Y),561)
+#define get_csv_bool_pos561(X,Y) get_csv_bool((X),(Y),561)
+#define get_csv_int_pos561(X,Y) get_csv_int((X),(Y),561)
+#define get_csv_llong_pos561(X,Y) get_csv_llong((X),(Y),561)
+#define get_csv_float_pos561(X,Y) get_csv_float((X),(Y),561)
+#define get_csv_uint_pos562(X,Y) get_csv_uint((X),(Y),562)
+#define get_csv_ullong_pos562(X,Y) get_csv_ullong((X),(Y),562)
+#define get_csv_ip_pos562(X,Y) get_csv_ip((X),(Y),562)
+#define get_csv_ipv6_pos562(X,Y) get_csv_ipv6((X),(Y),562)
+#define get_csv_string_pos562(X,Y) get_csv_string((X),(Y),562)
+#define get_csv_v_str_pos562(X,Y) get_csv_string((X),(Y),562)
+#define get_csv_bool_pos562(X,Y) get_csv_bool((X),(Y),562)
+#define get_csv_int_pos562(X,Y) get_csv_int((X),(Y),562)
+#define get_csv_llong_pos562(X,Y) get_csv_llong((X),(Y),562)
+#define get_csv_float_pos562(X,Y) get_csv_float((X),(Y),562)
+#define get_csv_uint_pos563(X,Y) get_csv_uint((X),(Y),563)
+#define get_csv_ullong_pos563(X,Y) get_csv_ullong((X),(Y),563)
+#define get_csv_ip_pos563(X,Y) get_csv_ip((X),(Y),563)
+#define get_csv_ipv6_pos563(X,Y) get_csv_ipv6((X),(Y),563)
+#define get_csv_string_pos563(X,Y) get_csv_string((X),(Y),563)
+#define get_csv_v_str_pos563(X,Y) get_csv_string((X),(Y),563)
+#define get_csv_bool_pos563(X,Y) get_csv_bool((X),(Y),563)
+#define get_csv_int_pos563(X,Y) get_csv_int((X),(Y),563)
+#define get_csv_llong_pos563(X,Y) get_csv_llong((X),(Y),563)
+#define get_csv_float_pos563(X,Y) get_csv_float((X),(Y),563)
+#define get_csv_uint_pos564(X,Y) get_csv_uint((X),(Y),564)
+#define get_csv_ullong_pos564(X,Y) get_csv_ullong((X),(Y),564)
+#define get_csv_ip_pos564(X,Y) get_csv_ip((X),(Y),564)
+#define get_csv_ipv6_pos564(X,Y) get_csv_ipv6((X),(Y),564)
+#define get_csv_string_pos564(X,Y) get_csv_string((X),(Y),564)
+#define get_csv_v_str_pos564(X,Y) get_csv_string((X),(Y),564)
+#define get_csv_bool_pos564(X,Y) get_csv_bool((X),(Y),564)
+#define get_csv_int_pos564(X,Y) get_csv_int((X),(Y),564)
+#define get_csv_llong_pos564(X,Y) get_csv_llong((X),(Y),564)
+#define get_csv_float_pos564(X,Y) get_csv_float((X),(Y),564)
+#define get_csv_uint_pos565(X,Y) get_csv_uint((X),(Y),565)
+#define get_csv_ullong_pos565(X,Y) get_csv_ullong((X),(Y),565)
+#define get_csv_ip_pos565(X,Y) get_csv_ip((X),(Y),565)
+#define get_csv_ipv6_pos565(X,Y) get_csv_ipv6((X),(Y),565)
+#define get_csv_string_pos565(X,Y) get_csv_string((X),(Y),565)
+#define get_csv_v_str_pos565(X,Y) get_csv_string((X),(Y),565)
+#define get_csv_bool_pos565(X,Y) get_csv_bool((X),(Y),565)
+#define get_csv_int_pos565(X,Y) get_csv_int((X),(Y),565)
+#define get_csv_llong_pos565(X,Y) get_csv_llong((X),(Y),565)
+#define get_csv_float_pos565(X,Y) get_csv_float((X),(Y),565)
+#define get_csv_uint_pos566(X,Y) get_csv_uint((X),(Y),566)
+#define get_csv_ullong_pos566(X,Y) get_csv_ullong((X),(Y),566)
+#define get_csv_ip_pos566(X,Y) get_csv_ip((X),(Y),566)
+#define get_csv_ipv6_pos566(X,Y) get_csv_ipv6((X),(Y),566)
+#define get_csv_string_pos566(X,Y) get_csv_string((X),(Y),566)
+#define get_csv_v_str_pos566(X,Y) get_csv_string((X),(Y),566)
+#define get_csv_bool_pos566(X,Y) get_csv_bool((X),(Y),566)
+#define get_csv_int_pos566(X,Y) get_csv_int((X),(Y),566)
+#define get_csv_llong_pos566(X,Y) get_csv_llong((X),(Y),566)
+#define get_csv_float_pos566(X,Y) get_csv_float((X),(Y),566)
+#define get_csv_uint_pos567(X,Y) get_csv_uint((X),(Y),567)
+#define get_csv_ullong_pos567(X,Y) get_csv_ullong((X),(Y),567)
+#define get_csv_ip_pos567(X,Y) get_csv_ip((X),(Y),567)
+#define get_csv_ipv6_pos567(X,Y) get_csv_ipv6((X),(Y),567)
+#define get_csv_string_pos567(X,Y) get_csv_string((X),(Y),567)
+#define get_csv_v_str_pos567(X,Y) get_csv_string((X),(Y),567)
+#define get_csv_bool_pos567(X,Y) get_csv_bool((X),(Y),567)
+#define get_csv_int_pos567(X,Y) get_csv_int((X),(Y),567)
+#define get_csv_llong_pos567(X,Y) get_csv_llong((X),(Y),567)
+#define get_csv_float_pos567(X,Y) get_csv_float((X),(Y),567)
+#define get_csv_uint_pos568(X,Y) get_csv_uint((X),(Y),568)
+#define get_csv_ullong_pos568(X,Y) get_csv_ullong((X),(Y),568)
+#define get_csv_ip_pos568(X,Y) get_csv_ip((X),(Y),568)
+#define get_csv_ipv6_pos568(X,Y) get_csv_ipv6((X),(Y),568)
+#define get_csv_string_pos568(X,Y) get_csv_string((X),(Y),568)
+#define get_csv_v_str_pos568(X,Y) get_csv_string((X),(Y),568)
+#define get_csv_bool_pos568(X,Y) get_csv_bool((X),(Y),568)
+#define get_csv_int_pos568(X,Y) get_csv_int((X),(Y),568)
+#define get_csv_llong_pos568(X,Y) get_csv_llong((X),(Y),568)
+#define get_csv_float_pos568(X,Y) get_csv_float((X),(Y),568)
+#define get_csv_uint_pos569(X,Y) get_csv_uint((X),(Y),569)
+#define get_csv_ullong_pos569(X,Y) get_csv_ullong((X),(Y),569)
+#define get_csv_ip_pos569(X,Y) get_csv_ip((X),(Y),569)
+#define get_csv_ipv6_pos569(X,Y) get_csv_ipv6((X),(Y),569)
+#define get_csv_string_pos569(X,Y) get_csv_string((X),(Y),569)
+#define get_csv_v_str_pos569(X,Y) get_csv_string((X),(Y),569)
+#define get_csv_bool_pos569(X,Y) get_csv_bool((X),(Y),569)
+#define get_csv_int_pos569(X,Y) get_csv_int((X),(Y),569)
+#define get_csv_llong_pos569(X,Y) get_csv_llong((X),(Y),569)
+#define get_csv_float_pos569(X,Y) get_csv_float((X),(Y),569)
+#define get_csv_uint_pos570(X,Y) get_csv_uint((X),(Y),570)
+#define get_csv_ullong_pos570(X,Y) get_csv_ullong((X),(Y),570)
+#define get_csv_ip_pos570(X,Y) get_csv_ip((X),(Y),570)
+#define get_csv_ipv6_pos570(X,Y) get_csv_ipv6((X),(Y),570)
+#define get_csv_string_pos570(X,Y) get_csv_string((X),(Y),570)
+#define get_csv_v_str_pos570(X,Y) get_csv_string((X),(Y),570)
+#define get_csv_bool_pos570(X,Y) get_csv_bool((X),(Y),570)
+#define get_csv_int_pos570(X,Y) get_csv_int((X),(Y),570)
+#define get_csv_llong_pos570(X,Y) get_csv_llong((X),(Y),570)
+#define get_csv_float_pos570(X,Y) get_csv_float((X),(Y),570)
+#define get_csv_uint_pos571(X,Y) get_csv_uint((X),(Y),571)
+#define get_csv_ullong_pos571(X,Y) get_csv_ullong((X),(Y),571)
+#define get_csv_ip_pos571(X,Y) get_csv_ip((X),(Y),571)
+#define get_csv_ipv6_pos571(X,Y) get_csv_ipv6((X),(Y),571)
+#define get_csv_string_pos571(X,Y) get_csv_string((X),(Y),571)
+#define get_csv_v_str_pos571(X,Y) get_csv_string((X),(Y),571)
+#define get_csv_bool_pos571(X,Y) get_csv_bool((X),(Y),571)
+#define get_csv_int_pos571(X,Y) get_csv_int((X),(Y),571)
+#define get_csv_llong_pos571(X,Y) get_csv_llong((X),(Y),571)
+#define get_csv_float_pos571(X,Y) get_csv_float((X),(Y),571)
+#define get_csv_uint_pos572(X,Y) get_csv_uint((X),(Y),572)
+#define get_csv_ullong_pos572(X,Y) get_csv_ullong((X),(Y),572)
+#define get_csv_ip_pos572(X,Y) get_csv_ip((X),(Y),572)
+#define get_csv_ipv6_pos572(X,Y) get_csv_ipv6((X),(Y),572)
+#define get_csv_string_pos572(X,Y) get_csv_string((X),(Y),572)
+#define get_csv_v_str_pos572(X,Y) get_csv_string((X),(Y),572)
+#define get_csv_bool_pos572(X,Y) get_csv_bool((X),(Y),572)
+#define get_csv_int_pos572(X,Y) get_csv_int((X),(Y),572)
+#define get_csv_llong_pos572(X,Y) get_csv_llong((X),(Y),572)
+#define get_csv_float_pos572(X,Y) get_csv_float((X),(Y),572)
+#define get_csv_uint_pos573(X,Y) get_csv_uint((X),(Y),573)
+#define get_csv_ullong_pos573(X,Y) get_csv_ullong((X),(Y),573)
+#define get_csv_ip_pos573(X,Y) get_csv_ip((X),(Y),573)
+#define get_csv_ipv6_pos573(X,Y) get_csv_ipv6((X),(Y),573)
+#define get_csv_string_pos573(X,Y) get_csv_string((X),(Y),573)
+#define get_csv_v_str_pos573(X,Y) get_csv_string((X),(Y),573)
+#define get_csv_bool_pos573(X,Y) get_csv_bool((X),(Y),573)
+#define get_csv_int_pos573(X,Y) get_csv_int((X),(Y),573)
+#define get_csv_llong_pos573(X,Y) get_csv_llong((X),(Y),573)
+#define get_csv_float_pos573(X,Y) get_csv_float((X),(Y),573)
+#define get_csv_uint_pos574(X,Y) get_csv_uint((X),(Y),574)
+#define get_csv_ullong_pos574(X,Y) get_csv_ullong((X),(Y),574)
+#define get_csv_ip_pos574(X,Y) get_csv_ip((X),(Y),574)
+#define get_csv_ipv6_pos574(X,Y) get_csv_ipv6((X),(Y),574)
+#define get_csv_string_pos574(X,Y) get_csv_string((X),(Y),574)
+#define get_csv_v_str_pos574(X,Y) get_csv_string((X),(Y),574)
+#define get_csv_bool_pos574(X,Y) get_csv_bool((X),(Y),574)
+#define get_csv_int_pos574(X,Y) get_csv_int((X),(Y),574)
+#define get_csv_llong_pos574(X,Y) get_csv_llong((X),(Y),574)
+#define get_csv_float_pos574(X,Y) get_csv_float((X),(Y),574)
+#define get_csv_uint_pos575(X,Y) get_csv_uint((X),(Y),575)
+#define get_csv_ullong_pos575(X,Y) get_csv_ullong((X),(Y),575)
+#define get_csv_ip_pos575(X,Y) get_csv_ip((X),(Y),575)
+#define get_csv_ipv6_pos575(X,Y) get_csv_ipv6((X),(Y),575)
+#define get_csv_string_pos575(X,Y) get_csv_string((X),(Y),575)
+#define get_csv_v_str_pos575(X,Y) get_csv_string((X),(Y),575)
+#define get_csv_bool_pos575(X,Y) get_csv_bool((X),(Y),575)
+#define get_csv_int_pos575(X,Y) get_csv_int((X),(Y),575)
+#define get_csv_llong_pos575(X,Y) get_csv_llong((X),(Y),575)
+#define get_csv_float_pos575(X,Y) get_csv_float((X),(Y),575)
+#define get_csv_uint_pos576(X,Y) get_csv_uint((X),(Y),576)
+#define get_csv_ullong_pos576(X,Y) get_csv_ullong((X),(Y),576)
+#define get_csv_ip_pos576(X,Y) get_csv_ip((X),(Y),576)
+#define get_csv_ipv6_pos576(X,Y) get_csv_ipv6((X),(Y),576)
+#define get_csv_string_pos576(X,Y) get_csv_string((X),(Y),576)
+#define get_csv_v_str_pos576(X,Y) get_csv_string((X),(Y),576)
+#define get_csv_bool_pos576(X,Y) get_csv_bool((X),(Y),576)
+#define get_csv_int_pos576(X,Y) get_csv_int((X),(Y),576)
+#define get_csv_llong_pos576(X,Y) get_csv_llong((X),(Y),576)
+#define get_csv_float_pos576(X,Y) get_csv_float((X),(Y),576)
+#define get_csv_uint_pos577(X,Y) get_csv_uint((X),(Y),577)
+#define get_csv_ullong_pos577(X,Y) get_csv_ullong((X),(Y),577)
+#define get_csv_ip_pos577(X,Y) get_csv_ip((X),(Y),577)
+#define get_csv_ipv6_pos577(X,Y) get_csv_ipv6((X),(Y),577)
+#define get_csv_string_pos577(X,Y) get_csv_string((X),(Y),577)
+#define get_csv_v_str_pos577(X,Y) get_csv_string((X),(Y),577)
+#define get_csv_bool_pos577(X,Y) get_csv_bool((X),(Y),577)
+#define get_csv_int_pos577(X,Y) get_csv_int((X),(Y),577)
+#define get_csv_llong_pos577(X,Y) get_csv_llong((X),(Y),577)
+#define get_csv_float_pos577(X,Y) get_csv_float((X),(Y),577)
+#define get_csv_uint_pos578(X,Y) get_csv_uint((X),(Y),578)
+#define get_csv_ullong_pos578(X,Y) get_csv_ullong((X),(Y),578)
+#define get_csv_ip_pos578(X,Y) get_csv_ip((X),(Y),578)
+#define get_csv_ipv6_pos578(X,Y) get_csv_ipv6((X),(Y),578)
+#define get_csv_string_pos578(X,Y) get_csv_string((X),(Y),578)
+#define get_csv_v_str_pos578(X,Y) get_csv_string((X),(Y),578)
+#define get_csv_bool_pos578(X,Y) get_csv_bool((X),(Y),578)
+#define get_csv_int_pos578(X,Y) get_csv_int((X),(Y),578)
+#define get_csv_llong_pos578(X,Y) get_csv_llong((X),(Y),578)
+#define get_csv_float_pos578(X,Y) get_csv_float((X),(Y),578)
+#define get_csv_uint_pos579(X,Y) get_csv_uint((X),(Y),579)
+#define get_csv_ullong_pos579(X,Y) get_csv_ullong((X),(Y),579)
+#define get_csv_ip_pos579(X,Y) get_csv_ip((X),(Y),579)
+#define get_csv_ipv6_pos579(X,Y) get_csv_ipv6((X),(Y),579)
+#define get_csv_string_pos579(X,Y) get_csv_string((X),(Y),579)
+#define get_csv_v_str_pos579(X,Y) get_csv_string((X),(Y),579)
+#define get_csv_bool_pos579(X,Y) get_csv_bool((X),(Y),579)
+#define get_csv_int_pos579(X,Y) get_csv_int((X),(Y),579)
+#define get_csv_llong_pos579(X,Y) get_csv_llong((X),(Y),579)
+#define get_csv_float_pos579(X,Y) get_csv_float((X),(Y),579)
+#define get_csv_uint_pos580(X,Y) get_csv_uint((X),(Y),580)
+#define get_csv_ullong_pos580(X,Y) get_csv_ullong((X),(Y),580)
+#define get_csv_ip_pos580(X,Y) get_csv_ip((X),(Y),580)
+#define get_csv_ipv6_pos580(X,Y) get_csv_ipv6((X),(Y),580)
+#define get_csv_string_pos580(X,Y) get_csv_string((X),(Y),580)
+#define get_csv_v_str_pos580(X,Y) get_csv_string((X),(Y),580)
+#define get_csv_bool_pos580(X,Y) get_csv_bool((X),(Y),580)
+#define get_csv_int_pos580(X,Y) get_csv_int((X),(Y),580)
+#define get_csv_llong_pos580(X,Y) get_csv_llong((X),(Y),580)
+#define get_csv_float_pos580(X,Y) get_csv_float((X),(Y),580)
+#define get_csv_uint_pos581(X,Y) get_csv_uint((X),(Y),581)
+#define get_csv_ullong_pos581(X,Y) get_csv_ullong((X),(Y),581)
+#define get_csv_ip_pos581(X,Y) get_csv_ip((X),(Y),581)
+#define get_csv_ipv6_pos581(X,Y) get_csv_ipv6((X),(Y),581)
+#define get_csv_string_pos581(X,Y) get_csv_string((X),(Y),581)
+#define get_csv_v_str_pos581(X,Y) get_csv_string((X),(Y),581)
+#define get_csv_bool_pos581(X,Y) get_csv_bool((X),(Y),581)
+#define get_csv_int_pos581(X,Y) get_csv_int((X),(Y),581)
+#define get_csv_llong_pos581(X,Y) get_csv_llong((X),(Y),581)
+#define get_csv_float_pos581(X,Y) get_csv_float((X),(Y),581)
+#define get_csv_uint_pos582(X,Y) get_csv_uint((X),(Y),582)
+#define get_csv_ullong_pos582(X,Y) get_csv_ullong((X),(Y),582)
+#define get_csv_ip_pos582(X,Y) get_csv_ip((X),(Y),582)
+#define get_csv_ipv6_pos582(X,Y) get_csv_ipv6((X),(Y),582)
+#define get_csv_string_pos582(X,Y) get_csv_string((X),(Y),582)
+#define get_csv_v_str_pos582(X,Y) get_csv_string((X),(Y),582)
+#define get_csv_bool_pos582(X,Y) get_csv_bool((X),(Y),582)
+#define get_csv_int_pos582(X,Y) get_csv_int((X),(Y),582)
+#define get_csv_llong_pos582(X,Y) get_csv_llong((X),(Y),582)
+#define get_csv_float_pos582(X,Y) get_csv_float((X),(Y),582)
+#define get_csv_uint_pos583(X,Y) get_csv_uint((X),(Y),583)
+#define get_csv_ullong_pos583(X,Y) get_csv_ullong((X),(Y),583)
+#define get_csv_ip_pos583(X,Y) get_csv_ip((X),(Y),583)
+#define get_csv_ipv6_pos583(X,Y) get_csv_ipv6((X),(Y),583)
+#define get_csv_string_pos583(X,Y) get_csv_string((X),(Y),583)
+#define get_csv_v_str_pos583(X,Y) get_csv_string((X),(Y),583)
+#define get_csv_bool_pos583(X,Y) get_csv_bool((X),(Y),583)
+#define get_csv_int_pos583(X,Y) get_csv_int((X),(Y),583)
+#define get_csv_llong_pos583(X,Y) get_csv_llong((X),(Y),583)
+#define get_csv_float_pos583(X,Y) get_csv_float((X),(Y),583)
+#define get_csv_uint_pos584(X,Y) get_csv_uint((X),(Y),584)
+#define get_csv_ullong_pos584(X,Y) get_csv_ullong((X),(Y),584)
+#define get_csv_ip_pos584(X,Y) get_csv_ip((X),(Y),584)
+#define get_csv_ipv6_pos584(X,Y) get_csv_ipv6((X),(Y),584)
+#define get_csv_string_pos584(X,Y) get_csv_string((X),(Y),584)
+#define get_csv_v_str_pos584(X,Y) get_csv_string((X),(Y),584)
+#define get_csv_bool_pos584(X,Y) get_csv_bool((X),(Y),584)
+#define get_csv_int_pos584(X,Y) get_csv_int((X),(Y),584)
+#define get_csv_llong_pos584(X,Y) get_csv_llong((X),(Y),584)
+#define get_csv_float_pos584(X,Y) get_csv_float((X),(Y),584)
+#define get_csv_uint_pos585(X,Y) get_csv_uint((X),(Y),585)
+#define get_csv_ullong_pos585(X,Y) get_csv_ullong((X),(Y),585)
+#define get_csv_ip_pos585(X,Y) get_csv_ip((X),(Y),585)
+#define get_csv_ipv6_pos585(X,Y) get_csv_ipv6((X),(Y),585)
+#define get_csv_string_pos585(X,Y) get_csv_string((X),(Y),585)
+#define get_csv_v_str_pos585(X,Y) get_csv_string((X),(Y),585)
+#define get_csv_bool_pos585(X,Y) get_csv_bool((X),(Y),585)
+#define get_csv_int_pos585(X,Y) get_csv_int((X),(Y),585)
+#define get_csv_llong_pos585(X,Y) get_csv_llong((X),(Y),585)
+#define get_csv_float_pos585(X,Y) get_csv_float((X),(Y),585)
+#define get_csv_uint_pos586(X,Y) get_csv_uint((X),(Y),586)
+#define get_csv_ullong_pos586(X,Y) get_csv_ullong((X),(Y),586)
+#define get_csv_ip_pos586(X,Y) get_csv_ip((X),(Y),586)
+#define get_csv_ipv6_pos586(X,Y) get_csv_ipv6((X),(Y),586)
+#define get_csv_string_pos586(X,Y) get_csv_string((X),(Y),586)
+#define get_csv_v_str_pos586(X,Y) get_csv_string((X),(Y),586)
+#define get_csv_bool_pos586(X,Y) get_csv_bool((X),(Y),586)
+#define get_csv_int_pos586(X,Y) get_csv_int((X),(Y),586)
+#define get_csv_llong_pos586(X,Y) get_csv_llong((X),(Y),586)
+#define get_csv_float_pos586(X,Y) get_csv_float((X),(Y),586)
+#define get_csv_uint_pos587(X,Y) get_csv_uint((X),(Y),587)
+#define get_csv_ullong_pos587(X,Y) get_csv_ullong((X),(Y),587)
+#define get_csv_ip_pos587(X,Y) get_csv_ip((X),(Y),587)
+#define get_csv_ipv6_pos587(X,Y) get_csv_ipv6((X),(Y),587)
+#define get_csv_string_pos587(X,Y) get_csv_string((X),(Y),587)
+#define get_csv_v_str_pos587(X,Y) get_csv_string((X),(Y),587)
+#define get_csv_bool_pos587(X,Y) get_csv_bool((X),(Y),587)
+#define get_csv_int_pos587(X,Y) get_csv_int((X),(Y),587)
+#define get_csv_llong_pos587(X,Y) get_csv_llong((X),(Y),587)
+#define get_csv_float_pos587(X,Y) get_csv_float((X),(Y),587)
+#define get_csv_uint_pos588(X,Y) get_csv_uint((X),(Y),588)
+#define get_csv_ullong_pos588(X,Y) get_csv_ullong((X),(Y),588)
+#define get_csv_ip_pos588(X,Y) get_csv_ip((X),(Y),588)
+#define get_csv_ipv6_pos588(X,Y) get_csv_ipv6((X),(Y),588)
+#define get_csv_string_pos588(X,Y) get_csv_string((X),(Y),588)
+#define get_csv_v_str_pos588(X,Y) get_csv_string((X),(Y),588)
+#define get_csv_bool_pos588(X,Y) get_csv_bool((X),(Y),588)
+#define get_csv_int_pos588(X,Y) get_csv_int((X),(Y),588)
+#define get_csv_llong_pos588(X,Y) get_csv_llong((X),(Y),588)
+#define get_csv_float_pos588(X,Y) get_csv_float((X),(Y),588)
+#define get_csv_uint_pos589(X,Y) get_csv_uint((X),(Y),589)
+#define get_csv_ullong_pos589(X,Y) get_csv_ullong((X),(Y),589)
+#define get_csv_ip_pos589(X,Y) get_csv_ip((X),(Y),589)
+#define get_csv_ipv6_pos589(X,Y) get_csv_ipv6((X),(Y),589)
+#define get_csv_string_pos589(X,Y) get_csv_string((X),(Y),589)
+#define get_csv_v_str_pos589(X,Y) get_csv_string((X),(Y),589)
+#define get_csv_bool_pos589(X,Y) get_csv_bool((X),(Y),589)
+#define get_csv_int_pos589(X,Y) get_csv_int((X),(Y),589)
+#define get_csv_llong_pos589(X,Y) get_csv_llong((X),(Y),589)
+#define get_csv_float_pos589(X,Y) get_csv_float((X),(Y),589)
+#define get_csv_uint_pos590(X,Y) get_csv_uint((X),(Y),590)
+#define get_csv_ullong_pos590(X,Y) get_csv_ullong((X),(Y),590)
+#define get_csv_ip_pos590(X,Y) get_csv_ip((X),(Y),590)
+#define get_csv_ipv6_pos590(X,Y) get_csv_ipv6((X),(Y),590)
+#define get_csv_string_pos590(X,Y) get_csv_string((X),(Y),590)
+#define get_csv_v_str_pos590(X,Y) get_csv_string((X),(Y),590)
+#define get_csv_bool_pos590(X,Y) get_csv_bool((X),(Y),590)
+#define get_csv_int_pos590(X,Y) get_csv_int((X),(Y),590)
+#define get_csv_llong_pos590(X,Y) get_csv_llong((X),(Y),590)
+#define get_csv_float_pos590(X,Y) get_csv_float((X),(Y),590)
+#define get_csv_uint_pos591(X,Y) get_csv_uint((X),(Y),591)
+#define get_csv_ullong_pos591(X,Y) get_csv_ullong((X),(Y),591)
+#define get_csv_ip_pos591(X,Y) get_csv_ip((X),(Y),591)
+#define get_csv_ipv6_pos591(X,Y) get_csv_ipv6((X),(Y),591)
+#define get_csv_string_pos591(X,Y) get_csv_string((X),(Y),591)
+#define get_csv_v_str_pos591(X,Y) get_csv_string((X),(Y),591)
+#define get_csv_bool_pos591(X,Y) get_csv_bool((X),(Y),591)
+#define get_csv_int_pos591(X,Y) get_csv_int((X),(Y),591)
+#define get_csv_llong_pos591(X,Y) get_csv_llong((X),(Y),591)
+#define get_csv_float_pos591(X,Y) get_csv_float((X),(Y),591)
+#define get_csv_uint_pos592(X,Y) get_csv_uint((X),(Y),592)
+#define get_csv_ullong_pos592(X,Y) get_csv_ullong((X),(Y),592)
+#define get_csv_ip_pos592(X,Y) get_csv_ip((X),(Y),592)
+#define get_csv_ipv6_pos592(X,Y) get_csv_ipv6((X),(Y),592)
+#define get_csv_string_pos592(X,Y) get_csv_string((X),(Y),592)
+#define get_csv_v_str_pos592(X,Y) get_csv_string((X),(Y),592)
+#define get_csv_bool_pos592(X,Y) get_csv_bool((X),(Y),592)
+#define get_csv_int_pos592(X,Y) get_csv_int((X),(Y),592)
+#define get_csv_llong_pos592(X,Y) get_csv_llong((X),(Y),592)
+#define get_csv_float_pos592(X,Y) get_csv_float((X),(Y),592)
+#define get_csv_uint_pos593(X,Y) get_csv_uint((X),(Y),593)
+#define get_csv_ullong_pos593(X,Y) get_csv_ullong((X),(Y),593)
+#define get_csv_ip_pos593(X,Y) get_csv_ip((X),(Y),593)
+#define get_csv_ipv6_pos593(X,Y) get_csv_ipv6((X),(Y),593)
+#define get_csv_string_pos593(X,Y) get_csv_string((X),(Y),593)
+#define get_csv_v_str_pos593(X,Y) get_csv_string((X),(Y),593)
+#define get_csv_bool_pos593(X,Y) get_csv_bool((X),(Y),593)
+#define get_csv_int_pos593(X,Y) get_csv_int((X),(Y),593)
+#define get_csv_llong_pos593(X,Y) get_csv_llong((X),(Y),593)
+#define get_csv_float_pos593(X,Y) get_csv_float((X),(Y),593)
+#define get_csv_uint_pos594(X,Y) get_csv_uint((X),(Y),594)
+#define get_csv_ullong_pos594(X,Y) get_csv_ullong((X),(Y),594)
+#define get_csv_ip_pos594(X,Y) get_csv_ip((X),(Y),594)
+#define get_csv_ipv6_pos594(X,Y) get_csv_ipv6((X),(Y),594)
+#define get_csv_string_pos594(X,Y) get_csv_string((X),(Y),594)
+#define get_csv_v_str_pos594(X,Y) get_csv_string((X),(Y),594)
+#define get_csv_bool_pos594(X,Y) get_csv_bool((X),(Y),594)
+#define get_csv_int_pos594(X,Y) get_csv_int((X),(Y),594)
+#define get_csv_llong_pos594(X,Y) get_csv_llong((X),(Y),594)
+#define get_csv_float_pos594(X,Y) get_csv_float((X),(Y),594)
+#define get_csv_uint_pos595(X,Y) get_csv_uint((X),(Y),595)
+#define get_csv_ullong_pos595(X,Y) get_csv_ullong((X),(Y),595)
+#define get_csv_ip_pos595(X,Y) get_csv_ip((X),(Y),595)
+#define get_csv_ipv6_pos595(X,Y) get_csv_ipv6((X),(Y),595)
+#define get_csv_string_pos595(X,Y) get_csv_string((X),(Y),595)
+#define get_csv_v_str_pos595(X,Y) get_csv_string((X),(Y),595)
+#define get_csv_bool_pos595(X,Y) get_csv_bool((X),(Y),595)
+#define get_csv_int_pos595(X,Y) get_csv_int((X),(Y),595)
+#define get_csv_llong_pos595(X,Y) get_csv_llong((X),(Y),595)
+#define get_csv_float_pos595(X,Y) get_csv_float((X),(Y),595)
+#define get_csv_uint_pos596(X,Y) get_csv_uint((X),(Y),596)
+#define get_csv_ullong_pos596(X,Y) get_csv_ullong((X),(Y),596)
+#define get_csv_ip_pos596(X,Y) get_csv_ip((X),(Y),596)
+#define get_csv_ipv6_pos596(X,Y) get_csv_ipv6((X),(Y),596)
+#define get_csv_string_pos596(X,Y) get_csv_string((X),(Y),596)
+#define get_csv_v_str_pos596(X,Y) get_csv_string((X),(Y),596)
+#define get_csv_bool_pos596(X,Y) get_csv_bool((X),(Y),596)
+#define get_csv_int_pos596(X,Y) get_csv_int((X),(Y),596)
+#define get_csv_llong_pos596(X,Y) get_csv_llong((X),(Y),596)
+#define get_csv_float_pos596(X,Y) get_csv_float((X),(Y),596)
+#define get_csv_uint_pos597(X,Y) get_csv_uint((X),(Y),597)
+#define get_csv_ullong_pos597(X,Y) get_csv_ullong((X),(Y),597)
+#define get_csv_ip_pos597(X,Y) get_csv_ip((X),(Y),597)
+#define get_csv_ipv6_pos597(X,Y) get_csv_ipv6((X),(Y),597)
+#define get_csv_string_pos597(X,Y) get_csv_string((X),(Y),597)
+#define get_csv_v_str_pos597(X,Y) get_csv_string((X),(Y),597)
+#define get_csv_bool_pos597(X,Y) get_csv_bool((X),(Y),597)
+#define get_csv_int_pos597(X,Y) get_csv_int((X),(Y),597)
+#define get_csv_llong_pos597(X,Y) get_csv_llong((X),(Y),597)
+#define get_csv_float_pos597(X,Y) get_csv_float((X),(Y),597)
+#define get_csv_uint_pos598(X,Y) get_csv_uint((X),(Y),598)
+#define get_csv_ullong_pos598(X,Y) get_csv_ullong((X),(Y),598)
+#define get_csv_ip_pos598(X,Y) get_csv_ip((X),(Y),598)
+#define get_csv_ipv6_pos598(X,Y) get_csv_ipv6((X),(Y),598)
+#define get_csv_string_pos598(X,Y) get_csv_string((X),(Y),598)
+#define get_csv_v_str_pos598(X,Y) get_csv_string((X),(Y),598)
+#define get_csv_bool_pos598(X,Y) get_csv_bool((X),(Y),598)
+#define get_csv_int_pos598(X,Y) get_csv_int((X),(Y),598)
+#define get_csv_llong_pos598(X,Y) get_csv_llong((X),(Y),598)
+#define get_csv_float_pos598(X,Y) get_csv_float((X),(Y),598)
+#define get_csv_uint_pos599(X,Y) get_csv_uint((X),(Y),599)
+#define get_csv_ullong_pos599(X,Y) get_csv_ullong((X),(Y),599)
+#define get_csv_ip_pos599(X,Y) get_csv_ip((X),(Y),599)
+#define get_csv_ipv6_pos599(X,Y) get_csv_ipv6((X),(Y),599)
+#define get_csv_string_pos599(X,Y) get_csv_string((X),(Y),599)
+#define get_csv_v_str_pos599(X,Y) get_csv_string((X),(Y),599)
+#define get_csv_bool_pos599(X,Y) get_csv_bool((X),(Y),599)
+#define get_csv_int_pos599(X,Y) get_csv_int((X),(Y),599)
+#define get_csv_llong_pos599(X,Y) get_csv_llong((X),(Y),599)
+#define get_csv_float_pos599(X,Y) get_csv_float((X),(Y),599)
+#define get_csv_uint_pos600(X,Y) get_csv_uint((X),(Y),600)
+#define get_csv_ullong_pos600(X,Y) get_csv_ullong((X),(Y),600)
+#define get_csv_ip_pos600(X,Y) get_csv_ip((X),(Y),600)
+#define get_csv_ipv6_pos600(X,Y) get_csv_ipv6((X),(Y),600)
+#define get_csv_string_pos600(X,Y) get_csv_string((X),(Y),600)
+#define get_csv_v_str_pos600(X,Y) get_csv_string((X),(Y),600)
+#define get_csv_bool_pos600(X,Y) get_csv_bool((X),(Y),600)
+#define get_csv_int_pos600(X,Y) get_csv_int((X),(Y),600)
+#define get_csv_llong_pos600(X,Y) get_csv_llong((X),(Y),600)
+#define get_csv_float_pos600(X,Y) get_csv_float((X),(Y),600)
+#define get_csv_uint_pos601(X,Y) get_csv_uint((X),(Y),601)
+#define get_csv_ullong_pos601(X,Y) get_csv_ullong((X),(Y),601)
+#define get_csv_ip_pos601(X,Y) get_csv_ip((X),(Y),601)
+#define get_csv_ipv6_pos601(X,Y) get_csv_ipv6((X),(Y),601)
+#define get_csv_string_pos601(X,Y) get_csv_string((X),(Y),601)
+#define get_csv_v_str_pos601(X,Y) get_csv_string((X),(Y),601)
+#define get_csv_bool_pos601(X,Y) get_csv_bool((X),(Y),601)
+#define get_csv_int_pos601(X,Y) get_csv_int((X),(Y),601)
+#define get_csv_llong_pos601(X,Y) get_csv_llong((X),(Y),601)
+#define get_csv_float_pos601(X,Y) get_csv_float((X),(Y),601)
+#define get_csv_uint_pos602(X,Y) get_csv_uint((X),(Y),602)
+#define get_csv_ullong_pos602(X,Y) get_csv_ullong((X),(Y),602)
+#define get_csv_ip_pos602(X,Y) get_csv_ip((X),(Y),602)
+#define get_csv_ipv6_pos602(X,Y) get_csv_ipv6((X),(Y),602)
+#define get_csv_string_pos602(X,Y) get_csv_string((X),(Y),602)
+#define get_csv_v_str_pos602(X,Y) get_csv_string((X),(Y),602)
+#define get_csv_bool_pos602(X,Y) get_csv_bool((X),(Y),602)
+#define get_csv_int_pos602(X,Y) get_csv_int((X),(Y),602)
+#define get_csv_llong_pos602(X,Y) get_csv_llong((X),(Y),602)
+#define get_csv_float_pos602(X,Y) get_csv_float((X),(Y),602)
+#define get_csv_uint_pos603(X,Y) get_csv_uint((X),(Y),603)
+#define get_csv_ullong_pos603(X,Y) get_csv_ullong((X),(Y),603)
+#define get_csv_ip_pos603(X,Y) get_csv_ip((X),(Y),603)
+#define get_csv_ipv6_pos603(X,Y) get_csv_ipv6((X),(Y),603)
+#define get_csv_string_pos603(X,Y) get_csv_string((X),(Y),603)
+#define get_csv_v_str_pos603(X,Y) get_csv_string((X),(Y),603)
+#define get_csv_bool_pos603(X,Y) get_csv_bool((X),(Y),603)
+#define get_csv_int_pos603(X,Y) get_csv_int((X),(Y),603)
+#define get_csv_llong_pos603(X,Y) get_csv_llong((X),(Y),603)
+#define get_csv_float_pos603(X,Y) get_csv_float((X),(Y),603)
+#define get_csv_uint_pos604(X,Y) get_csv_uint((X),(Y),604)
+#define get_csv_ullong_pos604(X,Y) get_csv_ullong((X),(Y),604)
+#define get_csv_ip_pos604(X,Y) get_csv_ip((X),(Y),604)
+#define get_csv_ipv6_pos604(X,Y) get_csv_ipv6((X),(Y),604)
+#define get_csv_string_pos604(X,Y) get_csv_string((X),(Y),604)
+#define get_csv_v_str_pos604(X,Y) get_csv_string((X),(Y),604)
+#define get_csv_bool_pos604(X,Y) get_csv_bool((X),(Y),604)
+#define get_csv_int_pos604(X,Y) get_csv_int((X),(Y),604)
+#define get_csv_llong_pos604(X,Y) get_csv_llong((X),(Y),604)
+#define get_csv_float_pos604(X,Y) get_csv_float((X),(Y),604)
+#define get_csv_uint_pos605(X,Y) get_csv_uint((X),(Y),605)
+#define get_csv_ullong_pos605(X,Y) get_csv_ullong((X),(Y),605)
+#define get_csv_ip_pos605(X,Y) get_csv_ip((X),(Y),605)
+#define get_csv_ipv6_pos605(X,Y) get_csv_ipv6((X),(Y),605)
+#define get_csv_string_pos605(X,Y) get_csv_string((X),(Y),605)
+#define get_csv_v_str_pos605(X,Y) get_csv_string((X),(Y),605)
+#define get_csv_bool_pos605(X,Y) get_csv_bool((X),(Y),605)
+#define get_csv_int_pos605(X,Y) get_csv_int((X),(Y),605)
+#define get_csv_llong_pos605(X,Y) get_csv_llong((X),(Y),605)
+#define get_csv_float_pos605(X,Y) get_csv_float((X),(Y),605)
+#define get_csv_uint_pos606(X,Y) get_csv_uint((X),(Y),606)
+#define get_csv_ullong_pos606(X,Y) get_csv_ullong((X),(Y),606)
+#define get_csv_ip_pos606(X,Y) get_csv_ip((X),(Y),606)
+#define get_csv_ipv6_pos606(X,Y) get_csv_ipv6((X),(Y),606)
+#define get_csv_string_pos606(X,Y) get_csv_string((X),(Y),606)
+#define get_csv_v_str_pos606(X,Y) get_csv_string((X),(Y),606)
+#define get_csv_bool_pos606(X,Y) get_csv_bool((X),(Y),606)
+#define get_csv_int_pos606(X,Y) get_csv_int((X),(Y),606)
+#define get_csv_llong_pos606(X,Y) get_csv_llong((X),(Y),606)
+#define get_csv_float_pos606(X,Y) get_csv_float((X),(Y),606)
+#define get_csv_uint_pos607(X,Y) get_csv_uint((X),(Y),607)
+#define get_csv_ullong_pos607(X,Y) get_csv_ullong((X),(Y),607)
+#define get_csv_ip_pos607(X,Y) get_csv_ip((X),(Y),607)
+#define get_csv_ipv6_pos607(X,Y) get_csv_ipv6((X),(Y),607)
+#define get_csv_string_pos607(X,Y) get_csv_string((X),(Y),607)
+#define get_csv_v_str_pos607(X,Y) get_csv_string((X),(Y),607)
+#define get_csv_bool_pos607(X,Y) get_csv_bool((X),(Y),607)
+#define get_csv_int_pos607(X,Y) get_csv_int((X),(Y),607)
+#define get_csv_llong_pos607(X,Y) get_csv_llong((X),(Y),607)
+#define get_csv_float_pos607(X,Y) get_csv_float((X),(Y),607)
+#define get_csv_uint_pos608(X,Y) get_csv_uint((X),(Y),608)
+#define get_csv_ullong_pos608(X,Y) get_csv_ullong((X),(Y),608)
+#define get_csv_ip_pos608(X,Y) get_csv_ip((X),(Y),608)
+#define get_csv_ipv6_pos608(X,Y) get_csv_ipv6((X),(Y),608)
+#define get_csv_string_pos608(X,Y) get_csv_string((X),(Y),608)
+#define get_csv_v_str_pos608(X,Y) get_csv_string((X),(Y),608)
+#define get_csv_bool_pos608(X,Y) get_csv_bool((X),(Y),608)
+#define get_csv_int_pos608(X,Y) get_csv_int((X),(Y),608)
+#define get_csv_llong_pos608(X,Y) get_csv_llong((X),(Y),608)
+#define get_csv_float_pos608(X,Y) get_csv_float((X),(Y),608)
+#define get_csv_uint_pos609(X,Y) get_csv_uint((X),(Y),609)
+#define get_csv_ullong_pos609(X,Y) get_csv_ullong((X),(Y),609)
+#define get_csv_ip_pos609(X,Y) get_csv_ip((X),(Y),609)
+#define get_csv_ipv6_pos609(X,Y) get_csv_ipv6((X),(Y),609)
+#define get_csv_string_pos609(X,Y) get_csv_string((X),(Y),609)
+#define get_csv_v_str_pos609(X,Y) get_csv_string((X),(Y),609)
+#define get_csv_bool_pos609(X,Y) get_csv_bool((X),(Y),609)
+#define get_csv_int_pos609(X,Y) get_csv_int((X),(Y),609)
+#define get_csv_llong_pos609(X,Y) get_csv_llong((X),(Y),609)
+#define get_csv_float_pos609(X,Y) get_csv_float((X),(Y),609)
+#define get_csv_uint_pos610(X,Y) get_csv_uint((X),(Y),610)
+#define get_csv_ullong_pos610(X,Y) get_csv_ullong((X),(Y),610)
+#define get_csv_ip_pos610(X,Y) get_csv_ip((X),(Y),610)
+#define get_csv_ipv6_pos610(X,Y) get_csv_ipv6((X),(Y),610)
+#define get_csv_string_pos610(X,Y) get_csv_string((X),(Y),610)
+#define get_csv_v_str_pos610(X,Y) get_csv_string((X),(Y),610)
+#define get_csv_bool_pos610(X,Y) get_csv_bool((X),(Y),610)
+#define get_csv_int_pos610(X,Y) get_csv_int((X),(Y),610)
+#define get_csv_llong_pos610(X,Y) get_csv_llong((X),(Y),610)
+#define get_csv_float_pos610(X,Y) get_csv_float((X),(Y),610)
+#define get_csv_uint_pos611(X,Y) get_csv_uint((X),(Y),611)
+#define get_csv_ullong_pos611(X,Y) get_csv_ullong((X),(Y),611)
+#define get_csv_ip_pos611(X,Y) get_csv_ip((X),(Y),611)
+#define get_csv_ipv6_pos611(X,Y) get_csv_ipv6((X),(Y),611)
+#define get_csv_string_pos611(X,Y) get_csv_string((X),(Y),611)
+#define get_csv_v_str_pos611(X,Y) get_csv_string((X),(Y),611)
+#define get_csv_bool_pos611(X,Y) get_csv_bool((X),(Y),611)
+#define get_csv_int_pos611(X,Y) get_csv_int((X),(Y),611)
+#define get_csv_llong_pos611(X,Y) get_csv_llong((X),(Y),611)
+#define get_csv_float_pos611(X,Y) get_csv_float((X),(Y),611)
+#define get_csv_uint_pos612(X,Y) get_csv_uint((X),(Y),612)
+#define get_csv_ullong_pos612(X,Y) get_csv_ullong((X),(Y),612)
+#define get_csv_ip_pos612(X,Y) get_csv_ip((X),(Y),612)
+#define get_csv_ipv6_pos612(X,Y) get_csv_ipv6((X),(Y),612)
+#define get_csv_string_pos612(X,Y) get_csv_string((X),(Y),612)
+#define get_csv_v_str_pos612(X,Y) get_csv_string((X),(Y),612)
+#define get_csv_bool_pos612(X,Y) get_csv_bool((X),(Y),612)
+#define get_csv_int_pos612(X,Y) get_csv_int((X),(Y),612)
+#define get_csv_llong_pos612(X,Y) get_csv_llong((X),(Y),612)
+#define get_csv_float_pos612(X,Y) get_csv_float((X),(Y),612)
+#define get_csv_uint_pos613(X,Y) get_csv_uint((X),(Y),613)
+#define get_csv_ullong_pos613(X,Y) get_csv_ullong((X),(Y),613)
+#define get_csv_ip_pos613(X,Y) get_csv_ip((X),(Y),613)
+#define get_csv_ipv6_pos613(X,Y) get_csv_ipv6((X),(Y),613)
+#define get_csv_string_pos613(X,Y) get_csv_string((X),(Y),613)
+#define get_csv_v_str_pos613(X,Y) get_csv_string((X),(Y),613)
+#define get_csv_bool_pos613(X,Y) get_csv_bool((X),(Y),613)
+#define get_csv_int_pos613(X,Y) get_csv_int((X),(Y),613)
+#define get_csv_llong_pos613(X,Y) get_csv_llong((X),(Y),613)
+#define get_csv_float_pos613(X,Y) get_csv_float((X),(Y),613)
+#define get_csv_uint_pos614(X,Y) get_csv_uint((X),(Y),614)
+#define get_csv_ullong_pos614(X,Y) get_csv_ullong((X),(Y),614)
+#define get_csv_ip_pos614(X,Y) get_csv_ip((X),(Y),614)
+#define get_csv_ipv6_pos614(X,Y) get_csv_ipv6((X),(Y),614)
+#define get_csv_string_pos614(X,Y) get_csv_string((X),(Y),614)
+#define get_csv_v_str_pos614(X,Y) get_csv_string((X),(Y),614)
+#define get_csv_bool_pos614(X,Y) get_csv_bool((X),(Y),614)
+#define get_csv_int_pos614(X,Y) get_csv_int((X),(Y),614)
+#define get_csv_llong_pos614(X,Y) get_csv_llong((X),(Y),614)
+#define get_csv_float_pos614(X,Y) get_csv_float((X),(Y),614)
+#define get_csv_uint_pos615(X,Y) get_csv_uint((X),(Y),615)
+#define get_csv_ullong_pos615(X,Y) get_csv_ullong((X),(Y),615)
+#define get_csv_ip_pos615(X,Y) get_csv_ip((X),(Y),615)
+#define get_csv_ipv6_pos615(X,Y) get_csv_ipv6((X),(Y),615)
+#define get_csv_string_pos615(X,Y) get_csv_string((X),(Y),615)
+#define get_csv_v_str_pos615(X,Y) get_csv_string((X),(Y),615)
+#define get_csv_bool_pos615(X,Y) get_csv_bool((X),(Y),615)
+#define get_csv_int_pos615(X,Y) get_csv_int((X),(Y),615)
+#define get_csv_llong_pos615(X,Y) get_csv_llong((X),(Y),615)
+#define get_csv_float_pos615(X,Y) get_csv_float((X),(Y),615)
+#define get_csv_uint_pos616(X,Y) get_csv_uint((X),(Y),616)
+#define get_csv_ullong_pos616(X,Y) get_csv_ullong((X),(Y),616)
+#define get_csv_ip_pos616(X,Y) get_csv_ip((X),(Y),616)
+#define get_csv_ipv6_pos616(X,Y) get_csv_ipv6((X),(Y),616)
+#define get_csv_string_pos616(X,Y) get_csv_string((X),(Y),616)
+#define get_csv_v_str_pos616(X,Y) get_csv_string((X),(Y),616)
+#define get_csv_bool_pos616(X,Y) get_csv_bool((X),(Y),616)
+#define get_csv_int_pos616(X,Y) get_csv_int((X),(Y),616)
+#define get_csv_llong_pos616(X,Y) get_csv_llong((X),(Y),616)
+#define get_csv_float_pos616(X,Y) get_csv_float((X),(Y),616)
+#define get_csv_uint_pos617(X,Y) get_csv_uint((X),(Y),617)
+#define get_csv_ullong_pos617(X,Y) get_csv_ullong((X),(Y),617)
+#define get_csv_ip_pos617(X,Y) get_csv_ip((X),(Y),617)
+#define get_csv_ipv6_pos617(X,Y) get_csv_ipv6((X),(Y),617)
+#define get_csv_string_pos617(X,Y) get_csv_string((X),(Y),617)
+#define get_csv_v_str_pos617(X,Y) get_csv_string((X),(Y),617)
+#define get_csv_bool_pos617(X,Y) get_csv_bool((X),(Y),617)
+#define get_csv_int_pos617(X,Y) get_csv_int((X),(Y),617)
+#define get_csv_llong_pos617(X,Y) get_csv_llong((X),(Y),617)
+#define get_csv_float_pos617(X,Y) get_csv_float((X),(Y),617)
+#define get_csv_uint_pos618(X,Y) get_csv_uint((X),(Y),618)
+#define get_csv_ullong_pos618(X,Y) get_csv_ullong((X),(Y),618)
+#define get_csv_ip_pos618(X,Y) get_csv_ip((X),(Y),618)
+#define get_csv_ipv6_pos618(X,Y) get_csv_ipv6((X),(Y),618)
+#define get_csv_string_pos618(X,Y) get_csv_string((X),(Y),618)
+#define get_csv_v_str_pos618(X,Y) get_csv_string((X),(Y),618)
+#define get_csv_bool_pos618(X,Y) get_csv_bool((X),(Y),618)
+#define get_csv_int_pos618(X,Y) get_csv_int((X),(Y),618)
+#define get_csv_llong_pos618(X,Y) get_csv_llong((X),(Y),618)
+#define get_csv_float_pos618(X,Y) get_csv_float((X),(Y),618)
+#define get_csv_uint_pos619(X,Y) get_csv_uint((X),(Y),619)
+#define get_csv_ullong_pos619(X,Y) get_csv_ullong((X),(Y),619)
+#define get_csv_ip_pos619(X,Y) get_csv_ip((X),(Y),619)
+#define get_csv_ipv6_pos619(X,Y) get_csv_ipv6((X),(Y),619)
+#define get_csv_string_pos619(X,Y) get_csv_string((X),(Y),619)
+#define get_csv_v_str_pos619(X,Y) get_csv_string((X),(Y),619)
+#define get_csv_bool_pos619(X,Y) get_csv_bool((X),(Y),619)
+#define get_csv_int_pos619(X,Y) get_csv_int((X),(Y),619)
+#define get_csv_llong_pos619(X,Y) get_csv_llong((X),(Y),619)
+#define get_csv_float_pos619(X,Y) get_csv_float((X),(Y),619)
+#define get_csv_uint_pos620(X,Y) get_csv_uint((X),(Y),620)
+#define get_csv_ullong_pos620(X,Y) get_csv_ullong((X),(Y),620)
+#define get_csv_ip_pos620(X,Y) get_csv_ip((X),(Y),620)
+#define get_csv_ipv6_pos620(X,Y) get_csv_ipv6((X),(Y),620)
+#define get_csv_string_pos620(X,Y) get_csv_string((X),(Y),620)
+#define get_csv_v_str_pos620(X,Y) get_csv_string((X),(Y),620)
+#define get_csv_bool_pos620(X,Y) get_csv_bool((X),(Y),620)
+#define get_csv_int_pos620(X,Y) get_csv_int((X),(Y),620)
+#define get_csv_llong_pos620(X,Y) get_csv_llong((X),(Y),620)
+#define get_csv_float_pos620(X,Y) get_csv_float((X),(Y),620)
+#define get_csv_uint_pos621(X,Y) get_csv_uint((X),(Y),621)
+#define get_csv_ullong_pos621(X,Y) get_csv_ullong((X),(Y),621)
+#define get_csv_ip_pos621(X,Y) get_csv_ip((X),(Y),621)
+#define get_csv_ipv6_pos621(X,Y) get_csv_ipv6((X),(Y),621)
+#define get_csv_string_pos621(X,Y) get_csv_string((X),(Y),621)
+#define get_csv_v_str_pos621(X,Y) get_csv_string((X),(Y),621)
+#define get_csv_bool_pos621(X,Y) get_csv_bool((X),(Y),621)
+#define get_csv_int_pos621(X,Y) get_csv_int((X),(Y),621)
+#define get_csv_llong_pos621(X,Y) get_csv_llong((X),(Y),621)
+#define get_csv_float_pos621(X,Y) get_csv_float((X),(Y),621)
+#define get_csv_uint_pos622(X,Y) get_csv_uint((X),(Y),622)
+#define get_csv_ullong_pos622(X,Y) get_csv_ullong((X),(Y),622)
+#define get_csv_ip_pos622(X,Y) get_csv_ip((X),(Y),622)
+#define get_csv_ipv6_pos622(X,Y) get_csv_ipv6((X),(Y),622)
+#define get_csv_string_pos622(X,Y) get_csv_string((X),(Y),622)
+#define get_csv_v_str_pos622(X,Y) get_csv_string((X),(Y),622)
+#define get_csv_bool_pos622(X,Y) get_csv_bool((X),(Y),622)
+#define get_csv_int_pos622(X,Y) get_csv_int((X),(Y),622)
+#define get_csv_llong_pos622(X,Y) get_csv_llong((X),(Y),622)
+#define get_csv_float_pos622(X,Y) get_csv_float((X),(Y),622)
+#define get_csv_uint_pos623(X,Y) get_csv_uint((X),(Y),623)
+#define get_csv_ullong_pos623(X,Y) get_csv_ullong((X),(Y),623)
+#define get_csv_ip_pos623(X,Y) get_csv_ip((X),(Y),623)
+#define get_csv_ipv6_pos623(X,Y) get_csv_ipv6((X),(Y),623)
+#define get_csv_string_pos623(X,Y) get_csv_string((X),(Y),623)
+#define get_csv_v_str_pos623(X,Y) get_csv_string((X),(Y),623)
+#define get_csv_bool_pos623(X,Y) get_csv_bool((X),(Y),623)
+#define get_csv_int_pos623(X,Y) get_csv_int((X),(Y),623)
+#define get_csv_llong_pos623(X,Y) get_csv_llong((X),(Y),623)
+#define get_csv_float_pos623(X,Y) get_csv_float((X),(Y),623)
+#define get_csv_uint_pos624(X,Y) get_csv_uint((X),(Y),624)
+#define get_csv_ullong_pos624(X,Y) get_csv_ullong((X),(Y),624)
+#define get_csv_ip_pos624(X,Y) get_csv_ip((X),(Y),624)
+#define get_csv_ipv6_pos624(X,Y) get_csv_ipv6((X),(Y),624)
+#define get_csv_string_pos624(X,Y) get_csv_string((X),(Y),624)
+#define get_csv_v_str_pos624(X,Y) get_csv_string((X),(Y),624)
+#define get_csv_bool_pos624(X,Y) get_csv_bool((X),(Y),624)
+#define get_csv_int_pos624(X,Y) get_csv_int((X),(Y),624)
+#define get_csv_llong_pos624(X,Y) get_csv_llong((X),(Y),624)
+#define get_csv_float_pos624(X,Y) get_csv_float((X),(Y),624)
+#define get_csv_uint_pos625(X,Y) get_csv_uint((X),(Y),625)
+#define get_csv_ullong_pos625(X,Y) get_csv_ullong((X),(Y),625)
+#define get_csv_ip_pos625(X,Y) get_csv_ip((X),(Y),625)
+#define get_csv_ipv6_pos625(X,Y) get_csv_ipv6((X),(Y),625)
+#define get_csv_string_pos625(X,Y) get_csv_string((X),(Y),625)
+#define get_csv_v_str_pos625(X,Y) get_csv_string((X),(Y),625)
+#define get_csv_bool_pos625(X,Y) get_csv_bool((X),(Y),625)
+#define get_csv_int_pos625(X,Y) get_csv_int((X),(Y),625)
+#define get_csv_llong_pos625(X,Y) get_csv_llong((X),(Y),625)
+#define get_csv_float_pos625(X,Y) get_csv_float((X),(Y),625)
+#define get_csv_uint_pos626(X,Y) get_csv_uint((X),(Y),626)
+#define get_csv_ullong_pos626(X,Y) get_csv_ullong((X),(Y),626)
+#define get_csv_ip_pos626(X,Y) get_csv_ip((X),(Y),626)
+#define get_csv_ipv6_pos626(X,Y) get_csv_ipv6((X),(Y),626)
+#define get_csv_string_pos626(X,Y) get_csv_string((X),(Y),626)
+#define get_csv_v_str_pos626(X,Y) get_csv_string((X),(Y),626)
+#define get_csv_bool_pos626(X,Y) get_csv_bool((X),(Y),626)
+#define get_csv_int_pos626(X,Y) get_csv_int((X),(Y),626)
+#define get_csv_llong_pos626(X,Y) get_csv_llong((X),(Y),626)
+#define get_csv_float_pos626(X,Y) get_csv_float((X),(Y),626)
+#define get_csv_uint_pos627(X,Y) get_csv_uint((X),(Y),627)
+#define get_csv_ullong_pos627(X,Y) get_csv_ullong((X),(Y),627)
+#define get_csv_ip_pos627(X,Y) get_csv_ip((X),(Y),627)
+#define get_csv_ipv6_pos627(X,Y) get_csv_ipv6((X),(Y),627)
+#define get_csv_string_pos627(X,Y) get_csv_string((X),(Y),627)
+#define get_csv_v_str_pos627(X,Y) get_csv_string((X),(Y),627)
+#define get_csv_bool_pos627(X,Y) get_csv_bool((X),(Y),627)
+#define get_csv_int_pos627(X,Y) get_csv_int((X),(Y),627)
+#define get_csv_llong_pos627(X,Y) get_csv_llong((X),(Y),627)
+#define get_csv_float_pos627(X,Y) get_csv_float((X),(Y),627)
+#define get_csv_uint_pos628(X,Y) get_csv_uint((X),(Y),628)
+#define get_csv_ullong_pos628(X,Y) get_csv_ullong((X),(Y),628)
+#define get_csv_ip_pos628(X,Y) get_csv_ip((X),(Y),628)
+#define get_csv_ipv6_pos628(X,Y) get_csv_ipv6((X),(Y),628)
+#define get_csv_string_pos628(X,Y) get_csv_string((X),(Y),628)
+#define get_csv_v_str_pos628(X,Y) get_csv_string((X),(Y),628)
+#define get_csv_bool_pos628(X,Y) get_csv_bool((X),(Y),628)
+#define get_csv_int_pos628(X,Y) get_csv_int((X),(Y),628)
+#define get_csv_llong_pos628(X,Y) get_csv_llong((X),(Y),628)
+#define get_csv_float_pos628(X,Y) get_csv_float((X),(Y),628)
+#define get_csv_uint_pos629(X,Y) get_csv_uint((X),(Y),629)
+#define get_csv_ullong_pos629(X,Y) get_csv_ullong((X),(Y),629)
+#define get_csv_ip_pos629(X,Y) get_csv_ip((X),(Y),629)
+#define get_csv_ipv6_pos629(X,Y) get_csv_ipv6((X),(Y),629)
+#define get_csv_string_pos629(X,Y) get_csv_string((X),(Y),629)
+#define get_csv_v_str_pos629(X,Y) get_csv_string((X),(Y),629)
+#define get_csv_bool_pos629(X,Y) get_csv_bool((X),(Y),629)
+#define get_csv_int_pos629(X,Y) get_csv_int((X),(Y),629)
+#define get_csv_llong_pos629(X,Y) get_csv_llong((X),(Y),629)
+#define get_csv_float_pos629(X,Y) get_csv_float((X),(Y),629)
+#define get_csv_uint_pos630(X,Y) get_csv_uint((X),(Y),630)
+#define get_csv_ullong_pos630(X,Y) get_csv_ullong((X),(Y),630)
+#define get_csv_ip_pos630(X,Y) get_csv_ip((X),(Y),630)
+#define get_csv_ipv6_pos630(X,Y) get_csv_ipv6((X),(Y),630)
+#define get_csv_string_pos630(X,Y) get_csv_string((X),(Y),630)
+#define get_csv_v_str_pos630(X,Y) get_csv_string((X),(Y),630)
+#define get_csv_bool_pos630(X,Y) get_csv_bool((X),(Y),630)
+#define get_csv_int_pos630(X,Y) get_csv_int((X),(Y),630)
+#define get_csv_llong_pos630(X,Y) get_csv_llong((X),(Y),630)
+#define get_csv_float_pos630(X,Y) get_csv_float((X),(Y),630)
+#define get_csv_uint_pos631(X,Y) get_csv_uint((X),(Y),631)
+#define get_csv_ullong_pos631(X,Y) get_csv_ullong((X),(Y),631)
+#define get_csv_ip_pos631(X,Y) get_csv_ip((X),(Y),631)
+#define get_csv_ipv6_pos631(X,Y) get_csv_ipv6((X),(Y),631)
+#define get_csv_string_pos631(X,Y) get_csv_string((X),(Y),631)
+#define get_csv_v_str_pos631(X,Y) get_csv_string((X),(Y),631)
+#define get_csv_bool_pos631(X,Y) get_csv_bool((X),(Y),631)
+#define get_csv_int_pos631(X,Y) get_csv_int((X),(Y),631)
+#define get_csv_llong_pos631(X,Y) get_csv_llong((X),(Y),631)
+#define get_csv_float_pos631(X,Y) get_csv_float((X),(Y),631)
+#define get_csv_uint_pos632(X,Y) get_csv_uint((X),(Y),632)
+#define get_csv_ullong_pos632(X,Y) get_csv_ullong((X),(Y),632)
+#define get_csv_ip_pos632(X,Y) get_csv_ip((X),(Y),632)
+#define get_csv_ipv6_pos632(X,Y) get_csv_ipv6((X),(Y),632)
+#define get_csv_string_pos632(X,Y) get_csv_string((X),(Y),632)
+#define get_csv_v_str_pos632(X,Y) get_csv_string((X),(Y),632)
+#define get_csv_bool_pos632(X,Y) get_csv_bool((X),(Y),632)
+#define get_csv_int_pos632(X,Y) get_csv_int((X),(Y),632)
+#define get_csv_llong_pos632(X,Y) get_csv_llong((X),(Y),632)
+#define get_csv_float_pos632(X,Y) get_csv_float((X),(Y),632)
+#define get_csv_uint_pos633(X,Y) get_csv_uint((X),(Y),633)
+#define get_csv_ullong_pos633(X,Y) get_csv_ullong((X),(Y),633)
+#define get_csv_ip_pos633(X,Y) get_csv_ip((X),(Y),633)
+#define get_csv_ipv6_pos633(X,Y) get_csv_ipv6((X),(Y),633)
+#define get_csv_string_pos633(X,Y) get_csv_string((X),(Y),633)
+#define get_csv_v_str_pos633(X,Y) get_csv_string((X),(Y),633)
+#define get_csv_bool_pos633(X,Y) get_csv_bool((X),(Y),633)
+#define get_csv_int_pos633(X,Y) get_csv_int((X),(Y),633)
+#define get_csv_llong_pos633(X,Y) get_csv_llong((X),(Y),633)
+#define get_csv_float_pos633(X,Y) get_csv_float((X),(Y),633)
+#define get_csv_uint_pos634(X,Y) get_csv_uint((X),(Y),634)
+#define get_csv_ullong_pos634(X,Y) get_csv_ullong((X),(Y),634)
+#define get_csv_ip_pos634(X,Y) get_csv_ip((X),(Y),634)
+#define get_csv_ipv6_pos634(X,Y) get_csv_ipv6((X),(Y),634)
+#define get_csv_string_pos634(X,Y) get_csv_string((X),(Y),634)
+#define get_csv_v_str_pos634(X,Y) get_csv_string((X),(Y),634)
+#define get_csv_bool_pos634(X,Y) get_csv_bool((X),(Y),634)
+#define get_csv_int_pos634(X,Y) get_csv_int((X),(Y),634)
+#define get_csv_llong_pos634(X,Y) get_csv_llong((X),(Y),634)
+#define get_csv_float_pos634(X,Y) get_csv_float((X),(Y),634)
+#define get_csv_uint_pos635(X,Y) get_csv_uint((X),(Y),635)
+#define get_csv_ullong_pos635(X,Y) get_csv_ullong((X),(Y),635)
+#define get_csv_ip_pos635(X,Y) get_csv_ip((X),(Y),635)
+#define get_csv_ipv6_pos635(X,Y) get_csv_ipv6((X),(Y),635)
+#define get_csv_string_pos635(X,Y) get_csv_string((X),(Y),635)
+#define get_csv_v_str_pos635(X,Y) get_csv_string((X),(Y),635)
+#define get_csv_bool_pos635(X,Y) get_csv_bool((X),(Y),635)
+#define get_csv_int_pos635(X,Y) get_csv_int((X),(Y),635)
+#define get_csv_llong_pos635(X,Y) get_csv_llong((X),(Y),635)
+#define get_csv_float_pos635(X,Y) get_csv_float((X),(Y),635)
+#define get_csv_uint_pos636(X,Y) get_csv_uint((X),(Y),636)
+#define get_csv_ullong_pos636(X,Y) get_csv_ullong((X),(Y),636)
+#define get_csv_ip_pos636(X,Y) get_csv_ip((X),(Y),636)
+#define get_csv_ipv6_pos636(X,Y) get_csv_ipv6((X),(Y),636)
+#define get_csv_string_pos636(X,Y) get_csv_string((X),(Y),636)
+#define get_csv_v_str_pos636(X,Y) get_csv_string((X),(Y),636)
+#define get_csv_bool_pos636(X,Y) get_csv_bool((X),(Y),636)
+#define get_csv_int_pos636(X,Y) get_csv_int((X),(Y),636)
+#define get_csv_llong_pos636(X,Y) get_csv_llong((X),(Y),636)
+#define get_csv_float_pos636(X,Y) get_csv_float((X),(Y),636)
+#define get_csv_uint_pos637(X,Y) get_csv_uint((X),(Y),637)
+#define get_csv_ullong_pos637(X,Y) get_csv_ullong((X),(Y),637)
+#define get_csv_ip_pos637(X,Y) get_csv_ip((X),(Y),637)
+#define get_csv_ipv6_pos637(X,Y) get_csv_ipv6((X),(Y),637)
+#define get_csv_string_pos637(X,Y) get_csv_string((X),(Y),637)
+#define get_csv_v_str_pos637(X,Y) get_csv_string((X),(Y),637)
+#define get_csv_bool_pos637(X,Y) get_csv_bool((X),(Y),637)
+#define get_csv_int_pos637(X,Y) get_csv_int((X),(Y),637)
+#define get_csv_llong_pos637(X,Y) get_csv_llong((X),(Y),637)
+#define get_csv_float_pos637(X,Y) get_csv_float((X),(Y),637)
+#define get_csv_uint_pos638(X,Y) get_csv_uint((X),(Y),638)
+#define get_csv_ullong_pos638(X,Y) get_csv_ullong((X),(Y),638)
+#define get_csv_ip_pos638(X,Y) get_csv_ip((X),(Y),638)
+#define get_csv_ipv6_pos638(X,Y) get_csv_ipv6((X),(Y),638)
+#define get_csv_string_pos638(X,Y) get_csv_string((X),(Y),638)
+#define get_csv_v_str_pos638(X,Y) get_csv_string((X),(Y),638)
+#define get_csv_bool_pos638(X,Y) get_csv_bool((X),(Y),638)
+#define get_csv_int_pos638(X,Y) get_csv_int((X),(Y),638)
+#define get_csv_llong_pos638(X,Y) get_csv_llong((X),(Y),638)
+#define get_csv_float_pos638(X,Y) get_csv_float((X),(Y),638)
+#define get_csv_uint_pos639(X,Y) get_csv_uint((X),(Y),639)
+#define get_csv_ullong_pos639(X,Y) get_csv_ullong((X),(Y),639)
+#define get_csv_ip_pos639(X,Y) get_csv_ip((X),(Y),639)
+#define get_csv_ipv6_pos639(X,Y) get_csv_ipv6((X),(Y),639)
+#define get_csv_string_pos639(X,Y) get_csv_string((X),(Y),639)
+#define get_csv_v_str_pos639(X,Y) get_csv_string((X),(Y),639)
+#define get_csv_bool_pos639(X,Y) get_csv_bool((X),(Y),639)
+#define get_csv_int_pos639(X,Y) get_csv_int((X),(Y),639)
+#define get_csv_llong_pos639(X,Y) get_csv_llong((X),(Y),639)
+#define get_csv_float_pos639(X,Y) get_csv_float((X),(Y),639)
+#define get_csv_uint_pos640(X,Y) get_csv_uint((X),(Y),640)
+#define get_csv_ullong_pos640(X,Y) get_csv_ullong((X),(Y),640)
+#define get_csv_ip_pos640(X,Y) get_csv_ip((X),(Y),640)
+#define get_csv_ipv6_pos640(X,Y) get_csv_ipv6((X),(Y),640)
+#define get_csv_string_pos640(X,Y) get_csv_string((X),(Y),640)
+#define get_csv_v_str_pos640(X,Y) get_csv_string((X),(Y),640)
+#define get_csv_bool_pos640(X,Y) get_csv_bool((X),(Y),640)
+#define get_csv_int_pos640(X,Y) get_csv_int((X),(Y),640)
+#define get_csv_llong_pos640(X,Y) get_csv_llong((X),(Y),640)
+#define get_csv_float_pos640(X,Y) get_csv_float((X),(Y),640)
+#define get_csv_uint_pos641(X,Y) get_csv_uint((X),(Y),641)
+#define get_csv_ullong_pos641(X,Y) get_csv_ullong((X),(Y),641)
+#define get_csv_ip_pos641(X,Y) get_csv_ip((X),(Y),641)
+#define get_csv_ipv6_pos641(X,Y) get_csv_ipv6((X),(Y),641)
+#define get_csv_string_pos641(X,Y) get_csv_string((X),(Y),641)
+#define get_csv_v_str_pos641(X,Y) get_csv_string((X),(Y),641)
+#define get_csv_bool_pos641(X,Y) get_csv_bool((X),(Y),641)
+#define get_csv_int_pos641(X,Y) get_csv_int((X),(Y),641)
+#define get_csv_llong_pos641(X,Y) get_csv_llong((X),(Y),641)
+#define get_csv_float_pos641(X,Y) get_csv_float((X),(Y),641)
+#define get_csv_uint_pos642(X,Y) get_csv_uint((X),(Y),642)
+#define get_csv_ullong_pos642(X,Y) get_csv_ullong((X),(Y),642)
+#define get_csv_ip_pos642(X,Y) get_csv_ip((X),(Y),642)
+#define get_csv_ipv6_pos642(X,Y) get_csv_ipv6((X),(Y),642)
+#define get_csv_string_pos642(X,Y) get_csv_string((X),(Y),642)
+#define get_csv_v_str_pos642(X,Y) get_csv_string((X),(Y),642)
+#define get_csv_bool_pos642(X,Y) get_csv_bool((X),(Y),642)
+#define get_csv_int_pos642(X,Y) get_csv_int((X),(Y),642)
+#define get_csv_llong_pos642(X,Y) get_csv_llong((X),(Y),642)
+#define get_csv_float_pos642(X,Y) get_csv_float((X),(Y),642)
+#define get_csv_uint_pos643(X,Y) get_csv_uint((X),(Y),643)
+#define get_csv_ullong_pos643(X,Y) get_csv_ullong((X),(Y),643)
+#define get_csv_ip_pos643(X,Y) get_csv_ip((X),(Y),643)
+#define get_csv_ipv6_pos643(X,Y) get_csv_ipv6((X),(Y),643)
+#define get_csv_string_pos643(X,Y) get_csv_string((X),(Y),643)
+#define get_csv_v_str_pos643(X,Y) get_csv_string((X),(Y),643)
+#define get_csv_bool_pos643(X,Y) get_csv_bool((X),(Y),643)
+#define get_csv_int_pos643(X,Y) get_csv_int((X),(Y),643)
+#define get_csv_llong_pos643(X,Y) get_csv_llong((X),(Y),643)
+#define get_csv_float_pos643(X,Y) get_csv_float((X),(Y),643)
+#define get_csv_uint_pos644(X,Y) get_csv_uint((X),(Y),644)
+#define get_csv_ullong_pos644(X,Y) get_csv_ullong((X),(Y),644)
+#define get_csv_ip_pos644(X,Y) get_csv_ip((X),(Y),644)
+#define get_csv_ipv6_pos644(X,Y) get_csv_ipv6((X),(Y),644)
+#define get_csv_string_pos644(X,Y) get_csv_string((X),(Y),644)
+#define get_csv_v_str_pos644(X,Y) get_csv_string((X),(Y),644)
+#define get_csv_bool_pos644(X,Y) get_csv_bool((X),(Y),644)
+#define get_csv_int_pos644(X,Y) get_csv_int((X),(Y),644)
+#define get_csv_llong_pos644(X,Y) get_csv_llong((X),(Y),644)
+#define get_csv_float_pos644(X,Y) get_csv_float((X),(Y),644)
+#define get_csv_uint_pos645(X,Y) get_csv_uint((X),(Y),645)
+#define get_csv_ullong_pos645(X,Y) get_csv_ullong((X),(Y),645)
+#define get_csv_ip_pos645(X,Y) get_csv_ip((X),(Y),645)
+#define get_csv_ipv6_pos645(X,Y) get_csv_ipv6((X),(Y),645)
+#define get_csv_string_pos645(X,Y) get_csv_string((X),(Y),645)
+#define get_csv_v_str_pos645(X,Y) get_csv_string((X),(Y),645)
+#define get_csv_bool_pos645(X,Y) get_csv_bool((X),(Y),645)
+#define get_csv_int_pos645(X,Y) get_csv_int((X),(Y),645)
+#define get_csv_llong_pos645(X,Y) get_csv_llong((X),(Y),645)
+#define get_csv_float_pos645(X,Y) get_csv_float((X),(Y),645)
+#define get_csv_uint_pos646(X,Y) get_csv_uint((X),(Y),646)
+#define get_csv_ullong_pos646(X,Y) get_csv_ullong((X),(Y),646)
+#define get_csv_ip_pos646(X,Y) get_csv_ip((X),(Y),646)
+#define get_csv_ipv6_pos646(X,Y) get_csv_ipv6((X),(Y),646)
+#define get_csv_string_pos646(X,Y) get_csv_string((X),(Y),646)
+#define get_csv_v_str_pos646(X,Y) get_csv_string((X),(Y),646)
+#define get_csv_bool_pos646(X,Y) get_csv_bool((X),(Y),646)
+#define get_csv_int_pos646(X,Y) get_csv_int((X),(Y),646)
+#define get_csv_llong_pos646(X,Y) get_csv_llong((X),(Y),646)
+#define get_csv_float_pos646(X,Y) get_csv_float((X),(Y),646)
+#define get_csv_uint_pos647(X,Y) get_csv_uint((X),(Y),647)
+#define get_csv_ullong_pos647(X,Y) get_csv_ullong((X),(Y),647)
+#define get_csv_ip_pos647(X,Y) get_csv_ip((X),(Y),647)
+#define get_csv_ipv6_pos647(X,Y) get_csv_ipv6((X),(Y),647)
+#define get_csv_string_pos647(X,Y) get_csv_string((X),(Y),647)
+#define get_csv_v_str_pos647(X,Y) get_csv_string((X),(Y),647)
+#define get_csv_bool_pos647(X,Y) get_csv_bool((X),(Y),647)
+#define get_csv_int_pos647(X,Y) get_csv_int((X),(Y),647)
+#define get_csv_llong_pos647(X,Y) get_csv_llong((X),(Y),647)
+#define get_csv_float_pos647(X,Y) get_csv_float((X),(Y),647)
+#define get_csv_uint_pos648(X,Y) get_csv_uint((X),(Y),648)
+#define get_csv_ullong_pos648(X,Y) get_csv_ullong((X),(Y),648)
+#define get_csv_ip_pos648(X,Y) get_csv_ip((X),(Y),648)
+#define get_csv_ipv6_pos648(X,Y) get_csv_ipv6((X),(Y),648)
+#define get_csv_string_pos648(X,Y) get_csv_string((X),(Y),648)
+#define get_csv_v_str_pos648(X,Y) get_csv_string((X),(Y),648)
+#define get_csv_bool_pos648(X,Y) get_csv_bool((X),(Y),648)
+#define get_csv_int_pos648(X,Y) get_csv_int((X),(Y),648)
+#define get_csv_llong_pos648(X,Y) get_csv_llong((X),(Y),648)
+#define get_csv_float_pos648(X,Y) get_csv_float((X),(Y),648)
+#define get_csv_uint_pos649(X,Y) get_csv_uint((X),(Y),649)
+#define get_csv_ullong_pos649(X,Y) get_csv_ullong((X),(Y),649)
+#define get_csv_ip_pos649(X,Y) get_csv_ip((X),(Y),649)
+#define get_csv_ipv6_pos649(X,Y) get_csv_ipv6((X),(Y),649)
+#define get_csv_string_pos649(X,Y) get_csv_string((X),(Y),649)
+#define get_csv_v_str_pos649(X,Y) get_csv_string((X),(Y),649)
+#define get_csv_bool_pos649(X,Y) get_csv_bool((X),(Y),649)
+#define get_csv_int_pos649(X,Y) get_csv_int((X),(Y),649)
+#define get_csv_llong_pos649(X,Y) get_csv_llong((X),(Y),649)
+#define get_csv_float_pos649(X,Y) get_csv_float((X),(Y),649)
+#define get_csv_uint_pos650(X,Y) get_csv_uint((X),(Y),650)
+#define get_csv_ullong_pos650(X,Y) get_csv_ullong((X),(Y),650)
+#define get_csv_ip_pos650(X,Y) get_csv_ip((X),(Y),650)
+#define get_csv_ipv6_pos650(X,Y) get_csv_ipv6((X),(Y),650)
+#define get_csv_string_pos650(X,Y) get_csv_string((X),(Y),650)
+#define get_csv_v_str_pos650(X,Y) get_csv_string((X),(Y),650)
+#define get_csv_bool_pos650(X,Y) get_csv_bool((X),(Y),650)
+#define get_csv_int_pos650(X,Y) get_csv_int((X),(Y),650)
+#define get_csv_llong_pos650(X,Y) get_csv_llong((X),(Y),650)
+#define get_csv_float_pos650(X,Y) get_csv_float((X),(Y),650)
+#define get_csv_uint_pos651(X,Y) get_csv_uint((X),(Y),651)
+#define get_csv_ullong_pos651(X,Y) get_csv_ullong((X),(Y),651)
+#define get_csv_ip_pos651(X,Y) get_csv_ip((X),(Y),651)
+#define get_csv_ipv6_pos651(X,Y) get_csv_ipv6((X),(Y),651)
+#define get_csv_string_pos651(X,Y) get_csv_string((X),(Y),651)
+#define get_csv_v_str_pos651(X,Y) get_csv_string((X),(Y),651)
+#define get_csv_bool_pos651(X,Y) get_csv_bool((X),(Y),651)
+#define get_csv_int_pos651(X,Y) get_csv_int((X),(Y),651)
+#define get_csv_llong_pos651(X,Y) get_csv_llong((X),(Y),651)
+#define get_csv_float_pos651(X,Y) get_csv_float((X),(Y),651)
+#define get_csv_uint_pos652(X,Y) get_csv_uint((X),(Y),652)
+#define get_csv_ullong_pos652(X,Y) get_csv_ullong((X),(Y),652)
+#define get_csv_ip_pos652(X,Y) get_csv_ip((X),(Y),652)
+#define get_csv_ipv6_pos652(X,Y) get_csv_ipv6((X),(Y),652)
+#define get_csv_string_pos652(X,Y) get_csv_string((X),(Y),652)
+#define get_csv_v_str_pos652(X,Y) get_csv_string((X),(Y),652)
+#define get_csv_bool_pos652(X,Y) get_csv_bool((X),(Y),652)
+#define get_csv_int_pos652(X,Y) get_csv_int((X),(Y),652)
+#define get_csv_llong_pos652(X,Y) get_csv_llong((X),(Y),652)
+#define get_csv_float_pos652(X,Y) get_csv_float((X),(Y),652)
+#define get_csv_uint_pos653(X,Y) get_csv_uint((X),(Y),653)
+#define get_csv_ullong_pos653(X,Y) get_csv_ullong((X),(Y),653)
+#define get_csv_ip_pos653(X,Y) get_csv_ip((X),(Y),653)
+#define get_csv_ipv6_pos653(X,Y) get_csv_ipv6((X),(Y),653)
+#define get_csv_string_pos653(X,Y) get_csv_string((X),(Y),653)
+#define get_csv_v_str_pos653(X,Y) get_csv_string((X),(Y),653)
+#define get_csv_bool_pos653(X,Y) get_csv_bool((X),(Y),653)
+#define get_csv_int_pos653(X,Y) get_csv_int((X),(Y),653)
+#define get_csv_llong_pos653(X,Y) get_csv_llong((X),(Y),653)
+#define get_csv_float_pos653(X,Y) get_csv_float((X),(Y),653)
+#define get_csv_uint_pos654(X,Y) get_csv_uint((X),(Y),654)
+#define get_csv_ullong_pos654(X,Y) get_csv_ullong((X),(Y),654)
+#define get_csv_ip_pos654(X,Y) get_csv_ip((X),(Y),654)
+#define get_csv_ipv6_pos654(X,Y) get_csv_ipv6((X),(Y),654)
+#define get_csv_string_pos654(X,Y) get_csv_string((X),(Y),654)
+#define get_csv_v_str_pos654(X,Y) get_csv_string((X),(Y),654)
+#define get_csv_bool_pos654(X,Y) get_csv_bool((X),(Y),654)
+#define get_csv_int_pos654(X,Y) get_csv_int((X),(Y),654)
+#define get_csv_llong_pos654(X,Y) get_csv_llong((X),(Y),654)
+#define get_csv_float_pos654(X,Y) get_csv_float((X),(Y),654)
+#define get_csv_uint_pos655(X,Y) get_csv_uint((X),(Y),655)
+#define get_csv_ullong_pos655(X,Y) get_csv_ullong((X),(Y),655)
+#define get_csv_ip_pos655(X,Y) get_csv_ip((X),(Y),655)
+#define get_csv_ipv6_pos655(X,Y) get_csv_ipv6((X),(Y),655)
+#define get_csv_string_pos655(X,Y) get_csv_string((X),(Y),655)
+#define get_csv_v_str_pos655(X,Y) get_csv_string((X),(Y),655)
+#define get_csv_bool_pos655(X,Y) get_csv_bool((X),(Y),655)
+#define get_csv_int_pos655(X,Y) get_csv_int((X),(Y),655)
+#define get_csv_llong_pos655(X,Y) get_csv_llong((X),(Y),655)
+#define get_csv_float_pos655(X,Y) get_csv_float((X),(Y),655)
+#define get_csv_uint_pos656(X,Y) get_csv_uint((X),(Y),656)
+#define get_csv_ullong_pos656(X,Y) get_csv_ullong((X),(Y),656)
+#define get_csv_ip_pos656(X,Y) get_csv_ip((X),(Y),656)
+#define get_csv_ipv6_pos656(X,Y) get_csv_ipv6((X),(Y),656)
+#define get_csv_string_pos656(X,Y) get_csv_string((X),(Y),656)
+#define get_csv_v_str_pos656(X,Y) get_csv_string((X),(Y),656)
+#define get_csv_bool_pos656(X,Y) get_csv_bool((X),(Y),656)
+#define get_csv_int_pos656(X,Y) get_csv_int((X),(Y),656)
+#define get_csv_llong_pos656(X,Y) get_csv_llong((X),(Y),656)
+#define get_csv_float_pos656(X,Y) get_csv_float((X),(Y),656)
+#define get_csv_uint_pos657(X,Y) get_csv_uint((X),(Y),657)
+#define get_csv_ullong_pos657(X,Y) get_csv_ullong((X),(Y),657)
+#define get_csv_ip_pos657(X,Y) get_csv_ip((X),(Y),657)
+#define get_csv_ipv6_pos657(X,Y) get_csv_ipv6((X),(Y),657)
+#define get_csv_string_pos657(X,Y) get_csv_string((X),(Y),657)
+#define get_csv_v_str_pos657(X,Y) get_csv_string((X),(Y),657)
+#define get_csv_bool_pos657(X,Y) get_csv_bool((X),(Y),657)
+#define get_csv_int_pos657(X,Y) get_csv_int((X),(Y),657)
+#define get_csv_llong_pos657(X,Y) get_csv_llong((X),(Y),657)
+#define get_csv_float_pos657(X,Y) get_csv_float((X),(Y),657)
+#define get_csv_uint_pos658(X,Y) get_csv_uint((X),(Y),658)
+#define get_csv_ullong_pos658(X,Y) get_csv_ullong((X),(Y),658)
+#define get_csv_ip_pos658(X,Y) get_csv_ip((X),(Y),658)
+#define get_csv_ipv6_pos658(X,Y) get_csv_ipv6((X),(Y),658)
+#define get_csv_string_pos658(X,Y) get_csv_string((X),(Y),658)
+#define get_csv_v_str_pos658(X,Y) get_csv_string((X),(Y),658)
+#define get_csv_bool_pos658(X,Y) get_csv_bool((X),(Y),658)
+#define get_csv_int_pos658(X,Y) get_csv_int((X),(Y),658)
+#define get_csv_llong_pos658(X,Y) get_csv_llong((X),(Y),658)
+#define get_csv_float_pos658(X,Y) get_csv_float((X),(Y),658)
+#define get_csv_uint_pos659(X,Y) get_csv_uint((X),(Y),659)
+#define get_csv_ullong_pos659(X,Y) get_csv_ullong((X),(Y),659)
+#define get_csv_ip_pos659(X,Y) get_csv_ip((X),(Y),659)
+#define get_csv_ipv6_pos659(X,Y) get_csv_ipv6((X),(Y),659)
+#define get_csv_string_pos659(X,Y) get_csv_string((X),(Y),659)
+#define get_csv_v_str_pos659(X,Y) get_csv_string((X),(Y),659)
+#define get_csv_bool_pos659(X,Y) get_csv_bool((X),(Y),659)
+#define get_csv_int_pos659(X,Y) get_csv_int((X),(Y),659)
+#define get_csv_llong_pos659(X,Y) get_csv_llong((X),(Y),659)
+#define get_csv_float_pos659(X,Y) get_csv_float((X),(Y),659)
+#define get_csv_uint_pos660(X,Y) get_csv_uint((X),(Y),660)
+#define get_csv_ullong_pos660(X,Y) get_csv_ullong((X),(Y),660)
+#define get_csv_ip_pos660(X,Y) get_csv_ip((X),(Y),660)
+#define get_csv_ipv6_pos660(X,Y) get_csv_ipv6((X),(Y),660)
+#define get_csv_string_pos660(X,Y) get_csv_string((X),(Y),660)
+#define get_csv_v_str_pos660(X,Y) get_csv_string((X),(Y),660)
+#define get_csv_bool_pos660(X,Y) get_csv_bool((X),(Y),660)
+#define get_csv_int_pos660(X,Y) get_csv_int((X),(Y),660)
+#define get_csv_llong_pos660(X,Y) get_csv_llong((X),(Y),660)
+#define get_csv_float_pos660(X,Y) get_csv_float((X),(Y),660)
+#define get_csv_uint_pos661(X,Y) get_csv_uint((X),(Y),661)
+#define get_csv_ullong_pos661(X,Y) get_csv_ullong((X),(Y),661)
+#define get_csv_ip_pos661(X,Y) get_csv_ip((X),(Y),661)
+#define get_csv_ipv6_pos661(X,Y) get_csv_ipv6((X),(Y),661)
+#define get_csv_string_pos661(X,Y) get_csv_string((X),(Y),661)
+#define get_csv_v_str_pos661(X,Y) get_csv_string((X),(Y),661)
+#define get_csv_bool_pos661(X,Y) get_csv_bool((X),(Y),661)
+#define get_csv_int_pos661(X,Y) get_csv_int((X),(Y),661)
+#define get_csv_llong_pos661(X,Y) get_csv_llong((X),(Y),661)
+#define get_csv_float_pos661(X,Y) get_csv_float((X),(Y),661)
+#define get_csv_uint_pos662(X,Y) get_csv_uint((X),(Y),662)
+#define get_csv_ullong_pos662(X,Y) get_csv_ullong((X),(Y),662)
+#define get_csv_ip_pos662(X,Y) get_csv_ip((X),(Y),662)
+#define get_csv_ipv6_pos662(X,Y) get_csv_ipv6((X),(Y),662)
+#define get_csv_string_pos662(X,Y) get_csv_string((X),(Y),662)
+#define get_csv_v_str_pos662(X,Y) get_csv_string((X),(Y),662)
+#define get_csv_bool_pos662(X,Y) get_csv_bool((X),(Y),662)
+#define get_csv_int_pos662(X,Y) get_csv_int((X),(Y),662)
+#define get_csv_llong_pos662(X,Y) get_csv_llong((X),(Y),662)
+#define get_csv_float_pos662(X,Y) get_csv_float((X),(Y),662)
+#define get_csv_uint_pos663(X,Y) get_csv_uint((X),(Y),663)
+#define get_csv_ullong_pos663(X,Y) get_csv_ullong((X),(Y),663)
+#define get_csv_ip_pos663(X,Y) get_csv_ip((X),(Y),663)
+#define get_csv_ipv6_pos663(X,Y) get_csv_ipv6((X),(Y),663)
+#define get_csv_string_pos663(X,Y) get_csv_string((X),(Y),663)
+#define get_csv_v_str_pos663(X,Y) get_csv_string((X),(Y),663)
+#define get_csv_bool_pos663(X,Y) get_csv_bool((X),(Y),663)
+#define get_csv_int_pos663(X,Y) get_csv_int((X),(Y),663)
+#define get_csv_llong_pos663(X,Y) get_csv_llong((X),(Y),663)
+#define get_csv_float_pos663(X,Y) get_csv_float((X),(Y),663)
+#define get_csv_uint_pos664(X,Y) get_csv_uint((X),(Y),664)
+#define get_csv_ullong_pos664(X,Y) get_csv_ullong((X),(Y),664)
+#define get_csv_ip_pos664(X,Y) get_csv_ip((X),(Y),664)
+#define get_csv_ipv6_pos664(X,Y) get_csv_ipv6((X),(Y),664)
+#define get_csv_string_pos664(X,Y) get_csv_string((X),(Y),664)
+#define get_csv_v_str_pos664(X,Y) get_csv_string((X),(Y),664)
+#define get_csv_bool_pos664(X,Y) get_csv_bool((X),(Y),664)
+#define get_csv_int_pos664(X,Y) get_csv_int((X),(Y),664)
+#define get_csv_llong_pos664(X,Y) get_csv_llong((X),(Y),664)
+#define get_csv_float_pos664(X,Y) get_csv_float((X),(Y),664)
+#define get_csv_uint_pos665(X,Y) get_csv_uint((X),(Y),665)
+#define get_csv_ullong_pos665(X,Y) get_csv_ullong((X),(Y),665)
+#define get_csv_ip_pos665(X,Y) get_csv_ip((X),(Y),665)
+#define get_csv_ipv6_pos665(X,Y) get_csv_ipv6((X),(Y),665)
+#define get_csv_string_pos665(X,Y) get_csv_string((X),(Y),665)
+#define get_csv_v_str_pos665(X,Y) get_csv_string((X),(Y),665)
+#define get_csv_bool_pos665(X,Y) get_csv_bool((X),(Y),665)
+#define get_csv_int_pos665(X,Y) get_csv_int((X),(Y),665)
+#define get_csv_llong_pos665(X,Y) get_csv_llong((X),(Y),665)
+#define get_csv_float_pos665(X,Y) get_csv_float((X),(Y),665)
+#define get_csv_uint_pos666(X,Y) get_csv_uint((X),(Y),666)
+#define get_csv_ullong_pos666(X,Y) get_csv_ullong((X),(Y),666)
+#define get_csv_ip_pos666(X,Y) get_csv_ip((X),(Y),666)
+#define get_csv_ipv6_pos666(X,Y) get_csv_ipv6((X),(Y),666)
+#define get_csv_string_pos666(X,Y) get_csv_string((X),(Y),666)
+#define get_csv_v_str_pos666(X,Y) get_csv_string((X),(Y),666)
+#define get_csv_bool_pos666(X,Y) get_csv_bool((X),(Y),666)
+#define get_csv_int_pos666(X,Y) get_csv_int((X),(Y),666)
+#define get_csv_llong_pos666(X,Y) get_csv_llong((X),(Y),666)
+#define get_csv_float_pos666(X,Y) get_csv_float((X),(Y),666)
+#define get_csv_uint_pos667(X,Y) get_csv_uint((X),(Y),667)
+#define get_csv_ullong_pos667(X,Y) get_csv_ullong((X),(Y),667)
+#define get_csv_ip_pos667(X,Y) get_csv_ip((X),(Y),667)
+#define get_csv_ipv6_pos667(X,Y) get_csv_ipv6((X),(Y),667)
+#define get_csv_string_pos667(X,Y) get_csv_string((X),(Y),667)
+#define get_csv_v_str_pos667(X,Y) get_csv_string((X),(Y),667)
+#define get_csv_bool_pos667(X,Y) get_csv_bool((X),(Y),667)
+#define get_csv_int_pos667(X,Y) get_csv_int((X),(Y),667)
+#define get_csv_llong_pos667(X,Y) get_csv_llong((X),(Y),667)
+#define get_csv_float_pos667(X,Y) get_csv_float((X),(Y),667)
+#define get_csv_uint_pos668(X,Y) get_csv_uint((X),(Y),668)
+#define get_csv_ullong_pos668(X,Y) get_csv_ullong((X),(Y),668)
+#define get_csv_ip_pos668(X,Y) get_csv_ip((X),(Y),668)
+#define get_csv_ipv6_pos668(X,Y) get_csv_ipv6((X),(Y),668)
+#define get_csv_string_pos668(X,Y) get_csv_string((X),(Y),668)
+#define get_csv_v_str_pos668(X,Y) get_csv_string((X),(Y),668)
+#define get_csv_bool_pos668(X,Y) get_csv_bool((X),(Y),668)
+#define get_csv_int_pos668(X,Y) get_csv_int((X),(Y),668)
+#define get_csv_llong_pos668(X,Y) get_csv_llong((X),(Y),668)
+#define get_csv_float_pos668(X,Y) get_csv_float((X),(Y),668)
+#define get_csv_uint_pos669(X,Y) get_csv_uint((X),(Y),669)
+#define get_csv_ullong_pos669(X,Y) get_csv_ullong((X),(Y),669)
+#define get_csv_ip_pos669(X,Y) get_csv_ip((X),(Y),669)
+#define get_csv_ipv6_pos669(X,Y) get_csv_ipv6((X),(Y),669)
+#define get_csv_string_pos669(X,Y) get_csv_string((X),(Y),669)
+#define get_csv_v_str_pos669(X,Y) get_csv_string((X),(Y),669)
+#define get_csv_bool_pos669(X,Y) get_csv_bool((X),(Y),669)
+#define get_csv_int_pos669(X,Y) get_csv_int((X),(Y),669)
+#define get_csv_llong_pos669(X,Y) get_csv_llong((X),(Y),669)
+#define get_csv_float_pos669(X,Y) get_csv_float((X),(Y),669)
+#define get_csv_uint_pos670(X,Y) get_csv_uint((X),(Y),670)
+#define get_csv_ullong_pos670(X,Y) get_csv_ullong((X),(Y),670)
+#define get_csv_ip_pos670(X,Y) get_csv_ip((X),(Y),670)
+#define get_csv_ipv6_pos670(X,Y) get_csv_ipv6((X),(Y),670)
+#define get_csv_string_pos670(X,Y) get_csv_string((X),(Y),670)
+#define get_csv_v_str_pos670(X,Y) get_csv_string((X),(Y),670)
+#define get_csv_bool_pos670(X,Y) get_csv_bool((X),(Y),670)
+#define get_csv_int_pos670(X,Y) get_csv_int((X),(Y),670)
+#define get_csv_llong_pos670(X,Y) get_csv_llong((X),(Y),670)
+#define get_csv_float_pos670(X,Y) get_csv_float((X),(Y),670)
+#define get_csv_uint_pos671(X,Y) get_csv_uint((X),(Y),671)
+#define get_csv_ullong_pos671(X,Y) get_csv_ullong((X),(Y),671)
+#define get_csv_ip_pos671(X,Y) get_csv_ip((X),(Y),671)
+#define get_csv_ipv6_pos671(X,Y) get_csv_ipv6((X),(Y),671)
+#define get_csv_string_pos671(X,Y) get_csv_string((X),(Y),671)
+#define get_csv_v_str_pos671(X,Y) get_csv_string((X),(Y),671)
+#define get_csv_bool_pos671(X,Y) get_csv_bool((X),(Y),671)
+#define get_csv_int_pos671(X,Y) get_csv_int((X),(Y),671)
+#define get_csv_llong_pos671(X,Y) get_csv_llong((X),(Y),671)
+#define get_csv_float_pos671(X,Y) get_csv_float((X),(Y),671)
+#define get_csv_uint_pos672(X,Y) get_csv_uint((X),(Y),672)
+#define get_csv_ullong_pos672(X,Y) get_csv_ullong((X),(Y),672)
+#define get_csv_ip_pos672(X,Y) get_csv_ip((X),(Y),672)
+#define get_csv_ipv6_pos672(X,Y) get_csv_ipv6((X),(Y),672)
+#define get_csv_string_pos672(X,Y) get_csv_string((X),(Y),672)
+#define get_csv_v_str_pos672(X,Y) get_csv_string((X),(Y),672)
+#define get_csv_bool_pos672(X,Y) get_csv_bool((X),(Y),672)
+#define get_csv_int_pos672(X,Y) get_csv_int((X),(Y),672)
+#define get_csv_llong_pos672(X,Y) get_csv_llong((X),(Y),672)
+#define get_csv_float_pos672(X,Y) get_csv_float((X),(Y),672)
+#define get_csv_uint_pos673(X,Y) get_csv_uint((X),(Y),673)
+#define get_csv_ullong_pos673(X,Y) get_csv_ullong((X),(Y),673)
+#define get_csv_ip_pos673(X,Y) get_csv_ip((X),(Y),673)
+#define get_csv_ipv6_pos673(X,Y) get_csv_ipv6((X),(Y),673)
+#define get_csv_string_pos673(X,Y) get_csv_string((X),(Y),673)
+#define get_csv_v_str_pos673(X,Y) get_csv_string((X),(Y),673)
+#define get_csv_bool_pos673(X,Y) get_csv_bool((X),(Y),673)
+#define get_csv_int_pos673(X,Y) get_csv_int((X),(Y),673)
+#define get_csv_llong_pos673(X,Y) get_csv_llong((X),(Y),673)
+#define get_csv_float_pos673(X,Y) get_csv_float((X),(Y),673)
+#define get_csv_uint_pos674(X,Y) get_csv_uint((X),(Y),674)
+#define get_csv_ullong_pos674(X,Y) get_csv_ullong((X),(Y),674)
+#define get_csv_ip_pos674(X,Y) get_csv_ip((X),(Y),674)
+#define get_csv_ipv6_pos674(X,Y) get_csv_ipv6((X),(Y),674)
+#define get_csv_string_pos674(X,Y) get_csv_string((X),(Y),674)
+#define get_csv_v_str_pos674(X,Y) get_csv_string((X),(Y),674)
+#define get_csv_bool_pos674(X,Y) get_csv_bool((X),(Y),674)
+#define get_csv_int_pos674(X,Y) get_csv_int((X),(Y),674)
+#define get_csv_llong_pos674(X,Y) get_csv_llong((X),(Y),674)
+#define get_csv_float_pos674(X,Y) get_csv_float((X),(Y),674)
+#define get_csv_uint_pos675(X,Y) get_csv_uint((X),(Y),675)
+#define get_csv_ullong_pos675(X,Y) get_csv_ullong((X),(Y),675)
+#define get_csv_ip_pos675(X,Y) get_csv_ip((X),(Y),675)
+#define get_csv_ipv6_pos675(X,Y) get_csv_ipv6((X),(Y),675)
+#define get_csv_string_pos675(X,Y) get_csv_string((X),(Y),675)
+#define get_csv_v_str_pos675(X,Y) get_csv_string((X),(Y),675)
+#define get_csv_bool_pos675(X,Y) get_csv_bool((X),(Y),675)
+#define get_csv_int_pos675(X,Y) get_csv_int((X),(Y),675)
+#define get_csv_llong_pos675(X,Y) get_csv_llong((X),(Y),675)
+#define get_csv_float_pos675(X,Y) get_csv_float((X),(Y),675)
+#define get_csv_uint_pos676(X,Y) get_csv_uint((X),(Y),676)
+#define get_csv_ullong_pos676(X,Y) get_csv_ullong((X),(Y),676)
+#define get_csv_ip_pos676(X,Y) get_csv_ip((X),(Y),676)
+#define get_csv_ipv6_pos676(X,Y) get_csv_ipv6((X),(Y),676)
+#define get_csv_string_pos676(X,Y) get_csv_string((X),(Y),676)
+#define get_csv_v_str_pos676(X,Y) get_csv_string((X),(Y),676)
+#define get_csv_bool_pos676(X,Y) get_csv_bool((X),(Y),676)
+#define get_csv_int_pos676(X,Y) get_csv_int((X),(Y),676)
+#define get_csv_llong_pos676(X,Y) get_csv_llong((X),(Y),676)
+#define get_csv_float_pos676(X,Y) get_csv_float((X),(Y),676)
+#define get_csv_uint_pos677(X,Y) get_csv_uint((X),(Y),677)
+#define get_csv_ullong_pos677(X,Y) get_csv_ullong((X),(Y),677)
+#define get_csv_ip_pos677(X,Y) get_csv_ip((X),(Y),677)
+#define get_csv_ipv6_pos677(X,Y) get_csv_ipv6((X),(Y),677)
+#define get_csv_string_pos677(X,Y) get_csv_string((X),(Y),677)
+#define get_csv_v_str_pos677(X,Y) get_csv_string((X),(Y),677)
+#define get_csv_bool_pos677(X,Y) get_csv_bool((X),(Y),677)
+#define get_csv_int_pos677(X,Y) get_csv_int((X),(Y),677)
+#define get_csv_llong_pos677(X,Y) get_csv_llong((X),(Y),677)
+#define get_csv_float_pos677(X,Y) get_csv_float((X),(Y),677)
+#define get_csv_uint_pos678(X,Y) get_csv_uint((X),(Y),678)
+#define get_csv_ullong_pos678(X,Y) get_csv_ullong((X),(Y),678)
+#define get_csv_ip_pos678(X,Y) get_csv_ip((X),(Y),678)
+#define get_csv_ipv6_pos678(X,Y) get_csv_ipv6((X),(Y),678)
+#define get_csv_string_pos678(X,Y) get_csv_string((X),(Y),678)
+#define get_csv_v_str_pos678(X,Y) get_csv_string((X),(Y),678)
+#define get_csv_bool_pos678(X,Y) get_csv_bool((X),(Y),678)
+#define get_csv_int_pos678(X,Y) get_csv_int((X),(Y),678)
+#define get_csv_llong_pos678(X,Y) get_csv_llong((X),(Y),678)
+#define get_csv_float_pos678(X,Y) get_csv_float((X),(Y),678)
+#define get_csv_uint_pos679(X,Y) get_csv_uint((X),(Y),679)
+#define get_csv_ullong_pos679(X,Y) get_csv_ullong((X),(Y),679)
+#define get_csv_ip_pos679(X,Y) get_csv_ip((X),(Y),679)
+#define get_csv_ipv6_pos679(X,Y) get_csv_ipv6((X),(Y),679)
+#define get_csv_string_pos679(X,Y) get_csv_string((X),(Y),679)
+#define get_csv_v_str_pos679(X,Y) get_csv_string((X),(Y),679)
+#define get_csv_bool_pos679(X,Y) get_csv_bool((X),(Y),679)
+#define get_csv_int_pos679(X,Y) get_csv_int((X),(Y),679)
+#define get_csv_llong_pos679(X,Y) get_csv_llong((X),(Y),679)
+#define get_csv_float_pos679(X,Y) get_csv_float((X),(Y),679)
+#define get_csv_uint_pos680(X,Y) get_csv_uint((X),(Y),680)
+#define get_csv_ullong_pos680(X,Y) get_csv_ullong((X),(Y),680)
+#define get_csv_ip_pos680(X,Y) get_csv_ip((X),(Y),680)
+#define get_csv_ipv6_pos680(X,Y) get_csv_ipv6((X),(Y),680)
+#define get_csv_string_pos680(X,Y) get_csv_string((X),(Y),680)
+#define get_csv_v_str_pos680(X,Y) get_csv_string((X),(Y),680)
+#define get_csv_bool_pos680(X,Y) get_csv_bool((X),(Y),680)
+#define get_csv_int_pos680(X,Y) get_csv_int((X),(Y),680)
+#define get_csv_llong_pos680(X,Y) get_csv_llong((X),(Y),680)
+#define get_csv_float_pos680(X,Y) get_csv_float((X),(Y),680)
+#define get_csv_uint_pos681(X,Y) get_csv_uint((X),(Y),681)
+#define get_csv_ullong_pos681(X,Y) get_csv_ullong((X),(Y),681)
+#define get_csv_ip_pos681(X,Y) get_csv_ip((X),(Y),681)
+#define get_csv_ipv6_pos681(X,Y) get_csv_ipv6((X),(Y),681)
+#define get_csv_string_pos681(X,Y) get_csv_string((X),(Y),681)
+#define get_csv_v_str_pos681(X,Y) get_csv_string((X),(Y),681)
+#define get_csv_bool_pos681(X,Y) get_csv_bool((X),(Y),681)
+#define get_csv_int_pos681(X,Y) get_csv_int((X),(Y),681)
+#define get_csv_llong_pos681(X,Y) get_csv_llong((X),(Y),681)
+#define get_csv_float_pos681(X,Y) get_csv_float((X),(Y),681)
+#define get_csv_uint_pos682(X,Y) get_csv_uint((X),(Y),682)
+#define get_csv_ullong_pos682(X,Y) get_csv_ullong((X),(Y),682)
+#define get_csv_ip_pos682(X,Y) get_csv_ip((X),(Y),682)
+#define get_csv_ipv6_pos682(X,Y) get_csv_ipv6((X),(Y),682)
+#define get_csv_string_pos682(X,Y) get_csv_string((X),(Y),682)
+#define get_csv_v_str_pos682(X,Y) get_csv_string((X),(Y),682)
+#define get_csv_bool_pos682(X,Y) get_csv_bool((X),(Y),682)
+#define get_csv_int_pos682(X,Y) get_csv_int((X),(Y),682)
+#define get_csv_llong_pos682(X,Y) get_csv_llong((X),(Y),682)
+#define get_csv_float_pos682(X,Y) get_csv_float((X),(Y),682)
+#define get_csv_uint_pos683(X,Y) get_csv_uint((X),(Y),683)
+#define get_csv_ullong_pos683(X,Y) get_csv_ullong((X),(Y),683)
+#define get_csv_ip_pos683(X,Y) get_csv_ip((X),(Y),683)
+#define get_csv_ipv6_pos683(X,Y) get_csv_ipv6((X),(Y),683)
+#define get_csv_string_pos683(X,Y) get_csv_string((X),(Y),683)
+#define get_csv_v_str_pos683(X,Y) get_csv_string((X),(Y),683)
+#define get_csv_bool_pos683(X,Y) get_csv_bool((X),(Y),683)
+#define get_csv_int_pos683(X,Y) get_csv_int((X),(Y),683)
+#define get_csv_llong_pos683(X,Y) get_csv_llong((X),(Y),683)
+#define get_csv_float_pos683(X,Y) get_csv_float((X),(Y),683)
+#define get_csv_uint_pos684(X,Y) get_csv_uint((X),(Y),684)
+#define get_csv_ullong_pos684(X,Y) get_csv_ullong((X),(Y),684)
+#define get_csv_ip_pos684(X,Y) get_csv_ip((X),(Y),684)
+#define get_csv_ipv6_pos684(X,Y) get_csv_ipv6((X),(Y),684)
+#define get_csv_string_pos684(X,Y) get_csv_string((X),(Y),684)
+#define get_csv_v_str_pos684(X,Y) get_csv_string((X),(Y),684)
+#define get_csv_bool_pos684(X,Y) get_csv_bool((X),(Y),684)
+#define get_csv_int_pos684(X,Y) get_csv_int((X),(Y),684)
+#define get_csv_llong_pos684(X,Y) get_csv_llong((X),(Y),684)
+#define get_csv_float_pos684(X,Y) get_csv_float((X),(Y),684)
+#define get_csv_uint_pos685(X,Y) get_csv_uint((X),(Y),685)
+#define get_csv_ullong_pos685(X,Y) get_csv_ullong((X),(Y),685)
+#define get_csv_ip_pos685(X,Y) get_csv_ip((X),(Y),685)
+#define get_csv_ipv6_pos685(X,Y) get_csv_ipv6((X),(Y),685)
+#define get_csv_string_pos685(X,Y) get_csv_string((X),(Y),685)
+#define get_csv_v_str_pos685(X,Y) get_csv_string((X),(Y),685)
+#define get_csv_bool_pos685(X,Y) get_csv_bool((X),(Y),685)
+#define get_csv_int_pos685(X,Y) get_csv_int((X),(Y),685)
+#define get_csv_llong_pos685(X,Y) get_csv_llong((X),(Y),685)
+#define get_csv_float_pos685(X,Y) get_csv_float((X),(Y),685)
+#define get_csv_uint_pos686(X,Y) get_csv_uint((X),(Y),686)
+#define get_csv_ullong_pos686(X,Y) get_csv_ullong((X),(Y),686)
+#define get_csv_ip_pos686(X,Y) get_csv_ip((X),(Y),686)
+#define get_csv_ipv6_pos686(X,Y) get_csv_ipv6((X),(Y),686)
+#define get_csv_string_pos686(X,Y) get_csv_string((X),(Y),686)
+#define get_csv_v_str_pos686(X,Y) get_csv_string((X),(Y),686)
+#define get_csv_bool_pos686(X,Y) get_csv_bool((X),(Y),686)
+#define get_csv_int_pos686(X,Y) get_csv_int((X),(Y),686)
+#define get_csv_llong_pos686(X,Y) get_csv_llong((X),(Y),686)
+#define get_csv_float_pos686(X,Y) get_csv_float((X),(Y),686)
+#define get_csv_uint_pos687(X,Y) get_csv_uint((X),(Y),687)
+#define get_csv_ullong_pos687(X,Y) get_csv_ullong((X),(Y),687)
+#define get_csv_ip_pos687(X,Y) get_csv_ip((X),(Y),687)
+#define get_csv_ipv6_pos687(X,Y) get_csv_ipv6((X),(Y),687)
+#define get_csv_string_pos687(X,Y) get_csv_string((X),(Y),687)
+#define get_csv_v_str_pos687(X,Y) get_csv_string((X),(Y),687)
+#define get_csv_bool_pos687(X,Y) get_csv_bool((X),(Y),687)
+#define get_csv_int_pos687(X,Y) get_csv_int((X),(Y),687)
+#define get_csv_llong_pos687(X,Y) get_csv_llong((X),(Y),687)
+#define get_csv_float_pos687(X,Y) get_csv_float((X),(Y),687)
+#define get_csv_uint_pos688(X,Y) get_csv_uint((X),(Y),688)
+#define get_csv_ullong_pos688(X,Y) get_csv_ullong((X),(Y),688)
+#define get_csv_ip_pos688(X,Y) get_csv_ip((X),(Y),688)
+#define get_csv_ipv6_pos688(X,Y) get_csv_ipv6((X),(Y),688)
+#define get_csv_string_pos688(X,Y) get_csv_string((X),(Y),688)
+#define get_csv_v_str_pos688(X,Y) get_csv_string((X),(Y),688)
+#define get_csv_bool_pos688(X,Y) get_csv_bool((X),(Y),688)
+#define get_csv_int_pos688(X,Y) get_csv_int((X),(Y),688)
+#define get_csv_llong_pos688(X,Y) get_csv_llong((X),(Y),688)
+#define get_csv_float_pos688(X,Y) get_csv_float((X),(Y),688)
+#define get_csv_uint_pos689(X,Y) get_csv_uint((X),(Y),689)
+#define get_csv_ullong_pos689(X,Y) get_csv_ullong((X),(Y),689)
+#define get_csv_ip_pos689(X,Y) get_csv_ip((X),(Y),689)
+#define get_csv_ipv6_pos689(X,Y) get_csv_ipv6((X),(Y),689)
+#define get_csv_string_pos689(X,Y) get_csv_string((X),(Y),689)
+#define get_csv_v_str_pos689(X,Y) get_csv_string((X),(Y),689)
+#define get_csv_bool_pos689(X,Y) get_csv_bool((X),(Y),689)
+#define get_csv_int_pos689(X,Y) get_csv_int((X),(Y),689)
+#define get_csv_llong_pos689(X,Y) get_csv_llong((X),(Y),689)
+#define get_csv_float_pos689(X,Y) get_csv_float((X),(Y),689)
+#define get_csv_uint_pos690(X,Y) get_csv_uint((X),(Y),690)
+#define get_csv_ullong_pos690(X,Y) get_csv_ullong((X),(Y),690)
+#define get_csv_ip_pos690(X,Y) get_csv_ip((X),(Y),690)
+#define get_csv_ipv6_pos690(X,Y) get_csv_ipv6((X),(Y),690)
+#define get_csv_string_pos690(X,Y) get_csv_string((X),(Y),690)
+#define get_csv_v_str_pos690(X,Y) get_csv_string((X),(Y),690)
+#define get_csv_bool_pos690(X,Y) get_csv_bool((X),(Y),690)
+#define get_csv_int_pos690(X,Y) get_csv_int((X),(Y),690)
+#define get_csv_llong_pos690(X,Y) get_csv_llong((X),(Y),690)
+#define get_csv_float_pos690(X,Y) get_csv_float((X),(Y),690)
+#define get_csv_uint_pos691(X,Y) get_csv_uint((X),(Y),691)
+#define get_csv_ullong_pos691(X,Y) get_csv_ullong((X),(Y),691)
+#define get_csv_ip_pos691(X,Y) get_csv_ip((X),(Y),691)
+#define get_csv_ipv6_pos691(X,Y) get_csv_ipv6((X),(Y),691)
+#define get_csv_string_pos691(X,Y) get_csv_string((X),(Y),691)
+#define get_csv_v_str_pos691(X,Y) get_csv_string((X),(Y),691)
+#define get_csv_bool_pos691(X,Y) get_csv_bool((X),(Y),691)
+#define get_csv_int_pos691(X,Y) get_csv_int((X),(Y),691)
+#define get_csv_llong_pos691(X,Y) get_csv_llong((X),(Y),691)
+#define get_csv_float_pos691(X,Y) get_csv_float((X),(Y),691)
+#define get_csv_uint_pos692(X,Y) get_csv_uint((X),(Y),692)
+#define get_csv_ullong_pos692(X,Y) get_csv_ullong((X),(Y),692)
+#define get_csv_ip_pos692(X,Y) get_csv_ip((X),(Y),692)
+#define get_csv_ipv6_pos692(X,Y) get_csv_ipv6((X),(Y),692)
+#define get_csv_string_pos692(X,Y) get_csv_string((X),(Y),692)
+#define get_csv_v_str_pos692(X,Y) get_csv_string((X),(Y),692)
+#define get_csv_bool_pos692(X,Y) get_csv_bool((X),(Y),692)
+#define get_csv_int_pos692(X,Y) get_csv_int((X),(Y),692)
+#define get_csv_llong_pos692(X,Y) get_csv_llong((X),(Y),692)
+#define get_csv_float_pos692(X,Y) get_csv_float((X),(Y),692)
+#define get_csv_uint_pos693(X,Y) get_csv_uint((X),(Y),693)
+#define get_csv_ullong_pos693(X,Y) get_csv_ullong((X),(Y),693)
+#define get_csv_ip_pos693(X,Y) get_csv_ip((X),(Y),693)
+#define get_csv_ipv6_pos693(X,Y) get_csv_ipv6((X),(Y),693)
+#define get_csv_string_pos693(X,Y) get_csv_string((X),(Y),693)
+#define get_csv_v_str_pos693(X,Y) get_csv_string((X),(Y),693)
+#define get_csv_bool_pos693(X,Y) get_csv_bool((X),(Y),693)
+#define get_csv_int_pos693(X,Y) get_csv_int((X),(Y),693)
+#define get_csv_llong_pos693(X,Y) get_csv_llong((X),(Y),693)
+#define get_csv_float_pos693(X,Y) get_csv_float((X),(Y),693)
+#define get_csv_uint_pos694(X,Y) get_csv_uint((X),(Y),694)
+#define get_csv_ullong_pos694(X,Y) get_csv_ullong((X),(Y),694)
+#define get_csv_ip_pos694(X,Y) get_csv_ip((X),(Y),694)
+#define get_csv_ipv6_pos694(X,Y) get_csv_ipv6((X),(Y),694)
+#define get_csv_string_pos694(X,Y) get_csv_string((X),(Y),694)
+#define get_csv_v_str_pos694(X,Y) get_csv_string((X),(Y),694)
+#define get_csv_bool_pos694(X,Y) get_csv_bool((X),(Y),694)
+#define get_csv_int_pos694(X,Y) get_csv_int((X),(Y),694)
+#define get_csv_llong_pos694(X,Y) get_csv_llong((X),(Y),694)
+#define get_csv_float_pos694(X,Y) get_csv_float((X),(Y),694)
+#define get_csv_uint_pos695(X,Y) get_csv_uint((X),(Y),695)
+#define get_csv_ullong_pos695(X,Y) get_csv_ullong((X),(Y),695)
+#define get_csv_ip_pos695(X,Y) get_csv_ip((X),(Y),695)
+#define get_csv_ipv6_pos695(X,Y) get_csv_ipv6((X),(Y),695)
+#define get_csv_string_pos695(X,Y) get_csv_string((X),(Y),695)
+#define get_csv_v_str_pos695(X,Y) get_csv_string((X),(Y),695)
+#define get_csv_bool_pos695(X,Y) get_csv_bool((X),(Y),695)
+#define get_csv_int_pos695(X,Y) get_csv_int((X),(Y),695)
+#define get_csv_llong_pos695(X,Y) get_csv_llong((X),(Y),695)
+#define get_csv_float_pos695(X,Y) get_csv_float((X),(Y),695)
+#define get_csv_uint_pos696(X,Y) get_csv_uint((X),(Y),696)
+#define get_csv_ullong_pos696(X,Y) get_csv_ullong((X),(Y),696)
+#define get_csv_ip_pos696(X,Y) get_csv_ip((X),(Y),696)
+#define get_csv_ipv6_pos696(X,Y) get_csv_ipv6((X),(Y),696)
+#define get_csv_string_pos696(X,Y) get_csv_string((X),(Y),696)
+#define get_csv_v_str_pos696(X,Y) get_csv_string((X),(Y),696)
+#define get_csv_bool_pos696(X,Y) get_csv_bool((X),(Y),696)
+#define get_csv_int_pos696(X,Y) get_csv_int((X),(Y),696)
+#define get_csv_llong_pos696(X,Y) get_csv_llong((X),(Y),696)
+#define get_csv_float_pos696(X,Y) get_csv_float((X),(Y),696)
+#define get_csv_uint_pos697(X,Y) get_csv_uint((X),(Y),697)
+#define get_csv_ullong_pos697(X,Y) get_csv_ullong((X),(Y),697)
+#define get_csv_ip_pos697(X,Y) get_csv_ip((X),(Y),697)
+#define get_csv_ipv6_pos697(X,Y) get_csv_ipv6((X),(Y),697)
+#define get_csv_string_pos697(X,Y) get_csv_string((X),(Y),697)
+#define get_csv_v_str_pos697(X,Y) get_csv_string((X),(Y),697)
+#define get_csv_bool_pos697(X,Y) get_csv_bool((X),(Y),697)
+#define get_csv_int_pos697(X,Y) get_csv_int((X),(Y),697)
+#define get_csv_llong_pos697(X,Y) get_csv_llong((X),(Y),697)
+#define get_csv_float_pos697(X,Y) get_csv_float((X),(Y),697)
+#define get_csv_uint_pos698(X,Y) get_csv_uint((X),(Y),698)
+#define get_csv_ullong_pos698(X,Y) get_csv_ullong((X),(Y),698)
+#define get_csv_ip_pos698(X,Y) get_csv_ip((X),(Y),698)
+#define get_csv_ipv6_pos698(X,Y) get_csv_ipv6((X),(Y),698)
+#define get_csv_string_pos698(X,Y) get_csv_string((X),(Y),698)
+#define get_csv_v_str_pos698(X,Y) get_csv_string((X),(Y),698)
+#define get_csv_bool_pos698(X,Y) get_csv_bool((X),(Y),698)
+#define get_csv_int_pos698(X,Y) get_csv_int((X),(Y),698)
+#define get_csv_llong_pos698(X,Y) get_csv_llong((X),(Y),698)
+#define get_csv_float_pos698(X,Y) get_csv_float((X),(Y),698)
+#define get_csv_uint_pos699(X,Y) get_csv_uint((X),(Y),699)
+#define get_csv_ullong_pos699(X,Y) get_csv_ullong((X),(Y),699)
+#define get_csv_ip_pos699(X,Y) get_csv_ip((X),(Y),699)
+#define get_csv_ipv6_pos699(X,Y) get_csv_ipv6((X),(Y),699)
+#define get_csv_string_pos699(X,Y) get_csv_string((X),(Y),699)
+#define get_csv_v_str_pos699(X,Y) get_csv_string((X),(Y),699)
+#define get_csv_bool_pos699(X,Y) get_csv_bool((X),(Y),699)
+#define get_csv_int_pos699(X,Y) get_csv_int((X),(Y),699)
+#define get_csv_llong_pos699(X,Y) get_csv_llong((X),(Y),699)
+#define get_csv_float_pos699(X,Y) get_csv_float((X),(Y),699)
+#define get_csv_uint_pos700(X,Y) get_csv_uint((X),(Y),700)
+#define get_csv_ullong_pos700(X,Y) get_csv_ullong((X),(Y),700)
+#define get_csv_ip_pos700(X,Y) get_csv_ip((X),(Y),700)
+#define get_csv_ipv6_pos700(X,Y) get_csv_ipv6((X),(Y),700)
+#define get_csv_string_pos700(X,Y) get_csv_string((X),(Y),700)
+#define get_csv_v_str_pos700(X,Y) get_csv_string((X),(Y),700)
+#define get_csv_bool_pos700(X,Y) get_csv_bool((X),(Y),700)
+#define get_csv_int_pos700(X,Y) get_csv_int((X),(Y),700)
+#define get_csv_llong_pos700(X,Y) get_csv_llong((X),(Y),700)
+#define get_csv_float_pos700(X,Y) get_csv_float((X),(Y),700)
+#define get_csv_uint_pos701(X,Y) get_csv_uint((X),(Y),701)
+#define get_csv_ullong_pos701(X,Y) get_csv_ullong((X),(Y),701)
+#define get_csv_ip_pos701(X,Y) get_csv_ip((X),(Y),701)
+#define get_csv_ipv6_pos701(X,Y) get_csv_ipv6((X),(Y),701)
+#define get_csv_string_pos701(X,Y) get_csv_string((X),(Y),701)
+#define get_csv_v_str_pos701(X,Y) get_csv_string((X),(Y),701)
+#define get_csv_bool_pos701(X,Y) get_csv_bool((X),(Y),701)
+#define get_csv_int_pos701(X,Y) get_csv_int((X),(Y),701)
+#define get_csv_llong_pos701(X,Y) get_csv_llong((X),(Y),701)
+#define get_csv_float_pos701(X,Y) get_csv_float((X),(Y),701)
+#define get_csv_uint_pos702(X,Y) get_csv_uint((X),(Y),702)
+#define get_csv_ullong_pos702(X,Y) get_csv_ullong((X),(Y),702)
+#define get_csv_ip_pos702(X,Y) get_csv_ip((X),(Y),702)
+#define get_csv_ipv6_pos702(X,Y) get_csv_ipv6((X),(Y),702)
+#define get_csv_string_pos702(X,Y) get_csv_string((X),(Y),702)
+#define get_csv_v_str_pos702(X,Y) get_csv_string((X),(Y),702)
+#define get_csv_bool_pos702(X,Y) get_csv_bool((X),(Y),702)
+#define get_csv_int_pos702(X,Y) get_csv_int((X),(Y),702)
+#define get_csv_llong_pos702(X,Y) get_csv_llong((X),(Y),702)
+#define get_csv_float_pos702(X,Y) get_csv_float((X),(Y),702)
+#define get_csv_uint_pos703(X,Y) get_csv_uint((X),(Y),703)
+#define get_csv_ullong_pos703(X,Y) get_csv_ullong((X),(Y),703)
+#define get_csv_ip_pos703(X,Y) get_csv_ip((X),(Y),703)
+#define get_csv_ipv6_pos703(X,Y) get_csv_ipv6((X),(Y),703)
+#define get_csv_string_pos703(X,Y) get_csv_string((X),(Y),703)
+#define get_csv_v_str_pos703(X,Y) get_csv_string((X),(Y),703)
+#define get_csv_bool_pos703(X,Y) get_csv_bool((X),(Y),703)
+#define get_csv_int_pos703(X,Y) get_csv_int((X),(Y),703)
+#define get_csv_llong_pos703(X,Y) get_csv_llong((X),(Y),703)
+#define get_csv_float_pos703(X,Y) get_csv_float((X),(Y),703)
+#define get_csv_uint_pos704(X,Y) get_csv_uint((X),(Y),704)
+#define get_csv_ullong_pos704(X,Y) get_csv_ullong((X),(Y),704)
+#define get_csv_ip_pos704(X,Y) get_csv_ip((X),(Y),704)
+#define get_csv_ipv6_pos704(X,Y) get_csv_ipv6((X),(Y),704)
+#define get_csv_string_pos704(X,Y) get_csv_string((X),(Y),704)
+#define get_csv_v_str_pos704(X,Y) get_csv_string((X),(Y),704)
+#define get_csv_bool_pos704(X,Y) get_csv_bool((X),(Y),704)
+#define get_csv_int_pos704(X,Y) get_csv_int((X),(Y),704)
+#define get_csv_llong_pos704(X,Y) get_csv_llong((X),(Y),704)
+#define get_csv_float_pos704(X,Y) get_csv_float((X),(Y),704)
+#define get_csv_uint_pos705(X,Y) get_csv_uint((X),(Y),705)
+#define get_csv_ullong_pos705(X,Y) get_csv_ullong((X),(Y),705)
+#define get_csv_ip_pos705(X,Y) get_csv_ip((X),(Y),705)
+#define get_csv_ipv6_pos705(X,Y) get_csv_ipv6((X),(Y),705)
+#define get_csv_string_pos705(X,Y) get_csv_string((X),(Y),705)
+#define get_csv_v_str_pos705(X,Y) get_csv_string((X),(Y),705)
+#define get_csv_bool_pos705(X,Y) get_csv_bool((X),(Y),705)
+#define get_csv_int_pos705(X,Y) get_csv_int((X),(Y),705)
+#define get_csv_llong_pos705(X,Y) get_csv_llong((X),(Y),705)
+#define get_csv_float_pos705(X,Y) get_csv_float((X),(Y),705)
+#define get_csv_uint_pos706(X,Y) get_csv_uint((X),(Y),706)
+#define get_csv_ullong_pos706(X,Y) get_csv_ullong((X),(Y),706)
+#define get_csv_ip_pos706(X,Y) get_csv_ip((X),(Y),706)
+#define get_csv_ipv6_pos706(X,Y) get_csv_ipv6((X),(Y),706)
+#define get_csv_string_pos706(X,Y) get_csv_string((X),(Y),706)
+#define get_csv_v_str_pos706(X,Y) get_csv_string((X),(Y),706)
+#define get_csv_bool_pos706(X,Y) get_csv_bool((X),(Y),706)
+#define get_csv_int_pos706(X,Y) get_csv_int((X),(Y),706)
+#define get_csv_llong_pos706(X,Y) get_csv_llong((X),(Y),706)
+#define get_csv_float_pos706(X,Y) get_csv_float((X),(Y),706)
+#define get_csv_uint_pos707(X,Y) get_csv_uint((X),(Y),707)
+#define get_csv_ullong_pos707(X,Y) get_csv_ullong((X),(Y),707)
+#define get_csv_ip_pos707(X,Y) get_csv_ip((X),(Y),707)
+#define get_csv_ipv6_pos707(X,Y) get_csv_ipv6((X),(Y),707)
+#define get_csv_string_pos707(X,Y) get_csv_string((X),(Y),707)
+#define get_csv_v_str_pos707(X,Y) get_csv_string((X),(Y),707)
+#define get_csv_bool_pos707(X,Y) get_csv_bool((X),(Y),707)
+#define get_csv_int_pos707(X,Y) get_csv_int((X),(Y),707)
+#define get_csv_llong_pos707(X,Y) get_csv_llong((X),(Y),707)
+#define get_csv_float_pos707(X,Y) get_csv_float((X),(Y),707)
+#define get_csv_uint_pos708(X,Y) get_csv_uint((X),(Y),708)
+#define get_csv_ullong_pos708(X,Y) get_csv_ullong((X),(Y),708)
+#define get_csv_ip_pos708(X,Y) get_csv_ip((X),(Y),708)
+#define get_csv_ipv6_pos708(X,Y) get_csv_ipv6((X),(Y),708)
+#define get_csv_string_pos708(X,Y) get_csv_string((X),(Y),708)
+#define get_csv_v_str_pos708(X,Y) get_csv_string((X),(Y),708)
+#define get_csv_bool_pos708(X,Y) get_csv_bool((X),(Y),708)
+#define get_csv_int_pos708(X,Y) get_csv_int((X),(Y),708)
+#define get_csv_llong_pos708(X,Y) get_csv_llong((X),(Y),708)
+#define get_csv_float_pos708(X,Y) get_csv_float((X),(Y),708)
+#define get_csv_uint_pos709(X,Y) get_csv_uint((X),(Y),709)
+#define get_csv_ullong_pos709(X,Y) get_csv_ullong((X),(Y),709)
+#define get_csv_ip_pos709(X,Y) get_csv_ip((X),(Y),709)
+#define get_csv_ipv6_pos709(X,Y) get_csv_ipv6((X),(Y),709)
+#define get_csv_string_pos709(X,Y) get_csv_string((X),(Y),709)
+#define get_csv_v_str_pos709(X,Y) get_csv_string((X),(Y),709)
+#define get_csv_bool_pos709(X,Y) get_csv_bool((X),(Y),709)
+#define get_csv_int_pos709(X,Y) get_csv_int((X),(Y),709)
+#define get_csv_llong_pos709(X,Y) get_csv_llong((X),(Y),709)
+#define get_csv_float_pos709(X,Y) get_csv_float((X),(Y),709)
+#define get_csv_uint_pos710(X,Y) get_csv_uint((X),(Y),710)
+#define get_csv_ullong_pos710(X,Y) get_csv_ullong((X),(Y),710)
+#define get_csv_ip_pos710(X,Y) get_csv_ip((X),(Y),710)
+#define get_csv_ipv6_pos710(X,Y) get_csv_ipv6((X),(Y),710)
+#define get_csv_string_pos710(X,Y) get_csv_string((X),(Y),710)
+#define get_csv_v_str_pos710(X,Y) get_csv_string((X),(Y),710)
+#define get_csv_bool_pos710(X,Y) get_csv_bool((X),(Y),710)
+#define get_csv_int_pos710(X,Y) get_csv_int((X),(Y),710)
+#define get_csv_llong_pos710(X,Y) get_csv_llong((X),(Y),710)
+#define get_csv_float_pos710(X,Y) get_csv_float((X),(Y),710)
+#define get_csv_uint_pos711(X,Y) get_csv_uint((X),(Y),711)
+#define get_csv_ullong_pos711(X,Y) get_csv_ullong((X),(Y),711)
+#define get_csv_ip_pos711(X,Y) get_csv_ip((X),(Y),711)
+#define get_csv_ipv6_pos711(X,Y) get_csv_ipv6((X),(Y),711)
+#define get_csv_string_pos711(X,Y) get_csv_string((X),(Y),711)
+#define get_csv_v_str_pos711(X,Y) get_csv_string((X),(Y),711)
+#define get_csv_bool_pos711(X,Y) get_csv_bool((X),(Y),711)
+#define get_csv_int_pos711(X,Y) get_csv_int((X),(Y),711)
+#define get_csv_llong_pos711(X,Y) get_csv_llong((X),(Y),711)
+#define get_csv_float_pos711(X,Y) get_csv_float((X),(Y),711)
+#define get_csv_uint_pos712(X,Y) get_csv_uint((X),(Y),712)
+#define get_csv_ullong_pos712(X,Y) get_csv_ullong((X),(Y),712)
+#define get_csv_ip_pos712(X,Y) get_csv_ip((X),(Y),712)
+#define get_csv_ipv6_pos712(X,Y) get_csv_ipv6((X),(Y),712)
+#define get_csv_string_pos712(X,Y) get_csv_string((X),(Y),712)
+#define get_csv_v_str_pos712(X,Y) get_csv_string((X),(Y),712)
+#define get_csv_bool_pos712(X,Y) get_csv_bool((X),(Y),712)
+#define get_csv_int_pos712(X,Y) get_csv_int((X),(Y),712)
+#define get_csv_llong_pos712(X,Y) get_csv_llong((X),(Y),712)
+#define get_csv_float_pos712(X,Y) get_csv_float((X),(Y),712)
+#define get_csv_uint_pos713(X,Y) get_csv_uint((X),(Y),713)
+#define get_csv_ullong_pos713(X,Y) get_csv_ullong((X),(Y),713)
+#define get_csv_ip_pos713(X,Y) get_csv_ip((X),(Y),713)
+#define get_csv_ipv6_pos713(X,Y) get_csv_ipv6((X),(Y),713)
+#define get_csv_string_pos713(X,Y) get_csv_string((X),(Y),713)
+#define get_csv_v_str_pos713(X,Y) get_csv_string((X),(Y),713)
+#define get_csv_bool_pos713(X,Y) get_csv_bool((X),(Y),713)
+#define get_csv_int_pos713(X,Y) get_csv_int((X),(Y),713)
+#define get_csv_llong_pos713(X,Y) get_csv_llong((X),(Y),713)
+#define get_csv_float_pos713(X,Y) get_csv_float((X),(Y),713)
+#define get_csv_uint_pos714(X,Y) get_csv_uint((X),(Y),714)
+#define get_csv_ullong_pos714(X,Y) get_csv_ullong((X),(Y),714)
+#define get_csv_ip_pos714(X,Y) get_csv_ip((X),(Y),714)
+#define get_csv_ipv6_pos714(X,Y) get_csv_ipv6((X),(Y),714)
+#define get_csv_string_pos714(X,Y) get_csv_string((X),(Y),714)
+#define get_csv_v_str_pos714(X,Y) get_csv_string((X),(Y),714)
+#define get_csv_bool_pos714(X,Y) get_csv_bool((X),(Y),714)
+#define get_csv_int_pos714(X,Y) get_csv_int((X),(Y),714)
+#define get_csv_llong_pos714(X,Y) get_csv_llong((X),(Y),714)
+#define get_csv_float_pos714(X,Y) get_csv_float((X),(Y),714)
+#define get_csv_uint_pos715(X,Y) get_csv_uint((X),(Y),715)
+#define get_csv_ullong_pos715(X,Y) get_csv_ullong((X),(Y),715)
+#define get_csv_ip_pos715(X,Y) get_csv_ip((X),(Y),715)
+#define get_csv_ipv6_pos715(X,Y) get_csv_ipv6((X),(Y),715)
+#define get_csv_string_pos715(X,Y) get_csv_string((X),(Y),715)
+#define get_csv_v_str_pos715(X,Y) get_csv_string((X),(Y),715)
+#define get_csv_bool_pos715(X,Y) get_csv_bool((X),(Y),715)
+#define get_csv_int_pos715(X,Y) get_csv_int((X),(Y),715)
+#define get_csv_llong_pos715(X,Y) get_csv_llong((X),(Y),715)
+#define get_csv_float_pos715(X,Y) get_csv_float((X),(Y),715)
+#define get_csv_uint_pos716(X,Y) get_csv_uint((X),(Y),716)
+#define get_csv_ullong_pos716(X,Y) get_csv_ullong((X),(Y),716)
+#define get_csv_ip_pos716(X,Y) get_csv_ip((X),(Y),716)
+#define get_csv_ipv6_pos716(X,Y) get_csv_ipv6((X),(Y),716)
+#define get_csv_string_pos716(X,Y) get_csv_string((X),(Y),716)
+#define get_csv_v_str_pos716(X,Y) get_csv_string((X),(Y),716)
+#define get_csv_bool_pos716(X,Y) get_csv_bool((X),(Y),716)
+#define get_csv_int_pos716(X,Y) get_csv_int((X),(Y),716)
+#define get_csv_llong_pos716(X,Y) get_csv_llong((X),(Y),716)
+#define get_csv_float_pos716(X,Y) get_csv_float((X),(Y),716)
+#define get_csv_uint_pos717(X,Y) get_csv_uint((X),(Y),717)
+#define get_csv_ullong_pos717(X,Y) get_csv_ullong((X),(Y),717)
+#define get_csv_ip_pos717(X,Y) get_csv_ip((X),(Y),717)
+#define get_csv_ipv6_pos717(X,Y) get_csv_ipv6((X),(Y),717)
+#define get_csv_string_pos717(X,Y) get_csv_string((X),(Y),717)
+#define get_csv_v_str_pos717(X,Y) get_csv_string((X),(Y),717)
+#define get_csv_bool_pos717(X,Y) get_csv_bool((X),(Y),717)
+#define get_csv_int_pos717(X,Y) get_csv_int((X),(Y),717)
+#define get_csv_llong_pos717(X,Y) get_csv_llong((X),(Y),717)
+#define get_csv_float_pos717(X,Y) get_csv_float((X),(Y),717)
+#define get_csv_uint_pos718(X,Y) get_csv_uint((X),(Y),718)
+#define get_csv_ullong_pos718(X,Y) get_csv_ullong((X),(Y),718)
+#define get_csv_ip_pos718(X,Y) get_csv_ip((X),(Y),718)
+#define get_csv_ipv6_pos718(X,Y) get_csv_ipv6((X),(Y),718)
+#define get_csv_string_pos718(X,Y) get_csv_string((X),(Y),718)
+#define get_csv_v_str_pos718(X,Y) get_csv_string((X),(Y),718)
+#define get_csv_bool_pos718(X,Y) get_csv_bool((X),(Y),718)
+#define get_csv_int_pos718(X,Y) get_csv_int((X),(Y),718)
+#define get_csv_llong_pos718(X,Y) get_csv_llong((X),(Y),718)
+#define get_csv_float_pos718(X,Y) get_csv_float((X),(Y),718)
+#define get_csv_uint_pos719(X,Y) get_csv_uint((X),(Y),719)
+#define get_csv_ullong_pos719(X,Y) get_csv_ullong((X),(Y),719)
+#define get_csv_ip_pos719(X,Y) get_csv_ip((X),(Y),719)
+#define get_csv_ipv6_pos719(X,Y) get_csv_ipv6((X),(Y),719)
+#define get_csv_string_pos719(X,Y) get_csv_string((X),(Y),719)
+#define get_csv_v_str_pos719(X,Y) get_csv_string((X),(Y),719)
+#define get_csv_bool_pos719(X,Y) get_csv_bool((X),(Y),719)
+#define get_csv_int_pos719(X,Y) get_csv_int((X),(Y),719)
+#define get_csv_llong_pos719(X,Y) get_csv_llong((X),(Y),719)
+#define get_csv_float_pos719(X,Y) get_csv_float((X),(Y),719)
+#define get_csv_uint_pos720(X,Y) get_csv_uint((X),(Y),720)
+#define get_csv_ullong_pos720(X,Y) get_csv_ullong((X),(Y),720)
+#define get_csv_ip_pos720(X,Y) get_csv_ip((X),(Y),720)
+#define get_csv_ipv6_pos720(X,Y) get_csv_ipv6((X),(Y),720)
+#define get_csv_string_pos720(X,Y) get_csv_string((X),(Y),720)
+#define get_csv_v_str_pos720(X,Y) get_csv_string((X),(Y),720)
+#define get_csv_bool_pos720(X,Y) get_csv_bool((X),(Y),720)
+#define get_csv_int_pos720(X,Y) get_csv_int((X),(Y),720)
+#define get_csv_llong_pos720(X,Y) get_csv_llong((X),(Y),720)
+#define get_csv_float_pos720(X,Y) get_csv_float((X),(Y),720)
+#define get_csv_uint_pos721(X,Y) get_csv_uint((X),(Y),721)
+#define get_csv_ullong_pos721(X,Y) get_csv_ullong((X),(Y),721)
+#define get_csv_ip_pos721(X,Y) get_csv_ip((X),(Y),721)
+#define get_csv_ipv6_pos721(X,Y) get_csv_ipv6((X),(Y),721)
+#define get_csv_string_pos721(X,Y) get_csv_string((X),(Y),721)
+#define get_csv_v_str_pos721(X,Y) get_csv_string((X),(Y),721)
+#define get_csv_bool_pos721(X,Y) get_csv_bool((X),(Y),721)
+#define get_csv_int_pos721(X,Y) get_csv_int((X),(Y),721)
+#define get_csv_llong_pos721(X,Y) get_csv_llong((X),(Y),721)
+#define get_csv_float_pos721(X,Y) get_csv_float((X),(Y),721)
+#define get_csv_uint_pos722(X,Y) get_csv_uint((X),(Y),722)
+#define get_csv_ullong_pos722(X,Y) get_csv_ullong((X),(Y),722)
+#define get_csv_ip_pos722(X,Y) get_csv_ip((X),(Y),722)
+#define get_csv_ipv6_pos722(X,Y) get_csv_ipv6((X),(Y),722)
+#define get_csv_string_pos722(X,Y) get_csv_string((X),(Y),722)
+#define get_csv_v_str_pos722(X,Y) get_csv_string((X),(Y),722)
+#define get_csv_bool_pos722(X,Y) get_csv_bool((X),(Y),722)
+#define get_csv_int_pos722(X,Y) get_csv_int((X),(Y),722)
+#define get_csv_llong_pos722(X,Y) get_csv_llong((X),(Y),722)
+#define get_csv_float_pos722(X,Y) get_csv_float((X),(Y),722)
+#define get_csv_uint_pos723(X,Y) get_csv_uint((X),(Y),723)
+#define get_csv_ullong_pos723(X,Y) get_csv_ullong((X),(Y),723)
+#define get_csv_ip_pos723(X,Y) get_csv_ip((X),(Y),723)
+#define get_csv_ipv6_pos723(X,Y) get_csv_ipv6((X),(Y),723)
+#define get_csv_string_pos723(X,Y) get_csv_string((X),(Y),723)
+#define get_csv_v_str_pos723(X,Y) get_csv_string((X),(Y),723)
+#define get_csv_bool_pos723(X,Y) get_csv_bool((X),(Y),723)
+#define get_csv_int_pos723(X,Y) get_csv_int((X),(Y),723)
+#define get_csv_llong_pos723(X,Y) get_csv_llong((X),(Y),723)
+#define get_csv_float_pos723(X,Y) get_csv_float((X),(Y),723)
+#define get_csv_uint_pos724(X,Y) get_csv_uint((X),(Y),724)
+#define get_csv_ullong_pos724(X,Y) get_csv_ullong((X),(Y),724)
+#define get_csv_ip_pos724(X,Y) get_csv_ip((X),(Y),724)
+#define get_csv_ipv6_pos724(X,Y) get_csv_ipv6((X),(Y),724)
+#define get_csv_string_pos724(X,Y) get_csv_string((X),(Y),724)
+#define get_csv_v_str_pos724(X,Y) get_csv_string((X),(Y),724)
+#define get_csv_bool_pos724(X,Y) get_csv_bool((X),(Y),724)
+#define get_csv_int_pos724(X,Y) get_csv_int((X),(Y),724)
+#define get_csv_llong_pos724(X,Y) get_csv_llong((X),(Y),724)
+#define get_csv_float_pos724(X,Y) get_csv_float((X),(Y),724)
+#define get_csv_uint_pos725(X,Y) get_csv_uint((X),(Y),725)
+#define get_csv_ullong_pos725(X,Y) get_csv_ullong((X),(Y),725)
+#define get_csv_ip_pos725(X,Y) get_csv_ip((X),(Y),725)
+#define get_csv_ipv6_pos725(X,Y) get_csv_ipv6((X),(Y),725)
+#define get_csv_string_pos725(X,Y) get_csv_string((X),(Y),725)
+#define get_csv_v_str_pos725(X,Y) get_csv_string((X),(Y),725)
+#define get_csv_bool_pos725(X,Y) get_csv_bool((X),(Y),725)
+#define get_csv_int_pos725(X,Y) get_csv_int((X),(Y),725)
+#define get_csv_llong_pos725(X,Y) get_csv_llong((X),(Y),725)
+#define get_csv_float_pos725(X,Y) get_csv_float((X),(Y),725)
+#define get_csv_uint_pos726(X,Y) get_csv_uint((X),(Y),726)
+#define get_csv_ullong_pos726(X,Y) get_csv_ullong((X),(Y),726)
+#define get_csv_ip_pos726(X,Y) get_csv_ip((X),(Y),726)
+#define get_csv_ipv6_pos726(X,Y) get_csv_ipv6((X),(Y),726)
+#define get_csv_string_pos726(X,Y) get_csv_string((X),(Y),726)
+#define get_csv_v_str_pos726(X,Y) get_csv_string((X),(Y),726)
+#define get_csv_bool_pos726(X,Y) get_csv_bool((X),(Y),726)
+#define get_csv_int_pos726(X,Y) get_csv_int((X),(Y),726)
+#define get_csv_llong_pos726(X,Y) get_csv_llong((X),(Y),726)
+#define get_csv_float_pos726(X,Y) get_csv_float((X),(Y),726)
+#define get_csv_uint_pos727(X,Y) get_csv_uint((X),(Y),727)
+#define get_csv_ullong_pos727(X,Y) get_csv_ullong((X),(Y),727)
+#define get_csv_ip_pos727(X,Y) get_csv_ip((X),(Y),727)
+#define get_csv_ipv6_pos727(X,Y) get_csv_ipv6((X),(Y),727)
+#define get_csv_string_pos727(X,Y) get_csv_string((X),(Y),727)
+#define get_csv_v_str_pos727(X,Y) get_csv_string((X),(Y),727)
+#define get_csv_bool_pos727(X,Y) get_csv_bool((X),(Y),727)
+#define get_csv_int_pos727(X,Y) get_csv_int((X),(Y),727)
+#define get_csv_llong_pos727(X,Y) get_csv_llong((X),(Y),727)
+#define get_csv_float_pos727(X,Y) get_csv_float((X),(Y),727)
+#define get_csv_uint_pos728(X,Y) get_csv_uint((X),(Y),728)
+#define get_csv_ullong_pos728(X,Y) get_csv_ullong((X),(Y),728)
+#define get_csv_ip_pos728(X,Y) get_csv_ip((X),(Y),728)
+#define get_csv_ipv6_pos728(X,Y) get_csv_ipv6((X),(Y),728)
+#define get_csv_string_pos728(X,Y) get_csv_string((X),(Y),728)
+#define get_csv_v_str_pos728(X,Y) get_csv_string((X),(Y),728)
+#define get_csv_bool_pos728(X,Y) get_csv_bool((X),(Y),728)
+#define get_csv_int_pos728(X,Y) get_csv_int((X),(Y),728)
+#define get_csv_llong_pos728(X,Y) get_csv_llong((X),(Y),728)
+#define get_csv_float_pos728(X,Y) get_csv_float((X),(Y),728)
+#define get_csv_uint_pos729(X,Y) get_csv_uint((X),(Y),729)
+#define get_csv_ullong_pos729(X,Y) get_csv_ullong((X),(Y),729)
+#define get_csv_ip_pos729(X,Y) get_csv_ip((X),(Y),729)
+#define get_csv_ipv6_pos729(X,Y) get_csv_ipv6((X),(Y),729)
+#define get_csv_string_pos729(X,Y) get_csv_string((X),(Y),729)
+#define get_csv_v_str_pos729(X,Y) get_csv_string((X),(Y),729)
+#define get_csv_bool_pos729(X,Y) get_csv_bool((X),(Y),729)
+#define get_csv_int_pos729(X,Y) get_csv_int((X),(Y),729)
+#define get_csv_llong_pos729(X,Y) get_csv_llong((X),(Y),729)
+#define get_csv_float_pos729(X,Y) get_csv_float((X),(Y),729)
+#define get_csv_uint_pos730(X,Y) get_csv_uint((X),(Y),730)
+#define get_csv_ullong_pos730(X,Y) get_csv_ullong((X),(Y),730)
+#define get_csv_ip_pos730(X,Y) get_csv_ip((X),(Y),730)
+#define get_csv_ipv6_pos730(X,Y) get_csv_ipv6((X),(Y),730)
+#define get_csv_string_pos730(X,Y) get_csv_string((X),(Y),730)
+#define get_csv_v_str_pos730(X,Y) get_csv_string((X),(Y),730)
+#define get_csv_bool_pos730(X,Y) get_csv_bool((X),(Y),730)
+#define get_csv_int_pos730(X,Y) get_csv_int((X),(Y),730)
+#define get_csv_llong_pos730(X,Y) get_csv_llong((X),(Y),730)
+#define get_csv_float_pos730(X,Y) get_csv_float((X),(Y),730)
+#define get_csv_uint_pos731(X,Y) get_csv_uint((X),(Y),731)
+#define get_csv_ullong_pos731(X,Y) get_csv_ullong((X),(Y),731)
+#define get_csv_ip_pos731(X,Y) get_csv_ip((X),(Y),731)
+#define get_csv_ipv6_pos731(X,Y) get_csv_ipv6((X),(Y),731)
+#define get_csv_string_pos731(X,Y) get_csv_string((X),(Y),731)
+#define get_csv_v_str_pos731(X,Y) get_csv_string((X),(Y),731)
+#define get_csv_bool_pos731(X,Y) get_csv_bool((X),(Y),731)
+#define get_csv_int_pos731(X,Y) get_csv_int((X),(Y),731)
+#define get_csv_llong_pos731(X,Y) get_csv_llong((X),(Y),731)
+#define get_csv_float_pos731(X,Y) get_csv_float((X),(Y),731)
+#define get_csv_uint_pos732(X,Y) get_csv_uint((X),(Y),732)
+#define get_csv_ullong_pos732(X,Y) get_csv_ullong((X),(Y),732)
+#define get_csv_ip_pos732(X,Y) get_csv_ip((X),(Y),732)
+#define get_csv_ipv6_pos732(X,Y) get_csv_ipv6((X),(Y),732)
+#define get_csv_string_pos732(X,Y) get_csv_string((X),(Y),732)
+#define get_csv_v_str_pos732(X,Y) get_csv_string((X),(Y),732)
+#define get_csv_bool_pos732(X,Y) get_csv_bool((X),(Y),732)
+#define get_csv_int_pos732(X,Y) get_csv_int((X),(Y),732)
+#define get_csv_llong_pos732(X,Y) get_csv_llong((X),(Y),732)
+#define get_csv_float_pos732(X,Y) get_csv_float((X),(Y),732)
+#define get_csv_uint_pos733(X,Y) get_csv_uint((X),(Y),733)
+#define get_csv_ullong_pos733(X,Y) get_csv_ullong((X),(Y),733)
+#define get_csv_ip_pos733(X,Y) get_csv_ip((X),(Y),733)
+#define get_csv_ipv6_pos733(X,Y) get_csv_ipv6((X),(Y),733)
+#define get_csv_string_pos733(X,Y) get_csv_string((X),(Y),733)
+#define get_csv_v_str_pos733(X,Y) get_csv_string((X),(Y),733)
+#define get_csv_bool_pos733(X,Y) get_csv_bool((X),(Y),733)
+#define get_csv_int_pos733(X,Y) get_csv_int((X),(Y),733)
+#define get_csv_llong_pos733(X,Y) get_csv_llong((X),(Y),733)
+#define get_csv_float_pos733(X,Y) get_csv_float((X),(Y),733)
+#define get_csv_uint_pos734(X,Y) get_csv_uint((X),(Y),734)
+#define get_csv_ullong_pos734(X,Y) get_csv_ullong((X),(Y),734)
+#define get_csv_ip_pos734(X,Y) get_csv_ip((X),(Y),734)
+#define get_csv_ipv6_pos734(X,Y) get_csv_ipv6((X),(Y),734)
+#define get_csv_string_pos734(X,Y) get_csv_string((X),(Y),734)
+#define get_csv_v_str_pos734(X,Y) get_csv_string((X),(Y),734)
+#define get_csv_bool_pos734(X,Y) get_csv_bool((X),(Y),734)
+#define get_csv_int_pos734(X,Y) get_csv_int((X),(Y),734)
+#define get_csv_llong_pos734(X,Y) get_csv_llong((X),(Y),734)
+#define get_csv_float_pos734(X,Y) get_csv_float((X),(Y),734)
+#define get_csv_uint_pos735(X,Y) get_csv_uint((X),(Y),735)
+#define get_csv_ullong_pos735(X,Y) get_csv_ullong((X),(Y),735)
+#define get_csv_ip_pos735(X,Y) get_csv_ip((X),(Y),735)
+#define get_csv_ipv6_pos735(X,Y) get_csv_ipv6((X),(Y),735)
+#define get_csv_string_pos735(X,Y) get_csv_string((X),(Y),735)
+#define get_csv_v_str_pos735(X,Y) get_csv_string((X),(Y),735)
+#define get_csv_bool_pos735(X,Y) get_csv_bool((X),(Y),735)
+#define get_csv_int_pos735(X,Y) get_csv_int((X),(Y),735)
+#define get_csv_llong_pos735(X,Y) get_csv_llong((X),(Y),735)
+#define get_csv_float_pos735(X,Y) get_csv_float((X),(Y),735)
+#define get_csv_uint_pos736(X,Y) get_csv_uint((X),(Y),736)
+#define get_csv_ullong_pos736(X,Y) get_csv_ullong((X),(Y),736)
+#define get_csv_ip_pos736(X,Y) get_csv_ip((X),(Y),736)
+#define get_csv_ipv6_pos736(X,Y) get_csv_ipv6((X),(Y),736)
+#define get_csv_string_pos736(X,Y) get_csv_string((X),(Y),736)
+#define get_csv_v_str_pos736(X,Y) get_csv_string((X),(Y),736)
+#define get_csv_bool_pos736(X,Y) get_csv_bool((X),(Y),736)
+#define get_csv_int_pos736(X,Y) get_csv_int((X),(Y),736)
+#define get_csv_llong_pos736(X,Y) get_csv_llong((X),(Y),736)
+#define get_csv_float_pos736(X,Y) get_csv_float((X),(Y),736)
+#define get_csv_uint_pos737(X,Y) get_csv_uint((X),(Y),737)
+#define get_csv_ullong_pos737(X,Y) get_csv_ullong((X),(Y),737)
+#define get_csv_ip_pos737(X,Y) get_csv_ip((X),(Y),737)
+#define get_csv_ipv6_pos737(X,Y) get_csv_ipv6((X),(Y),737)
+#define get_csv_string_pos737(X,Y) get_csv_string((X),(Y),737)
+#define get_csv_v_str_pos737(X,Y) get_csv_string((X),(Y),737)
+#define get_csv_bool_pos737(X,Y) get_csv_bool((X),(Y),737)
+#define get_csv_int_pos737(X,Y) get_csv_int((X),(Y),737)
+#define get_csv_llong_pos737(X,Y) get_csv_llong((X),(Y),737)
+#define get_csv_float_pos737(X,Y) get_csv_float((X),(Y),737)
+#define get_csv_uint_pos738(X,Y) get_csv_uint((X),(Y),738)
+#define get_csv_ullong_pos738(X,Y) get_csv_ullong((X),(Y),738)
+#define get_csv_ip_pos738(X,Y) get_csv_ip((X),(Y),738)
+#define get_csv_ipv6_pos738(X,Y) get_csv_ipv6((X),(Y),738)
+#define get_csv_string_pos738(X,Y) get_csv_string((X),(Y),738)
+#define get_csv_v_str_pos738(X,Y) get_csv_string((X),(Y),738)
+#define get_csv_bool_pos738(X,Y) get_csv_bool((X),(Y),738)
+#define get_csv_int_pos738(X,Y) get_csv_int((X),(Y),738)
+#define get_csv_llong_pos738(X,Y) get_csv_llong((X),(Y),738)
+#define get_csv_float_pos738(X,Y) get_csv_float((X),(Y),738)
+#define get_csv_uint_pos739(X,Y) get_csv_uint((X),(Y),739)
+#define get_csv_ullong_pos739(X,Y) get_csv_ullong((X),(Y),739)
+#define get_csv_ip_pos739(X,Y) get_csv_ip((X),(Y),739)
+#define get_csv_ipv6_pos739(X,Y) get_csv_ipv6((X),(Y),739)
+#define get_csv_string_pos739(X,Y) get_csv_string((X),(Y),739)
+#define get_csv_v_str_pos739(X,Y) get_csv_string((X),(Y),739)
+#define get_csv_bool_pos739(X,Y) get_csv_bool((X),(Y),739)
+#define get_csv_int_pos739(X,Y) get_csv_int((X),(Y),739)
+#define get_csv_llong_pos739(X,Y) get_csv_llong((X),(Y),739)
+#define get_csv_float_pos739(X,Y) get_csv_float((X),(Y),739)
+#define get_csv_uint_pos740(X,Y) get_csv_uint((X),(Y),740)
+#define get_csv_ullong_pos740(X,Y) get_csv_ullong((X),(Y),740)
+#define get_csv_ip_pos740(X,Y) get_csv_ip((X),(Y),740)
+#define get_csv_ipv6_pos740(X,Y) get_csv_ipv6((X),(Y),740)
+#define get_csv_string_pos740(X,Y) get_csv_string((X),(Y),740)
+#define get_csv_v_str_pos740(X,Y) get_csv_string((X),(Y),740)
+#define get_csv_bool_pos740(X,Y) get_csv_bool((X),(Y),740)
+#define get_csv_int_pos740(X,Y) get_csv_int((X),(Y),740)
+#define get_csv_llong_pos740(X,Y) get_csv_llong((X),(Y),740)
+#define get_csv_float_pos740(X,Y) get_csv_float((X),(Y),740)
+#define get_csv_uint_pos741(X,Y) get_csv_uint((X),(Y),741)
+#define get_csv_ullong_pos741(X,Y) get_csv_ullong((X),(Y),741)
+#define get_csv_ip_pos741(X,Y) get_csv_ip((X),(Y),741)
+#define get_csv_ipv6_pos741(X,Y) get_csv_ipv6((X),(Y),741)
+#define get_csv_string_pos741(X,Y) get_csv_string((X),(Y),741)
+#define get_csv_v_str_pos741(X,Y) get_csv_string((X),(Y),741)
+#define get_csv_bool_pos741(X,Y) get_csv_bool((X),(Y),741)
+#define get_csv_int_pos741(X,Y) get_csv_int((X),(Y),741)
+#define get_csv_llong_pos741(X,Y) get_csv_llong((X),(Y),741)
+#define get_csv_float_pos741(X,Y) get_csv_float((X),(Y),741)
+#define get_csv_uint_pos742(X,Y) get_csv_uint((X),(Y),742)
+#define get_csv_ullong_pos742(X,Y) get_csv_ullong((X),(Y),742)
+#define get_csv_ip_pos742(X,Y) get_csv_ip((X),(Y),742)
+#define get_csv_ipv6_pos742(X,Y) get_csv_ipv6((X),(Y),742)
+#define get_csv_string_pos742(X,Y) get_csv_string((X),(Y),742)
+#define get_csv_v_str_pos742(X,Y) get_csv_string((X),(Y),742)
+#define get_csv_bool_pos742(X,Y) get_csv_bool((X),(Y),742)
+#define get_csv_int_pos742(X,Y) get_csv_int((X),(Y),742)
+#define get_csv_llong_pos742(X,Y) get_csv_llong((X),(Y),742)
+#define get_csv_float_pos742(X,Y) get_csv_float((X),(Y),742)
+#define get_csv_uint_pos743(X,Y) get_csv_uint((X),(Y),743)
+#define get_csv_ullong_pos743(X,Y) get_csv_ullong((X),(Y),743)
+#define get_csv_ip_pos743(X,Y) get_csv_ip((X),(Y),743)
+#define get_csv_ipv6_pos743(X,Y) get_csv_ipv6((X),(Y),743)
+#define get_csv_string_pos743(X,Y) get_csv_string((X),(Y),743)
+#define get_csv_v_str_pos743(X,Y) get_csv_string((X),(Y),743)
+#define get_csv_bool_pos743(X,Y) get_csv_bool((X),(Y),743)
+#define get_csv_int_pos743(X,Y) get_csv_int((X),(Y),743)
+#define get_csv_llong_pos743(X,Y) get_csv_llong((X),(Y),743)
+#define get_csv_float_pos743(X,Y) get_csv_float((X),(Y),743)
+#define get_csv_uint_pos744(X,Y) get_csv_uint((X),(Y),744)
+#define get_csv_ullong_pos744(X,Y) get_csv_ullong((X),(Y),744)
+#define get_csv_ip_pos744(X,Y) get_csv_ip((X),(Y),744)
+#define get_csv_ipv6_pos744(X,Y) get_csv_ipv6((X),(Y),744)
+#define get_csv_string_pos744(X,Y) get_csv_string((X),(Y),744)
+#define get_csv_v_str_pos744(X,Y) get_csv_string((X),(Y),744)
+#define get_csv_bool_pos744(X,Y) get_csv_bool((X),(Y),744)
+#define get_csv_int_pos744(X,Y) get_csv_int((X),(Y),744)
+#define get_csv_llong_pos744(X,Y) get_csv_llong((X),(Y),744)
+#define get_csv_float_pos744(X,Y) get_csv_float((X),(Y),744)
+#define get_csv_uint_pos745(X,Y) get_csv_uint((X),(Y),745)
+#define get_csv_ullong_pos745(X,Y) get_csv_ullong((X),(Y),745)
+#define get_csv_ip_pos745(X,Y) get_csv_ip((X),(Y),745)
+#define get_csv_ipv6_pos745(X,Y) get_csv_ipv6((X),(Y),745)
+#define get_csv_string_pos745(X,Y) get_csv_string((X),(Y),745)
+#define get_csv_v_str_pos745(X,Y) get_csv_string((X),(Y),745)
+#define get_csv_bool_pos745(X,Y) get_csv_bool((X),(Y),745)
+#define get_csv_int_pos745(X,Y) get_csv_int((X),(Y),745)
+#define get_csv_llong_pos745(X,Y) get_csv_llong((X),(Y),745)
+#define get_csv_float_pos745(X,Y) get_csv_float((X),(Y),745)
+#define get_csv_uint_pos746(X,Y) get_csv_uint((X),(Y),746)
+#define get_csv_ullong_pos746(X,Y) get_csv_ullong((X),(Y),746)
+#define get_csv_ip_pos746(X,Y) get_csv_ip((X),(Y),746)
+#define get_csv_ipv6_pos746(X,Y) get_csv_ipv6((X),(Y),746)
+#define get_csv_string_pos746(X,Y) get_csv_string((X),(Y),746)
+#define get_csv_v_str_pos746(X,Y) get_csv_string((X),(Y),746)
+#define get_csv_bool_pos746(X,Y) get_csv_bool((X),(Y),746)
+#define get_csv_int_pos746(X,Y) get_csv_int((X),(Y),746)
+#define get_csv_llong_pos746(X,Y) get_csv_llong((X),(Y),746)
+#define get_csv_float_pos746(X,Y) get_csv_float((X),(Y),746)
+#define get_csv_uint_pos747(X,Y) get_csv_uint((X),(Y),747)
+#define get_csv_ullong_pos747(X,Y) get_csv_ullong((X),(Y),747)
+#define get_csv_ip_pos747(X,Y) get_csv_ip((X),(Y),747)
+#define get_csv_ipv6_pos747(X,Y) get_csv_ipv6((X),(Y),747)
+#define get_csv_string_pos747(X,Y) get_csv_string((X),(Y),747)
+#define get_csv_v_str_pos747(X,Y) get_csv_string((X),(Y),747)
+#define get_csv_bool_pos747(X,Y) get_csv_bool((X),(Y),747)
+#define get_csv_int_pos747(X,Y) get_csv_int((X),(Y),747)
+#define get_csv_llong_pos747(X,Y) get_csv_llong((X),(Y),747)
+#define get_csv_float_pos747(X,Y) get_csv_float((X),(Y),747)
+#define get_csv_uint_pos748(X,Y) get_csv_uint((X),(Y),748)
+#define get_csv_ullong_pos748(X,Y) get_csv_ullong((X),(Y),748)
+#define get_csv_ip_pos748(X,Y) get_csv_ip((X),(Y),748)
+#define get_csv_ipv6_pos748(X,Y) get_csv_ipv6((X),(Y),748)
+#define get_csv_string_pos748(X,Y) get_csv_string((X),(Y),748)
+#define get_csv_v_str_pos748(X,Y) get_csv_string((X),(Y),748)
+#define get_csv_bool_pos748(X,Y) get_csv_bool((X),(Y),748)
+#define get_csv_int_pos748(X,Y) get_csv_int((X),(Y),748)
+#define get_csv_llong_pos748(X,Y) get_csv_llong((X),(Y),748)
+#define get_csv_float_pos748(X,Y) get_csv_float((X),(Y),748)
+#define get_csv_uint_pos749(X,Y) get_csv_uint((X),(Y),749)
+#define get_csv_ullong_pos749(X,Y) get_csv_ullong((X),(Y),749)
+#define get_csv_ip_pos749(X,Y) get_csv_ip((X),(Y),749)
+#define get_csv_ipv6_pos749(X,Y) get_csv_ipv6((X),(Y),749)
+#define get_csv_string_pos749(X,Y) get_csv_string((X),(Y),749)
+#define get_csv_v_str_pos749(X,Y) get_csv_string((X),(Y),749)
+#define get_csv_bool_pos749(X,Y) get_csv_bool((X),(Y),749)
+#define get_csv_int_pos749(X,Y) get_csv_int((X),(Y),749)
+#define get_csv_llong_pos749(X,Y) get_csv_llong((X),(Y),749)
+#define get_csv_float_pos749(X,Y) get_csv_float((X),(Y),749)
+#define get_csv_uint_pos750(X,Y) get_csv_uint((X),(Y),750)
+#define get_csv_ullong_pos750(X,Y) get_csv_ullong((X),(Y),750)
+#define get_csv_ip_pos750(X,Y) get_csv_ip((X),(Y),750)
+#define get_csv_ipv6_pos750(X,Y) get_csv_ipv6((X),(Y),750)
+#define get_csv_string_pos750(X,Y) get_csv_string((X),(Y),750)
+#define get_csv_v_str_pos750(X,Y) get_csv_string((X),(Y),750)
+#define get_csv_bool_pos750(X,Y) get_csv_bool((X),(Y),750)
+#define get_csv_int_pos750(X,Y) get_csv_int((X),(Y),750)
+#define get_csv_llong_pos750(X,Y) get_csv_llong((X),(Y),750)
+#define get_csv_float_pos750(X,Y) get_csv_float((X),(Y),750)
+#define get_csv_uint_pos751(X,Y) get_csv_uint((X),(Y),751)
+#define get_csv_ullong_pos751(X,Y) get_csv_ullong((X),(Y),751)
+#define get_csv_ip_pos751(X,Y) get_csv_ip((X),(Y),751)
+#define get_csv_ipv6_pos751(X,Y) get_csv_ipv6((X),(Y),751)
+#define get_csv_string_pos751(X,Y) get_csv_string((X),(Y),751)
+#define get_csv_v_str_pos751(X,Y) get_csv_string((X),(Y),751)
+#define get_csv_bool_pos751(X,Y) get_csv_bool((X),(Y),751)
+#define get_csv_int_pos751(X,Y) get_csv_int((X),(Y),751)
+#define get_csv_llong_pos751(X,Y) get_csv_llong((X),(Y),751)
+#define get_csv_float_pos751(X,Y) get_csv_float((X),(Y),751)
+#define get_csv_uint_pos752(X,Y) get_csv_uint((X),(Y),752)
+#define get_csv_ullong_pos752(X,Y) get_csv_ullong((X),(Y),752)
+#define get_csv_ip_pos752(X,Y) get_csv_ip((X),(Y),752)
+#define get_csv_ipv6_pos752(X,Y) get_csv_ipv6((X),(Y),752)
+#define get_csv_string_pos752(X,Y) get_csv_string((X),(Y),752)
+#define get_csv_v_str_pos752(X,Y) get_csv_string((X),(Y),752)
+#define get_csv_bool_pos752(X,Y) get_csv_bool((X),(Y),752)
+#define get_csv_int_pos752(X,Y) get_csv_int((X),(Y),752)
+#define get_csv_llong_pos752(X,Y) get_csv_llong((X),(Y),752)
+#define get_csv_float_pos752(X,Y) get_csv_float((X),(Y),752)
+#define get_csv_uint_pos753(X,Y) get_csv_uint((X),(Y),753)
+#define get_csv_ullong_pos753(X,Y) get_csv_ullong((X),(Y),753)
+#define get_csv_ip_pos753(X,Y) get_csv_ip((X),(Y),753)
+#define get_csv_ipv6_pos753(X,Y) get_csv_ipv6((X),(Y),753)
+#define get_csv_string_pos753(X,Y) get_csv_string((X),(Y),753)
+#define get_csv_v_str_pos753(X,Y) get_csv_string((X),(Y),753)
+#define get_csv_bool_pos753(X,Y) get_csv_bool((X),(Y),753)
+#define get_csv_int_pos753(X,Y) get_csv_int((X),(Y),753)
+#define get_csv_llong_pos753(X,Y) get_csv_llong((X),(Y),753)
+#define get_csv_float_pos753(X,Y) get_csv_float((X),(Y),753)
+#define get_csv_uint_pos754(X,Y) get_csv_uint((X),(Y),754)
+#define get_csv_ullong_pos754(X,Y) get_csv_ullong((X),(Y),754)
+#define get_csv_ip_pos754(X,Y) get_csv_ip((X),(Y),754)
+#define get_csv_ipv6_pos754(X,Y) get_csv_ipv6((X),(Y),754)
+#define get_csv_string_pos754(X,Y) get_csv_string((X),(Y),754)
+#define get_csv_v_str_pos754(X,Y) get_csv_string((X),(Y),754)
+#define get_csv_bool_pos754(X,Y) get_csv_bool((X),(Y),754)
+#define get_csv_int_pos754(X,Y) get_csv_int((X),(Y),754)
+#define get_csv_llong_pos754(X,Y) get_csv_llong((X),(Y),754)
+#define get_csv_float_pos754(X,Y) get_csv_float((X),(Y),754)
+#define get_csv_uint_pos755(X,Y) get_csv_uint((X),(Y),755)
+#define get_csv_ullong_pos755(X,Y) get_csv_ullong((X),(Y),755)
+#define get_csv_ip_pos755(X,Y) get_csv_ip((X),(Y),755)
+#define get_csv_ipv6_pos755(X,Y) get_csv_ipv6((X),(Y),755)
+#define get_csv_string_pos755(X,Y) get_csv_string((X),(Y),755)
+#define get_csv_v_str_pos755(X,Y) get_csv_string((X),(Y),755)
+#define get_csv_bool_pos755(X,Y) get_csv_bool((X),(Y),755)
+#define get_csv_int_pos755(X,Y) get_csv_int((X),(Y),755)
+#define get_csv_llong_pos755(X,Y) get_csv_llong((X),(Y),755)
+#define get_csv_float_pos755(X,Y) get_csv_float((X),(Y),755)
+#define get_csv_uint_pos756(X,Y) get_csv_uint((X),(Y),756)
+#define get_csv_ullong_pos756(X,Y) get_csv_ullong((X),(Y),756)
+#define get_csv_ip_pos756(X,Y) get_csv_ip((X),(Y),756)
+#define get_csv_ipv6_pos756(X,Y) get_csv_ipv6((X),(Y),756)
+#define get_csv_string_pos756(X,Y) get_csv_string((X),(Y),756)
+#define get_csv_v_str_pos756(X,Y) get_csv_string((X),(Y),756)
+#define get_csv_bool_pos756(X,Y) get_csv_bool((X),(Y),756)
+#define get_csv_int_pos756(X,Y) get_csv_int((X),(Y),756)
+#define get_csv_llong_pos756(X,Y) get_csv_llong((X),(Y),756)
+#define get_csv_float_pos756(X,Y) get_csv_float((X),(Y),756)
+#define get_csv_uint_pos757(X,Y) get_csv_uint((X),(Y),757)
+#define get_csv_ullong_pos757(X,Y) get_csv_ullong((X),(Y),757)
+#define get_csv_ip_pos757(X,Y) get_csv_ip((X),(Y),757)
+#define get_csv_ipv6_pos757(X,Y) get_csv_ipv6((X),(Y),757)
+#define get_csv_string_pos757(X,Y) get_csv_string((X),(Y),757)
+#define get_csv_v_str_pos757(X,Y) get_csv_string((X),(Y),757)
+#define get_csv_bool_pos757(X,Y) get_csv_bool((X),(Y),757)
+#define get_csv_int_pos757(X,Y) get_csv_int((X),(Y),757)
+#define get_csv_llong_pos757(X,Y) get_csv_llong((X),(Y),757)
+#define get_csv_float_pos757(X,Y) get_csv_float((X),(Y),757)
+#define get_csv_uint_pos758(X,Y) get_csv_uint((X),(Y),758)
+#define get_csv_ullong_pos758(X,Y) get_csv_ullong((X),(Y),758)
+#define get_csv_ip_pos758(X,Y) get_csv_ip((X),(Y),758)
+#define get_csv_ipv6_pos758(X,Y) get_csv_ipv6((X),(Y),758)
+#define get_csv_string_pos758(X,Y) get_csv_string((X),(Y),758)
+#define get_csv_v_str_pos758(X,Y) get_csv_string((X),(Y),758)
+#define get_csv_bool_pos758(X,Y) get_csv_bool((X),(Y),758)
+#define get_csv_int_pos758(X,Y) get_csv_int((X),(Y),758)
+#define get_csv_llong_pos758(X,Y) get_csv_llong((X),(Y),758)
+#define get_csv_float_pos758(X,Y) get_csv_float((X),(Y),758)
+#define get_csv_uint_pos759(X,Y) get_csv_uint((X),(Y),759)
+#define get_csv_ullong_pos759(X,Y) get_csv_ullong((X),(Y),759)
+#define get_csv_ip_pos759(X,Y) get_csv_ip((X),(Y),759)
+#define get_csv_ipv6_pos759(X,Y) get_csv_ipv6((X),(Y),759)
+#define get_csv_string_pos759(X,Y) get_csv_string((X),(Y),759)
+#define get_csv_v_str_pos759(X,Y) get_csv_string((X),(Y),759)
+#define get_csv_bool_pos759(X,Y) get_csv_bool((X),(Y),759)
+#define get_csv_int_pos759(X,Y) get_csv_int((X),(Y),759)
+#define get_csv_llong_pos759(X,Y) get_csv_llong((X),(Y),759)
+#define get_csv_float_pos759(X,Y) get_csv_float((X),(Y),759)
+#define get_csv_uint_pos760(X,Y) get_csv_uint((X),(Y),760)
+#define get_csv_ullong_pos760(X,Y) get_csv_ullong((X),(Y),760)
+#define get_csv_ip_pos760(X,Y) get_csv_ip((X),(Y),760)
+#define get_csv_ipv6_pos760(X,Y) get_csv_ipv6((X),(Y),760)
+#define get_csv_string_pos760(X,Y) get_csv_string((X),(Y),760)
+#define get_csv_v_str_pos760(X,Y) get_csv_string((X),(Y),760)
+#define get_csv_bool_pos760(X,Y) get_csv_bool((X),(Y),760)
+#define get_csv_int_pos760(X,Y) get_csv_int((X),(Y),760)
+#define get_csv_llong_pos760(X,Y) get_csv_llong((X),(Y),760)
+#define get_csv_float_pos760(X,Y) get_csv_float((X),(Y),760)
+#define get_csv_uint_pos761(X,Y) get_csv_uint((X),(Y),761)
+#define get_csv_ullong_pos761(X,Y) get_csv_ullong((X),(Y),761)
+#define get_csv_ip_pos761(X,Y) get_csv_ip((X),(Y),761)
+#define get_csv_ipv6_pos761(X,Y) get_csv_ipv6((X),(Y),761)
+#define get_csv_string_pos761(X,Y) get_csv_string((X),(Y),761)
+#define get_csv_v_str_pos761(X,Y) get_csv_string((X),(Y),761)
+#define get_csv_bool_pos761(X,Y) get_csv_bool((X),(Y),761)
+#define get_csv_int_pos761(X,Y) get_csv_int((X),(Y),761)
+#define get_csv_llong_pos761(X,Y) get_csv_llong((X),(Y),761)
+#define get_csv_float_pos761(X,Y) get_csv_float((X),(Y),761)
+#define get_csv_uint_pos762(X,Y) get_csv_uint((X),(Y),762)
+#define get_csv_ullong_pos762(X,Y) get_csv_ullong((X),(Y),762)
+#define get_csv_ip_pos762(X,Y) get_csv_ip((X),(Y),762)
+#define get_csv_ipv6_pos762(X,Y) get_csv_ipv6((X),(Y),762)
+#define get_csv_string_pos762(X,Y) get_csv_string((X),(Y),762)
+#define get_csv_v_str_pos762(X,Y) get_csv_string((X),(Y),762)
+#define get_csv_bool_pos762(X,Y) get_csv_bool((X),(Y),762)
+#define get_csv_int_pos762(X,Y) get_csv_int((X),(Y),762)
+#define get_csv_llong_pos762(X,Y) get_csv_llong((X),(Y),762)
+#define get_csv_float_pos762(X,Y) get_csv_float((X),(Y),762)
+#define get_csv_uint_pos763(X,Y) get_csv_uint((X),(Y),763)
+#define get_csv_ullong_pos763(X,Y) get_csv_ullong((X),(Y),763)
+#define get_csv_ip_pos763(X,Y) get_csv_ip((X),(Y),763)
+#define get_csv_ipv6_pos763(X,Y) get_csv_ipv6((X),(Y),763)
+#define get_csv_string_pos763(X,Y) get_csv_string((X),(Y),763)
+#define get_csv_v_str_pos763(X,Y) get_csv_string((X),(Y),763)
+#define get_csv_bool_pos763(X,Y) get_csv_bool((X),(Y),763)
+#define get_csv_int_pos763(X,Y) get_csv_int((X),(Y),763)
+#define get_csv_llong_pos763(X,Y) get_csv_llong((X),(Y),763)
+#define get_csv_float_pos763(X,Y) get_csv_float((X),(Y),763)
+#define get_csv_uint_pos764(X,Y) get_csv_uint((X),(Y),764)
+#define get_csv_ullong_pos764(X,Y) get_csv_ullong((X),(Y),764)
+#define get_csv_ip_pos764(X,Y) get_csv_ip((X),(Y),764)
+#define get_csv_ipv6_pos764(X,Y) get_csv_ipv6((X),(Y),764)
+#define get_csv_string_pos764(X,Y) get_csv_string((X),(Y),764)
+#define get_csv_v_str_pos764(X,Y) get_csv_string((X),(Y),764)
+#define get_csv_bool_pos764(X,Y) get_csv_bool((X),(Y),764)
+#define get_csv_int_pos764(X,Y) get_csv_int((X),(Y),764)
+#define get_csv_llong_pos764(X,Y) get_csv_llong((X),(Y),764)
+#define get_csv_float_pos764(X,Y) get_csv_float((X),(Y),764)
+#define get_csv_uint_pos765(X,Y) get_csv_uint((X),(Y),765)
+#define get_csv_ullong_pos765(X,Y) get_csv_ullong((X),(Y),765)
+#define get_csv_ip_pos765(X,Y) get_csv_ip((X),(Y),765)
+#define get_csv_ipv6_pos765(X,Y) get_csv_ipv6((X),(Y),765)
+#define get_csv_string_pos765(X,Y) get_csv_string((X),(Y),765)
+#define get_csv_v_str_pos765(X,Y) get_csv_string((X),(Y),765)
+#define get_csv_bool_pos765(X,Y) get_csv_bool((X),(Y),765)
+#define get_csv_int_pos765(X,Y) get_csv_int((X),(Y),765)
+#define get_csv_llong_pos765(X,Y) get_csv_llong((X),(Y),765)
+#define get_csv_float_pos765(X,Y) get_csv_float((X),(Y),765)
+#define get_csv_uint_pos766(X,Y) get_csv_uint((X),(Y),766)
+#define get_csv_ullong_pos766(X,Y) get_csv_ullong((X),(Y),766)
+#define get_csv_ip_pos766(X,Y) get_csv_ip((X),(Y),766)
+#define get_csv_ipv6_pos766(X,Y) get_csv_ipv6((X),(Y),766)
+#define get_csv_string_pos766(X,Y) get_csv_string((X),(Y),766)
+#define get_csv_v_str_pos766(X,Y) get_csv_string((X),(Y),766)
+#define get_csv_bool_pos766(X,Y) get_csv_bool((X),(Y),766)
+#define get_csv_int_pos766(X,Y) get_csv_int((X),(Y),766)
+#define get_csv_llong_pos766(X,Y) get_csv_llong((X),(Y),766)
+#define get_csv_float_pos766(X,Y) get_csv_float((X),(Y),766)
+#define get_csv_uint_pos767(X,Y) get_csv_uint((X),(Y),767)
+#define get_csv_ullong_pos767(X,Y) get_csv_ullong((X),(Y),767)
+#define get_csv_ip_pos767(X,Y) get_csv_ip((X),(Y),767)
+#define get_csv_ipv6_pos767(X,Y) get_csv_ipv6((X),(Y),767)
+#define get_csv_string_pos767(X,Y) get_csv_string((X),(Y),767)
+#define get_csv_v_str_pos767(X,Y) get_csv_string((X),(Y),767)
+#define get_csv_bool_pos767(X,Y) get_csv_bool((X),(Y),767)
+#define get_csv_int_pos767(X,Y) get_csv_int((X),(Y),767)
+#define get_csv_llong_pos767(X,Y) get_csv_llong((X),(Y),767)
+#define get_csv_float_pos767(X,Y) get_csv_float((X),(Y),767)
+#define get_csv_uint_pos768(X,Y) get_csv_uint((X),(Y),768)
+#define get_csv_ullong_pos768(X,Y) get_csv_ullong((X),(Y),768)
+#define get_csv_ip_pos768(X,Y) get_csv_ip((X),(Y),768)
+#define get_csv_ipv6_pos768(X,Y) get_csv_ipv6((X),(Y),768)
+#define get_csv_string_pos768(X,Y) get_csv_string((X),(Y),768)
+#define get_csv_v_str_pos768(X,Y) get_csv_string((X),(Y),768)
+#define get_csv_bool_pos768(X,Y) get_csv_bool((X),(Y),768)
+#define get_csv_int_pos768(X,Y) get_csv_int((X),(Y),768)
+#define get_csv_llong_pos768(X,Y) get_csv_llong((X),(Y),768)
+#define get_csv_float_pos768(X,Y) get_csv_float((X),(Y),768)
+#define get_csv_uint_pos769(X,Y) get_csv_uint((X),(Y),769)
+#define get_csv_ullong_pos769(X,Y) get_csv_ullong((X),(Y),769)
+#define get_csv_ip_pos769(X,Y) get_csv_ip((X),(Y),769)
+#define get_csv_ipv6_pos769(X,Y) get_csv_ipv6((X),(Y),769)
+#define get_csv_string_pos769(X,Y) get_csv_string((X),(Y),769)
+#define get_csv_v_str_pos769(X,Y) get_csv_string((X),(Y),769)
+#define get_csv_bool_pos769(X,Y) get_csv_bool((X),(Y),769)
+#define get_csv_int_pos769(X,Y) get_csv_int((X),(Y),769)
+#define get_csv_llong_pos769(X,Y) get_csv_llong((X),(Y),769)
+#define get_csv_float_pos769(X,Y) get_csv_float((X),(Y),769)
+#define get_csv_uint_pos770(X,Y) get_csv_uint((X),(Y),770)
+#define get_csv_ullong_pos770(X,Y) get_csv_ullong((X),(Y),770)
+#define get_csv_ip_pos770(X,Y) get_csv_ip((X),(Y),770)
+#define get_csv_ipv6_pos770(X,Y) get_csv_ipv6((X),(Y),770)
+#define get_csv_string_pos770(X,Y) get_csv_string((X),(Y),770)
+#define get_csv_v_str_pos770(X,Y) get_csv_string((X),(Y),770)
+#define get_csv_bool_pos770(X,Y) get_csv_bool((X),(Y),770)
+#define get_csv_int_pos770(X,Y) get_csv_int((X),(Y),770)
+#define get_csv_llong_pos770(X,Y) get_csv_llong((X),(Y),770)
+#define get_csv_float_pos770(X,Y) get_csv_float((X),(Y),770)
+#define get_csv_uint_pos771(X,Y) get_csv_uint((X),(Y),771)
+#define get_csv_ullong_pos771(X,Y) get_csv_ullong((X),(Y),771)
+#define get_csv_ip_pos771(X,Y) get_csv_ip((X),(Y),771)
+#define get_csv_ipv6_pos771(X,Y) get_csv_ipv6((X),(Y),771)
+#define get_csv_string_pos771(X,Y) get_csv_string((X),(Y),771)
+#define get_csv_v_str_pos771(X,Y) get_csv_string((X),(Y),771)
+#define get_csv_bool_pos771(X,Y) get_csv_bool((X),(Y),771)
+#define get_csv_int_pos771(X,Y) get_csv_int((X),(Y),771)
+#define get_csv_llong_pos771(X,Y) get_csv_llong((X),(Y),771)
+#define get_csv_float_pos771(X,Y) get_csv_float((X),(Y),771)
+#define get_csv_uint_pos772(X,Y) get_csv_uint((X),(Y),772)
+#define get_csv_ullong_pos772(X,Y) get_csv_ullong((X),(Y),772)
+#define get_csv_ip_pos772(X,Y) get_csv_ip((X),(Y),772)
+#define get_csv_ipv6_pos772(X,Y) get_csv_ipv6((X),(Y),772)
+#define get_csv_string_pos772(X,Y) get_csv_string((X),(Y),772)
+#define get_csv_v_str_pos772(X,Y) get_csv_string((X),(Y),772)
+#define get_csv_bool_pos772(X,Y) get_csv_bool((X),(Y),772)
+#define get_csv_int_pos772(X,Y) get_csv_int((X),(Y),772)
+#define get_csv_llong_pos772(X,Y) get_csv_llong((X),(Y),772)
+#define get_csv_float_pos772(X,Y) get_csv_float((X),(Y),772)
+#define get_csv_uint_pos773(X,Y) get_csv_uint((X),(Y),773)
+#define get_csv_ullong_pos773(X,Y) get_csv_ullong((X),(Y),773)
+#define get_csv_ip_pos773(X,Y) get_csv_ip((X),(Y),773)
+#define get_csv_ipv6_pos773(X,Y) get_csv_ipv6((X),(Y),773)
+#define get_csv_string_pos773(X,Y) get_csv_string((X),(Y),773)
+#define get_csv_v_str_pos773(X,Y) get_csv_string((X),(Y),773)
+#define get_csv_bool_pos773(X,Y) get_csv_bool((X),(Y),773)
+#define get_csv_int_pos773(X,Y) get_csv_int((X),(Y),773)
+#define get_csv_llong_pos773(X,Y) get_csv_llong((X),(Y),773)
+#define get_csv_float_pos773(X,Y) get_csv_float((X),(Y),773)
+#define get_csv_uint_pos774(X,Y) get_csv_uint((X),(Y),774)
+#define get_csv_ullong_pos774(X,Y) get_csv_ullong((X),(Y),774)
+#define get_csv_ip_pos774(X,Y) get_csv_ip((X),(Y),774)
+#define get_csv_ipv6_pos774(X,Y) get_csv_ipv6((X),(Y),774)
+#define get_csv_string_pos774(X,Y) get_csv_string((X),(Y),774)
+#define get_csv_v_str_pos774(X,Y) get_csv_string((X),(Y),774)
+#define get_csv_bool_pos774(X,Y) get_csv_bool((X),(Y),774)
+#define get_csv_int_pos774(X,Y) get_csv_int((X),(Y),774)
+#define get_csv_llong_pos774(X,Y) get_csv_llong((X),(Y),774)
+#define get_csv_float_pos774(X,Y) get_csv_float((X),(Y),774)
+#define get_csv_uint_pos775(X,Y) get_csv_uint((X),(Y),775)
+#define get_csv_ullong_pos775(X,Y) get_csv_ullong((X),(Y),775)
+#define get_csv_ip_pos775(X,Y) get_csv_ip((X),(Y),775)
+#define get_csv_ipv6_pos775(X,Y) get_csv_ipv6((X),(Y),775)
+#define get_csv_string_pos775(X,Y) get_csv_string((X),(Y),775)
+#define get_csv_v_str_pos775(X,Y) get_csv_string((X),(Y),775)
+#define get_csv_bool_pos775(X,Y) get_csv_bool((X),(Y),775)
+#define get_csv_int_pos775(X,Y) get_csv_int((X),(Y),775)
+#define get_csv_llong_pos775(X,Y) get_csv_llong((X),(Y),775)
+#define get_csv_float_pos775(X,Y) get_csv_float((X),(Y),775)
+#define get_csv_uint_pos776(X,Y) get_csv_uint((X),(Y),776)
+#define get_csv_ullong_pos776(X,Y) get_csv_ullong((X),(Y),776)
+#define get_csv_ip_pos776(X,Y) get_csv_ip((X),(Y),776)
+#define get_csv_ipv6_pos776(X,Y) get_csv_ipv6((X),(Y),776)
+#define get_csv_string_pos776(X,Y) get_csv_string((X),(Y),776)
+#define get_csv_v_str_pos776(X,Y) get_csv_string((X),(Y),776)
+#define get_csv_bool_pos776(X,Y) get_csv_bool((X),(Y),776)
+#define get_csv_int_pos776(X,Y) get_csv_int((X),(Y),776)
+#define get_csv_llong_pos776(X,Y) get_csv_llong((X),(Y),776)
+#define get_csv_float_pos776(X,Y) get_csv_float((X),(Y),776)
+#define get_csv_uint_pos777(X,Y) get_csv_uint((X),(Y),777)
+#define get_csv_ullong_pos777(X,Y) get_csv_ullong((X),(Y),777)
+#define get_csv_ip_pos777(X,Y) get_csv_ip((X),(Y),777)
+#define get_csv_ipv6_pos777(X,Y) get_csv_ipv6((X),(Y),777)
+#define get_csv_string_pos777(X,Y) get_csv_string((X),(Y),777)
+#define get_csv_v_str_pos777(X,Y) get_csv_string((X),(Y),777)
+#define get_csv_bool_pos777(X,Y) get_csv_bool((X),(Y),777)
+#define get_csv_int_pos777(X,Y) get_csv_int((X),(Y),777)
+#define get_csv_llong_pos777(X,Y) get_csv_llong((X),(Y),777)
+#define get_csv_float_pos777(X,Y) get_csv_float((X),(Y),777)
+#define get_csv_uint_pos778(X,Y) get_csv_uint((X),(Y),778)
+#define get_csv_ullong_pos778(X,Y) get_csv_ullong((X),(Y),778)
+#define get_csv_ip_pos778(X,Y) get_csv_ip((X),(Y),778)
+#define get_csv_ipv6_pos778(X,Y) get_csv_ipv6((X),(Y),778)
+#define get_csv_string_pos778(X,Y) get_csv_string((X),(Y),778)
+#define get_csv_v_str_pos778(X,Y) get_csv_string((X),(Y),778)
+#define get_csv_bool_pos778(X,Y) get_csv_bool((X),(Y),778)
+#define get_csv_int_pos778(X,Y) get_csv_int((X),(Y),778)
+#define get_csv_llong_pos778(X,Y) get_csv_llong((X),(Y),778)
+#define get_csv_float_pos778(X,Y) get_csv_float((X),(Y),778)
+#define get_csv_uint_pos779(X,Y) get_csv_uint((X),(Y),779)
+#define get_csv_ullong_pos779(X,Y) get_csv_ullong((X),(Y),779)
+#define get_csv_ip_pos779(X,Y) get_csv_ip((X),(Y),779)
+#define get_csv_ipv6_pos779(X,Y) get_csv_ipv6((X),(Y),779)
+#define get_csv_string_pos779(X,Y) get_csv_string((X),(Y),779)
+#define get_csv_v_str_pos779(X,Y) get_csv_string((X),(Y),779)
+#define get_csv_bool_pos779(X,Y) get_csv_bool((X),(Y),779)
+#define get_csv_int_pos779(X,Y) get_csv_int((X),(Y),779)
+#define get_csv_llong_pos779(X,Y) get_csv_llong((X),(Y),779)
+#define get_csv_float_pos779(X,Y) get_csv_float((X),(Y),779)
+#define get_csv_uint_pos780(X,Y) get_csv_uint((X),(Y),780)
+#define get_csv_ullong_pos780(X,Y) get_csv_ullong((X),(Y),780)
+#define get_csv_ip_pos780(X,Y) get_csv_ip((X),(Y),780)
+#define get_csv_ipv6_pos780(X,Y) get_csv_ipv6((X),(Y),780)
+#define get_csv_string_pos780(X,Y) get_csv_string((X),(Y),780)
+#define get_csv_v_str_pos780(X,Y) get_csv_string((X),(Y),780)
+#define get_csv_bool_pos780(X,Y) get_csv_bool((X),(Y),780)
+#define get_csv_int_pos780(X,Y) get_csv_int((X),(Y),780)
+#define get_csv_llong_pos780(X,Y) get_csv_llong((X),(Y),780)
+#define get_csv_float_pos780(X,Y) get_csv_float((X),(Y),780)
+#define get_csv_uint_pos781(X,Y) get_csv_uint((X),(Y),781)
+#define get_csv_ullong_pos781(X,Y) get_csv_ullong((X),(Y),781)
+#define get_csv_ip_pos781(X,Y) get_csv_ip((X),(Y),781)
+#define get_csv_ipv6_pos781(X,Y) get_csv_ipv6((X),(Y),781)
+#define get_csv_string_pos781(X,Y) get_csv_string((X),(Y),781)
+#define get_csv_v_str_pos781(X,Y) get_csv_string((X),(Y),781)
+#define get_csv_bool_pos781(X,Y) get_csv_bool((X),(Y),781)
+#define get_csv_int_pos781(X,Y) get_csv_int((X),(Y),781)
+#define get_csv_llong_pos781(X,Y) get_csv_llong((X),(Y),781)
+#define get_csv_float_pos781(X,Y) get_csv_float((X),(Y),781)
+#define get_csv_uint_pos782(X,Y) get_csv_uint((X),(Y),782)
+#define get_csv_ullong_pos782(X,Y) get_csv_ullong((X),(Y),782)
+#define get_csv_ip_pos782(X,Y) get_csv_ip((X),(Y),782)
+#define get_csv_ipv6_pos782(X,Y) get_csv_ipv6((X),(Y),782)
+#define get_csv_string_pos782(X,Y) get_csv_string((X),(Y),782)
+#define get_csv_v_str_pos782(X,Y) get_csv_string((X),(Y),782)
+#define get_csv_bool_pos782(X,Y) get_csv_bool((X),(Y),782)
+#define get_csv_int_pos782(X,Y) get_csv_int((X),(Y),782)
+#define get_csv_llong_pos782(X,Y) get_csv_llong((X),(Y),782)
+#define get_csv_float_pos782(X,Y) get_csv_float((X),(Y),782)
+#define get_csv_uint_pos783(X,Y) get_csv_uint((X),(Y),783)
+#define get_csv_ullong_pos783(X,Y) get_csv_ullong((X),(Y),783)
+#define get_csv_ip_pos783(X,Y) get_csv_ip((X),(Y),783)
+#define get_csv_ipv6_pos783(X,Y) get_csv_ipv6((X),(Y),783)
+#define get_csv_string_pos783(X,Y) get_csv_string((X),(Y),783)
+#define get_csv_v_str_pos783(X,Y) get_csv_string((X),(Y),783)
+#define get_csv_bool_pos783(X,Y) get_csv_bool((X),(Y),783)
+#define get_csv_int_pos783(X,Y) get_csv_int((X),(Y),783)
+#define get_csv_llong_pos783(X,Y) get_csv_llong((X),(Y),783)
+#define get_csv_float_pos783(X,Y) get_csv_float((X),(Y),783)
+#define get_csv_uint_pos784(X,Y) get_csv_uint((X),(Y),784)
+#define get_csv_ullong_pos784(X,Y) get_csv_ullong((X),(Y),784)
+#define get_csv_ip_pos784(X,Y) get_csv_ip((X),(Y),784)
+#define get_csv_ipv6_pos784(X,Y) get_csv_ipv6((X),(Y),784)
+#define get_csv_string_pos784(X,Y) get_csv_string((X),(Y),784)
+#define get_csv_v_str_pos784(X,Y) get_csv_string((X),(Y),784)
+#define get_csv_bool_pos784(X,Y) get_csv_bool((X),(Y),784)
+#define get_csv_int_pos784(X,Y) get_csv_int((X),(Y),784)
+#define get_csv_llong_pos784(X,Y) get_csv_llong((X),(Y),784)
+#define get_csv_float_pos784(X,Y) get_csv_float((X),(Y),784)
+#define get_csv_uint_pos785(X,Y) get_csv_uint((X),(Y),785)
+#define get_csv_ullong_pos785(X,Y) get_csv_ullong((X),(Y),785)
+#define get_csv_ip_pos785(X,Y) get_csv_ip((X),(Y),785)
+#define get_csv_ipv6_pos785(X,Y) get_csv_ipv6((X),(Y),785)
+#define get_csv_string_pos785(X,Y) get_csv_string((X),(Y),785)
+#define get_csv_v_str_pos785(X,Y) get_csv_string((X),(Y),785)
+#define get_csv_bool_pos785(X,Y) get_csv_bool((X),(Y),785)
+#define get_csv_int_pos785(X,Y) get_csv_int((X),(Y),785)
+#define get_csv_llong_pos785(X,Y) get_csv_llong((X),(Y),785)
+#define get_csv_float_pos785(X,Y) get_csv_float((X),(Y),785)
+#define get_csv_uint_pos786(X,Y) get_csv_uint((X),(Y),786)
+#define get_csv_ullong_pos786(X,Y) get_csv_ullong((X),(Y),786)
+#define get_csv_ip_pos786(X,Y) get_csv_ip((X),(Y),786)
+#define get_csv_ipv6_pos786(X,Y) get_csv_ipv6((X),(Y),786)
+#define get_csv_string_pos786(X,Y) get_csv_string((X),(Y),786)
+#define get_csv_v_str_pos786(X,Y) get_csv_string((X),(Y),786)
+#define get_csv_bool_pos786(X,Y) get_csv_bool((X),(Y),786)
+#define get_csv_int_pos786(X,Y) get_csv_int((X),(Y),786)
+#define get_csv_llong_pos786(X,Y) get_csv_llong((X),(Y),786)
+#define get_csv_float_pos786(X,Y) get_csv_float((X),(Y),786)
+#define get_csv_uint_pos787(X,Y) get_csv_uint((X),(Y),787)
+#define get_csv_ullong_pos787(X,Y) get_csv_ullong((X),(Y),787)
+#define get_csv_ip_pos787(X,Y) get_csv_ip((X),(Y),787)
+#define get_csv_ipv6_pos787(X,Y) get_csv_ipv6((X),(Y),787)
+#define get_csv_string_pos787(X,Y) get_csv_string((X),(Y),787)
+#define get_csv_v_str_pos787(X,Y) get_csv_string((X),(Y),787)
+#define get_csv_bool_pos787(X,Y) get_csv_bool((X),(Y),787)
+#define get_csv_int_pos787(X,Y) get_csv_int((X),(Y),787)
+#define get_csv_llong_pos787(X,Y) get_csv_llong((X),(Y),787)
+#define get_csv_float_pos787(X,Y) get_csv_float((X),(Y),787)
+#define get_csv_uint_pos788(X,Y) get_csv_uint((X),(Y),788)
+#define get_csv_ullong_pos788(X,Y) get_csv_ullong((X),(Y),788)
+#define get_csv_ip_pos788(X,Y) get_csv_ip((X),(Y),788)
+#define get_csv_ipv6_pos788(X,Y) get_csv_ipv6((X),(Y),788)
+#define get_csv_string_pos788(X,Y) get_csv_string((X),(Y),788)
+#define get_csv_v_str_pos788(X,Y) get_csv_string((X),(Y),788)
+#define get_csv_bool_pos788(X,Y) get_csv_bool((X),(Y),788)
+#define get_csv_int_pos788(X,Y) get_csv_int((X),(Y),788)
+#define get_csv_llong_pos788(X,Y) get_csv_llong((X),(Y),788)
+#define get_csv_float_pos788(X,Y) get_csv_float((X),(Y),788)
+#define get_csv_uint_pos789(X,Y) get_csv_uint((X),(Y),789)
+#define get_csv_ullong_pos789(X,Y) get_csv_ullong((X),(Y),789)
+#define get_csv_ip_pos789(X,Y) get_csv_ip((X),(Y),789)
+#define get_csv_ipv6_pos789(X,Y) get_csv_ipv6((X),(Y),789)
+#define get_csv_string_pos789(X,Y) get_csv_string((X),(Y),789)
+#define get_csv_v_str_pos789(X,Y) get_csv_string((X),(Y),789)
+#define get_csv_bool_pos789(X,Y) get_csv_bool((X),(Y),789)
+#define get_csv_int_pos789(X,Y) get_csv_int((X),(Y),789)
+#define get_csv_llong_pos789(X,Y) get_csv_llong((X),(Y),789)
+#define get_csv_float_pos789(X,Y) get_csv_float((X),(Y),789)
+#define get_csv_uint_pos790(X,Y) get_csv_uint((X),(Y),790)
+#define get_csv_ullong_pos790(X,Y) get_csv_ullong((X),(Y),790)
+#define get_csv_ip_pos790(X,Y) get_csv_ip((X),(Y),790)
+#define get_csv_ipv6_pos790(X,Y) get_csv_ipv6((X),(Y),790)
+#define get_csv_string_pos790(X,Y) get_csv_string((X),(Y),790)
+#define get_csv_v_str_pos790(X,Y) get_csv_string((X),(Y),790)
+#define get_csv_bool_pos790(X,Y) get_csv_bool((X),(Y),790)
+#define get_csv_int_pos790(X,Y) get_csv_int((X),(Y),790)
+#define get_csv_llong_pos790(X,Y) get_csv_llong((X),(Y),790)
+#define get_csv_float_pos790(X,Y) get_csv_float((X),(Y),790)
+#define get_csv_uint_pos791(X,Y) get_csv_uint((X),(Y),791)
+#define get_csv_ullong_pos791(X,Y) get_csv_ullong((X),(Y),791)
+#define get_csv_ip_pos791(X,Y) get_csv_ip((X),(Y),791)
+#define get_csv_ipv6_pos791(X,Y) get_csv_ipv6((X),(Y),791)
+#define get_csv_string_pos791(X,Y) get_csv_string((X),(Y),791)
+#define get_csv_v_str_pos791(X,Y) get_csv_string((X),(Y),791)
+#define get_csv_bool_pos791(X,Y) get_csv_bool((X),(Y),791)
+#define get_csv_int_pos791(X,Y) get_csv_int((X),(Y),791)
+#define get_csv_llong_pos791(X,Y) get_csv_llong((X),(Y),791)
+#define get_csv_float_pos791(X,Y) get_csv_float((X),(Y),791)
+#define get_csv_uint_pos792(X,Y) get_csv_uint((X),(Y),792)
+#define get_csv_ullong_pos792(X,Y) get_csv_ullong((X),(Y),792)
+#define get_csv_ip_pos792(X,Y) get_csv_ip((X),(Y),792)
+#define get_csv_ipv6_pos792(X,Y) get_csv_ipv6((X),(Y),792)
+#define get_csv_string_pos792(X,Y) get_csv_string((X),(Y),792)
+#define get_csv_v_str_pos792(X,Y) get_csv_string((X),(Y),792)
+#define get_csv_bool_pos792(X,Y) get_csv_bool((X),(Y),792)
+#define get_csv_int_pos792(X,Y) get_csv_int((X),(Y),792)
+#define get_csv_llong_pos792(X,Y) get_csv_llong((X),(Y),792)
+#define get_csv_float_pos792(X,Y) get_csv_float((X),(Y),792)
+#define get_csv_uint_pos793(X,Y) get_csv_uint((X),(Y),793)
+#define get_csv_ullong_pos793(X,Y) get_csv_ullong((X),(Y),793)
+#define get_csv_ip_pos793(X,Y) get_csv_ip((X),(Y),793)
+#define get_csv_ipv6_pos793(X,Y) get_csv_ipv6((X),(Y),793)
+#define get_csv_string_pos793(X,Y) get_csv_string((X),(Y),793)
+#define get_csv_v_str_pos793(X,Y) get_csv_string((X),(Y),793)
+#define get_csv_bool_pos793(X,Y) get_csv_bool((X),(Y),793)
+#define get_csv_int_pos793(X,Y) get_csv_int((X),(Y),793)
+#define get_csv_llong_pos793(X,Y) get_csv_llong((X),(Y),793)
+#define get_csv_float_pos793(X,Y) get_csv_float((X),(Y),793)
+#define get_csv_uint_pos794(X,Y) get_csv_uint((X),(Y),794)
+#define get_csv_ullong_pos794(X,Y) get_csv_ullong((X),(Y),794)
+#define get_csv_ip_pos794(X,Y) get_csv_ip((X),(Y),794)
+#define get_csv_ipv6_pos794(X,Y) get_csv_ipv6((X),(Y),794)
+#define get_csv_string_pos794(X,Y) get_csv_string((X),(Y),794)
+#define get_csv_v_str_pos794(X,Y) get_csv_string((X),(Y),794)
+#define get_csv_bool_pos794(X,Y) get_csv_bool((X),(Y),794)
+#define get_csv_int_pos794(X,Y) get_csv_int((X),(Y),794)
+#define get_csv_llong_pos794(X,Y) get_csv_llong((X),(Y),794)
+#define get_csv_float_pos794(X,Y) get_csv_float((X),(Y),794)
+#define get_csv_uint_pos795(X,Y) get_csv_uint((X),(Y),795)
+#define get_csv_ullong_pos795(X,Y) get_csv_ullong((X),(Y),795)
+#define get_csv_ip_pos795(X,Y) get_csv_ip((X),(Y),795)
+#define get_csv_ipv6_pos795(X,Y) get_csv_ipv6((X),(Y),795)
+#define get_csv_string_pos795(X,Y) get_csv_string((X),(Y),795)
+#define get_csv_v_str_pos795(X,Y) get_csv_string((X),(Y),795)
+#define get_csv_bool_pos795(X,Y) get_csv_bool((X),(Y),795)
+#define get_csv_int_pos795(X,Y) get_csv_int((X),(Y),795)
+#define get_csv_llong_pos795(X,Y) get_csv_llong((X),(Y),795)
+#define get_csv_float_pos795(X,Y) get_csv_float((X),(Y),795)
+#define get_csv_uint_pos796(X,Y) get_csv_uint((X),(Y),796)
+#define get_csv_ullong_pos796(X,Y) get_csv_ullong((X),(Y),796)
+#define get_csv_ip_pos796(X,Y) get_csv_ip((X),(Y),796)
+#define get_csv_ipv6_pos796(X,Y) get_csv_ipv6((X),(Y),796)
+#define get_csv_string_pos796(X,Y) get_csv_string((X),(Y),796)
+#define get_csv_v_str_pos796(X,Y) get_csv_string((X),(Y),796)
+#define get_csv_bool_pos796(X,Y) get_csv_bool((X),(Y),796)
+#define get_csv_int_pos796(X,Y) get_csv_int((X),(Y),796)
+#define get_csv_llong_pos796(X,Y) get_csv_llong((X),(Y),796)
+#define get_csv_float_pos796(X,Y) get_csv_float((X),(Y),796)
+#define get_csv_uint_pos797(X,Y) get_csv_uint((X),(Y),797)
+#define get_csv_ullong_pos797(X,Y) get_csv_ullong((X),(Y),797)
+#define get_csv_ip_pos797(X,Y) get_csv_ip((X),(Y),797)
+#define get_csv_ipv6_pos797(X,Y) get_csv_ipv6((X),(Y),797)
+#define get_csv_string_pos797(X,Y) get_csv_string((X),(Y),797)
+#define get_csv_v_str_pos797(X,Y) get_csv_string((X),(Y),797)
+#define get_csv_bool_pos797(X,Y) get_csv_bool((X),(Y),797)
+#define get_csv_int_pos797(X,Y) get_csv_int((X),(Y),797)
+#define get_csv_llong_pos797(X,Y) get_csv_llong((X),(Y),797)
+#define get_csv_float_pos797(X,Y) get_csv_float((X),(Y),797)
+#define get_csv_uint_pos798(X,Y) get_csv_uint((X),(Y),798)
+#define get_csv_ullong_pos798(X,Y) get_csv_ullong((X),(Y),798)
+#define get_csv_ip_pos798(X,Y) get_csv_ip((X),(Y),798)
+#define get_csv_ipv6_pos798(X,Y) get_csv_ipv6((X),(Y),798)
+#define get_csv_string_pos798(X,Y) get_csv_string((X),(Y),798)
+#define get_csv_v_str_pos798(X,Y) get_csv_string((X),(Y),798)
+#define get_csv_bool_pos798(X,Y) get_csv_bool((X),(Y),798)
+#define get_csv_int_pos798(X,Y) get_csv_int((X),(Y),798)
+#define get_csv_llong_pos798(X,Y) get_csv_llong((X),(Y),798)
+#define get_csv_float_pos798(X,Y) get_csv_float((X),(Y),798)
+#define get_csv_uint_pos799(X,Y) get_csv_uint((X),(Y),799)
+#define get_csv_ullong_pos799(X,Y) get_csv_ullong((X),(Y),799)
+#define get_csv_ip_pos799(X,Y) get_csv_ip((X),(Y),799)
+#define get_csv_ipv6_pos799(X,Y) get_csv_ipv6((X),(Y),799)
+#define get_csv_string_pos799(X,Y) get_csv_string((X),(Y),799)
+#define get_csv_v_str_pos799(X,Y) get_csv_string((X),(Y),799)
+#define get_csv_bool_pos799(X,Y) get_csv_bool((X),(Y),799)
+#define get_csv_int_pos799(X,Y) get_csv_int((X),(Y),799)
+#define get_csv_llong_pos799(X,Y) get_csv_llong((X),(Y),799)
+#define get_csv_float_pos799(X,Y) get_csv_float((X),(Y),799)
+#define get_csv_uint_pos800(X,Y) get_csv_uint((X),(Y),800)
+#define get_csv_ullong_pos800(X,Y) get_csv_ullong((X),(Y),800)
+#define get_csv_ip_pos800(X,Y) get_csv_ip((X),(Y),800)
+#define get_csv_ipv6_pos800(X,Y) get_csv_ipv6((X),(Y),800)
+#define get_csv_string_pos800(X,Y) get_csv_string((X),(Y),800)
+#define get_csv_v_str_pos800(X,Y) get_csv_string((X),(Y),800)
+#define get_csv_bool_pos800(X,Y) get_csv_bool((X),(Y),800)
+#define get_csv_int_pos800(X,Y) get_csv_int((X),(Y),800)
+#define get_csv_llong_pos800(X,Y) get_csv_llong((X),(Y),800)
+#define get_csv_float_pos800(X,Y) get_csv_float((X),(Y),800)
+#define get_csv_uint_pos801(X,Y) get_csv_uint((X),(Y),801)
+#define get_csv_ullong_pos801(X,Y) get_csv_ullong((X),(Y),801)
+#define get_csv_ip_pos801(X,Y) get_csv_ip((X),(Y),801)
+#define get_csv_ipv6_pos801(X,Y) get_csv_ipv6((X),(Y),801)
+#define get_csv_string_pos801(X,Y) get_csv_string((X),(Y),801)
+#define get_csv_v_str_pos801(X,Y) get_csv_string((X),(Y),801)
+#define get_csv_bool_pos801(X,Y) get_csv_bool((X),(Y),801)
+#define get_csv_int_pos801(X,Y) get_csv_int((X),(Y),801)
+#define get_csv_llong_pos801(X,Y) get_csv_llong((X),(Y),801)
+#define get_csv_float_pos801(X,Y) get_csv_float((X),(Y),801)
+#define get_csv_uint_pos802(X,Y) get_csv_uint((X),(Y),802)
+#define get_csv_ullong_pos802(X,Y) get_csv_ullong((X),(Y),802)
+#define get_csv_ip_pos802(X,Y) get_csv_ip((X),(Y),802)
+#define get_csv_ipv6_pos802(X,Y) get_csv_ipv6((X),(Y),802)
+#define get_csv_string_pos802(X,Y) get_csv_string((X),(Y),802)
+#define get_csv_v_str_pos802(X,Y) get_csv_string((X),(Y),802)
+#define get_csv_bool_pos802(X,Y) get_csv_bool((X),(Y),802)
+#define get_csv_int_pos802(X,Y) get_csv_int((X),(Y),802)
+#define get_csv_llong_pos802(X,Y) get_csv_llong((X),(Y),802)
+#define get_csv_float_pos802(X,Y) get_csv_float((X),(Y),802)
+#define get_csv_uint_pos803(X,Y) get_csv_uint((X),(Y),803)
+#define get_csv_ullong_pos803(X,Y) get_csv_ullong((X),(Y),803)
+#define get_csv_ip_pos803(X,Y) get_csv_ip((X),(Y),803)
+#define get_csv_ipv6_pos803(X,Y) get_csv_ipv6((X),(Y),803)
+#define get_csv_string_pos803(X,Y) get_csv_string((X),(Y),803)
+#define get_csv_v_str_pos803(X,Y) get_csv_string((X),(Y),803)
+#define get_csv_bool_pos803(X,Y) get_csv_bool((X),(Y),803)
+#define get_csv_int_pos803(X,Y) get_csv_int((X),(Y),803)
+#define get_csv_llong_pos803(X,Y) get_csv_llong((X),(Y),803)
+#define get_csv_float_pos803(X,Y) get_csv_float((X),(Y),803)
+#define get_csv_uint_pos804(X,Y) get_csv_uint((X),(Y),804)
+#define get_csv_ullong_pos804(X,Y) get_csv_ullong((X),(Y),804)
+#define get_csv_ip_pos804(X,Y) get_csv_ip((X),(Y),804)
+#define get_csv_ipv6_pos804(X,Y) get_csv_ipv6((X),(Y),804)
+#define get_csv_string_pos804(X,Y) get_csv_string((X),(Y),804)
+#define get_csv_v_str_pos804(X,Y) get_csv_string((X),(Y),804)
+#define get_csv_bool_pos804(X,Y) get_csv_bool((X),(Y),804)
+#define get_csv_int_pos804(X,Y) get_csv_int((X),(Y),804)
+#define get_csv_llong_pos804(X,Y) get_csv_llong((X),(Y),804)
+#define get_csv_float_pos804(X,Y) get_csv_float((X),(Y),804)
+#define get_csv_uint_pos805(X,Y) get_csv_uint((X),(Y),805)
+#define get_csv_ullong_pos805(X,Y) get_csv_ullong((X),(Y),805)
+#define get_csv_ip_pos805(X,Y) get_csv_ip((X),(Y),805)
+#define get_csv_ipv6_pos805(X,Y) get_csv_ipv6((X),(Y),805)
+#define get_csv_string_pos805(X,Y) get_csv_string((X),(Y),805)
+#define get_csv_v_str_pos805(X,Y) get_csv_string((X),(Y),805)
+#define get_csv_bool_pos805(X,Y) get_csv_bool((X),(Y),805)
+#define get_csv_int_pos805(X,Y) get_csv_int((X),(Y),805)
+#define get_csv_llong_pos805(X,Y) get_csv_llong((X),(Y),805)
+#define get_csv_float_pos805(X,Y) get_csv_float((X),(Y),805)
+#define get_csv_uint_pos806(X,Y) get_csv_uint((X),(Y),806)
+#define get_csv_ullong_pos806(X,Y) get_csv_ullong((X),(Y),806)
+#define get_csv_ip_pos806(X,Y) get_csv_ip((X),(Y),806)
+#define get_csv_ipv6_pos806(X,Y) get_csv_ipv6((X),(Y),806)
+#define get_csv_string_pos806(X,Y) get_csv_string((X),(Y),806)
+#define get_csv_v_str_pos806(X,Y) get_csv_string((X),(Y),806)
+#define get_csv_bool_pos806(X,Y) get_csv_bool((X),(Y),806)
+#define get_csv_int_pos806(X,Y) get_csv_int((X),(Y),806)
+#define get_csv_llong_pos806(X,Y) get_csv_llong((X),(Y),806)
+#define get_csv_float_pos806(X,Y) get_csv_float((X),(Y),806)
+#define get_csv_uint_pos807(X,Y) get_csv_uint((X),(Y),807)
+#define get_csv_ullong_pos807(X,Y) get_csv_ullong((X),(Y),807)
+#define get_csv_ip_pos807(X,Y) get_csv_ip((X),(Y),807)
+#define get_csv_ipv6_pos807(X,Y) get_csv_ipv6((X),(Y),807)
+#define get_csv_string_pos807(X,Y) get_csv_string((X),(Y),807)
+#define get_csv_v_str_pos807(X,Y) get_csv_string((X),(Y),807)
+#define get_csv_bool_pos807(X,Y) get_csv_bool((X),(Y),807)
+#define get_csv_int_pos807(X,Y) get_csv_int((X),(Y),807)
+#define get_csv_llong_pos807(X,Y) get_csv_llong((X),(Y),807)
+#define get_csv_float_pos807(X,Y) get_csv_float((X),(Y),807)
+#define get_csv_uint_pos808(X,Y) get_csv_uint((X),(Y),808)
+#define get_csv_ullong_pos808(X,Y) get_csv_ullong((X),(Y),808)
+#define get_csv_ip_pos808(X,Y) get_csv_ip((X),(Y),808)
+#define get_csv_ipv6_pos808(X,Y) get_csv_ipv6((X),(Y),808)
+#define get_csv_string_pos808(X,Y) get_csv_string((X),(Y),808)
+#define get_csv_v_str_pos808(X,Y) get_csv_string((X),(Y),808)
+#define get_csv_bool_pos808(X,Y) get_csv_bool((X),(Y),808)
+#define get_csv_int_pos808(X,Y) get_csv_int((X),(Y),808)
+#define get_csv_llong_pos808(X,Y) get_csv_llong((X),(Y),808)
+#define get_csv_float_pos808(X,Y) get_csv_float((X),(Y),808)
+#define get_csv_uint_pos809(X,Y) get_csv_uint((X),(Y),809)
+#define get_csv_ullong_pos809(X,Y) get_csv_ullong((X),(Y),809)
+#define get_csv_ip_pos809(X,Y) get_csv_ip((X),(Y),809)
+#define get_csv_ipv6_pos809(X,Y) get_csv_ipv6((X),(Y),809)
+#define get_csv_string_pos809(X,Y) get_csv_string((X),(Y),809)
+#define get_csv_v_str_pos809(X,Y) get_csv_string((X),(Y),809)
+#define get_csv_bool_pos809(X,Y) get_csv_bool((X),(Y),809)
+#define get_csv_int_pos809(X,Y) get_csv_int((X),(Y),809)
+#define get_csv_llong_pos809(X,Y) get_csv_llong((X),(Y),809)
+#define get_csv_float_pos809(X,Y) get_csv_float((X),(Y),809)
+#define get_csv_uint_pos810(X,Y) get_csv_uint((X),(Y),810)
+#define get_csv_ullong_pos810(X,Y) get_csv_ullong((X),(Y),810)
+#define get_csv_ip_pos810(X,Y) get_csv_ip((X),(Y),810)
+#define get_csv_ipv6_pos810(X,Y) get_csv_ipv6((X),(Y),810)
+#define get_csv_string_pos810(X,Y) get_csv_string((X),(Y),810)
+#define get_csv_v_str_pos810(X,Y) get_csv_string((X),(Y),810)
+#define get_csv_bool_pos810(X,Y) get_csv_bool((X),(Y),810)
+#define get_csv_int_pos810(X,Y) get_csv_int((X),(Y),810)
+#define get_csv_llong_pos810(X,Y) get_csv_llong((X),(Y),810)
+#define get_csv_float_pos810(X,Y) get_csv_float((X),(Y),810)
+#define get_csv_uint_pos811(X,Y) get_csv_uint((X),(Y),811)
+#define get_csv_ullong_pos811(X,Y) get_csv_ullong((X),(Y),811)
+#define get_csv_ip_pos811(X,Y) get_csv_ip((X),(Y),811)
+#define get_csv_ipv6_pos811(X,Y) get_csv_ipv6((X),(Y),811)
+#define get_csv_string_pos811(X,Y) get_csv_string((X),(Y),811)
+#define get_csv_v_str_pos811(X,Y) get_csv_string((X),(Y),811)
+#define get_csv_bool_pos811(X,Y) get_csv_bool((X),(Y),811)
+#define get_csv_int_pos811(X,Y) get_csv_int((X),(Y),811)
+#define get_csv_llong_pos811(X,Y) get_csv_llong((X),(Y),811)
+#define get_csv_float_pos811(X,Y) get_csv_float((X),(Y),811)
+#define get_csv_uint_pos812(X,Y) get_csv_uint((X),(Y),812)
+#define get_csv_ullong_pos812(X,Y) get_csv_ullong((X),(Y),812)
+#define get_csv_ip_pos812(X,Y) get_csv_ip((X),(Y),812)
+#define get_csv_ipv6_pos812(X,Y) get_csv_ipv6((X),(Y),812)
+#define get_csv_string_pos812(X,Y) get_csv_string((X),(Y),812)
+#define get_csv_v_str_pos812(X,Y) get_csv_string((X),(Y),812)
+#define get_csv_bool_pos812(X,Y) get_csv_bool((X),(Y),812)
+#define get_csv_int_pos812(X,Y) get_csv_int((X),(Y),812)
+#define get_csv_llong_pos812(X,Y) get_csv_llong((X),(Y),812)
+#define get_csv_float_pos812(X,Y) get_csv_float((X),(Y),812)
+#define get_csv_uint_pos813(X,Y) get_csv_uint((X),(Y),813)
+#define get_csv_ullong_pos813(X,Y) get_csv_ullong((X),(Y),813)
+#define get_csv_ip_pos813(X,Y) get_csv_ip((X),(Y),813)
+#define get_csv_ipv6_pos813(X,Y) get_csv_ipv6((X),(Y),813)
+#define get_csv_string_pos813(X,Y) get_csv_string((X),(Y),813)
+#define get_csv_v_str_pos813(X,Y) get_csv_string((X),(Y),813)
+#define get_csv_bool_pos813(X,Y) get_csv_bool((X),(Y),813)
+#define get_csv_int_pos813(X,Y) get_csv_int((X),(Y),813)
+#define get_csv_llong_pos813(X,Y) get_csv_llong((X),(Y),813)
+#define get_csv_float_pos813(X,Y) get_csv_float((X),(Y),813)
+#define get_csv_uint_pos814(X,Y) get_csv_uint((X),(Y),814)
+#define get_csv_ullong_pos814(X,Y) get_csv_ullong((X),(Y),814)
+#define get_csv_ip_pos814(X,Y) get_csv_ip((X),(Y),814)
+#define get_csv_ipv6_pos814(X,Y) get_csv_ipv6((X),(Y),814)
+#define get_csv_string_pos814(X,Y) get_csv_string((X),(Y),814)
+#define get_csv_v_str_pos814(X,Y) get_csv_string((X),(Y),814)
+#define get_csv_bool_pos814(X,Y) get_csv_bool((X),(Y),814)
+#define get_csv_int_pos814(X,Y) get_csv_int((X),(Y),814)
+#define get_csv_llong_pos814(X,Y) get_csv_llong((X),(Y),814)
+#define get_csv_float_pos814(X,Y) get_csv_float((X),(Y),814)
+#define get_csv_uint_pos815(X,Y) get_csv_uint((X),(Y),815)
+#define get_csv_ullong_pos815(X,Y) get_csv_ullong((X),(Y),815)
+#define get_csv_ip_pos815(X,Y) get_csv_ip((X),(Y),815)
+#define get_csv_ipv6_pos815(X,Y) get_csv_ipv6((X),(Y),815)
+#define get_csv_string_pos815(X,Y) get_csv_string((X),(Y),815)
+#define get_csv_v_str_pos815(X,Y) get_csv_string((X),(Y),815)
+#define get_csv_bool_pos815(X,Y) get_csv_bool((X),(Y),815)
+#define get_csv_int_pos815(X,Y) get_csv_int((X),(Y),815)
+#define get_csv_llong_pos815(X,Y) get_csv_llong((X),(Y),815)
+#define get_csv_float_pos815(X,Y) get_csv_float((X),(Y),815)
+#define get_csv_uint_pos816(X,Y) get_csv_uint((X),(Y),816)
+#define get_csv_ullong_pos816(X,Y) get_csv_ullong((X),(Y),816)
+#define get_csv_ip_pos816(X,Y) get_csv_ip((X),(Y),816)
+#define get_csv_ipv6_pos816(X,Y) get_csv_ipv6((X),(Y),816)
+#define get_csv_string_pos816(X,Y) get_csv_string((X),(Y),816)
+#define get_csv_v_str_pos816(X,Y) get_csv_string((X),(Y),816)
+#define get_csv_bool_pos816(X,Y) get_csv_bool((X),(Y),816)
+#define get_csv_int_pos816(X,Y) get_csv_int((X),(Y),816)
+#define get_csv_llong_pos816(X,Y) get_csv_llong((X),(Y),816)
+#define get_csv_float_pos816(X,Y) get_csv_float((X),(Y),816)
+#define get_csv_uint_pos817(X,Y) get_csv_uint((X),(Y),817)
+#define get_csv_ullong_pos817(X,Y) get_csv_ullong((X),(Y),817)
+#define get_csv_ip_pos817(X,Y) get_csv_ip((X),(Y),817)
+#define get_csv_ipv6_pos817(X,Y) get_csv_ipv6((X),(Y),817)
+#define get_csv_string_pos817(X,Y) get_csv_string((X),(Y),817)
+#define get_csv_v_str_pos817(X,Y) get_csv_string((X),(Y),817)
+#define get_csv_bool_pos817(X,Y) get_csv_bool((X),(Y),817)
+#define get_csv_int_pos817(X,Y) get_csv_int((X),(Y),817)
+#define get_csv_llong_pos817(X,Y) get_csv_llong((X),(Y),817)
+#define get_csv_float_pos817(X,Y) get_csv_float((X),(Y),817)
+#define get_csv_uint_pos818(X,Y) get_csv_uint((X),(Y),818)
+#define get_csv_ullong_pos818(X,Y) get_csv_ullong((X),(Y),818)
+#define get_csv_ip_pos818(X,Y) get_csv_ip((X),(Y),818)
+#define get_csv_ipv6_pos818(X,Y) get_csv_ipv6((X),(Y),818)
+#define get_csv_string_pos818(X,Y) get_csv_string((X),(Y),818)
+#define get_csv_v_str_pos818(X,Y) get_csv_string((X),(Y),818)
+#define get_csv_bool_pos818(X,Y) get_csv_bool((X),(Y),818)
+#define get_csv_int_pos818(X,Y) get_csv_int((X),(Y),818)
+#define get_csv_llong_pos818(X,Y) get_csv_llong((X),(Y),818)
+#define get_csv_float_pos818(X,Y) get_csv_float((X),(Y),818)
+#define get_csv_uint_pos819(X,Y) get_csv_uint((X),(Y),819)
+#define get_csv_ullong_pos819(X,Y) get_csv_ullong((X),(Y),819)
+#define get_csv_ip_pos819(X,Y) get_csv_ip((X),(Y),819)
+#define get_csv_ipv6_pos819(X,Y) get_csv_ipv6((X),(Y),819)
+#define get_csv_string_pos819(X,Y) get_csv_string((X),(Y),819)
+#define get_csv_v_str_pos819(X,Y) get_csv_string((X),(Y),819)
+#define get_csv_bool_pos819(X,Y) get_csv_bool((X),(Y),819)
+#define get_csv_int_pos819(X,Y) get_csv_int((X),(Y),819)
+#define get_csv_llong_pos819(X,Y) get_csv_llong((X),(Y),819)
+#define get_csv_float_pos819(X,Y) get_csv_float((X),(Y),819)
+#define get_csv_uint_pos820(X,Y) get_csv_uint((X),(Y),820)
+#define get_csv_ullong_pos820(X,Y) get_csv_ullong((X),(Y),820)
+#define get_csv_ip_pos820(X,Y) get_csv_ip((X),(Y),820)
+#define get_csv_ipv6_pos820(X,Y) get_csv_ipv6((X),(Y),820)
+#define get_csv_string_pos820(X,Y) get_csv_string((X),(Y),820)
+#define get_csv_v_str_pos820(X,Y) get_csv_string((X),(Y),820)
+#define get_csv_bool_pos820(X,Y) get_csv_bool((X),(Y),820)
+#define get_csv_int_pos820(X,Y) get_csv_int((X),(Y),820)
+#define get_csv_llong_pos820(X,Y) get_csv_llong((X),(Y),820)
+#define get_csv_float_pos820(X,Y) get_csv_float((X),(Y),820)
+#define get_csv_uint_pos821(X,Y) get_csv_uint((X),(Y),821)
+#define get_csv_ullong_pos821(X,Y) get_csv_ullong((X),(Y),821)
+#define get_csv_ip_pos821(X,Y) get_csv_ip((X),(Y),821)
+#define get_csv_ipv6_pos821(X,Y) get_csv_ipv6((X),(Y),821)
+#define get_csv_string_pos821(X,Y) get_csv_string((X),(Y),821)
+#define get_csv_v_str_pos821(X,Y) get_csv_string((X),(Y),821)
+#define get_csv_bool_pos821(X,Y) get_csv_bool((X),(Y),821)
+#define get_csv_int_pos821(X,Y) get_csv_int((X),(Y),821)
+#define get_csv_llong_pos821(X,Y) get_csv_llong((X),(Y),821)
+#define get_csv_float_pos821(X,Y) get_csv_float((X),(Y),821)
+#define get_csv_uint_pos822(X,Y) get_csv_uint((X),(Y),822)
+#define get_csv_ullong_pos822(X,Y) get_csv_ullong((X),(Y),822)
+#define get_csv_ip_pos822(X,Y) get_csv_ip((X),(Y),822)
+#define get_csv_ipv6_pos822(X,Y) get_csv_ipv6((X),(Y),822)
+#define get_csv_string_pos822(X,Y) get_csv_string((X),(Y),822)
+#define get_csv_v_str_pos822(X,Y) get_csv_string((X),(Y),822)
+#define get_csv_bool_pos822(X,Y) get_csv_bool((X),(Y),822)
+#define get_csv_int_pos822(X,Y) get_csv_int((X),(Y),822)
+#define get_csv_llong_pos822(X,Y) get_csv_llong((X),(Y),822)
+#define get_csv_float_pos822(X,Y) get_csv_float((X),(Y),822)
+#define get_csv_uint_pos823(X,Y) get_csv_uint((X),(Y),823)
+#define get_csv_ullong_pos823(X,Y) get_csv_ullong((X),(Y),823)
+#define get_csv_ip_pos823(X,Y) get_csv_ip((X),(Y),823)
+#define get_csv_ipv6_pos823(X,Y) get_csv_ipv6((X),(Y),823)
+#define get_csv_string_pos823(X,Y) get_csv_string((X),(Y),823)
+#define get_csv_v_str_pos823(X,Y) get_csv_string((X),(Y),823)
+#define get_csv_bool_pos823(X,Y) get_csv_bool((X),(Y),823)
+#define get_csv_int_pos823(X,Y) get_csv_int((X),(Y),823)
+#define get_csv_llong_pos823(X,Y) get_csv_llong((X),(Y),823)
+#define get_csv_float_pos823(X,Y) get_csv_float((X),(Y),823)
+#define get_csv_uint_pos824(X,Y) get_csv_uint((X),(Y),824)
+#define get_csv_ullong_pos824(X,Y) get_csv_ullong((X),(Y),824)
+#define get_csv_ip_pos824(X,Y) get_csv_ip((X),(Y),824)
+#define get_csv_ipv6_pos824(X,Y) get_csv_ipv6((X),(Y),824)
+#define get_csv_string_pos824(X,Y) get_csv_string((X),(Y),824)
+#define get_csv_v_str_pos824(X,Y) get_csv_string((X),(Y),824)
+#define get_csv_bool_pos824(X,Y) get_csv_bool((X),(Y),824)
+#define get_csv_int_pos824(X,Y) get_csv_int((X),(Y),824)
+#define get_csv_llong_pos824(X,Y) get_csv_llong((X),(Y),824)
+#define get_csv_float_pos824(X,Y) get_csv_float((X),(Y),824)
+#define get_csv_uint_pos825(X,Y) get_csv_uint((X),(Y),825)
+#define get_csv_ullong_pos825(X,Y) get_csv_ullong((X),(Y),825)
+#define get_csv_ip_pos825(X,Y) get_csv_ip((X),(Y),825)
+#define get_csv_ipv6_pos825(X,Y) get_csv_ipv6((X),(Y),825)
+#define get_csv_string_pos825(X,Y) get_csv_string((X),(Y),825)
+#define get_csv_v_str_pos825(X,Y) get_csv_string((X),(Y),825)
+#define get_csv_bool_pos825(X,Y) get_csv_bool((X),(Y),825)
+#define get_csv_int_pos825(X,Y) get_csv_int((X),(Y),825)
+#define get_csv_llong_pos825(X,Y) get_csv_llong((X),(Y),825)
+#define get_csv_float_pos825(X,Y) get_csv_float((X),(Y),825)
+#define get_csv_uint_pos826(X,Y) get_csv_uint((X),(Y),826)
+#define get_csv_ullong_pos826(X,Y) get_csv_ullong((X),(Y),826)
+#define get_csv_ip_pos826(X,Y) get_csv_ip((X),(Y),826)
+#define get_csv_ipv6_pos826(X,Y) get_csv_ipv6((X),(Y),826)
+#define get_csv_string_pos826(X,Y) get_csv_string((X),(Y),826)
+#define get_csv_v_str_pos826(X,Y) get_csv_string((X),(Y),826)
+#define get_csv_bool_pos826(X,Y) get_csv_bool((X),(Y),826)
+#define get_csv_int_pos826(X,Y) get_csv_int((X),(Y),826)
+#define get_csv_llong_pos826(X,Y) get_csv_llong((X),(Y),826)
+#define get_csv_float_pos826(X,Y) get_csv_float((X),(Y),826)
+#define get_csv_uint_pos827(X,Y) get_csv_uint((X),(Y),827)
+#define get_csv_ullong_pos827(X,Y) get_csv_ullong((X),(Y),827)
+#define get_csv_ip_pos827(X,Y) get_csv_ip((X),(Y),827)
+#define get_csv_ipv6_pos827(X,Y) get_csv_ipv6((X),(Y),827)
+#define get_csv_string_pos827(X,Y) get_csv_string((X),(Y),827)
+#define get_csv_v_str_pos827(X,Y) get_csv_string((X),(Y),827)
+#define get_csv_bool_pos827(X,Y) get_csv_bool((X),(Y),827)
+#define get_csv_int_pos827(X,Y) get_csv_int((X),(Y),827)
+#define get_csv_llong_pos827(X,Y) get_csv_llong((X),(Y),827)
+#define get_csv_float_pos827(X,Y) get_csv_float((X),(Y),827)
+#define get_csv_uint_pos828(X,Y) get_csv_uint((X),(Y),828)
+#define get_csv_ullong_pos828(X,Y) get_csv_ullong((X),(Y),828)
+#define get_csv_ip_pos828(X,Y) get_csv_ip((X),(Y),828)
+#define get_csv_ipv6_pos828(X,Y) get_csv_ipv6((X),(Y),828)
+#define get_csv_string_pos828(X,Y) get_csv_string((X),(Y),828)
+#define get_csv_v_str_pos828(X,Y) get_csv_string((X),(Y),828)
+#define get_csv_bool_pos828(X,Y) get_csv_bool((X),(Y),828)
+#define get_csv_int_pos828(X,Y) get_csv_int((X),(Y),828)
+#define get_csv_llong_pos828(X,Y) get_csv_llong((X),(Y),828)
+#define get_csv_float_pos828(X,Y) get_csv_float((X),(Y),828)
+#define get_csv_uint_pos829(X,Y) get_csv_uint((X),(Y),829)
+#define get_csv_ullong_pos829(X,Y) get_csv_ullong((X),(Y),829)
+#define get_csv_ip_pos829(X,Y) get_csv_ip((X),(Y),829)
+#define get_csv_ipv6_pos829(X,Y) get_csv_ipv6((X),(Y),829)
+#define get_csv_string_pos829(X,Y) get_csv_string((X),(Y),829)
+#define get_csv_v_str_pos829(X,Y) get_csv_string((X),(Y),829)
+#define get_csv_bool_pos829(X,Y) get_csv_bool((X),(Y),829)
+#define get_csv_int_pos829(X,Y) get_csv_int((X),(Y),829)
+#define get_csv_llong_pos829(X,Y) get_csv_llong((X),(Y),829)
+#define get_csv_float_pos829(X,Y) get_csv_float((X),(Y),829)
+#define get_csv_uint_pos830(X,Y) get_csv_uint((X),(Y),830)
+#define get_csv_ullong_pos830(X,Y) get_csv_ullong((X),(Y),830)
+#define get_csv_ip_pos830(X,Y) get_csv_ip((X),(Y),830)
+#define get_csv_ipv6_pos830(X,Y) get_csv_ipv6((X),(Y),830)
+#define get_csv_string_pos830(X,Y) get_csv_string((X),(Y),830)
+#define get_csv_v_str_pos830(X,Y) get_csv_string((X),(Y),830)
+#define get_csv_bool_pos830(X,Y) get_csv_bool((X),(Y),830)
+#define get_csv_int_pos830(X,Y) get_csv_int((X),(Y),830)
+#define get_csv_llong_pos830(X,Y) get_csv_llong((X),(Y),830)
+#define get_csv_float_pos830(X,Y) get_csv_float((X),(Y),830)
+#define get_csv_uint_pos831(X,Y) get_csv_uint((X),(Y),831)
+#define get_csv_ullong_pos831(X,Y) get_csv_ullong((X),(Y),831)
+#define get_csv_ip_pos831(X,Y) get_csv_ip((X),(Y),831)
+#define get_csv_ipv6_pos831(X,Y) get_csv_ipv6((X),(Y),831)
+#define get_csv_string_pos831(X,Y) get_csv_string((X),(Y),831)
+#define get_csv_v_str_pos831(X,Y) get_csv_string((X),(Y),831)
+#define get_csv_bool_pos831(X,Y) get_csv_bool((X),(Y),831)
+#define get_csv_int_pos831(X,Y) get_csv_int((X),(Y),831)
+#define get_csv_llong_pos831(X,Y) get_csv_llong((X),(Y),831)
+#define get_csv_float_pos831(X,Y) get_csv_float((X),(Y),831)
+#define get_csv_uint_pos832(X,Y) get_csv_uint((X),(Y),832)
+#define get_csv_ullong_pos832(X,Y) get_csv_ullong((X),(Y),832)
+#define get_csv_ip_pos832(X,Y) get_csv_ip((X),(Y),832)
+#define get_csv_ipv6_pos832(X,Y) get_csv_ipv6((X),(Y),832)
+#define get_csv_string_pos832(X,Y) get_csv_string((X),(Y),832)
+#define get_csv_v_str_pos832(X,Y) get_csv_string((X),(Y),832)
+#define get_csv_bool_pos832(X,Y) get_csv_bool((X),(Y),832)
+#define get_csv_int_pos832(X,Y) get_csv_int((X),(Y),832)
+#define get_csv_llong_pos832(X,Y) get_csv_llong((X),(Y),832)
+#define get_csv_float_pos832(X,Y) get_csv_float((X),(Y),832)
+#define get_csv_uint_pos833(X,Y) get_csv_uint((X),(Y),833)
+#define get_csv_ullong_pos833(X,Y) get_csv_ullong((X),(Y),833)
+#define get_csv_ip_pos833(X,Y) get_csv_ip((X),(Y),833)
+#define get_csv_ipv6_pos833(X,Y) get_csv_ipv6((X),(Y),833)
+#define get_csv_string_pos833(X,Y) get_csv_string((X),(Y),833)
+#define get_csv_v_str_pos833(X,Y) get_csv_string((X),(Y),833)
+#define get_csv_bool_pos833(X,Y) get_csv_bool((X),(Y),833)
+#define get_csv_int_pos833(X,Y) get_csv_int((X),(Y),833)
+#define get_csv_llong_pos833(X,Y) get_csv_llong((X),(Y),833)
+#define get_csv_float_pos833(X,Y) get_csv_float((X),(Y),833)
+#define get_csv_uint_pos834(X,Y) get_csv_uint((X),(Y),834)
+#define get_csv_ullong_pos834(X,Y) get_csv_ullong((X),(Y),834)
+#define get_csv_ip_pos834(X,Y) get_csv_ip((X),(Y),834)
+#define get_csv_ipv6_pos834(X,Y) get_csv_ipv6((X),(Y),834)
+#define get_csv_string_pos834(X,Y) get_csv_string((X),(Y),834)
+#define get_csv_v_str_pos834(X,Y) get_csv_string((X),(Y),834)
+#define get_csv_bool_pos834(X,Y) get_csv_bool((X),(Y),834)
+#define get_csv_int_pos834(X,Y) get_csv_int((X),(Y),834)
+#define get_csv_llong_pos834(X,Y) get_csv_llong((X),(Y),834)
+#define get_csv_float_pos834(X,Y) get_csv_float((X),(Y),834)
+#define get_csv_uint_pos835(X,Y) get_csv_uint((X),(Y),835)
+#define get_csv_ullong_pos835(X,Y) get_csv_ullong((X),(Y),835)
+#define get_csv_ip_pos835(X,Y) get_csv_ip((X),(Y),835)
+#define get_csv_ipv6_pos835(X,Y) get_csv_ipv6((X),(Y),835)
+#define get_csv_string_pos835(X,Y) get_csv_string((X),(Y),835)
+#define get_csv_v_str_pos835(X,Y) get_csv_string((X),(Y),835)
+#define get_csv_bool_pos835(X,Y) get_csv_bool((X),(Y),835)
+#define get_csv_int_pos835(X,Y) get_csv_int((X),(Y),835)
+#define get_csv_llong_pos835(X,Y) get_csv_llong((X),(Y),835)
+#define get_csv_float_pos835(X,Y) get_csv_float((X),(Y),835)
+#define get_csv_uint_pos836(X,Y) get_csv_uint((X),(Y),836)
+#define get_csv_ullong_pos836(X,Y) get_csv_ullong((X),(Y),836)
+#define get_csv_ip_pos836(X,Y) get_csv_ip((X),(Y),836)
+#define get_csv_ipv6_pos836(X,Y) get_csv_ipv6((X),(Y),836)
+#define get_csv_string_pos836(X,Y) get_csv_string((X),(Y),836)
+#define get_csv_v_str_pos836(X,Y) get_csv_string((X),(Y),836)
+#define get_csv_bool_pos836(X,Y) get_csv_bool((X),(Y),836)
+#define get_csv_int_pos836(X,Y) get_csv_int((X),(Y),836)
+#define get_csv_llong_pos836(X,Y) get_csv_llong((X),(Y),836)
+#define get_csv_float_pos836(X,Y) get_csv_float((X),(Y),836)
+#define get_csv_uint_pos837(X,Y) get_csv_uint((X),(Y),837)
+#define get_csv_ullong_pos837(X,Y) get_csv_ullong((X),(Y),837)
+#define get_csv_ip_pos837(X,Y) get_csv_ip((X),(Y),837)
+#define get_csv_ipv6_pos837(X,Y) get_csv_ipv6((X),(Y),837)
+#define get_csv_string_pos837(X,Y) get_csv_string((X),(Y),837)
+#define get_csv_v_str_pos837(X,Y) get_csv_string((X),(Y),837)
+#define get_csv_bool_pos837(X,Y) get_csv_bool((X),(Y),837)
+#define get_csv_int_pos837(X,Y) get_csv_int((X),(Y),837)
+#define get_csv_llong_pos837(X,Y) get_csv_llong((X),(Y),837)
+#define get_csv_float_pos837(X,Y) get_csv_float((X),(Y),837)
+#define get_csv_uint_pos838(X,Y) get_csv_uint((X),(Y),838)
+#define get_csv_ullong_pos838(X,Y) get_csv_ullong((X),(Y),838)
+#define get_csv_ip_pos838(X,Y) get_csv_ip((X),(Y),838)
+#define get_csv_ipv6_pos838(X,Y) get_csv_ipv6((X),(Y),838)
+#define get_csv_string_pos838(X,Y) get_csv_string((X),(Y),838)
+#define get_csv_v_str_pos838(X,Y) get_csv_string((X),(Y),838)
+#define get_csv_bool_pos838(X,Y) get_csv_bool((X),(Y),838)
+#define get_csv_int_pos838(X,Y) get_csv_int((X),(Y),838)
+#define get_csv_llong_pos838(X,Y) get_csv_llong((X),(Y),838)
+#define get_csv_float_pos838(X,Y) get_csv_float((X),(Y),838)
+#define get_csv_uint_pos839(X,Y) get_csv_uint((X),(Y),839)
+#define get_csv_ullong_pos839(X,Y) get_csv_ullong((X),(Y),839)
+#define get_csv_ip_pos839(X,Y) get_csv_ip((X),(Y),839)
+#define get_csv_ipv6_pos839(X,Y) get_csv_ipv6((X),(Y),839)
+#define get_csv_string_pos839(X,Y) get_csv_string((X),(Y),839)
+#define get_csv_v_str_pos839(X,Y) get_csv_string((X),(Y),839)
+#define get_csv_bool_pos839(X,Y) get_csv_bool((X),(Y),839)
+#define get_csv_int_pos839(X,Y) get_csv_int((X),(Y),839)
+#define get_csv_llong_pos839(X,Y) get_csv_llong((X),(Y),839)
+#define get_csv_float_pos839(X,Y) get_csv_float((X),(Y),839)
+#define get_csv_uint_pos840(X,Y) get_csv_uint((X),(Y),840)
+#define get_csv_ullong_pos840(X,Y) get_csv_ullong((X),(Y),840)
+#define get_csv_ip_pos840(X,Y) get_csv_ip((X),(Y),840)
+#define get_csv_ipv6_pos840(X,Y) get_csv_ipv6((X),(Y),840)
+#define get_csv_string_pos840(X,Y) get_csv_string((X),(Y),840)
+#define get_csv_v_str_pos840(X,Y) get_csv_string((X),(Y),840)
+#define get_csv_bool_pos840(X,Y) get_csv_bool((X),(Y),840)
+#define get_csv_int_pos840(X,Y) get_csv_int((X),(Y),840)
+#define get_csv_llong_pos840(X,Y) get_csv_llong((X),(Y),840)
+#define get_csv_float_pos840(X,Y) get_csv_float((X),(Y),840)
+#define get_csv_uint_pos841(X,Y) get_csv_uint((X),(Y),841)
+#define get_csv_ullong_pos841(X,Y) get_csv_ullong((X),(Y),841)
+#define get_csv_ip_pos841(X,Y) get_csv_ip((X),(Y),841)
+#define get_csv_ipv6_pos841(X,Y) get_csv_ipv6((X),(Y),841)
+#define get_csv_string_pos841(X,Y) get_csv_string((X),(Y),841)
+#define get_csv_v_str_pos841(X,Y) get_csv_string((X),(Y),841)
+#define get_csv_bool_pos841(X,Y) get_csv_bool((X),(Y),841)
+#define get_csv_int_pos841(X,Y) get_csv_int((X),(Y),841)
+#define get_csv_llong_pos841(X,Y) get_csv_llong((X),(Y),841)
+#define get_csv_float_pos841(X,Y) get_csv_float((X),(Y),841)
+#define get_csv_uint_pos842(X,Y) get_csv_uint((X),(Y),842)
+#define get_csv_ullong_pos842(X,Y) get_csv_ullong((X),(Y),842)
+#define get_csv_ip_pos842(X,Y) get_csv_ip((X),(Y),842)
+#define get_csv_ipv6_pos842(X,Y) get_csv_ipv6((X),(Y),842)
+#define get_csv_string_pos842(X,Y) get_csv_string((X),(Y),842)
+#define get_csv_v_str_pos842(X,Y) get_csv_string((X),(Y),842)
+#define get_csv_bool_pos842(X,Y) get_csv_bool((X),(Y),842)
+#define get_csv_int_pos842(X,Y) get_csv_int((X),(Y),842)
+#define get_csv_llong_pos842(X,Y) get_csv_llong((X),(Y),842)
+#define get_csv_float_pos842(X,Y) get_csv_float((X),(Y),842)
+#define get_csv_uint_pos843(X,Y) get_csv_uint((X),(Y),843)
+#define get_csv_ullong_pos843(X,Y) get_csv_ullong((X),(Y),843)
+#define get_csv_ip_pos843(X,Y) get_csv_ip((X),(Y),843)
+#define get_csv_ipv6_pos843(X,Y) get_csv_ipv6((X),(Y),843)
+#define get_csv_string_pos843(X,Y) get_csv_string((X),(Y),843)
+#define get_csv_v_str_pos843(X,Y) get_csv_string((X),(Y),843)
+#define get_csv_bool_pos843(X,Y) get_csv_bool((X),(Y),843)
+#define get_csv_int_pos843(X,Y) get_csv_int((X),(Y),843)
+#define get_csv_llong_pos843(X,Y) get_csv_llong((X),(Y),843)
+#define get_csv_float_pos843(X,Y) get_csv_float((X),(Y),843)
+#define get_csv_uint_pos844(X,Y) get_csv_uint((X),(Y),844)
+#define get_csv_ullong_pos844(X,Y) get_csv_ullong((X),(Y),844)
+#define get_csv_ip_pos844(X,Y) get_csv_ip((X),(Y),844)
+#define get_csv_ipv6_pos844(X,Y) get_csv_ipv6((X),(Y),844)
+#define get_csv_string_pos844(X,Y) get_csv_string((X),(Y),844)
+#define get_csv_v_str_pos844(X,Y) get_csv_string((X),(Y),844)
+#define get_csv_bool_pos844(X,Y) get_csv_bool((X),(Y),844)
+#define get_csv_int_pos844(X,Y) get_csv_int((X),(Y),844)
+#define get_csv_llong_pos844(X,Y) get_csv_llong((X),(Y),844)
+#define get_csv_float_pos844(X,Y) get_csv_float((X),(Y),844)
+#define get_csv_uint_pos845(X,Y) get_csv_uint((X),(Y),845)
+#define get_csv_ullong_pos845(X,Y) get_csv_ullong((X),(Y),845)
+#define get_csv_ip_pos845(X,Y) get_csv_ip((X),(Y),845)
+#define get_csv_ipv6_pos845(X,Y) get_csv_ipv6((X),(Y),845)
+#define get_csv_string_pos845(X,Y) get_csv_string((X),(Y),845)
+#define get_csv_v_str_pos845(X,Y) get_csv_string((X),(Y),845)
+#define get_csv_bool_pos845(X,Y) get_csv_bool((X),(Y),845)
+#define get_csv_int_pos845(X,Y) get_csv_int((X),(Y),845)
+#define get_csv_llong_pos845(X,Y) get_csv_llong((X),(Y),845)
+#define get_csv_float_pos845(X,Y) get_csv_float((X),(Y),845)
+#define get_csv_uint_pos846(X,Y) get_csv_uint((X),(Y),846)
+#define get_csv_ullong_pos846(X,Y) get_csv_ullong((X),(Y),846)
+#define get_csv_ip_pos846(X,Y) get_csv_ip((X),(Y),846)
+#define get_csv_ipv6_pos846(X,Y) get_csv_ipv6((X),(Y),846)
+#define get_csv_string_pos846(X,Y) get_csv_string((X),(Y),846)
+#define get_csv_v_str_pos846(X,Y) get_csv_string((X),(Y),846)
+#define get_csv_bool_pos846(X,Y) get_csv_bool((X),(Y),846)
+#define get_csv_int_pos846(X,Y) get_csv_int((X),(Y),846)
+#define get_csv_llong_pos846(X,Y) get_csv_llong((X),(Y),846)
+#define get_csv_float_pos846(X,Y) get_csv_float((X),(Y),846)
+#define get_csv_uint_pos847(X,Y) get_csv_uint((X),(Y),847)
+#define get_csv_ullong_pos847(X,Y) get_csv_ullong((X),(Y),847)
+#define get_csv_ip_pos847(X,Y) get_csv_ip((X),(Y),847)
+#define get_csv_ipv6_pos847(X,Y) get_csv_ipv6((X),(Y),847)
+#define get_csv_string_pos847(X,Y) get_csv_string((X),(Y),847)
+#define get_csv_v_str_pos847(X,Y) get_csv_string((X),(Y),847)
+#define get_csv_bool_pos847(X,Y) get_csv_bool((X),(Y),847)
+#define get_csv_int_pos847(X,Y) get_csv_int((X),(Y),847)
+#define get_csv_llong_pos847(X,Y) get_csv_llong((X),(Y),847)
+#define get_csv_float_pos847(X,Y) get_csv_float((X),(Y),847)
+#define get_csv_uint_pos848(X,Y) get_csv_uint((X),(Y),848)
+#define get_csv_ullong_pos848(X,Y) get_csv_ullong((X),(Y),848)
+#define get_csv_ip_pos848(X,Y) get_csv_ip((X),(Y),848)
+#define get_csv_ipv6_pos848(X,Y) get_csv_ipv6((X),(Y),848)
+#define get_csv_string_pos848(X,Y) get_csv_string((X),(Y),848)
+#define get_csv_v_str_pos848(X,Y) get_csv_string((X),(Y),848)
+#define get_csv_bool_pos848(X,Y) get_csv_bool((X),(Y),848)
+#define get_csv_int_pos848(X,Y) get_csv_int((X),(Y),848)
+#define get_csv_llong_pos848(X,Y) get_csv_llong((X),(Y),848)
+#define get_csv_float_pos848(X,Y) get_csv_float((X),(Y),848)
+#define get_csv_uint_pos849(X,Y) get_csv_uint((X),(Y),849)
+#define get_csv_ullong_pos849(X,Y) get_csv_ullong((X),(Y),849)
+#define get_csv_ip_pos849(X,Y) get_csv_ip((X),(Y),849)
+#define get_csv_ipv6_pos849(X,Y) get_csv_ipv6((X),(Y),849)
+#define get_csv_string_pos849(X,Y) get_csv_string((X),(Y),849)
+#define get_csv_v_str_pos849(X,Y) get_csv_string((X),(Y),849)
+#define get_csv_bool_pos849(X,Y) get_csv_bool((X),(Y),849)
+#define get_csv_int_pos849(X,Y) get_csv_int((X),(Y),849)
+#define get_csv_llong_pos849(X,Y) get_csv_llong((X),(Y),849)
+#define get_csv_float_pos849(X,Y) get_csv_float((X),(Y),849)
+#define get_csv_uint_pos850(X,Y) get_csv_uint((X),(Y),850)
+#define get_csv_ullong_pos850(X,Y) get_csv_ullong((X),(Y),850)
+#define get_csv_ip_pos850(X,Y) get_csv_ip((X),(Y),850)
+#define get_csv_ipv6_pos850(X,Y) get_csv_ipv6((X),(Y),850)
+#define get_csv_string_pos850(X,Y) get_csv_string((X),(Y),850)
+#define get_csv_v_str_pos850(X,Y) get_csv_string((X),(Y),850)
+#define get_csv_bool_pos850(X,Y) get_csv_bool((X),(Y),850)
+#define get_csv_int_pos850(X,Y) get_csv_int((X),(Y),850)
+#define get_csv_llong_pos850(X,Y) get_csv_llong((X),(Y),850)
+#define get_csv_float_pos850(X,Y) get_csv_float((X),(Y),850)
+#define get_csv_uint_pos851(X,Y) get_csv_uint((X),(Y),851)
+#define get_csv_ullong_pos851(X,Y) get_csv_ullong((X),(Y),851)
+#define get_csv_ip_pos851(X,Y) get_csv_ip((X),(Y),851)
+#define get_csv_ipv6_pos851(X,Y) get_csv_ipv6((X),(Y),851)
+#define get_csv_string_pos851(X,Y) get_csv_string((X),(Y),851)
+#define get_csv_v_str_pos851(X,Y) get_csv_string((X),(Y),851)
+#define get_csv_bool_pos851(X,Y) get_csv_bool((X),(Y),851)
+#define get_csv_int_pos851(X,Y) get_csv_int((X),(Y),851)
+#define get_csv_llong_pos851(X,Y) get_csv_llong((X),(Y),851)
+#define get_csv_float_pos851(X,Y) get_csv_float((X),(Y),851)
+#define get_csv_uint_pos852(X,Y) get_csv_uint((X),(Y),852)
+#define get_csv_ullong_pos852(X,Y) get_csv_ullong((X),(Y),852)
+#define get_csv_ip_pos852(X,Y) get_csv_ip((X),(Y),852)
+#define get_csv_ipv6_pos852(X,Y) get_csv_ipv6((X),(Y),852)
+#define get_csv_string_pos852(X,Y) get_csv_string((X),(Y),852)
+#define get_csv_v_str_pos852(X,Y) get_csv_string((X),(Y),852)
+#define get_csv_bool_pos852(X,Y) get_csv_bool((X),(Y),852)
+#define get_csv_int_pos852(X,Y) get_csv_int((X),(Y),852)
+#define get_csv_llong_pos852(X,Y) get_csv_llong((X),(Y),852)
+#define get_csv_float_pos852(X,Y) get_csv_float((X),(Y),852)
+#define get_csv_uint_pos853(X,Y) get_csv_uint((X),(Y),853)
+#define get_csv_ullong_pos853(X,Y) get_csv_ullong((X),(Y),853)
+#define get_csv_ip_pos853(X,Y) get_csv_ip((X),(Y),853)
+#define get_csv_ipv6_pos853(X,Y) get_csv_ipv6((X),(Y),853)
+#define get_csv_string_pos853(X,Y) get_csv_string((X),(Y),853)
+#define get_csv_v_str_pos853(X,Y) get_csv_string((X),(Y),853)
+#define get_csv_bool_pos853(X,Y) get_csv_bool((X),(Y),853)
+#define get_csv_int_pos853(X,Y) get_csv_int((X),(Y),853)
+#define get_csv_llong_pos853(X,Y) get_csv_llong((X),(Y),853)
+#define get_csv_float_pos853(X,Y) get_csv_float((X),(Y),853)
+#define get_csv_uint_pos854(X,Y) get_csv_uint((X),(Y),854)
+#define get_csv_ullong_pos854(X,Y) get_csv_ullong((X),(Y),854)
+#define get_csv_ip_pos854(X,Y) get_csv_ip((X),(Y),854)
+#define get_csv_ipv6_pos854(X,Y) get_csv_ipv6((X),(Y),854)
+#define get_csv_string_pos854(X,Y) get_csv_string((X),(Y),854)
+#define get_csv_v_str_pos854(X,Y) get_csv_string((X),(Y),854)
+#define get_csv_bool_pos854(X,Y) get_csv_bool((X),(Y),854)
+#define get_csv_int_pos854(X,Y) get_csv_int((X),(Y),854)
+#define get_csv_llong_pos854(X,Y) get_csv_llong((X),(Y),854)
+#define get_csv_float_pos854(X,Y) get_csv_float((X),(Y),854)
+#define get_csv_uint_pos855(X,Y) get_csv_uint((X),(Y),855)
+#define get_csv_ullong_pos855(X,Y) get_csv_ullong((X),(Y),855)
+#define get_csv_ip_pos855(X,Y) get_csv_ip((X),(Y),855)
+#define get_csv_ipv6_pos855(X,Y) get_csv_ipv6((X),(Y),855)
+#define get_csv_string_pos855(X,Y) get_csv_string((X),(Y),855)
+#define get_csv_v_str_pos855(X,Y) get_csv_string((X),(Y),855)
+#define get_csv_bool_pos855(X,Y) get_csv_bool((X),(Y),855)
+#define get_csv_int_pos855(X,Y) get_csv_int((X),(Y),855)
+#define get_csv_llong_pos855(X,Y) get_csv_llong((X),(Y),855)
+#define get_csv_float_pos855(X,Y) get_csv_float((X),(Y),855)
+#define get_csv_uint_pos856(X,Y) get_csv_uint((X),(Y),856)
+#define get_csv_ullong_pos856(X,Y) get_csv_ullong((X),(Y),856)
+#define get_csv_ip_pos856(X,Y) get_csv_ip((X),(Y),856)
+#define get_csv_ipv6_pos856(X,Y) get_csv_ipv6((X),(Y),856)
+#define get_csv_string_pos856(X,Y) get_csv_string((X),(Y),856)
+#define get_csv_v_str_pos856(X,Y) get_csv_string((X),(Y),856)
+#define get_csv_bool_pos856(X,Y) get_csv_bool((X),(Y),856)
+#define get_csv_int_pos856(X,Y) get_csv_int((X),(Y),856)
+#define get_csv_llong_pos856(X,Y) get_csv_llong((X),(Y),856)
+#define get_csv_float_pos856(X,Y) get_csv_float((X),(Y),856)
+#define get_csv_uint_pos857(X,Y) get_csv_uint((X),(Y),857)
+#define get_csv_ullong_pos857(X,Y) get_csv_ullong((X),(Y),857)
+#define get_csv_ip_pos857(X,Y) get_csv_ip((X),(Y),857)
+#define get_csv_ipv6_pos857(X,Y) get_csv_ipv6((X),(Y),857)
+#define get_csv_string_pos857(X,Y) get_csv_string((X),(Y),857)
+#define get_csv_v_str_pos857(X,Y) get_csv_string((X),(Y),857)
+#define get_csv_bool_pos857(X,Y) get_csv_bool((X),(Y),857)
+#define get_csv_int_pos857(X,Y) get_csv_int((X),(Y),857)
+#define get_csv_llong_pos857(X,Y) get_csv_llong((X),(Y),857)
+#define get_csv_float_pos857(X,Y) get_csv_float((X),(Y),857)
+#define get_csv_uint_pos858(X,Y) get_csv_uint((X),(Y),858)
+#define get_csv_ullong_pos858(X,Y) get_csv_ullong((X),(Y),858)
+#define get_csv_ip_pos858(X,Y) get_csv_ip((X),(Y),858)
+#define get_csv_ipv6_pos858(X,Y) get_csv_ipv6((X),(Y),858)
+#define get_csv_string_pos858(X,Y) get_csv_string((X),(Y),858)
+#define get_csv_v_str_pos858(X,Y) get_csv_string((X),(Y),858)
+#define get_csv_bool_pos858(X,Y) get_csv_bool((X),(Y),858)
+#define get_csv_int_pos858(X,Y) get_csv_int((X),(Y),858)
+#define get_csv_llong_pos858(X,Y) get_csv_llong((X),(Y),858)
+#define get_csv_float_pos858(X,Y) get_csv_float((X),(Y),858)
+#define get_csv_uint_pos859(X,Y) get_csv_uint((X),(Y),859)
+#define get_csv_ullong_pos859(X,Y) get_csv_ullong((X),(Y),859)
+#define get_csv_ip_pos859(X,Y) get_csv_ip((X),(Y),859)
+#define get_csv_ipv6_pos859(X,Y) get_csv_ipv6((X),(Y),859)
+#define get_csv_string_pos859(X,Y) get_csv_string((X),(Y),859)
+#define get_csv_v_str_pos859(X,Y) get_csv_string((X),(Y),859)
+#define get_csv_bool_pos859(X,Y) get_csv_bool((X),(Y),859)
+#define get_csv_int_pos859(X,Y) get_csv_int((X),(Y),859)
+#define get_csv_llong_pos859(X,Y) get_csv_llong((X),(Y),859)
+#define get_csv_float_pos859(X,Y) get_csv_float((X),(Y),859)
+#define get_csv_uint_pos860(X,Y) get_csv_uint((X),(Y),860)
+#define get_csv_ullong_pos860(X,Y) get_csv_ullong((X),(Y),860)
+#define get_csv_ip_pos860(X,Y) get_csv_ip((X),(Y),860)
+#define get_csv_ipv6_pos860(X,Y) get_csv_ipv6((X),(Y),860)
+#define get_csv_string_pos860(X,Y) get_csv_string((X),(Y),860)
+#define get_csv_v_str_pos860(X,Y) get_csv_string((X),(Y),860)
+#define get_csv_bool_pos860(X,Y) get_csv_bool((X),(Y),860)
+#define get_csv_int_pos860(X,Y) get_csv_int((X),(Y),860)
+#define get_csv_llong_pos860(X,Y) get_csv_llong((X),(Y),860)
+#define get_csv_float_pos860(X,Y) get_csv_float((X),(Y),860)
+#define get_csv_uint_pos861(X,Y) get_csv_uint((X),(Y),861)
+#define get_csv_ullong_pos861(X,Y) get_csv_ullong((X),(Y),861)
+#define get_csv_ip_pos861(X,Y) get_csv_ip((X),(Y),861)
+#define get_csv_ipv6_pos861(X,Y) get_csv_ipv6((X),(Y),861)
+#define get_csv_string_pos861(X,Y) get_csv_string((X),(Y),861)
+#define get_csv_v_str_pos861(X,Y) get_csv_string((X),(Y),861)
+#define get_csv_bool_pos861(X,Y) get_csv_bool((X),(Y),861)
+#define get_csv_int_pos861(X,Y) get_csv_int((X),(Y),861)
+#define get_csv_llong_pos861(X,Y) get_csv_llong((X),(Y),861)
+#define get_csv_float_pos861(X,Y) get_csv_float((X),(Y),861)
+#define get_csv_uint_pos862(X,Y) get_csv_uint((X),(Y),862)
+#define get_csv_ullong_pos862(X,Y) get_csv_ullong((X),(Y),862)
+#define get_csv_ip_pos862(X,Y) get_csv_ip((X),(Y),862)
+#define get_csv_ipv6_pos862(X,Y) get_csv_ipv6((X),(Y),862)
+#define get_csv_string_pos862(X,Y) get_csv_string((X),(Y),862)
+#define get_csv_v_str_pos862(X,Y) get_csv_string((X),(Y),862)
+#define get_csv_bool_pos862(X,Y) get_csv_bool((X),(Y),862)
+#define get_csv_int_pos862(X,Y) get_csv_int((X),(Y),862)
+#define get_csv_llong_pos862(X,Y) get_csv_llong((X),(Y),862)
+#define get_csv_float_pos862(X,Y) get_csv_float((X),(Y),862)
+#define get_csv_uint_pos863(X,Y) get_csv_uint((X),(Y),863)
+#define get_csv_ullong_pos863(X,Y) get_csv_ullong((X),(Y),863)
+#define get_csv_ip_pos863(X,Y) get_csv_ip((X),(Y),863)
+#define get_csv_ipv6_pos863(X,Y) get_csv_ipv6((X),(Y),863)
+#define get_csv_string_pos863(X,Y) get_csv_string((X),(Y),863)
+#define get_csv_v_str_pos863(X,Y) get_csv_string((X),(Y),863)
+#define get_csv_bool_pos863(X,Y) get_csv_bool((X),(Y),863)
+#define get_csv_int_pos863(X,Y) get_csv_int((X),(Y),863)
+#define get_csv_llong_pos863(X,Y) get_csv_llong((X),(Y),863)
+#define get_csv_float_pos863(X,Y) get_csv_float((X),(Y),863)
+#define get_csv_uint_pos864(X,Y) get_csv_uint((X),(Y),864)
+#define get_csv_ullong_pos864(X,Y) get_csv_ullong((X),(Y),864)
+#define get_csv_ip_pos864(X,Y) get_csv_ip((X),(Y),864)
+#define get_csv_ipv6_pos864(X,Y) get_csv_ipv6((X),(Y),864)
+#define get_csv_string_pos864(X,Y) get_csv_string((X),(Y),864)
+#define get_csv_v_str_pos864(X,Y) get_csv_string((X),(Y),864)
+#define get_csv_bool_pos864(X,Y) get_csv_bool((X),(Y),864)
+#define get_csv_int_pos864(X,Y) get_csv_int((X),(Y),864)
+#define get_csv_llong_pos864(X,Y) get_csv_llong((X),(Y),864)
+#define get_csv_float_pos864(X,Y) get_csv_float((X),(Y),864)
+#define get_csv_uint_pos865(X,Y) get_csv_uint((X),(Y),865)
+#define get_csv_ullong_pos865(X,Y) get_csv_ullong((X),(Y),865)
+#define get_csv_ip_pos865(X,Y) get_csv_ip((X),(Y),865)
+#define get_csv_ipv6_pos865(X,Y) get_csv_ipv6((X),(Y),865)
+#define get_csv_string_pos865(X,Y) get_csv_string((X),(Y),865)
+#define get_csv_v_str_pos865(X,Y) get_csv_string((X),(Y),865)
+#define get_csv_bool_pos865(X,Y) get_csv_bool((X),(Y),865)
+#define get_csv_int_pos865(X,Y) get_csv_int((X),(Y),865)
+#define get_csv_llong_pos865(X,Y) get_csv_llong((X),(Y),865)
+#define get_csv_float_pos865(X,Y) get_csv_float((X),(Y),865)
+#define get_csv_uint_pos866(X,Y) get_csv_uint((X),(Y),866)
+#define get_csv_ullong_pos866(X,Y) get_csv_ullong((X),(Y),866)
+#define get_csv_ip_pos866(X,Y) get_csv_ip((X),(Y),866)
+#define get_csv_ipv6_pos866(X,Y) get_csv_ipv6((X),(Y),866)
+#define get_csv_string_pos866(X,Y) get_csv_string((X),(Y),866)
+#define get_csv_v_str_pos866(X,Y) get_csv_string((X),(Y),866)
+#define get_csv_bool_pos866(X,Y) get_csv_bool((X),(Y),866)
+#define get_csv_int_pos866(X,Y) get_csv_int((X),(Y),866)
+#define get_csv_llong_pos866(X,Y) get_csv_llong((X),(Y),866)
+#define get_csv_float_pos866(X,Y) get_csv_float((X),(Y),866)
+#define get_csv_uint_pos867(X,Y) get_csv_uint((X),(Y),867)
+#define get_csv_ullong_pos867(X,Y) get_csv_ullong((X),(Y),867)
+#define get_csv_ip_pos867(X,Y) get_csv_ip((X),(Y),867)
+#define get_csv_ipv6_pos867(X,Y) get_csv_ipv6((X),(Y),867)
+#define get_csv_string_pos867(X,Y) get_csv_string((X),(Y),867)
+#define get_csv_v_str_pos867(X,Y) get_csv_string((X),(Y),867)
+#define get_csv_bool_pos867(X,Y) get_csv_bool((X),(Y),867)
+#define get_csv_int_pos867(X,Y) get_csv_int((X),(Y),867)
+#define get_csv_llong_pos867(X,Y) get_csv_llong((X),(Y),867)
+#define get_csv_float_pos867(X,Y) get_csv_float((X),(Y),867)
+#define get_csv_uint_pos868(X,Y) get_csv_uint((X),(Y),868)
+#define get_csv_ullong_pos868(X,Y) get_csv_ullong((X),(Y),868)
+#define get_csv_ip_pos868(X,Y) get_csv_ip((X),(Y),868)
+#define get_csv_ipv6_pos868(X,Y) get_csv_ipv6((X),(Y),868)
+#define get_csv_string_pos868(X,Y) get_csv_string((X),(Y),868)
+#define get_csv_v_str_pos868(X,Y) get_csv_string((X),(Y),868)
+#define get_csv_bool_pos868(X,Y) get_csv_bool((X),(Y),868)
+#define get_csv_int_pos868(X,Y) get_csv_int((X),(Y),868)
+#define get_csv_llong_pos868(X,Y) get_csv_llong((X),(Y),868)
+#define get_csv_float_pos868(X,Y) get_csv_float((X),(Y),868)
+#define get_csv_uint_pos869(X,Y) get_csv_uint((X),(Y),869)
+#define get_csv_ullong_pos869(X,Y) get_csv_ullong((X),(Y),869)
+#define get_csv_ip_pos869(X,Y) get_csv_ip((X),(Y),869)
+#define get_csv_ipv6_pos869(X,Y) get_csv_ipv6((X),(Y),869)
+#define get_csv_string_pos869(X,Y) get_csv_string((X),(Y),869)
+#define get_csv_v_str_pos869(X,Y) get_csv_string((X),(Y),869)
+#define get_csv_bool_pos869(X,Y) get_csv_bool((X),(Y),869)
+#define get_csv_int_pos869(X,Y) get_csv_int((X),(Y),869)
+#define get_csv_llong_pos869(X,Y) get_csv_llong((X),(Y),869)
+#define get_csv_float_pos869(X,Y) get_csv_float((X),(Y),869)
+#define get_csv_uint_pos870(X,Y) get_csv_uint((X),(Y),870)
+#define get_csv_ullong_pos870(X,Y) get_csv_ullong((X),(Y),870)
+#define get_csv_ip_pos870(X,Y) get_csv_ip((X),(Y),870)
+#define get_csv_ipv6_pos870(X,Y) get_csv_ipv6((X),(Y),870)
+#define get_csv_string_pos870(X,Y) get_csv_string((X),(Y),870)
+#define get_csv_v_str_pos870(X,Y) get_csv_string((X),(Y),870)
+#define get_csv_bool_pos870(X,Y) get_csv_bool((X),(Y),870)
+#define get_csv_int_pos870(X,Y) get_csv_int((X),(Y),870)
+#define get_csv_llong_pos870(X,Y) get_csv_llong((X),(Y),870)
+#define get_csv_float_pos870(X,Y) get_csv_float((X),(Y),870)
+#define get_csv_uint_pos871(X,Y) get_csv_uint((X),(Y),871)
+#define get_csv_ullong_pos871(X,Y) get_csv_ullong((X),(Y),871)
+#define get_csv_ip_pos871(X,Y) get_csv_ip((X),(Y),871)
+#define get_csv_ipv6_pos871(X,Y) get_csv_ipv6((X),(Y),871)
+#define get_csv_string_pos871(X,Y) get_csv_string((X),(Y),871)
+#define get_csv_v_str_pos871(X,Y) get_csv_string((X),(Y),871)
+#define get_csv_bool_pos871(X,Y) get_csv_bool((X),(Y),871)
+#define get_csv_int_pos871(X,Y) get_csv_int((X),(Y),871)
+#define get_csv_llong_pos871(X,Y) get_csv_llong((X),(Y),871)
+#define get_csv_float_pos871(X,Y) get_csv_float((X),(Y),871)
+#define get_csv_uint_pos872(X,Y) get_csv_uint((X),(Y),872)
+#define get_csv_ullong_pos872(X,Y) get_csv_ullong((X),(Y),872)
+#define get_csv_ip_pos872(X,Y) get_csv_ip((X),(Y),872)
+#define get_csv_ipv6_pos872(X,Y) get_csv_ipv6((X),(Y),872)
+#define get_csv_string_pos872(X,Y) get_csv_string((X),(Y),872)
+#define get_csv_v_str_pos872(X,Y) get_csv_string((X),(Y),872)
+#define get_csv_bool_pos872(X,Y) get_csv_bool((X),(Y),872)
+#define get_csv_int_pos872(X,Y) get_csv_int((X),(Y),872)
+#define get_csv_llong_pos872(X,Y) get_csv_llong((X),(Y),872)
+#define get_csv_float_pos872(X,Y) get_csv_float((X),(Y),872)
+#define get_csv_uint_pos873(X,Y) get_csv_uint((X),(Y),873)
+#define get_csv_ullong_pos873(X,Y) get_csv_ullong((X),(Y),873)
+#define get_csv_ip_pos873(X,Y) get_csv_ip((X),(Y),873)
+#define get_csv_ipv6_pos873(X,Y) get_csv_ipv6((X),(Y),873)
+#define get_csv_string_pos873(X,Y) get_csv_string((X),(Y),873)
+#define get_csv_v_str_pos873(X,Y) get_csv_string((X),(Y),873)
+#define get_csv_bool_pos873(X,Y) get_csv_bool((X),(Y),873)
+#define get_csv_int_pos873(X,Y) get_csv_int((X),(Y),873)
+#define get_csv_llong_pos873(X,Y) get_csv_llong((X),(Y),873)
+#define get_csv_float_pos873(X,Y) get_csv_float((X),(Y),873)
+#define get_csv_uint_pos874(X,Y) get_csv_uint((X),(Y),874)
+#define get_csv_ullong_pos874(X,Y) get_csv_ullong((X),(Y),874)
+#define get_csv_ip_pos874(X,Y) get_csv_ip((X),(Y),874)
+#define get_csv_ipv6_pos874(X,Y) get_csv_ipv6((X),(Y),874)
+#define get_csv_string_pos874(X,Y) get_csv_string((X),(Y),874)
+#define get_csv_v_str_pos874(X,Y) get_csv_string((X),(Y),874)
+#define get_csv_bool_pos874(X,Y) get_csv_bool((X),(Y),874)
+#define get_csv_int_pos874(X,Y) get_csv_int((X),(Y),874)
+#define get_csv_llong_pos874(X,Y) get_csv_llong((X),(Y),874)
+#define get_csv_float_pos874(X,Y) get_csv_float((X),(Y),874)
+#define get_csv_uint_pos875(X,Y) get_csv_uint((X),(Y),875)
+#define get_csv_ullong_pos875(X,Y) get_csv_ullong((X),(Y),875)
+#define get_csv_ip_pos875(X,Y) get_csv_ip((X),(Y),875)
+#define get_csv_ipv6_pos875(X,Y) get_csv_ipv6((X),(Y),875)
+#define get_csv_string_pos875(X,Y) get_csv_string((X),(Y),875)
+#define get_csv_v_str_pos875(X,Y) get_csv_string((X),(Y),875)
+#define get_csv_bool_pos875(X,Y) get_csv_bool((X),(Y),875)
+#define get_csv_int_pos875(X,Y) get_csv_int((X),(Y),875)
+#define get_csv_llong_pos875(X,Y) get_csv_llong((X),(Y),875)
+#define get_csv_float_pos875(X,Y) get_csv_float((X),(Y),875)
+#define get_csv_uint_pos876(X,Y) get_csv_uint((X),(Y),876)
+#define get_csv_ullong_pos876(X,Y) get_csv_ullong((X),(Y),876)
+#define get_csv_ip_pos876(X,Y) get_csv_ip((X),(Y),876)
+#define get_csv_ipv6_pos876(X,Y) get_csv_ipv6((X),(Y),876)
+#define get_csv_string_pos876(X,Y) get_csv_string((X),(Y),876)
+#define get_csv_v_str_pos876(X,Y) get_csv_string((X),(Y),876)
+#define get_csv_bool_pos876(X,Y) get_csv_bool((X),(Y),876)
+#define get_csv_int_pos876(X,Y) get_csv_int((X),(Y),876)
+#define get_csv_llong_pos876(X,Y) get_csv_llong((X),(Y),876)
+#define get_csv_float_pos876(X,Y) get_csv_float((X),(Y),876)
+#define get_csv_uint_pos877(X,Y) get_csv_uint((X),(Y),877)
+#define get_csv_ullong_pos877(X,Y) get_csv_ullong((X),(Y),877)
+#define get_csv_ip_pos877(X,Y) get_csv_ip((X),(Y),877)
+#define get_csv_ipv6_pos877(X,Y) get_csv_ipv6((X),(Y),877)
+#define get_csv_string_pos877(X,Y) get_csv_string((X),(Y),877)
+#define get_csv_v_str_pos877(X,Y) get_csv_string((X),(Y),877)
+#define get_csv_bool_pos877(X,Y) get_csv_bool((X),(Y),877)
+#define get_csv_int_pos877(X,Y) get_csv_int((X),(Y),877)
+#define get_csv_llong_pos877(X,Y) get_csv_llong((X),(Y),877)
+#define get_csv_float_pos877(X,Y) get_csv_float((X),(Y),877)
+#define get_csv_uint_pos878(X,Y) get_csv_uint((X),(Y),878)
+#define get_csv_ullong_pos878(X,Y) get_csv_ullong((X),(Y),878)
+#define get_csv_ip_pos878(X,Y) get_csv_ip((X),(Y),878)
+#define get_csv_ipv6_pos878(X,Y) get_csv_ipv6((X),(Y),878)
+#define get_csv_string_pos878(X,Y) get_csv_string((X),(Y),878)
+#define get_csv_v_str_pos878(X,Y) get_csv_string((X),(Y),878)
+#define get_csv_bool_pos878(X,Y) get_csv_bool((X),(Y),878)
+#define get_csv_int_pos878(X,Y) get_csv_int((X),(Y),878)
+#define get_csv_llong_pos878(X,Y) get_csv_llong((X),(Y),878)
+#define get_csv_float_pos878(X,Y) get_csv_float((X),(Y),878)
+#define get_csv_uint_pos879(X,Y) get_csv_uint((X),(Y),879)
+#define get_csv_ullong_pos879(X,Y) get_csv_ullong((X),(Y),879)
+#define get_csv_ip_pos879(X,Y) get_csv_ip((X),(Y),879)
+#define get_csv_ipv6_pos879(X,Y) get_csv_ipv6((X),(Y),879)
+#define get_csv_string_pos879(X,Y) get_csv_string((X),(Y),879)
+#define get_csv_v_str_pos879(X,Y) get_csv_string((X),(Y),879)
+#define get_csv_bool_pos879(X,Y) get_csv_bool((X),(Y),879)
+#define get_csv_int_pos879(X,Y) get_csv_int((X),(Y),879)
+#define get_csv_llong_pos879(X,Y) get_csv_llong((X),(Y),879)
+#define get_csv_float_pos879(X,Y) get_csv_float((X),(Y),879)
+#define get_csv_uint_pos880(X,Y) get_csv_uint((X),(Y),880)
+#define get_csv_ullong_pos880(X,Y) get_csv_ullong((X),(Y),880)
+#define get_csv_ip_pos880(X,Y) get_csv_ip((X),(Y),880)
+#define get_csv_ipv6_pos880(X,Y) get_csv_ipv6((X),(Y),880)
+#define get_csv_string_pos880(X,Y) get_csv_string((X),(Y),880)
+#define get_csv_v_str_pos880(X,Y) get_csv_string((X),(Y),880)
+#define get_csv_bool_pos880(X,Y) get_csv_bool((X),(Y),880)
+#define get_csv_int_pos880(X,Y) get_csv_int((X),(Y),880)
+#define get_csv_llong_pos880(X,Y) get_csv_llong((X),(Y),880)
+#define get_csv_float_pos880(X,Y) get_csv_float((X),(Y),880)
+#define get_csv_uint_pos881(X,Y) get_csv_uint((X),(Y),881)
+#define get_csv_ullong_pos881(X,Y) get_csv_ullong((X),(Y),881)
+#define get_csv_ip_pos881(X,Y) get_csv_ip((X),(Y),881)
+#define get_csv_ipv6_pos881(X,Y) get_csv_ipv6((X),(Y),881)
+#define get_csv_string_pos881(X,Y) get_csv_string((X),(Y),881)
+#define get_csv_v_str_pos881(X,Y) get_csv_string((X),(Y),881)
+#define get_csv_bool_pos881(X,Y) get_csv_bool((X),(Y),881)
+#define get_csv_int_pos881(X,Y) get_csv_int((X),(Y),881)
+#define get_csv_llong_pos881(X,Y) get_csv_llong((X),(Y),881)
+#define get_csv_float_pos881(X,Y) get_csv_float((X),(Y),881)
+#define get_csv_uint_pos882(X,Y) get_csv_uint((X),(Y),882)
+#define get_csv_ullong_pos882(X,Y) get_csv_ullong((X),(Y),882)
+#define get_csv_ip_pos882(X,Y) get_csv_ip((X),(Y),882)
+#define get_csv_ipv6_pos882(X,Y) get_csv_ipv6((X),(Y),882)
+#define get_csv_string_pos882(X,Y) get_csv_string((X),(Y),882)
+#define get_csv_v_str_pos882(X,Y) get_csv_string((X),(Y),882)
+#define get_csv_bool_pos882(X,Y) get_csv_bool((X),(Y),882)
+#define get_csv_int_pos882(X,Y) get_csv_int((X),(Y),882)
+#define get_csv_llong_pos882(X,Y) get_csv_llong((X),(Y),882)
+#define get_csv_float_pos882(X,Y) get_csv_float((X),(Y),882)
+#define get_csv_uint_pos883(X,Y) get_csv_uint((X),(Y),883)
+#define get_csv_ullong_pos883(X,Y) get_csv_ullong((X),(Y),883)
+#define get_csv_ip_pos883(X,Y) get_csv_ip((X),(Y),883)
+#define get_csv_ipv6_pos883(X,Y) get_csv_ipv6((X),(Y),883)
+#define get_csv_string_pos883(X,Y) get_csv_string((X),(Y),883)
+#define get_csv_v_str_pos883(X,Y) get_csv_string((X),(Y),883)
+#define get_csv_bool_pos883(X,Y) get_csv_bool((X),(Y),883)
+#define get_csv_int_pos883(X,Y) get_csv_int((X),(Y),883)
+#define get_csv_llong_pos883(X,Y) get_csv_llong((X),(Y),883)
+#define get_csv_float_pos883(X,Y) get_csv_float((X),(Y),883)
+#define get_csv_uint_pos884(X,Y) get_csv_uint((X),(Y),884)
+#define get_csv_ullong_pos884(X,Y) get_csv_ullong((X),(Y),884)
+#define get_csv_ip_pos884(X,Y) get_csv_ip((X),(Y),884)
+#define get_csv_ipv6_pos884(X,Y) get_csv_ipv6((X),(Y),884)
+#define get_csv_string_pos884(X,Y) get_csv_string((X),(Y),884)
+#define get_csv_v_str_pos884(X,Y) get_csv_string((X),(Y),884)
+#define get_csv_bool_pos884(X,Y) get_csv_bool((X),(Y),884)
+#define get_csv_int_pos884(X,Y) get_csv_int((X),(Y),884)
+#define get_csv_llong_pos884(X,Y) get_csv_llong((X),(Y),884)
+#define get_csv_float_pos884(X,Y) get_csv_float((X),(Y),884)
+#define get_csv_uint_pos885(X,Y) get_csv_uint((X),(Y),885)
+#define get_csv_ullong_pos885(X,Y) get_csv_ullong((X),(Y),885)
+#define get_csv_ip_pos885(X,Y) get_csv_ip((X),(Y),885)
+#define get_csv_ipv6_pos885(X,Y) get_csv_ipv6((X),(Y),885)
+#define get_csv_string_pos885(X,Y) get_csv_string((X),(Y),885)
+#define get_csv_v_str_pos885(X,Y) get_csv_string((X),(Y),885)
+#define get_csv_bool_pos885(X,Y) get_csv_bool((X),(Y),885)
+#define get_csv_int_pos885(X,Y) get_csv_int((X),(Y),885)
+#define get_csv_llong_pos885(X,Y) get_csv_llong((X),(Y),885)
+#define get_csv_float_pos885(X,Y) get_csv_float((X),(Y),885)
+#define get_csv_uint_pos886(X,Y) get_csv_uint((X),(Y),886)
+#define get_csv_ullong_pos886(X,Y) get_csv_ullong((X),(Y),886)
+#define get_csv_ip_pos886(X,Y) get_csv_ip((X),(Y),886)
+#define get_csv_ipv6_pos886(X,Y) get_csv_ipv6((X),(Y),886)
+#define get_csv_string_pos886(X,Y) get_csv_string((X),(Y),886)
+#define get_csv_v_str_pos886(X,Y) get_csv_string((X),(Y),886)
+#define get_csv_bool_pos886(X,Y) get_csv_bool((X),(Y),886)
+#define get_csv_int_pos886(X,Y) get_csv_int((X),(Y),886)
+#define get_csv_llong_pos886(X,Y) get_csv_llong((X),(Y),886)
+#define get_csv_float_pos886(X,Y) get_csv_float((X),(Y),886)
+#define get_csv_uint_pos887(X,Y) get_csv_uint((X),(Y),887)
+#define get_csv_ullong_pos887(X,Y) get_csv_ullong((X),(Y),887)
+#define get_csv_ip_pos887(X,Y) get_csv_ip((X),(Y),887)
+#define get_csv_ipv6_pos887(X,Y) get_csv_ipv6((X),(Y),887)
+#define get_csv_string_pos887(X,Y) get_csv_string((X),(Y),887)
+#define get_csv_v_str_pos887(X,Y) get_csv_string((X),(Y),887)
+#define get_csv_bool_pos887(X,Y) get_csv_bool((X),(Y),887)
+#define get_csv_int_pos887(X,Y) get_csv_int((X),(Y),887)
+#define get_csv_llong_pos887(X,Y) get_csv_llong((X),(Y),887)
+#define get_csv_float_pos887(X,Y) get_csv_float((X),(Y),887)
+#define get_csv_uint_pos888(X,Y) get_csv_uint((X),(Y),888)
+#define get_csv_ullong_pos888(X,Y) get_csv_ullong((X),(Y),888)
+#define get_csv_ip_pos888(X,Y) get_csv_ip((X),(Y),888)
+#define get_csv_ipv6_pos888(X,Y) get_csv_ipv6((X),(Y),888)
+#define get_csv_string_pos888(X,Y) get_csv_string((X),(Y),888)
+#define get_csv_v_str_pos888(X,Y) get_csv_string((X),(Y),888)
+#define get_csv_bool_pos888(X,Y) get_csv_bool((X),(Y),888)
+#define get_csv_int_pos888(X,Y) get_csv_int((X),(Y),888)
+#define get_csv_llong_pos888(X,Y) get_csv_llong((X),(Y),888)
+#define get_csv_float_pos888(X,Y) get_csv_float((X),(Y),888)
+#define get_csv_uint_pos889(X,Y) get_csv_uint((X),(Y),889)
+#define get_csv_ullong_pos889(X,Y) get_csv_ullong((X),(Y),889)
+#define get_csv_ip_pos889(X,Y) get_csv_ip((X),(Y),889)
+#define get_csv_ipv6_pos889(X,Y) get_csv_ipv6((X),(Y),889)
+#define get_csv_string_pos889(X,Y) get_csv_string((X),(Y),889)
+#define get_csv_v_str_pos889(X,Y) get_csv_string((X),(Y),889)
+#define get_csv_bool_pos889(X,Y) get_csv_bool((X),(Y),889)
+#define get_csv_int_pos889(X,Y) get_csv_int((X),(Y),889)
+#define get_csv_llong_pos889(X,Y) get_csv_llong((X),(Y),889)
+#define get_csv_float_pos889(X,Y) get_csv_float((X),(Y),889)
+#define get_csv_uint_pos890(X,Y) get_csv_uint((X),(Y),890)
+#define get_csv_ullong_pos890(X,Y) get_csv_ullong((X),(Y),890)
+#define get_csv_ip_pos890(X,Y) get_csv_ip((X),(Y),890)
+#define get_csv_ipv6_pos890(X,Y) get_csv_ipv6((X),(Y),890)
+#define get_csv_string_pos890(X,Y) get_csv_string((X),(Y),890)
+#define get_csv_v_str_pos890(X,Y) get_csv_string((X),(Y),890)
+#define get_csv_bool_pos890(X,Y) get_csv_bool((X),(Y),890)
+#define get_csv_int_pos890(X,Y) get_csv_int((X),(Y),890)
+#define get_csv_llong_pos890(X,Y) get_csv_llong((X),(Y),890)
+#define get_csv_float_pos890(X,Y) get_csv_float((X),(Y),890)
+#define get_csv_uint_pos891(X,Y) get_csv_uint((X),(Y),891)
+#define get_csv_ullong_pos891(X,Y) get_csv_ullong((X),(Y),891)
+#define get_csv_ip_pos891(X,Y) get_csv_ip((X),(Y),891)
+#define get_csv_ipv6_pos891(X,Y) get_csv_ipv6((X),(Y),891)
+#define get_csv_string_pos891(X,Y) get_csv_string((X),(Y),891)
+#define get_csv_v_str_pos891(X,Y) get_csv_string((X),(Y),891)
+#define get_csv_bool_pos891(X,Y) get_csv_bool((X),(Y),891)
+#define get_csv_int_pos891(X,Y) get_csv_int((X),(Y),891)
+#define get_csv_llong_pos891(X,Y) get_csv_llong((X),(Y),891)
+#define get_csv_float_pos891(X,Y) get_csv_float((X),(Y),891)
+#define get_csv_uint_pos892(X,Y) get_csv_uint((X),(Y),892)
+#define get_csv_ullong_pos892(X,Y) get_csv_ullong((X),(Y),892)
+#define get_csv_ip_pos892(X,Y) get_csv_ip((X),(Y),892)
+#define get_csv_ipv6_pos892(X,Y) get_csv_ipv6((X),(Y),892)
+#define get_csv_string_pos892(X,Y) get_csv_string((X),(Y),892)
+#define get_csv_v_str_pos892(X,Y) get_csv_string((X),(Y),892)
+#define get_csv_bool_pos892(X,Y) get_csv_bool((X),(Y),892)
+#define get_csv_int_pos892(X,Y) get_csv_int((X),(Y),892)
+#define get_csv_llong_pos892(X,Y) get_csv_llong((X),(Y),892)
+#define get_csv_float_pos892(X,Y) get_csv_float((X),(Y),892)
+#define get_csv_uint_pos893(X,Y) get_csv_uint((X),(Y),893)
+#define get_csv_ullong_pos893(X,Y) get_csv_ullong((X),(Y),893)
+#define get_csv_ip_pos893(X,Y) get_csv_ip((X),(Y),893)
+#define get_csv_ipv6_pos893(X,Y) get_csv_ipv6((X),(Y),893)
+#define get_csv_string_pos893(X,Y) get_csv_string((X),(Y),893)
+#define get_csv_v_str_pos893(X,Y) get_csv_string((X),(Y),893)
+#define get_csv_bool_pos893(X,Y) get_csv_bool((X),(Y),893)
+#define get_csv_int_pos893(X,Y) get_csv_int((X),(Y),893)
+#define get_csv_llong_pos893(X,Y) get_csv_llong((X),(Y),893)
+#define get_csv_float_pos893(X,Y) get_csv_float((X),(Y),893)
+#define get_csv_uint_pos894(X,Y) get_csv_uint((X),(Y),894)
+#define get_csv_ullong_pos894(X,Y) get_csv_ullong((X),(Y),894)
+#define get_csv_ip_pos894(X,Y) get_csv_ip((X),(Y),894)
+#define get_csv_ipv6_pos894(X,Y) get_csv_ipv6((X),(Y),894)
+#define get_csv_string_pos894(X,Y) get_csv_string((X),(Y),894)
+#define get_csv_v_str_pos894(X,Y) get_csv_string((X),(Y),894)
+#define get_csv_bool_pos894(X,Y) get_csv_bool((X),(Y),894)
+#define get_csv_int_pos894(X,Y) get_csv_int((X),(Y),894)
+#define get_csv_llong_pos894(X,Y) get_csv_llong((X),(Y),894)
+#define get_csv_float_pos894(X,Y) get_csv_float((X),(Y),894)
+#define get_csv_uint_pos895(X,Y) get_csv_uint((X),(Y),895)
+#define get_csv_ullong_pos895(X,Y) get_csv_ullong((X),(Y),895)
+#define get_csv_ip_pos895(X,Y) get_csv_ip((X),(Y),895)
+#define get_csv_ipv6_pos895(X,Y) get_csv_ipv6((X),(Y),895)
+#define get_csv_string_pos895(X,Y) get_csv_string((X),(Y),895)
+#define get_csv_v_str_pos895(X,Y) get_csv_string((X),(Y),895)
+#define get_csv_bool_pos895(X,Y) get_csv_bool((X),(Y),895)
+#define get_csv_int_pos895(X,Y) get_csv_int((X),(Y),895)
+#define get_csv_llong_pos895(X,Y) get_csv_llong((X),(Y),895)
+#define get_csv_float_pos895(X,Y) get_csv_float((X),(Y),895)
+#define get_csv_uint_pos896(X,Y) get_csv_uint((X),(Y),896)
+#define get_csv_ullong_pos896(X,Y) get_csv_ullong((X),(Y),896)
+#define get_csv_ip_pos896(X,Y) get_csv_ip((X),(Y),896)
+#define get_csv_ipv6_pos896(X,Y) get_csv_ipv6((X),(Y),896)
+#define get_csv_string_pos896(X,Y) get_csv_string((X),(Y),896)
+#define get_csv_v_str_pos896(X,Y) get_csv_string((X),(Y),896)
+#define get_csv_bool_pos896(X,Y) get_csv_bool((X),(Y),896)
+#define get_csv_int_pos896(X,Y) get_csv_int((X),(Y),896)
+#define get_csv_llong_pos896(X,Y) get_csv_llong((X),(Y),896)
+#define get_csv_float_pos896(X,Y) get_csv_float((X),(Y),896)
+#define get_csv_uint_pos897(X,Y) get_csv_uint((X),(Y),897)
+#define get_csv_ullong_pos897(X,Y) get_csv_ullong((X),(Y),897)
+#define get_csv_ip_pos897(X,Y) get_csv_ip((X),(Y),897)
+#define get_csv_ipv6_pos897(X,Y) get_csv_ipv6((X),(Y),897)
+#define get_csv_string_pos897(X,Y) get_csv_string((X),(Y),897)
+#define get_csv_v_str_pos897(X,Y) get_csv_string((X),(Y),897)
+#define get_csv_bool_pos897(X,Y) get_csv_bool((X),(Y),897)
+#define get_csv_int_pos897(X,Y) get_csv_int((X),(Y),897)
+#define get_csv_llong_pos897(X,Y) get_csv_llong((X),(Y),897)
+#define get_csv_float_pos897(X,Y) get_csv_float((X),(Y),897)
+#define get_csv_uint_pos898(X,Y) get_csv_uint((X),(Y),898)
+#define get_csv_ullong_pos898(X,Y) get_csv_ullong((X),(Y),898)
+#define get_csv_ip_pos898(X,Y) get_csv_ip((X),(Y),898)
+#define get_csv_ipv6_pos898(X,Y) get_csv_ipv6((X),(Y),898)
+#define get_csv_string_pos898(X,Y) get_csv_string((X),(Y),898)
+#define get_csv_v_str_pos898(X,Y) get_csv_string((X),(Y),898)
+#define get_csv_bool_pos898(X,Y) get_csv_bool((X),(Y),898)
+#define get_csv_int_pos898(X,Y) get_csv_int((X),(Y),898)
+#define get_csv_llong_pos898(X,Y) get_csv_llong((X),(Y),898)
+#define get_csv_float_pos898(X,Y) get_csv_float((X),(Y),898)
+#define get_csv_uint_pos899(X,Y) get_csv_uint((X),(Y),899)
+#define get_csv_ullong_pos899(X,Y) get_csv_ullong((X),(Y),899)
+#define get_csv_ip_pos899(X,Y) get_csv_ip((X),(Y),899)
+#define get_csv_ipv6_pos899(X,Y) get_csv_ipv6((X),(Y),899)
+#define get_csv_string_pos899(X,Y) get_csv_string((X),(Y),899)
+#define get_csv_v_str_pos899(X,Y) get_csv_string((X),(Y),899)
+#define get_csv_bool_pos899(X,Y) get_csv_bool((X),(Y),899)
+#define get_csv_int_pos899(X,Y) get_csv_int((X),(Y),899)
+#define get_csv_llong_pos899(X,Y) get_csv_llong((X),(Y),899)
+#define get_csv_float_pos899(X,Y) get_csv_float((X),(Y),899)
+#define get_csv_uint_pos900(X,Y) get_csv_uint((X),(Y),900)
+#define get_csv_ullong_pos900(X,Y) get_csv_ullong((X),(Y),900)
+#define get_csv_ip_pos900(X,Y) get_csv_ip((X),(Y),900)
+#define get_csv_ipv6_pos900(X,Y) get_csv_ipv6((X),(Y),900)
+#define get_csv_string_pos900(X,Y) get_csv_string((X),(Y),900)
+#define get_csv_v_str_pos900(X,Y) get_csv_string((X),(Y),900)
+#define get_csv_bool_pos900(X,Y) get_csv_bool((X),(Y),900)
+#define get_csv_int_pos900(X,Y) get_csv_int((X),(Y),900)
+#define get_csv_llong_pos900(X,Y) get_csv_llong((X),(Y),900)
+#define get_csv_float_pos900(X,Y) get_csv_float((X),(Y),900)
+#define get_csv_uint_pos901(X,Y) get_csv_uint((X),(Y),901)
+#define get_csv_ullong_pos901(X,Y) get_csv_ullong((X),(Y),901)
+#define get_csv_ip_pos901(X,Y) get_csv_ip((X),(Y),901)
+#define get_csv_ipv6_pos901(X,Y) get_csv_ipv6((X),(Y),901)
+#define get_csv_string_pos901(X,Y) get_csv_string((X),(Y),901)
+#define get_csv_v_str_pos901(X,Y) get_csv_string((X),(Y),901)
+#define get_csv_bool_pos901(X,Y) get_csv_bool((X),(Y),901)
+#define get_csv_int_pos901(X,Y) get_csv_int((X),(Y),901)
+#define get_csv_llong_pos901(X,Y) get_csv_llong((X),(Y),901)
+#define get_csv_float_pos901(X,Y) get_csv_float((X),(Y),901)
+#define get_csv_uint_pos902(X,Y) get_csv_uint((X),(Y),902)
+#define get_csv_ullong_pos902(X,Y) get_csv_ullong((X),(Y),902)
+#define get_csv_ip_pos902(X,Y) get_csv_ip((X),(Y),902)
+#define get_csv_ipv6_pos902(X,Y) get_csv_ipv6((X),(Y),902)
+#define get_csv_string_pos902(X,Y) get_csv_string((X),(Y),902)
+#define get_csv_v_str_pos902(X,Y) get_csv_string((X),(Y),902)
+#define get_csv_bool_pos902(X,Y) get_csv_bool((X),(Y),902)
+#define get_csv_int_pos902(X,Y) get_csv_int((X),(Y),902)
+#define get_csv_llong_pos902(X,Y) get_csv_llong((X),(Y),902)
+#define get_csv_float_pos902(X,Y) get_csv_float((X),(Y),902)
+#define get_csv_uint_pos903(X,Y) get_csv_uint((X),(Y),903)
+#define get_csv_ullong_pos903(X,Y) get_csv_ullong((X),(Y),903)
+#define get_csv_ip_pos903(X,Y) get_csv_ip((X),(Y),903)
+#define get_csv_ipv6_pos903(X,Y) get_csv_ipv6((X),(Y),903)
+#define get_csv_string_pos903(X,Y) get_csv_string((X),(Y),903)
+#define get_csv_v_str_pos903(X,Y) get_csv_string((X),(Y),903)
+#define get_csv_bool_pos903(X,Y) get_csv_bool((X),(Y),903)
+#define get_csv_int_pos903(X,Y) get_csv_int((X),(Y),903)
+#define get_csv_llong_pos903(X,Y) get_csv_llong((X),(Y),903)
+#define get_csv_float_pos903(X,Y) get_csv_float((X),(Y),903)
+#define get_csv_uint_pos904(X,Y) get_csv_uint((X),(Y),904)
+#define get_csv_ullong_pos904(X,Y) get_csv_ullong((X),(Y),904)
+#define get_csv_ip_pos904(X,Y) get_csv_ip((X),(Y),904)
+#define get_csv_ipv6_pos904(X,Y) get_csv_ipv6((X),(Y),904)
+#define get_csv_string_pos904(X,Y) get_csv_string((X),(Y),904)
+#define get_csv_v_str_pos904(X,Y) get_csv_string((X),(Y),904)
+#define get_csv_bool_pos904(X,Y) get_csv_bool((X),(Y),904)
+#define get_csv_int_pos904(X,Y) get_csv_int((X),(Y),904)
+#define get_csv_llong_pos904(X,Y) get_csv_llong((X),(Y),904)
+#define get_csv_float_pos904(X,Y) get_csv_float((X),(Y),904)
+#define get_csv_uint_pos905(X,Y) get_csv_uint((X),(Y),905)
+#define get_csv_ullong_pos905(X,Y) get_csv_ullong((X),(Y),905)
+#define get_csv_ip_pos905(X,Y) get_csv_ip((X),(Y),905)
+#define get_csv_ipv6_pos905(X,Y) get_csv_ipv6((X),(Y),905)
+#define get_csv_string_pos905(X,Y) get_csv_string((X),(Y),905)
+#define get_csv_v_str_pos905(X,Y) get_csv_string((X),(Y),905)
+#define get_csv_bool_pos905(X,Y) get_csv_bool((X),(Y),905)
+#define get_csv_int_pos905(X,Y) get_csv_int((X),(Y),905)
+#define get_csv_llong_pos905(X,Y) get_csv_llong((X),(Y),905)
+#define get_csv_float_pos905(X,Y) get_csv_float((X),(Y),905)
+#define get_csv_uint_pos906(X,Y) get_csv_uint((X),(Y),906)
+#define get_csv_ullong_pos906(X,Y) get_csv_ullong((X),(Y),906)
+#define get_csv_ip_pos906(X,Y) get_csv_ip((X),(Y),906)
+#define get_csv_ipv6_pos906(X,Y) get_csv_ipv6((X),(Y),906)
+#define get_csv_string_pos906(X,Y) get_csv_string((X),(Y),906)
+#define get_csv_v_str_pos906(X,Y) get_csv_string((X),(Y),906)
+#define get_csv_bool_pos906(X,Y) get_csv_bool((X),(Y),906)
+#define get_csv_int_pos906(X,Y) get_csv_int((X),(Y),906)
+#define get_csv_llong_pos906(X,Y) get_csv_llong((X),(Y),906)
+#define get_csv_float_pos906(X,Y) get_csv_float((X),(Y),906)
+#define get_csv_uint_pos907(X,Y) get_csv_uint((X),(Y),907)
+#define get_csv_ullong_pos907(X,Y) get_csv_ullong((X),(Y),907)
+#define get_csv_ip_pos907(X,Y) get_csv_ip((X),(Y),907)
+#define get_csv_ipv6_pos907(X,Y) get_csv_ipv6((X),(Y),907)
+#define get_csv_string_pos907(X,Y) get_csv_string((X),(Y),907)
+#define get_csv_v_str_pos907(X,Y) get_csv_string((X),(Y),907)
+#define get_csv_bool_pos907(X,Y) get_csv_bool((X),(Y),907)
+#define get_csv_int_pos907(X,Y) get_csv_int((X),(Y),907)
+#define get_csv_llong_pos907(X,Y) get_csv_llong((X),(Y),907)
+#define get_csv_float_pos907(X,Y) get_csv_float((X),(Y),907)
+#define get_csv_uint_pos908(X,Y) get_csv_uint((X),(Y),908)
+#define get_csv_ullong_pos908(X,Y) get_csv_ullong((X),(Y),908)
+#define get_csv_ip_pos908(X,Y) get_csv_ip((X),(Y),908)
+#define get_csv_ipv6_pos908(X,Y) get_csv_ipv6((X),(Y),908)
+#define get_csv_string_pos908(X,Y) get_csv_string((X),(Y),908)
+#define get_csv_v_str_pos908(X,Y) get_csv_string((X),(Y),908)
+#define get_csv_bool_pos908(X,Y) get_csv_bool((X),(Y),908)
+#define get_csv_int_pos908(X,Y) get_csv_int((X),(Y),908)
+#define get_csv_llong_pos908(X,Y) get_csv_llong((X),(Y),908)
+#define get_csv_float_pos908(X,Y) get_csv_float((X),(Y),908)
+#define get_csv_uint_pos909(X,Y) get_csv_uint((X),(Y),909)
+#define get_csv_ullong_pos909(X,Y) get_csv_ullong((X),(Y),909)
+#define get_csv_ip_pos909(X,Y) get_csv_ip((X),(Y),909)
+#define get_csv_ipv6_pos909(X,Y) get_csv_ipv6((X),(Y),909)
+#define get_csv_string_pos909(X,Y) get_csv_string((X),(Y),909)
+#define get_csv_v_str_pos909(X,Y) get_csv_string((X),(Y),909)
+#define get_csv_bool_pos909(X,Y) get_csv_bool((X),(Y),909)
+#define get_csv_int_pos909(X,Y) get_csv_int((X),(Y),909)
+#define get_csv_llong_pos909(X,Y) get_csv_llong((X),(Y),909)
+#define get_csv_float_pos909(X,Y) get_csv_float((X),(Y),909)
+#define get_csv_uint_pos910(X,Y) get_csv_uint((X),(Y),910)
+#define get_csv_ullong_pos910(X,Y) get_csv_ullong((X),(Y),910)
+#define get_csv_ip_pos910(X,Y) get_csv_ip((X),(Y),910)
+#define get_csv_ipv6_pos910(X,Y) get_csv_ipv6((X),(Y),910)
+#define get_csv_string_pos910(X,Y) get_csv_string((X),(Y),910)
+#define get_csv_v_str_pos910(X,Y) get_csv_string((X),(Y),910)
+#define get_csv_bool_pos910(X,Y) get_csv_bool((X),(Y),910)
+#define get_csv_int_pos910(X,Y) get_csv_int((X),(Y),910)
+#define get_csv_llong_pos910(X,Y) get_csv_llong((X),(Y),910)
+#define get_csv_float_pos910(X,Y) get_csv_float((X),(Y),910)
+#define get_csv_uint_pos911(X,Y) get_csv_uint((X),(Y),911)
+#define get_csv_ullong_pos911(X,Y) get_csv_ullong((X),(Y),911)
+#define get_csv_ip_pos911(X,Y) get_csv_ip((X),(Y),911)
+#define get_csv_ipv6_pos911(X,Y) get_csv_ipv6((X),(Y),911)
+#define get_csv_string_pos911(X,Y) get_csv_string((X),(Y),911)
+#define get_csv_v_str_pos911(X,Y) get_csv_string((X),(Y),911)
+#define get_csv_bool_pos911(X,Y) get_csv_bool((X),(Y),911)
+#define get_csv_int_pos911(X,Y) get_csv_int((X),(Y),911)
+#define get_csv_llong_pos911(X,Y) get_csv_llong((X),(Y),911)
+#define get_csv_float_pos911(X,Y) get_csv_float((X),(Y),911)
+#define get_csv_uint_pos912(X,Y) get_csv_uint((X),(Y),912)
+#define get_csv_ullong_pos912(X,Y) get_csv_ullong((X),(Y),912)
+#define get_csv_ip_pos912(X,Y) get_csv_ip((X),(Y),912)
+#define get_csv_ipv6_pos912(X,Y) get_csv_ipv6((X),(Y),912)
+#define get_csv_string_pos912(X,Y) get_csv_string((X),(Y),912)
+#define get_csv_v_str_pos912(X,Y) get_csv_string((X),(Y),912)
+#define get_csv_bool_pos912(X,Y) get_csv_bool((X),(Y),912)
+#define get_csv_int_pos912(X,Y) get_csv_int((X),(Y),912)
+#define get_csv_llong_pos912(X,Y) get_csv_llong((X),(Y),912)
+#define get_csv_float_pos912(X,Y) get_csv_float((X),(Y),912)
+#define get_csv_uint_pos913(X,Y) get_csv_uint((X),(Y),913)
+#define get_csv_ullong_pos913(X,Y) get_csv_ullong((X),(Y),913)
+#define get_csv_ip_pos913(X,Y) get_csv_ip((X),(Y),913)
+#define get_csv_ipv6_pos913(X,Y) get_csv_ipv6((X),(Y),913)
+#define get_csv_string_pos913(X,Y) get_csv_string((X),(Y),913)
+#define get_csv_v_str_pos913(X,Y) get_csv_string((X),(Y),913)
+#define get_csv_bool_pos913(X,Y) get_csv_bool((X),(Y),913)
+#define get_csv_int_pos913(X,Y) get_csv_int((X),(Y),913)
+#define get_csv_llong_pos913(X,Y) get_csv_llong((X),(Y),913)
+#define get_csv_float_pos913(X,Y) get_csv_float((X),(Y),913)
+#define get_csv_uint_pos914(X,Y) get_csv_uint((X),(Y),914)
+#define get_csv_ullong_pos914(X,Y) get_csv_ullong((X),(Y),914)
+#define get_csv_ip_pos914(X,Y) get_csv_ip((X),(Y),914)
+#define get_csv_ipv6_pos914(X,Y) get_csv_ipv6((X),(Y),914)
+#define get_csv_string_pos914(X,Y) get_csv_string((X),(Y),914)
+#define get_csv_v_str_pos914(X,Y) get_csv_string((X),(Y),914)
+#define get_csv_bool_pos914(X,Y) get_csv_bool((X),(Y),914)
+#define get_csv_int_pos914(X,Y) get_csv_int((X),(Y),914)
+#define get_csv_llong_pos914(X,Y) get_csv_llong((X),(Y),914)
+#define get_csv_float_pos914(X,Y) get_csv_float((X),(Y),914)
+#define get_csv_uint_pos915(X,Y) get_csv_uint((X),(Y),915)
+#define get_csv_ullong_pos915(X,Y) get_csv_ullong((X),(Y),915)
+#define get_csv_ip_pos915(X,Y) get_csv_ip((X),(Y),915)
+#define get_csv_ipv6_pos915(X,Y) get_csv_ipv6((X),(Y),915)
+#define get_csv_string_pos915(X,Y) get_csv_string((X),(Y),915)
+#define get_csv_v_str_pos915(X,Y) get_csv_string((X),(Y),915)
+#define get_csv_bool_pos915(X,Y) get_csv_bool((X),(Y),915)
+#define get_csv_int_pos915(X,Y) get_csv_int((X),(Y),915)
+#define get_csv_llong_pos915(X,Y) get_csv_llong((X),(Y),915)
+#define get_csv_float_pos915(X,Y) get_csv_float((X),(Y),915)
+#define get_csv_uint_pos916(X,Y) get_csv_uint((X),(Y),916)
+#define get_csv_ullong_pos916(X,Y) get_csv_ullong((X),(Y),916)
+#define get_csv_ip_pos916(X,Y) get_csv_ip((X),(Y),916)
+#define get_csv_ipv6_pos916(X,Y) get_csv_ipv6((X),(Y),916)
+#define get_csv_string_pos916(X,Y) get_csv_string((X),(Y),916)
+#define get_csv_v_str_pos916(X,Y) get_csv_string((X),(Y),916)
+#define get_csv_bool_pos916(X,Y) get_csv_bool((X),(Y),916)
+#define get_csv_int_pos916(X,Y) get_csv_int((X),(Y),916)
+#define get_csv_llong_pos916(X,Y) get_csv_llong((X),(Y),916)
+#define get_csv_float_pos916(X,Y) get_csv_float((X),(Y),916)
+#define get_csv_uint_pos917(X,Y) get_csv_uint((X),(Y),917)
+#define get_csv_ullong_pos917(X,Y) get_csv_ullong((X),(Y),917)
+#define get_csv_ip_pos917(X,Y) get_csv_ip((X),(Y),917)
+#define get_csv_ipv6_pos917(X,Y) get_csv_ipv6((X),(Y),917)
+#define get_csv_string_pos917(X,Y) get_csv_string((X),(Y),917)
+#define get_csv_v_str_pos917(X,Y) get_csv_string((X),(Y),917)
+#define get_csv_bool_pos917(X,Y) get_csv_bool((X),(Y),917)
+#define get_csv_int_pos917(X,Y) get_csv_int((X),(Y),917)
+#define get_csv_llong_pos917(X,Y) get_csv_llong((X),(Y),917)
+#define get_csv_float_pos917(X,Y) get_csv_float((X),(Y),917)
+#define get_csv_uint_pos918(X,Y) get_csv_uint((X),(Y),918)
+#define get_csv_ullong_pos918(X,Y) get_csv_ullong((X),(Y),918)
+#define get_csv_ip_pos918(X,Y) get_csv_ip((X),(Y),918)
+#define get_csv_ipv6_pos918(X,Y) get_csv_ipv6((X),(Y),918)
+#define get_csv_string_pos918(X,Y) get_csv_string((X),(Y),918)
+#define get_csv_v_str_pos918(X,Y) get_csv_string((X),(Y),918)
+#define get_csv_bool_pos918(X,Y) get_csv_bool((X),(Y),918)
+#define get_csv_int_pos918(X,Y) get_csv_int((X),(Y),918)
+#define get_csv_llong_pos918(X,Y) get_csv_llong((X),(Y),918)
+#define get_csv_float_pos918(X,Y) get_csv_float((X),(Y),918)
+#define get_csv_uint_pos919(X,Y) get_csv_uint((X),(Y),919)
+#define get_csv_ullong_pos919(X,Y) get_csv_ullong((X),(Y),919)
+#define get_csv_ip_pos919(X,Y) get_csv_ip((X),(Y),919)
+#define get_csv_ipv6_pos919(X,Y) get_csv_ipv6((X),(Y),919)
+#define get_csv_string_pos919(X,Y) get_csv_string((X),(Y),919)
+#define get_csv_v_str_pos919(X,Y) get_csv_string((X),(Y),919)
+#define get_csv_bool_pos919(X,Y) get_csv_bool((X),(Y),919)
+#define get_csv_int_pos919(X,Y) get_csv_int((X),(Y),919)
+#define get_csv_llong_pos919(X,Y) get_csv_llong((X),(Y),919)
+#define get_csv_float_pos919(X,Y) get_csv_float((X),(Y),919)
+#define get_csv_uint_pos920(X,Y) get_csv_uint((X),(Y),920)
+#define get_csv_ullong_pos920(X,Y) get_csv_ullong((X),(Y),920)
+#define get_csv_ip_pos920(X,Y) get_csv_ip((X),(Y),920)
+#define get_csv_ipv6_pos920(X,Y) get_csv_ipv6((X),(Y),920)
+#define get_csv_string_pos920(X,Y) get_csv_string((X),(Y),920)
+#define get_csv_v_str_pos920(X,Y) get_csv_string((X),(Y),920)
+#define get_csv_bool_pos920(X,Y) get_csv_bool((X),(Y),920)
+#define get_csv_int_pos920(X,Y) get_csv_int((X),(Y),920)
+#define get_csv_llong_pos920(X,Y) get_csv_llong((X),(Y),920)
+#define get_csv_float_pos920(X,Y) get_csv_float((X),(Y),920)
+#define get_csv_uint_pos921(X,Y) get_csv_uint((X),(Y),921)
+#define get_csv_ullong_pos921(X,Y) get_csv_ullong((X),(Y),921)
+#define get_csv_ip_pos921(X,Y) get_csv_ip((X),(Y),921)
+#define get_csv_ipv6_pos921(X,Y) get_csv_ipv6((X),(Y),921)
+#define get_csv_string_pos921(X,Y) get_csv_string((X),(Y),921)
+#define get_csv_v_str_pos921(X,Y) get_csv_string((X),(Y),921)
+#define get_csv_bool_pos921(X,Y) get_csv_bool((X),(Y),921)
+#define get_csv_int_pos921(X,Y) get_csv_int((X),(Y),921)
+#define get_csv_llong_pos921(X,Y) get_csv_llong((X),(Y),921)
+#define get_csv_float_pos921(X,Y) get_csv_float((X),(Y),921)
+#define get_csv_uint_pos922(X,Y) get_csv_uint((X),(Y),922)
+#define get_csv_ullong_pos922(X,Y) get_csv_ullong((X),(Y),922)
+#define get_csv_ip_pos922(X,Y) get_csv_ip((X),(Y),922)
+#define get_csv_ipv6_pos922(X,Y) get_csv_ipv6((X),(Y),922)
+#define get_csv_string_pos922(X,Y) get_csv_string((X),(Y),922)
+#define get_csv_v_str_pos922(X,Y) get_csv_string((X),(Y),922)
+#define get_csv_bool_pos922(X,Y) get_csv_bool((X),(Y),922)
+#define get_csv_int_pos922(X,Y) get_csv_int((X),(Y),922)
+#define get_csv_llong_pos922(X,Y) get_csv_llong((X),(Y),922)
+#define get_csv_float_pos922(X,Y) get_csv_float((X),(Y),922)
+#define get_csv_uint_pos923(X,Y) get_csv_uint((X),(Y),923)
+#define get_csv_ullong_pos923(X,Y) get_csv_ullong((X),(Y),923)
+#define get_csv_ip_pos923(X,Y) get_csv_ip((X),(Y),923)
+#define get_csv_ipv6_pos923(X,Y) get_csv_ipv6((X),(Y),923)
+#define get_csv_string_pos923(X,Y) get_csv_string((X),(Y),923)
+#define get_csv_v_str_pos923(X,Y) get_csv_string((X),(Y),923)
+#define get_csv_bool_pos923(X,Y) get_csv_bool((X),(Y),923)
+#define get_csv_int_pos923(X,Y) get_csv_int((X),(Y),923)
+#define get_csv_llong_pos923(X,Y) get_csv_llong((X),(Y),923)
+#define get_csv_float_pos923(X,Y) get_csv_float((X),(Y),923)
+#define get_csv_uint_pos924(X,Y) get_csv_uint((X),(Y),924)
+#define get_csv_ullong_pos924(X,Y) get_csv_ullong((X),(Y),924)
+#define get_csv_ip_pos924(X,Y) get_csv_ip((X),(Y),924)
+#define get_csv_ipv6_pos924(X,Y) get_csv_ipv6((X),(Y),924)
+#define get_csv_string_pos924(X,Y) get_csv_string((X),(Y),924)
+#define get_csv_v_str_pos924(X,Y) get_csv_string((X),(Y),924)
+#define get_csv_bool_pos924(X,Y) get_csv_bool((X),(Y),924)
+#define get_csv_int_pos924(X,Y) get_csv_int((X),(Y),924)
+#define get_csv_llong_pos924(X,Y) get_csv_llong((X),(Y),924)
+#define get_csv_float_pos924(X,Y) get_csv_float((X),(Y),924)
+#define get_csv_uint_pos925(X,Y) get_csv_uint((X),(Y),925)
+#define get_csv_ullong_pos925(X,Y) get_csv_ullong((X),(Y),925)
+#define get_csv_ip_pos925(X,Y) get_csv_ip((X),(Y),925)
+#define get_csv_ipv6_pos925(X,Y) get_csv_ipv6((X),(Y),925)
+#define get_csv_string_pos925(X,Y) get_csv_string((X),(Y),925)
+#define get_csv_v_str_pos925(X,Y) get_csv_string((X),(Y),925)
+#define get_csv_bool_pos925(X,Y) get_csv_bool((X),(Y),925)
+#define get_csv_int_pos925(X,Y) get_csv_int((X),(Y),925)
+#define get_csv_llong_pos925(X,Y) get_csv_llong((X),(Y),925)
+#define get_csv_float_pos925(X,Y) get_csv_float((X),(Y),925)
+#define get_csv_uint_pos926(X,Y) get_csv_uint((X),(Y),926)
+#define get_csv_ullong_pos926(X,Y) get_csv_ullong((X),(Y),926)
+#define get_csv_ip_pos926(X,Y) get_csv_ip((X),(Y),926)
+#define get_csv_ipv6_pos926(X,Y) get_csv_ipv6((X),(Y),926)
+#define get_csv_string_pos926(X,Y) get_csv_string((X),(Y),926)
+#define get_csv_v_str_pos926(X,Y) get_csv_string((X),(Y),926)
+#define get_csv_bool_pos926(X,Y) get_csv_bool((X),(Y),926)
+#define get_csv_int_pos926(X,Y) get_csv_int((X),(Y),926)
+#define get_csv_llong_pos926(X,Y) get_csv_llong((X),(Y),926)
+#define get_csv_float_pos926(X,Y) get_csv_float((X),(Y),926)
+#define get_csv_uint_pos927(X,Y) get_csv_uint((X),(Y),927)
+#define get_csv_ullong_pos927(X,Y) get_csv_ullong((X),(Y),927)
+#define get_csv_ip_pos927(X,Y) get_csv_ip((X),(Y),927)
+#define get_csv_ipv6_pos927(X,Y) get_csv_ipv6((X),(Y),927)
+#define get_csv_string_pos927(X,Y) get_csv_string((X),(Y),927)
+#define get_csv_v_str_pos927(X,Y) get_csv_string((X),(Y),927)
+#define get_csv_bool_pos927(X,Y) get_csv_bool((X),(Y),927)
+#define get_csv_int_pos927(X,Y) get_csv_int((X),(Y),927)
+#define get_csv_llong_pos927(X,Y) get_csv_llong((X),(Y),927)
+#define get_csv_float_pos927(X,Y) get_csv_float((X),(Y),927)
+#define get_csv_uint_pos928(X,Y) get_csv_uint((X),(Y),928)
+#define get_csv_ullong_pos928(X,Y) get_csv_ullong((X),(Y),928)
+#define get_csv_ip_pos928(X,Y) get_csv_ip((X),(Y),928)
+#define get_csv_ipv6_pos928(X,Y) get_csv_ipv6((X),(Y),928)
+#define get_csv_string_pos928(X,Y) get_csv_string((X),(Y),928)
+#define get_csv_v_str_pos928(X,Y) get_csv_string((X),(Y),928)
+#define get_csv_bool_pos928(X,Y) get_csv_bool((X),(Y),928)
+#define get_csv_int_pos928(X,Y) get_csv_int((X),(Y),928)
+#define get_csv_llong_pos928(X,Y) get_csv_llong((X),(Y),928)
+#define get_csv_float_pos928(X,Y) get_csv_float((X),(Y),928)
+#define get_csv_uint_pos929(X,Y) get_csv_uint((X),(Y),929)
+#define get_csv_ullong_pos929(X,Y) get_csv_ullong((X),(Y),929)
+#define get_csv_ip_pos929(X,Y) get_csv_ip((X),(Y),929)
+#define get_csv_ipv6_pos929(X,Y) get_csv_ipv6((X),(Y),929)
+#define get_csv_string_pos929(X,Y) get_csv_string((X),(Y),929)
+#define get_csv_v_str_pos929(X,Y) get_csv_string((X),(Y),929)
+#define get_csv_bool_pos929(X,Y) get_csv_bool((X),(Y),929)
+#define get_csv_int_pos929(X,Y) get_csv_int((X),(Y),929)
+#define get_csv_llong_pos929(X,Y) get_csv_llong((X),(Y),929)
+#define get_csv_float_pos929(X,Y) get_csv_float((X),(Y),929)
+#define get_csv_uint_pos930(X,Y) get_csv_uint((X),(Y),930)
+#define get_csv_ullong_pos930(X,Y) get_csv_ullong((X),(Y),930)
+#define get_csv_ip_pos930(X,Y) get_csv_ip((X),(Y),930)
+#define get_csv_ipv6_pos930(X,Y) get_csv_ipv6((X),(Y),930)
+#define get_csv_string_pos930(X,Y) get_csv_string((X),(Y),930)
+#define get_csv_v_str_pos930(X,Y) get_csv_string((X),(Y),930)
+#define get_csv_bool_pos930(X,Y) get_csv_bool((X),(Y),930)
+#define get_csv_int_pos930(X,Y) get_csv_int((X),(Y),930)
+#define get_csv_llong_pos930(X,Y) get_csv_llong((X),(Y),930)
+#define get_csv_float_pos930(X,Y) get_csv_float((X),(Y),930)
+#define get_csv_uint_pos931(X,Y) get_csv_uint((X),(Y),931)
+#define get_csv_ullong_pos931(X,Y) get_csv_ullong((X),(Y),931)
+#define get_csv_ip_pos931(X,Y) get_csv_ip((X),(Y),931)
+#define get_csv_ipv6_pos931(X,Y) get_csv_ipv6((X),(Y),931)
+#define get_csv_string_pos931(X,Y) get_csv_string((X),(Y),931)
+#define get_csv_v_str_pos931(X,Y) get_csv_string((X),(Y),931)
+#define get_csv_bool_pos931(X,Y) get_csv_bool((X),(Y),931)
+#define get_csv_int_pos931(X,Y) get_csv_int((X),(Y),931)
+#define get_csv_llong_pos931(X,Y) get_csv_llong((X),(Y),931)
+#define get_csv_float_pos931(X,Y) get_csv_float((X),(Y),931)
+#define get_csv_uint_pos932(X,Y) get_csv_uint((X),(Y),932)
+#define get_csv_ullong_pos932(X,Y) get_csv_ullong((X),(Y),932)
+#define get_csv_ip_pos932(X,Y) get_csv_ip((X),(Y),932)
+#define get_csv_ipv6_pos932(X,Y) get_csv_ipv6((X),(Y),932)
+#define get_csv_string_pos932(X,Y) get_csv_string((X),(Y),932)
+#define get_csv_v_str_pos932(X,Y) get_csv_string((X),(Y),932)
+#define get_csv_bool_pos932(X,Y) get_csv_bool((X),(Y),932)
+#define get_csv_int_pos932(X,Y) get_csv_int((X),(Y),932)
+#define get_csv_llong_pos932(X,Y) get_csv_llong((X),(Y),932)
+#define get_csv_float_pos932(X,Y) get_csv_float((X),(Y),932)
+#define get_csv_uint_pos933(X,Y) get_csv_uint((X),(Y),933)
+#define get_csv_ullong_pos933(X,Y) get_csv_ullong((X),(Y),933)
+#define get_csv_ip_pos933(X,Y) get_csv_ip((X),(Y),933)
+#define get_csv_ipv6_pos933(X,Y) get_csv_ipv6((X),(Y),933)
+#define get_csv_string_pos933(X,Y) get_csv_string((X),(Y),933)
+#define get_csv_v_str_pos933(X,Y) get_csv_string((X),(Y),933)
+#define get_csv_bool_pos933(X,Y) get_csv_bool((X),(Y),933)
+#define get_csv_int_pos933(X,Y) get_csv_int((X),(Y),933)
+#define get_csv_llong_pos933(X,Y) get_csv_llong((X),(Y),933)
+#define get_csv_float_pos933(X,Y) get_csv_float((X),(Y),933)
+#define get_csv_uint_pos934(X,Y) get_csv_uint((X),(Y),934)
+#define get_csv_ullong_pos934(X,Y) get_csv_ullong((X),(Y),934)
+#define get_csv_ip_pos934(X,Y) get_csv_ip((X),(Y),934)
+#define get_csv_ipv6_pos934(X,Y) get_csv_ipv6((X),(Y),934)
+#define get_csv_string_pos934(X,Y) get_csv_string((X),(Y),934)
+#define get_csv_v_str_pos934(X,Y) get_csv_string((X),(Y),934)
+#define get_csv_bool_pos934(X,Y) get_csv_bool((X),(Y),934)
+#define get_csv_int_pos934(X,Y) get_csv_int((X),(Y),934)
+#define get_csv_llong_pos934(X,Y) get_csv_llong((X),(Y),934)
+#define get_csv_float_pos934(X,Y) get_csv_float((X),(Y),934)
+#define get_csv_uint_pos935(X,Y) get_csv_uint((X),(Y),935)
+#define get_csv_ullong_pos935(X,Y) get_csv_ullong((X),(Y),935)
+#define get_csv_ip_pos935(X,Y) get_csv_ip((X),(Y),935)
+#define get_csv_ipv6_pos935(X,Y) get_csv_ipv6((X),(Y),935)
+#define get_csv_string_pos935(X,Y) get_csv_string((X),(Y),935)
+#define get_csv_v_str_pos935(X,Y) get_csv_string((X),(Y),935)
+#define get_csv_bool_pos935(X,Y) get_csv_bool((X),(Y),935)
+#define get_csv_int_pos935(X,Y) get_csv_int((X),(Y),935)
+#define get_csv_llong_pos935(X,Y) get_csv_llong((X),(Y),935)
+#define get_csv_float_pos935(X,Y) get_csv_float((X),(Y),935)
+#define get_csv_uint_pos936(X,Y) get_csv_uint((X),(Y),936)
+#define get_csv_ullong_pos936(X,Y) get_csv_ullong((X),(Y),936)
+#define get_csv_ip_pos936(X,Y) get_csv_ip((X),(Y),936)
+#define get_csv_ipv6_pos936(X,Y) get_csv_ipv6((X),(Y),936)
+#define get_csv_string_pos936(X,Y) get_csv_string((X),(Y),936)
+#define get_csv_v_str_pos936(X,Y) get_csv_string((X),(Y),936)
+#define get_csv_bool_pos936(X,Y) get_csv_bool((X),(Y),936)
+#define get_csv_int_pos936(X,Y) get_csv_int((X),(Y),936)
+#define get_csv_llong_pos936(X,Y) get_csv_llong((X),(Y),936)
+#define get_csv_float_pos936(X,Y) get_csv_float((X),(Y),936)
+#define get_csv_uint_pos937(X,Y) get_csv_uint((X),(Y),937)
+#define get_csv_ullong_pos937(X,Y) get_csv_ullong((X),(Y),937)
+#define get_csv_ip_pos937(X,Y) get_csv_ip((X),(Y),937)
+#define get_csv_ipv6_pos937(X,Y) get_csv_ipv6((X),(Y),937)
+#define get_csv_string_pos937(X,Y) get_csv_string((X),(Y),937)
+#define get_csv_v_str_pos937(X,Y) get_csv_string((X),(Y),937)
+#define get_csv_bool_pos937(X,Y) get_csv_bool((X),(Y),937)
+#define get_csv_int_pos937(X,Y) get_csv_int((X),(Y),937)
+#define get_csv_llong_pos937(X,Y) get_csv_llong((X),(Y),937)
+#define get_csv_float_pos937(X,Y) get_csv_float((X),(Y),937)
+#define get_csv_uint_pos938(X,Y) get_csv_uint((X),(Y),938)
+#define get_csv_ullong_pos938(X,Y) get_csv_ullong((X),(Y),938)
+#define get_csv_ip_pos938(X,Y) get_csv_ip((X),(Y),938)
+#define get_csv_ipv6_pos938(X,Y) get_csv_ipv6((X),(Y),938)
+#define get_csv_string_pos938(X,Y) get_csv_string((X),(Y),938)
+#define get_csv_v_str_pos938(X,Y) get_csv_string((X),(Y),938)
+#define get_csv_bool_pos938(X,Y) get_csv_bool((X),(Y),938)
+#define get_csv_int_pos938(X,Y) get_csv_int((X),(Y),938)
+#define get_csv_llong_pos938(X,Y) get_csv_llong((X),(Y),938)
+#define get_csv_float_pos938(X,Y) get_csv_float((X),(Y),938)
+#define get_csv_uint_pos939(X,Y) get_csv_uint((X),(Y),939)
+#define get_csv_ullong_pos939(X,Y) get_csv_ullong((X),(Y),939)
+#define get_csv_ip_pos939(X,Y) get_csv_ip((X),(Y),939)
+#define get_csv_ipv6_pos939(X,Y) get_csv_ipv6((X),(Y),939)
+#define get_csv_string_pos939(X,Y) get_csv_string((X),(Y),939)
+#define get_csv_v_str_pos939(X,Y) get_csv_string((X),(Y),939)
+#define get_csv_bool_pos939(X,Y) get_csv_bool((X),(Y),939)
+#define get_csv_int_pos939(X,Y) get_csv_int((X),(Y),939)
+#define get_csv_llong_pos939(X,Y) get_csv_llong((X),(Y),939)
+#define get_csv_float_pos939(X,Y) get_csv_float((X),(Y),939)
+#define get_csv_uint_pos940(X,Y) get_csv_uint((X),(Y),940)
+#define get_csv_ullong_pos940(X,Y) get_csv_ullong((X),(Y),940)
+#define get_csv_ip_pos940(X,Y) get_csv_ip((X),(Y),940)
+#define get_csv_ipv6_pos940(X,Y) get_csv_ipv6((X),(Y),940)
+#define get_csv_string_pos940(X,Y) get_csv_string((X),(Y),940)
+#define get_csv_v_str_pos940(X,Y) get_csv_string((X),(Y),940)
+#define get_csv_bool_pos940(X,Y) get_csv_bool((X),(Y),940)
+#define get_csv_int_pos940(X,Y) get_csv_int((X),(Y),940)
+#define get_csv_llong_pos940(X,Y) get_csv_llong((X),(Y),940)
+#define get_csv_float_pos940(X,Y) get_csv_float((X),(Y),940)
+#define get_csv_uint_pos941(X,Y) get_csv_uint((X),(Y),941)
+#define get_csv_ullong_pos941(X,Y) get_csv_ullong((X),(Y),941)
+#define get_csv_ip_pos941(X,Y) get_csv_ip((X),(Y),941)
+#define get_csv_ipv6_pos941(X,Y) get_csv_ipv6((X),(Y),941)
+#define get_csv_string_pos941(X,Y) get_csv_string((X),(Y),941)
+#define get_csv_v_str_pos941(X,Y) get_csv_string((X),(Y),941)
+#define get_csv_bool_pos941(X,Y) get_csv_bool((X),(Y),941)
+#define get_csv_int_pos941(X,Y) get_csv_int((X),(Y),941)
+#define get_csv_llong_pos941(X,Y) get_csv_llong((X),(Y),941)
+#define get_csv_float_pos941(X,Y) get_csv_float((X),(Y),941)
+#define get_csv_uint_pos942(X,Y) get_csv_uint((X),(Y),942)
+#define get_csv_ullong_pos942(X,Y) get_csv_ullong((X),(Y),942)
+#define get_csv_ip_pos942(X,Y) get_csv_ip((X),(Y),942)
+#define get_csv_ipv6_pos942(X,Y) get_csv_ipv6((X),(Y),942)
+#define get_csv_string_pos942(X,Y) get_csv_string((X),(Y),942)
+#define get_csv_v_str_pos942(X,Y) get_csv_string((X),(Y),942)
+#define get_csv_bool_pos942(X,Y) get_csv_bool((X),(Y),942)
+#define get_csv_int_pos942(X,Y) get_csv_int((X),(Y),942)
+#define get_csv_llong_pos942(X,Y) get_csv_llong((X),(Y),942)
+#define get_csv_float_pos942(X,Y) get_csv_float((X),(Y),942)
+#define get_csv_uint_pos943(X,Y) get_csv_uint((X),(Y),943)
+#define get_csv_ullong_pos943(X,Y) get_csv_ullong((X),(Y),943)
+#define get_csv_ip_pos943(X,Y) get_csv_ip((X),(Y),943)
+#define get_csv_ipv6_pos943(X,Y) get_csv_ipv6((X),(Y),943)
+#define get_csv_string_pos943(X,Y) get_csv_string((X),(Y),943)
+#define get_csv_v_str_pos943(X,Y) get_csv_string((X),(Y),943)
+#define get_csv_bool_pos943(X,Y) get_csv_bool((X),(Y),943)
+#define get_csv_int_pos943(X,Y) get_csv_int((X),(Y),943)
+#define get_csv_llong_pos943(X,Y) get_csv_llong((X),(Y),943)
+#define get_csv_float_pos943(X,Y) get_csv_float((X),(Y),943)
+#define get_csv_uint_pos944(X,Y) get_csv_uint((X),(Y),944)
+#define get_csv_ullong_pos944(X,Y) get_csv_ullong((X),(Y),944)
+#define get_csv_ip_pos944(X,Y) get_csv_ip((X),(Y),944)
+#define get_csv_ipv6_pos944(X,Y) get_csv_ipv6((X),(Y),944)
+#define get_csv_string_pos944(X,Y) get_csv_string((X),(Y),944)
+#define get_csv_v_str_pos944(X,Y) get_csv_string((X),(Y),944)
+#define get_csv_bool_pos944(X,Y) get_csv_bool((X),(Y),944)
+#define get_csv_int_pos944(X,Y) get_csv_int((X),(Y),944)
+#define get_csv_llong_pos944(X,Y) get_csv_llong((X),(Y),944)
+#define get_csv_float_pos944(X,Y) get_csv_float((X),(Y),944)
+#define get_csv_uint_pos945(X,Y) get_csv_uint((X),(Y),945)
+#define get_csv_ullong_pos945(X,Y) get_csv_ullong((X),(Y),945)
+#define get_csv_ip_pos945(X,Y) get_csv_ip((X),(Y),945)
+#define get_csv_ipv6_pos945(X,Y) get_csv_ipv6((X),(Y),945)
+#define get_csv_string_pos945(X,Y) get_csv_string((X),(Y),945)
+#define get_csv_v_str_pos945(X,Y) get_csv_string((X),(Y),945)
+#define get_csv_bool_pos945(X,Y) get_csv_bool((X),(Y),945)
+#define get_csv_int_pos945(X,Y) get_csv_int((X),(Y),945)
+#define get_csv_llong_pos945(X,Y) get_csv_llong((X),(Y),945)
+#define get_csv_float_pos945(X,Y) get_csv_float((X),(Y),945)
+#define get_csv_uint_pos946(X,Y) get_csv_uint((X),(Y),946)
+#define get_csv_ullong_pos946(X,Y) get_csv_ullong((X),(Y),946)
+#define get_csv_ip_pos946(X,Y) get_csv_ip((X),(Y),946)
+#define get_csv_ipv6_pos946(X,Y) get_csv_ipv6((X),(Y),946)
+#define get_csv_string_pos946(X,Y) get_csv_string((X),(Y),946)
+#define get_csv_v_str_pos946(X,Y) get_csv_string((X),(Y),946)
+#define get_csv_bool_pos946(X,Y) get_csv_bool((X),(Y),946)
+#define get_csv_int_pos946(X,Y) get_csv_int((X),(Y),946)
+#define get_csv_llong_pos946(X,Y) get_csv_llong((X),(Y),946)
+#define get_csv_float_pos946(X,Y) get_csv_float((X),(Y),946)
+#define get_csv_uint_pos947(X,Y) get_csv_uint((X),(Y),947)
+#define get_csv_ullong_pos947(X,Y) get_csv_ullong((X),(Y),947)
+#define get_csv_ip_pos947(X,Y) get_csv_ip((X),(Y),947)
+#define get_csv_ipv6_pos947(X,Y) get_csv_ipv6((X),(Y),947)
+#define get_csv_string_pos947(X,Y) get_csv_string((X),(Y),947)
+#define get_csv_v_str_pos947(X,Y) get_csv_string((X),(Y),947)
+#define get_csv_bool_pos947(X,Y) get_csv_bool((X),(Y),947)
+#define get_csv_int_pos947(X,Y) get_csv_int((X),(Y),947)
+#define get_csv_llong_pos947(X,Y) get_csv_llong((X),(Y),947)
+#define get_csv_float_pos947(X,Y) get_csv_float((X),(Y),947)
+#define get_csv_uint_pos948(X,Y) get_csv_uint((X),(Y),948)
+#define get_csv_ullong_pos948(X,Y) get_csv_ullong((X),(Y),948)
+#define get_csv_ip_pos948(X,Y) get_csv_ip((X),(Y),948)
+#define get_csv_ipv6_pos948(X,Y) get_csv_ipv6((X),(Y),948)
+#define get_csv_string_pos948(X,Y) get_csv_string((X),(Y),948)
+#define get_csv_v_str_pos948(X,Y) get_csv_string((X),(Y),948)
+#define get_csv_bool_pos948(X,Y) get_csv_bool((X),(Y),948)
+#define get_csv_int_pos948(X,Y) get_csv_int((X),(Y),948)
+#define get_csv_llong_pos948(X,Y) get_csv_llong((X),(Y),948)
+#define get_csv_float_pos948(X,Y) get_csv_float((X),(Y),948)
+#define get_csv_uint_pos949(X,Y) get_csv_uint((X),(Y),949)
+#define get_csv_ullong_pos949(X,Y) get_csv_ullong((X),(Y),949)
+#define get_csv_ip_pos949(X,Y) get_csv_ip((X),(Y),949)
+#define get_csv_ipv6_pos949(X,Y) get_csv_ipv6((X),(Y),949)
+#define get_csv_string_pos949(X,Y) get_csv_string((X),(Y),949)
+#define get_csv_v_str_pos949(X,Y) get_csv_string((X),(Y),949)
+#define get_csv_bool_pos949(X,Y) get_csv_bool((X),(Y),949)
+#define get_csv_int_pos949(X,Y) get_csv_int((X),(Y),949)
+#define get_csv_llong_pos949(X,Y) get_csv_llong((X),(Y),949)
+#define get_csv_float_pos949(X,Y) get_csv_float((X),(Y),949)
+#define get_csv_uint_pos950(X,Y) get_csv_uint((X),(Y),950)
+#define get_csv_ullong_pos950(X,Y) get_csv_ullong((X),(Y),950)
+#define get_csv_ip_pos950(X,Y) get_csv_ip((X),(Y),950)
+#define get_csv_ipv6_pos950(X,Y) get_csv_ipv6((X),(Y),950)
+#define get_csv_string_pos950(X,Y) get_csv_string((X),(Y),950)
+#define get_csv_v_str_pos950(X,Y) get_csv_string((X),(Y),950)
+#define get_csv_bool_pos950(X,Y) get_csv_bool((X),(Y),950)
+#define get_csv_int_pos950(X,Y) get_csv_int((X),(Y),950)
+#define get_csv_llong_pos950(X,Y) get_csv_llong((X),(Y),950)
+#define get_csv_float_pos950(X,Y) get_csv_float((X),(Y),950)
+#define get_csv_uint_pos951(X,Y) get_csv_uint((X),(Y),951)
+#define get_csv_ullong_pos951(X,Y) get_csv_ullong((X),(Y),951)
+#define get_csv_ip_pos951(X,Y) get_csv_ip((X),(Y),951)
+#define get_csv_ipv6_pos951(X,Y) get_csv_ipv6((X),(Y),951)
+#define get_csv_string_pos951(X,Y) get_csv_string((X),(Y),951)
+#define get_csv_v_str_pos951(X,Y) get_csv_string((X),(Y),951)
+#define get_csv_bool_pos951(X,Y) get_csv_bool((X),(Y),951)
+#define get_csv_int_pos951(X,Y) get_csv_int((X),(Y),951)
+#define get_csv_llong_pos951(X,Y) get_csv_llong((X),(Y),951)
+#define get_csv_float_pos951(X,Y) get_csv_float((X),(Y),951)
+#define get_csv_uint_pos952(X,Y) get_csv_uint((X),(Y),952)
+#define get_csv_ullong_pos952(X,Y) get_csv_ullong((X),(Y),952)
+#define get_csv_ip_pos952(X,Y) get_csv_ip((X),(Y),952)
+#define get_csv_ipv6_pos952(X,Y) get_csv_ipv6((X),(Y),952)
+#define get_csv_string_pos952(X,Y) get_csv_string((X),(Y),952)
+#define get_csv_v_str_pos952(X,Y) get_csv_string((X),(Y),952)
+#define get_csv_bool_pos952(X,Y) get_csv_bool((X),(Y),952)
+#define get_csv_int_pos952(X,Y) get_csv_int((X),(Y),952)
+#define get_csv_llong_pos952(X,Y) get_csv_llong((X),(Y),952)
+#define get_csv_float_pos952(X,Y) get_csv_float((X),(Y),952)
+#define get_csv_uint_pos953(X,Y) get_csv_uint((X),(Y),953)
+#define get_csv_ullong_pos953(X,Y) get_csv_ullong((X),(Y),953)
+#define get_csv_ip_pos953(X,Y) get_csv_ip((X),(Y),953)
+#define get_csv_ipv6_pos953(X,Y) get_csv_ipv6((X),(Y),953)
+#define get_csv_string_pos953(X,Y) get_csv_string((X),(Y),953)
+#define get_csv_v_str_pos953(X,Y) get_csv_string((X),(Y),953)
+#define get_csv_bool_pos953(X,Y) get_csv_bool((X),(Y),953)
+#define get_csv_int_pos953(X,Y) get_csv_int((X),(Y),953)
+#define get_csv_llong_pos953(X,Y) get_csv_llong((X),(Y),953)
+#define get_csv_float_pos953(X,Y) get_csv_float((X),(Y),953)
+#define get_csv_uint_pos954(X,Y) get_csv_uint((X),(Y),954)
+#define get_csv_ullong_pos954(X,Y) get_csv_ullong((X),(Y),954)
+#define get_csv_ip_pos954(X,Y) get_csv_ip((X),(Y),954)
+#define get_csv_ipv6_pos954(X,Y) get_csv_ipv6((X),(Y),954)
+#define get_csv_string_pos954(X,Y) get_csv_string((X),(Y),954)
+#define get_csv_v_str_pos954(X,Y) get_csv_string((X),(Y),954)
+#define get_csv_bool_pos954(X,Y) get_csv_bool((X),(Y),954)
+#define get_csv_int_pos954(X,Y) get_csv_int((X),(Y),954)
+#define get_csv_llong_pos954(X,Y) get_csv_llong((X),(Y),954)
+#define get_csv_float_pos954(X,Y) get_csv_float((X),(Y),954)
+#define get_csv_uint_pos955(X,Y) get_csv_uint((X),(Y),955)
+#define get_csv_ullong_pos955(X,Y) get_csv_ullong((X),(Y),955)
+#define get_csv_ip_pos955(X,Y) get_csv_ip((X),(Y),955)
+#define get_csv_ipv6_pos955(X,Y) get_csv_ipv6((X),(Y),955)
+#define get_csv_string_pos955(X,Y) get_csv_string((X),(Y),955)
+#define get_csv_v_str_pos955(X,Y) get_csv_string((X),(Y),955)
+#define get_csv_bool_pos955(X,Y) get_csv_bool((X),(Y),955)
+#define get_csv_int_pos955(X,Y) get_csv_int((X),(Y),955)
+#define get_csv_llong_pos955(X,Y) get_csv_llong((X),(Y),955)
+#define get_csv_float_pos955(X,Y) get_csv_float((X),(Y),955)
+#define get_csv_uint_pos956(X,Y) get_csv_uint((X),(Y),956)
+#define get_csv_ullong_pos956(X,Y) get_csv_ullong((X),(Y),956)
+#define get_csv_ip_pos956(X,Y) get_csv_ip((X),(Y),956)
+#define get_csv_ipv6_pos956(X,Y) get_csv_ipv6((X),(Y),956)
+#define get_csv_string_pos956(X,Y) get_csv_string((X),(Y),956)
+#define get_csv_v_str_pos956(X,Y) get_csv_string((X),(Y),956)
+#define get_csv_bool_pos956(X,Y) get_csv_bool((X),(Y),956)
+#define get_csv_int_pos956(X,Y) get_csv_int((X),(Y),956)
+#define get_csv_llong_pos956(X,Y) get_csv_llong((X),(Y),956)
+#define get_csv_float_pos956(X,Y) get_csv_float((X),(Y),956)
+#define get_csv_uint_pos957(X,Y) get_csv_uint((X),(Y),957)
+#define get_csv_ullong_pos957(X,Y) get_csv_ullong((X),(Y),957)
+#define get_csv_ip_pos957(X,Y) get_csv_ip((X),(Y),957)
+#define get_csv_ipv6_pos957(X,Y) get_csv_ipv6((X),(Y),957)
+#define get_csv_string_pos957(X,Y) get_csv_string((X),(Y),957)
+#define get_csv_v_str_pos957(X,Y) get_csv_string((X),(Y),957)
+#define get_csv_bool_pos957(X,Y) get_csv_bool((X),(Y),957)
+#define get_csv_int_pos957(X,Y) get_csv_int((X),(Y),957)
+#define get_csv_llong_pos957(X,Y) get_csv_llong((X),(Y),957)
+#define get_csv_float_pos957(X,Y) get_csv_float((X),(Y),957)
+#define get_csv_uint_pos958(X,Y) get_csv_uint((X),(Y),958)
+#define get_csv_ullong_pos958(X,Y) get_csv_ullong((X),(Y),958)
+#define get_csv_ip_pos958(X,Y) get_csv_ip((X),(Y),958)
+#define get_csv_ipv6_pos958(X,Y) get_csv_ipv6((X),(Y),958)
+#define get_csv_string_pos958(X,Y) get_csv_string((X),(Y),958)
+#define get_csv_v_str_pos958(X,Y) get_csv_string((X),(Y),958)
+#define get_csv_bool_pos958(X,Y) get_csv_bool((X),(Y),958)
+#define get_csv_int_pos958(X,Y) get_csv_int((X),(Y),958)
+#define get_csv_llong_pos958(X,Y) get_csv_llong((X),(Y),958)
+#define get_csv_float_pos958(X,Y) get_csv_float((X),(Y),958)
+#define get_csv_uint_pos959(X,Y) get_csv_uint((X),(Y),959)
+#define get_csv_ullong_pos959(X,Y) get_csv_ullong((X),(Y),959)
+#define get_csv_ip_pos959(X,Y) get_csv_ip((X),(Y),959)
+#define get_csv_ipv6_pos959(X,Y) get_csv_ipv6((X),(Y),959)
+#define get_csv_string_pos959(X,Y) get_csv_string((X),(Y),959)
+#define get_csv_v_str_pos959(X,Y) get_csv_string((X),(Y),959)
+#define get_csv_bool_pos959(X,Y) get_csv_bool((X),(Y),959)
+#define get_csv_int_pos959(X,Y) get_csv_int((X),(Y),959)
+#define get_csv_llong_pos959(X,Y) get_csv_llong((X),(Y),959)
+#define get_csv_float_pos959(X,Y) get_csv_float((X),(Y),959)
+#define get_csv_uint_pos960(X,Y) get_csv_uint((X),(Y),960)
+#define get_csv_ullong_pos960(X,Y) get_csv_ullong((X),(Y),960)
+#define get_csv_ip_pos960(X,Y) get_csv_ip((X),(Y),960)
+#define get_csv_ipv6_pos960(X,Y) get_csv_ipv6((X),(Y),960)
+#define get_csv_string_pos960(X,Y) get_csv_string((X),(Y),960)
+#define get_csv_v_str_pos960(X,Y) get_csv_string((X),(Y),960)
+#define get_csv_bool_pos960(X,Y) get_csv_bool((X),(Y),960)
+#define get_csv_int_pos960(X,Y) get_csv_int((X),(Y),960)
+#define get_csv_llong_pos960(X,Y) get_csv_llong((X),(Y),960)
+#define get_csv_float_pos960(X,Y) get_csv_float((X),(Y),960)
+#define get_csv_uint_pos961(X,Y) get_csv_uint((X),(Y),961)
+#define get_csv_ullong_pos961(X,Y) get_csv_ullong((X),(Y),961)
+#define get_csv_ip_pos961(X,Y) get_csv_ip((X),(Y),961)
+#define get_csv_ipv6_pos961(X,Y) get_csv_ipv6((X),(Y),961)
+#define get_csv_string_pos961(X,Y) get_csv_string((X),(Y),961)
+#define get_csv_v_str_pos961(X,Y) get_csv_string((X),(Y),961)
+#define get_csv_bool_pos961(X,Y) get_csv_bool((X),(Y),961)
+#define get_csv_int_pos961(X,Y) get_csv_int((X),(Y),961)
+#define get_csv_llong_pos961(X,Y) get_csv_llong((X),(Y),961)
+#define get_csv_float_pos961(X,Y) get_csv_float((X),(Y),961)
+#define get_csv_uint_pos962(X,Y) get_csv_uint((X),(Y),962)
+#define get_csv_ullong_pos962(X,Y) get_csv_ullong((X),(Y),962)
+#define get_csv_ip_pos962(X,Y) get_csv_ip((X),(Y),962)
+#define get_csv_ipv6_pos962(X,Y) get_csv_ipv6((X),(Y),962)
+#define get_csv_string_pos962(X,Y) get_csv_string((X),(Y),962)
+#define get_csv_v_str_pos962(X,Y) get_csv_string((X),(Y),962)
+#define get_csv_bool_pos962(X,Y) get_csv_bool((X),(Y),962)
+#define get_csv_int_pos962(X,Y) get_csv_int((X),(Y),962)
+#define get_csv_llong_pos962(X,Y) get_csv_llong((X),(Y),962)
+#define get_csv_float_pos962(X,Y) get_csv_float((X),(Y),962)
+#define get_csv_uint_pos963(X,Y) get_csv_uint((X),(Y),963)
+#define get_csv_ullong_pos963(X,Y) get_csv_ullong((X),(Y),963)
+#define get_csv_ip_pos963(X,Y) get_csv_ip((X),(Y),963)
+#define get_csv_ipv6_pos963(X,Y) get_csv_ipv6((X),(Y),963)
+#define get_csv_string_pos963(X,Y) get_csv_string((X),(Y),963)
+#define get_csv_v_str_pos963(X,Y) get_csv_string((X),(Y),963)
+#define get_csv_bool_pos963(X,Y) get_csv_bool((X),(Y),963)
+#define get_csv_int_pos963(X,Y) get_csv_int((X),(Y),963)
+#define get_csv_llong_pos963(X,Y) get_csv_llong((X),(Y),963)
+#define get_csv_float_pos963(X,Y) get_csv_float((X),(Y),963)
+#define get_csv_uint_pos964(X,Y) get_csv_uint((X),(Y),964)
+#define get_csv_ullong_pos964(X,Y) get_csv_ullong((X),(Y),964)
+#define get_csv_ip_pos964(X,Y) get_csv_ip((X),(Y),964)
+#define get_csv_ipv6_pos964(X,Y) get_csv_ipv6((X),(Y),964)
+#define get_csv_string_pos964(X,Y) get_csv_string((X),(Y),964)
+#define get_csv_v_str_pos964(X,Y) get_csv_string((X),(Y),964)
+#define get_csv_bool_pos964(X,Y) get_csv_bool((X),(Y),964)
+#define get_csv_int_pos964(X,Y) get_csv_int((X),(Y),964)
+#define get_csv_llong_pos964(X,Y) get_csv_llong((X),(Y),964)
+#define get_csv_float_pos964(X,Y) get_csv_float((X),(Y),964)
+#define get_csv_uint_pos965(X,Y) get_csv_uint((X),(Y),965)
+#define get_csv_ullong_pos965(X,Y) get_csv_ullong((X),(Y),965)
+#define get_csv_ip_pos965(X,Y) get_csv_ip((X),(Y),965)
+#define get_csv_ipv6_pos965(X,Y) get_csv_ipv6((X),(Y),965)
+#define get_csv_string_pos965(X,Y) get_csv_string((X),(Y),965)
+#define get_csv_v_str_pos965(X,Y) get_csv_string((X),(Y),965)
+#define get_csv_bool_pos965(X,Y) get_csv_bool((X),(Y),965)
+#define get_csv_int_pos965(X,Y) get_csv_int((X),(Y),965)
+#define get_csv_llong_pos965(X,Y) get_csv_llong((X),(Y),965)
+#define get_csv_float_pos965(X,Y) get_csv_float((X),(Y),965)
+#define get_csv_uint_pos966(X,Y) get_csv_uint((X),(Y),966)
+#define get_csv_ullong_pos966(X,Y) get_csv_ullong((X),(Y),966)
+#define get_csv_ip_pos966(X,Y) get_csv_ip((X),(Y),966)
+#define get_csv_ipv6_pos966(X,Y) get_csv_ipv6((X),(Y),966)
+#define get_csv_string_pos966(X,Y) get_csv_string((X),(Y),966)
+#define get_csv_v_str_pos966(X,Y) get_csv_string((X),(Y),966)
+#define get_csv_bool_pos966(X,Y) get_csv_bool((X),(Y),966)
+#define get_csv_int_pos966(X,Y) get_csv_int((X),(Y),966)
+#define get_csv_llong_pos966(X,Y) get_csv_llong((X),(Y),966)
+#define get_csv_float_pos966(X,Y) get_csv_float((X),(Y),966)
+#define get_csv_uint_pos967(X,Y) get_csv_uint((X),(Y),967)
+#define get_csv_ullong_pos967(X,Y) get_csv_ullong((X),(Y),967)
+#define get_csv_ip_pos967(X,Y) get_csv_ip((X),(Y),967)
+#define get_csv_ipv6_pos967(X,Y) get_csv_ipv6((X),(Y),967)
+#define get_csv_string_pos967(X,Y) get_csv_string((X),(Y),967)
+#define get_csv_v_str_pos967(X,Y) get_csv_string((X),(Y),967)
+#define get_csv_bool_pos967(X,Y) get_csv_bool((X),(Y),967)
+#define get_csv_int_pos967(X,Y) get_csv_int((X),(Y),967)
+#define get_csv_llong_pos967(X,Y) get_csv_llong((X),(Y),967)
+#define get_csv_float_pos967(X,Y) get_csv_float((X),(Y),967)
+#define get_csv_uint_pos968(X,Y) get_csv_uint((X),(Y),968)
+#define get_csv_ullong_pos968(X,Y) get_csv_ullong((X),(Y),968)
+#define get_csv_ip_pos968(X,Y) get_csv_ip((X),(Y),968)
+#define get_csv_ipv6_pos968(X,Y) get_csv_ipv6((X),(Y),968)
+#define get_csv_string_pos968(X,Y) get_csv_string((X),(Y),968)
+#define get_csv_v_str_pos968(X,Y) get_csv_string((X),(Y),968)
+#define get_csv_bool_pos968(X,Y) get_csv_bool((X),(Y),968)
+#define get_csv_int_pos968(X,Y) get_csv_int((X),(Y),968)
+#define get_csv_llong_pos968(X,Y) get_csv_llong((X),(Y),968)
+#define get_csv_float_pos968(X,Y) get_csv_float((X),(Y),968)
+#define get_csv_uint_pos969(X,Y) get_csv_uint((X),(Y),969)
+#define get_csv_ullong_pos969(X,Y) get_csv_ullong((X),(Y),969)
+#define get_csv_ip_pos969(X,Y) get_csv_ip((X),(Y),969)
+#define get_csv_ipv6_pos969(X,Y) get_csv_ipv6((X),(Y),969)
+#define get_csv_string_pos969(X,Y) get_csv_string((X),(Y),969)
+#define get_csv_v_str_pos969(X,Y) get_csv_string((X),(Y),969)
+#define get_csv_bool_pos969(X,Y) get_csv_bool((X),(Y),969)
+#define get_csv_int_pos969(X,Y) get_csv_int((X),(Y),969)
+#define get_csv_llong_pos969(X,Y) get_csv_llong((X),(Y),969)
+#define get_csv_float_pos969(X,Y) get_csv_float((X),(Y),969)
+#define get_csv_uint_pos970(X,Y) get_csv_uint((X),(Y),970)
+#define get_csv_ullong_pos970(X,Y) get_csv_ullong((X),(Y),970)
+#define get_csv_ip_pos970(X,Y) get_csv_ip((X),(Y),970)
+#define get_csv_ipv6_pos970(X,Y) get_csv_ipv6((X),(Y),970)
+#define get_csv_string_pos970(X,Y) get_csv_string((X),(Y),970)
+#define get_csv_v_str_pos970(X,Y) get_csv_string((X),(Y),970)
+#define get_csv_bool_pos970(X,Y) get_csv_bool((X),(Y),970)
+#define get_csv_int_pos970(X,Y) get_csv_int((X),(Y),970)
+#define get_csv_llong_pos970(X,Y) get_csv_llong((X),(Y),970)
+#define get_csv_float_pos970(X,Y) get_csv_float((X),(Y),970)
+#define get_csv_uint_pos971(X,Y) get_csv_uint((X),(Y),971)
+#define get_csv_ullong_pos971(X,Y) get_csv_ullong((X),(Y),971)
+#define get_csv_ip_pos971(X,Y) get_csv_ip((X),(Y),971)
+#define get_csv_ipv6_pos971(X,Y) get_csv_ipv6((X),(Y),971)
+#define get_csv_string_pos971(X,Y) get_csv_string((X),(Y),971)
+#define get_csv_v_str_pos971(X,Y) get_csv_string((X),(Y),971)
+#define get_csv_bool_pos971(X,Y) get_csv_bool((X),(Y),971)
+#define get_csv_int_pos971(X,Y) get_csv_int((X),(Y),971)
+#define get_csv_llong_pos971(X,Y) get_csv_llong((X),(Y),971)
+#define get_csv_float_pos971(X,Y) get_csv_float((X),(Y),971)
+#define get_csv_uint_pos972(X,Y) get_csv_uint((X),(Y),972)
+#define get_csv_ullong_pos972(X,Y) get_csv_ullong((X),(Y),972)
+#define get_csv_ip_pos972(X,Y) get_csv_ip((X),(Y),972)
+#define get_csv_ipv6_pos972(X,Y) get_csv_ipv6((X),(Y),972)
+#define get_csv_string_pos972(X,Y) get_csv_string((X),(Y),972)
+#define get_csv_v_str_pos972(X,Y) get_csv_string((X),(Y),972)
+#define get_csv_bool_pos972(X,Y) get_csv_bool((X),(Y),972)
+#define get_csv_int_pos972(X,Y) get_csv_int((X),(Y),972)
+#define get_csv_llong_pos972(X,Y) get_csv_llong((X),(Y),972)
+#define get_csv_float_pos972(X,Y) get_csv_float((X),(Y),972)
+#define get_csv_uint_pos973(X,Y) get_csv_uint((X),(Y),973)
+#define get_csv_ullong_pos973(X,Y) get_csv_ullong((X),(Y),973)
+#define get_csv_ip_pos973(X,Y) get_csv_ip((X),(Y),973)
+#define get_csv_ipv6_pos973(X,Y) get_csv_ipv6((X),(Y),973)
+#define get_csv_string_pos973(X,Y) get_csv_string((X),(Y),973)
+#define get_csv_v_str_pos973(X,Y) get_csv_string((X),(Y),973)
+#define get_csv_bool_pos973(X,Y) get_csv_bool((X),(Y),973)
+#define get_csv_int_pos973(X,Y) get_csv_int((X),(Y),973)
+#define get_csv_llong_pos973(X,Y) get_csv_llong((X),(Y),973)
+#define get_csv_float_pos973(X,Y) get_csv_float((X),(Y),973)
+#define get_csv_uint_pos974(X,Y) get_csv_uint((X),(Y),974)
+#define get_csv_ullong_pos974(X,Y) get_csv_ullong((X),(Y),974)
+#define get_csv_ip_pos974(X,Y) get_csv_ip((X),(Y),974)
+#define get_csv_ipv6_pos974(X,Y) get_csv_ipv6((X),(Y),974)
+#define get_csv_string_pos974(X,Y) get_csv_string((X),(Y),974)
+#define get_csv_v_str_pos974(X,Y) get_csv_string((X),(Y),974)
+#define get_csv_bool_pos974(X,Y) get_csv_bool((X),(Y),974)
+#define get_csv_int_pos974(X,Y) get_csv_int((X),(Y),974)
+#define get_csv_llong_pos974(X,Y) get_csv_llong((X),(Y),974)
+#define get_csv_float_pos974(X,Y) get_csv_float((X),(Y),974)
+#define get_csv_uint_pos975(X,Y) get_csv_uint((X),(Y),975)
+#define get_csv_ullong_pos975(X,Y) get_csv_ullong((X),(Y),975)
+#define get_csv_ip_pos975(X,Y) get_csv_ip((X),(Y),975)
+#define get_csv_ipv6_pos975(X,Y) get_csv_ipv6((X),(Y),975)
+#define get_csv_string_pos975(X,Y) get_csv_string((X),(Y),975)
+#define get_csv_v_str_pos975(X,Y) get_csv_string((X),(Y),975)
+#define get_csv_bool_pos975(X,Y) get_csv_bool((X),(Y),975)
+#define get_csv_int_pos975(X,Y) get_csv_int((X),(Y),975)
+#define get_csv_llong_pos975(X,Y) get_csv_llong((X),(Y),975)
+#define get_csv_float_pos975(X,Y) get_csv_float((X),(Y),975)
+#define get_csv_uint_pos976(X,Y) get_csv_uint((X),(Y),976)
+#define get_csv_ullong_pos976(X,Y) get_csv_ullong((X),(Y),976)
+#define get_csv_ip_pos976(X,Y) get_csv_ip((X),(Y),976)
+#define get_csv_ipv6_pos976(X,Y) get_csv_ipv6((X),(Y),976)
+#define get_csv_string_pos976(X,Y) get_csv_string((X),(Y),976)
+#define get_csv_v_str_pos976(X,Y) get_csv_string((X),(Y),976)
+#define get_csv_bool_pos976(X,Y) get_csv_bool((X),(Y),976)
+#define get_csv_int_pos976(X,Y) get_csv_int((X),(Y),976)
+#define get_csv_llong_pos976(X,Y) get_csv_llong((X),(Y),976)
+#define get_csv_float_pos976(X,Y) get_csv_float((X),(Y),976)
+#define get_csv_uint_pos977(X,Y) get_csv_uint((X),(Y),977)
+#define get_csv_ullong_pos977(X,Y) get_csv_ullong((X),(Y),977)
+#define get_csv_ip_pos977(X,Y) get_csv_ip((X),(Y),977)
+#define get_csv_ipv6_pos977(X,Y) get_csv_ipv6((X),(Y),977)
+#define get_csv_string_pos977(X,Y) get_csv_string((X),(Y),977)
+#define get_csv_v_str_pos977(X,Y) get_csv_string((X),(Y),977)
+#define get_csv_bool_pos977(X,Y) get_csv_bool((X),(Y),977)
+#define get_csv_int_pos977(X,Y) get_csv_int((X),(Y),977)
+#define get_csv_llong_pos977(X,Y) get_csv_llong((X),(Y),977)
+#define get_csv_float_pos977(X,Y) get_csv_float((X),(Y),977)
+#define get_csv_uint_pos978(X,Y) get_csv_uint((X),(Y),978)
+#define get_csv_ullong_pos978(X,Y) get_csv_ullong((X),(Y),978)
+#define get_csv_ip_pos978(X,Y) get_csv_ip((X),(Y),978)
+#define get_csv_ipv6_pos978(X,Y) get_csv_ipv6((X),(Y),978)
+#define get_csv_string_pos978(X,Y) get_csv_string((X),(Y),978)
+#define get_csv_v_str_pos978(X,Y) get_csv_string((X),(Y),978)
+#define get_csv_bool_pos978(X,Y) get_csv_bool((X),(Y),978)
+#define get_csv_int_pos978(X,Y) get_csv_int((X),(Y),978)
+#define get_csv_llong_pos978(X,Y) get_csv_llong((X),(Y),978)
+#define get_csv_float_pos978(X,Y) get_csv_float((X),(Y),978)
+#define get_csv_uint_pos979(X,Y) get_csv_uint((X),(Y),979)
+#define get_csv_ullong_pos979(X,Y) get_csv_ullong((X),(Y),979)
+#define get_csv_ip_pos979(X,Y) get_csv_ip((X),(Y),979)
+#define get_csv_ipv6_pos979(X,Y) get_csv_ipv6((X),(Y),979)
+#define get_csv_string_pos979(X,Y) get_csv_string((X),(Y),979)
+#define get_csv_v_str_pos979(X,Y) get_csv_string((X),(Y),979)
+#define get_csv_bool_pos979(X,Y) get_csv_bool((X),(Y),979)
+#define get_csv_int_pos979(X,Y) get_csv_int((X),(Y),979)
+#define get_csv_llong_pos979(X,Y) get_csv_llong((X),(Y),979)
+#define get_csv_float_pos979(X,Y) get_csv_float((X),(Y),979)
+#define get_csv_uint_pos980(X,Y) get_csv_uint((X),(Y),980)
+#define get_csv_ullong_pos980(X,Y) get_csv_ullong((X),(Y),980)
+#define get_csv_ip_pos980(X,Y) get_csv_ip((X),(Y),980)
+#define get_csv_ipv6_pos980(X,Y) get_csv_ipv6((X),(Y),980)
+#define get_csv_string_pos980(X,Y) get_csv_string((X),(Y),980)
+#define get_csv_v_str_pos980(X,Y) get_csv_string((X),(Y),980)
+#define get_csv_bool_pos980(X,Y) get_csv_bool((X),(Y),980)
+#define get_csv_int_pos980(X,Y) get_csv_int((X),(Y),980)
+#define get_csv_llong_pos980(X,Y) get_csv_llong((X),(Y),980)
+#define get_csv_float_pos980(X,Y) get_csv_float((X),(Y),980)
+#define get_csv_uint_pos981(X,Y) get_csv_uint((X),(Y),981)
+#define get_csv_ullong_pos981(X,Y) get_csv_ullong((X),(Y),981)
+#define get_csv_ip_pos981(X,Y) get_csv_ip((X),(Y),981)
+#define get_csv_ipv6_pos981(X,Y) get_csv_ipv6((X),(Y),981)
+#define get_csv_string_pos981(X,Y) get_csv_string((X),(Y),981)
+#define get_csv_v_str_pos981(X,Y) get_csv_string((X),(Y),981)
+#define get_csv_bool_pos981(X,Y) get_csv_bool((X),(Y),981)
+#define get_csv_int_pos981(X,Y) get_csv_int((X),(Y),981)
+#define get_csv_llong_pos981(X,Y) get_csv_llong((X),(Y),981)
+#define get_csv_float_pos981(X,Y) get_csv_float((X),(Y),981)
+#define get_csv_uint_pos982(X,Y) get_csv_uint((X),(Y),982)
+#define get_csv_ullong_pos982(X,Y) get_csv_ullong((X),(Y),982)
+#define get_csv_ip_pos982(X,Y) get_csv_ip((X),(Y),982)
+#define get_csv_ipv6_pos982(X,Y) get_csv_ipv6((X),(Y),982)
+#define get_csv_string_pos982(X,Y) get_csv_string((X),(Y),982)
+#define get_csv_v_str_pos982(X,Y) get_csv_string((X),(Y),982)
+#define get_csv_bool_pos982(X,Y) get_csv_bool((X),(Y),982)
+#define get_csv_int_pos982(X,Y) get_csv_int((X),(Y),982)
+#define get_csv_llong_pos982(X,Y) get_csv_llong((X),(Y),982)
+#define get_csv_float_pos982(X,Y) get_csv_float((X),(Y),982)
+#define get_csv_uint_pos983(X,Y) get_csv_uint((X),(Y),983)
+#define get_csv_ullong_pos983(X,Y) get_csv_ullong((X),(Y),983)
+#define get_csv_ip_pos983(X,Y) get_csv_ip((X),(Y),983)
+#define get_csv_ipv6_pos983(X,Y) get_csv_ipv6((X),(Y),983)
+#define get_csv_string_pos983(X,Y) get_csv_string((X),(Y),983)
+#define get_csv_v_str_pos983(X,Y) get_csv_string((X),(Y),983)
+#define get_csv_bool_pos983(X,Y) get_csv_bool((X),(Y),983)
+#define get_csv_int_pos983(X,Y) get_csv_int((X),(Y),983)
+#define get_csv_llong_pos983(X,Y) get_csv_llong((X),(Y),983)
+#define get_csv_float_pos983(X,Y) get_csv_float((X),(Y),983)
+#define get_csv_uint_pos984(X,Y) get_csv_uint((X),(Y),984)
+#define get_csv_ullong_pos984(X,Y) get_csv_ullong((X),(Y),984)
+#define get_csv_ip_pos984(X,Y) get_csv_ip((X),(Y),984)
+#define get_csv_ipv6_pos984(X,Y) get_csv_ipv6((X),(Y),984)
+#define get_csv_string_pos984(X,Y) get_csv_string((X),(Y),984)
+#define get_csv_v_str_pos984(X,Y) get_csv_string((X),(Y),984)
+#define get_csv_bool_pos984(X,Y) get_csv_bool((X),(Y),984)
+#define get_csv_int_pos984(X,Y) get_csv_int((X),(Y),984)
+#define get_csv_llong_pos984(X,Y) get_csv_llong((X),(Y),984)
+#define get_csv_float_pos984(X,Y) get_csv_float((X),(Y),984)
+#define get_csv_uint_pos985(X,Y) get_csv_uint((X),(Y),985)
+#define get_csv_ullong_pos985(X,Y) get_csv_ullong((X),(Y),985)
+#define get_csv_ip_pos985(X,Y) get_csv_ip((X),(Y),985)
+#define get_csv_ipv6_pos985(X,Y) get_csv_ipv6((X),(Y),985)
+#define get_csv_string_pos985(X,Y) get_csv_string((X),(Y),985)
+#define get_csv_v_str_pos985(X,Y) get_csv_string((X),(Y),985)
+#define get_csv_bool_pos985(X,Y) get_csv_bool((X),(Y),985)
+#define get_csv_int_pos985(X,Y) get_csv_int((X),(Y),985)
+#define get_csv_llong_pos985(X,Y) get_csv_llong((X),(Y),985)
+#define get_csv_float_pos985(X,Y) get_csv_float((X),(Y),985)
+#define get_csv_uint_pos986(X,Y) get_csv_uint((X),(Y),986)
+#define get_csv_ullong_pos986(X,Y) get_csv_ullong((X),(Y),986)
+#define get_csv_ip_pos986(X,Y) get_csv_ip((X),(Y),986)
+#define get_csv_ipv6_pos986(X,Y) get_csv_ipv6((X),(Y),986)
+#define get_csv_string_pos986(X,Y) get_csv_string((X),(Y),986)
+#define get_csv_v_str_pos986(X,Y) get_csv_string((X),(Y),986)
+#define get_csv_bool_pos986(X,Y) get_csv_bool((X),(Y),986)
+#define get_csv_int_pos986(X,Y) get_csv_int((X),(Y),986)
+#define get_csv_llong_pos986(X,Y) get_csv_llong((X),(Y),986)
+#define get_csv_float_pos986(X,Y) get_csv_float((X),(Y),986)
+#define get_csv_uint_pos987(X,Y) get_csv_uint((X),(Y),987)
+#define get_csv_ullong_pos987(X,Y) get_csv_ullong((X),(Y),987)
+#define get_csv_ip_pos987(X,Y) get_csv_ip((X),(Y),987)
+#define get_csv_ipv6_pos987(X,Y) get_csv_ipv6((X),(Y),987)
+#define get_csv_string_pos987(X,Y) get_csv_string((X),(Y),987)
+#define get_csv_v_str_pos987(X,Y) get_csv_string((X),(Y),987)
+#define get_csv_bool_pos987(X,Y) get_csv_bool((X),(Y),987)
+#define get_csv_int_pos987(X,Y) get_csv_int((X),(Y),987)
+#define get_csv_llong_pos987(X,Y) get_csv_llong((X),(Y),987)
+#define get_csv_float_pos987(X,Y) get_csv_float((X),(Y),987)
+#define get_csv_uint_pos988(X,Y) get_csv_uint((X),(Y),988)
+#define get_csv_ullong_pos988(X,Y) get_csv_ullong((X),(Y),988)
+#define get_csv_ip_pos988(X,Y) get_csv_ip((X),(Y),988)
+#define get_csv_ipv6_pos988(X,Y) get_csv_ipv6((X),(Y),988)
+#define get_csv_string_pos988(X,Y) get_csv_string((X),(Y),988)
+#define get_csv_v_str_pos988(X,Y) get_csv_string((X),(Y),988)
+#define get_csv_bool_pos988(X,Y) get_csv_bool((X),(Y),988)
+#define get_csv_int_pos988(X,Y) get_csv_int((X),(Y),988)
+#define get_csv_llong_pos988(X,Y) get_csv_llong((X),(Y),988)
+#define get_csv_float_pos988(X,Y) get_csv_float((X),(Y),988)
+#define get_csv_uint_pos989(X,Y) get_csv_uint((X),(Y),989)
+#define get_csv_ullong_pos989(X,Y) get_csv_ullong((X),(Y),989)
+#define get_csv_ip_pos989(X,Y) get_csv_ip((X),(Y),989)
+#define get_csv_ipv6_pos989(X,Y) get_csv_ipv6((X),(Y),989)
+#define get_csv_string_pos989(X,Y) get_csv_string((X),(Y),989)
+#define get_csv_v_str_pos989(X,Y) get_csv_string((X),(Y),989)
+#define get_csv_bool_pos989(X,Y) get_csv_bool((X),(Y),989)
+#define get_csv_int_pos989(X,Y) get_csv_int((X),(Y),989)
+#define get_csv_llong_pos989(X,Y) get_csv_llong((X),(Y),989)
+#define get_csv_float_pos989(X,Y) get_csv_float((X),(Y),989)
+#define get_csv_uint_pos990(X,Y) get_csv_uint((X),(Y),990)
+#define get_csv_ullong_pos990(X,Y) get_csv_ullong((X),(Y),990)
+#define get_csv_ip_pos990(X,Y) get_csv_ip((X),(Y),990)
+#define get_csv_ipv6_pos990(X,Y) get_csv_ipv6((X),(Y),990)
+#define get_csv_string_pos990(X,Y) get_csv_string((X),(Y),990)
+#define get_csv_v_str_pos990(X,Y) get_csv_string((X),(Y),990)
+#define get_csv_bool_pos990(X,Y) get_csv_bool((X),(Y),990)
+#define get_csv_int_pos990(X,Y) get_csv_int((X),(Y),990)
+#define get_csv_llong_pos990(X,Y) get_csv_llong((X),(Y),990)
+#define get_csv_float_pos990(X,Y) get_csv_float((X),(Y),990)
+#define get_csv_uint_pos991(X,Y) get_csv_uint((X),(Y),991)
+#define get_csv_ullong_pos991(X,Y) get_csv_ullong((X),(Y),991)
+#define get_csv_ip_pos991(X,Y) get_csv_ip((X),(Y),991)
+#define get_csv_ipv6_pos991(X,Y) get_csv_ipv6((X),(Y),991)
+#define get_csv_string_pos991(X,Y) get_csv_string((X),(Y),991)
+#define get_csv_v_str_pos991(X,Y) get_csv_string((X),(Y),991)
+#define get_csv_bool_pos991(X,Y) get_csv_bool((X),(Y),991)
+#define get_csv_int_pos991(X,Y) get_csv_int((X),(Y),991)
+#define get_csv_llong_pos991(X,Y) get_csv_llong((X),(Y),991)
+#define get_csv_float_pos991(X,Y) get_csv_float((X),(Y),991)
+#define get_csv_uint_pos992(X,Y) get_csv_uint((X),(Y),992)
+#define get_csv_ullong_pos992(X,Y) get_csv_ullong((X),(Y),992)
+#define get_csv_ip_pos992(X,Y) get_csv_ip((X),(Y),992)
+#define get_csv_ipv6_pos992(X,Y) get_csv_ipv6((X),(Y),992)
+#define get_csv_string_pos992(X,Y) get_csv_string((X),(Y),992)
+#define get_csv_v_str_pos992(X,Y) get_csv_string((X),(Y),992)
+#define get_csv_bool_pos992(X,Y) get_csv_bool((X),(Y),992)
+#define get_csv_int_pos992(X,Y) get_csv_int((X),(Y),992)
+#define get_csv_llong_pos992(X,Y) get_csv_llong((X),(Y),992)
+#define get_csv_float_pos992(X,Y) get_csv_float((X),(Y),992)
+#define get_csv_uint_pos993(X,Y) get_csv_uint((X),(Y),993)
+#define get_csv_ullong_pos993(X,Y) get_csv_ullong((X),(Y),993)
+#define get_csv_ip_pos993(X,Y) get_csv_ip((X),(Y),993)
+#define get_csv_ipv6_pos993(X,Y) get_csv_ipv6((X),(Y),993)
+#define get_csv_string_pos993(X,Y) get_csv_string((X),(Y),993)
+#define get_csv_v_str_pos993(X,Y) get_csv_string((X),(Y),993)
+#define get_csv_bool_pos993(X,Y) get_csv_bool((X),(Y),993)
+#define get_csv_int_pos993(X,Y) get_csv_int((X),(Y),993)
+#define get_csv_llong_pos993(X,Y) get_csv_llong((X),(Y),993)
+#define get_csv_float_pos993(X,Y) get_csv_float((X),(Y),993)
+#define get_csv_uint_pos994(X,Y) get_csv_uint((X),(Y),994)
+#define get_csv_ullong_pos994(X,Y) get_csv_ullong((X),(Y),994)
+#define get_csv_ip_pos994(X,Y) get_csv_ip((X),(Y),994)
+#define get_csv_ipv6_pos994(X,Y) get_csv_ipv6((X),(Y),994)
+#define get_csv_string_pos994(X,Y) get_csv_string((X),(Y),994)
+#define get_csv_v_str_pos994(X,Y) get_csv_string((X),(Y),994)
+#define get_csv_bool_pos994(X,Y) get_csv_bool((X),(Y),994)
+#define get_csv_int_pos994(X,Y) get_csv_int((X),(Y),994)
+#define get_csv_llong_pos994(X,Y) get_csv_llong((X),(Y),994)
+#define get_csv_float_pos994(X,Y) get_csv_float((X),(Y),994)
+#define get_csv_uint_pos995(X,Y) get_csv_uint((X),(Y),995)
+#define get_csv_ullong_pos995(X,Y) get_csv_ullong((X),(Y),995)
+#define get_csv_ip_pos995(X,Y) get_csv_ip((X),(Y),995)
+#define get_csv_ipv6_pos995(X,Y) get_csv_ipv6((X),(Y),995)
+#define get_csv_string_pos995(X,Y) get_csv_string((X),(Y),995)
+#define get_csv_v_str_pos995(X,Y) get_csv_string((X),(Y),995)
+#define get_csv_bool_pos995(X,Y) get_csv_bool((X),(Y),995)
+#define get_csv_int_pos995(X,Y) get_csv_int((X),(Y),995)
+#define get_csv_llong_pos995(X,Y) get_csv_llong((X),(Y),995)
+#define get_csv_float_pos995(X,Y) get_csv_float((X),(Y),995)
+#define get_csv_uint_pos996(X,Y) get_csv_uint((X),(Y),996)
+#define get_csv_ullong_pos996(X,Y) get_csv_ullong((X),(Y),996)
+#define get_csv_ip_pos996(X,Y) get_csv_ip((X),(Y),996)
+#define get_csv_ipv6_pos996(X,Y) get_csv_ipv6((X),(Y),996)
+#define get_csv_string_pos996(X,Y) get_csv_string((X),(Y),996)
+#define get_csv_v_str_pos996(X,Y) get_csv_string((X),(Y),996)
+#define get_csv_bool_pos996(X,Y) get_csv_bool((X),(Y),996)
+#define get_csv_int_pos996(X,Y) get_csv_int((X),(Y),996)
+#define get_csv_llong_pos996(X,Y) get_csv_llong((X),(Y),996)
+#define get_csv_float_pos996(X,Y) get_csv_float((X),(Y),996)
+#define get_csv_uint_pos997(X,Y) get_csv_uint((X),(Y),997)
+#define get_csv_ullong_pos997(X,Y) get_csv_ullong((X),(Y),997)
+#define get_csv_ip_pos997(X,Y) get_csv_ip((X),(Y),997)
+#define get_csv_ipv6_pos997(X,Y) get_csv_ipv6((X),(Y),997)
+#define get_csv_string_pos997(X,Y) get_csv_string((X),(Y),997)
+#define get_csv_v_str_pos997(X,Y) get_csv_string((X),(Y),997)
+#define get_csv_bool_pos997(X,Y) get_csv_bool((X),(Y),997)
+#define get_csv_int_pos997(X,Y) get_csv_int((X),(Y),997)
+#define get_csv_llong_pos997(X,Y) get_csv_llong((X),(Y),997)
+#define get_csv_float_pos997(X,Y) get_csv_float((X),(Y),997)
+#define get_csv_uint_pos998(X,Y) get_csv_uint((X),(Y),998)
+#define get_csv_ullong_pos998(X,Y) get_csv_ullong((X),(Y),998)
+#define get_csv_ip_pos998(X,Y) get_csv_ip((X),(Y),998)
+#define get_csv_ipv6_pos998(X,Y) get_csv_ipv6((X),(Y),998)
+#define get_csv_string_pos998(X,Y) get_csv_string((X),(Y),998)
+#define get_csv_v_str_pos998(X,Y) get_csv_string((X),(Y),998)
+#define get_csv_bool_pos998(X,Y) get_csv_bool((X),(Y),998)
+#define get_csv_int_pos998(X,Y) get_csv_int((X),(Y),998)
+#define get_csv_llong_pos998(X,Y) get_csv_llong((X),(Y),998)
+#define get_csv_float_pos998(X,Y) get_csv_float((X),(Y),998)
+#define get_csv_uint_pos999(X,Y) get_csv_uint((X),(Y),999)
+#define get_csv_ullong_pos999(X,Y) get_csv_ullong((X),(Y),999)
+#define get_csv_ip_pos999(X,Y) get_csv_ip((X),(Y),999)
+#define get_csv_ipv6_pos999(X,Y) get_csv_ipv6((X),(Y),999)
+#define get_csv_string_pos999(X,Y) get_csv_string((X),(Y),999)
+#define get_csv_v_str_pos999(X,Y) get_csv_string((X),(Y),999)
+#define get_csv_bool_pos999(X,Y) get_csv_bool((X),(Y),999)
+#define get_csv_int_pos999(X,Y) get_csv_int((X),(Y),999)
+#define get_csv_llong_pos999(X,Y) get_csv_llong((X),(Y),999)
+#define get_csv_float_pos999(X,Y) get_csv_float((X),(Y),999)
+#define get_csv_uint_pos1000(X,Y) get_csv_uint((X),(Y),1000)
+#define get_csv_ullong_pos1000(X,Y) get_csv_ullong((X),(Y),1000)
+#define get_csv_ip_pos1000(X,Y) get_csv_ip((X),(Y),1000)
+#define get_csv_ipv6_pos1000(X,Y) get_csv_ipv6((X),(Y),1000)
+#define get_csv_string_pos1000(X,Y) get_csv_string((X),(Y),1000)
+#define get_csv_v_str_pos1000(X,Y) get_csv_string((X),(Y),1000)
+#define get_csv_bool_pos1000(X,Y) get_csv_bool((X),(Y),1000)
+#define get_csv_int_pos1000(X,Y) get_csv_int((X),(Y),1000)
+#define get_csv_llong_pos1000(X,Y) get_csv_llong((X),(Y),1000)
+#define get_csv_float_pos1000(X,Y) get_csv_float((X),(Y),1000)
+#endif
diff --git a/include/lfta/gdat_macro.h b/include/lfta/gdat_macro.h
new file mode 100644 (file)
index 0000000..971f833
--- /dev/null
@@ -0,0 +1,10017 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef GDAT_MACRO_H
+#define GDAT_MACRO_H
+#define get_gdat_uint_pos1(X,Y) get_gdat_uint((X),(Y),1)
+#define get_gdat_ullong_pos1(X,Y) get_gdat_ullong((X),(Y),1)
+#define get_gdat_ip_pos1(X,Y) get_gdat_ip((X),(Y),1)
+#define get_gdat_ipv6_pos1(X,Y) get_gdat_ipv6((X),(Y),1)
+#define get_gdat_string_pos1(X,Y) get_gdat_string((X),(Y),1)
+#define get_gdat_v_str_pos1(X,Y) get_gdat_string((X),(Y),1)
+#define get_gdat_bool_pos1(X,Y) get_gdat_bool((X),(Y),1)
+#define get_gdat_int_pos1(X,Y) get_gdat_int((X),(Y),1)
+#define get_gdat_llong_pos1(X,Y) get_gdat_llong((X),(Y),1)
+#define get_gdat_float_pos1(X,Y) get_gdat_float((X),(Y),1)
+#define get_gdat_uint_pos2(X,Y) get_gdat_uint((X),(Y),2)
+#define get_gdat_ullong_pos2(X,Y) get_gdat_ullong((X),(Y),2)
+#define get_gdat_ip_pos2(X,Y) get_gdat_ip((X),(Y),2)
+#define get_gdat_ipv6_pos2(X,Y) get_gdat_ipv6((X),(Y),2)
+#define get_gdat_string_pos2(X,Y) get_gdat_string((X),(Y),2)
+#define get_gdat_v_str_pos2(X,Y) get_gdat_string((X),(Y),2)
+#define get_gdat_bool_pos2(X,Y) get_gdat_bool((X),(Y),2)
+#define get_gdat_int_pos2(X,Y) get_gdat_int((X),(Y),2)
+#define get_gdat_llong_pos2(X,Y) get_gdat_llong((X),(Y),2)
+#define get_gdat_float_pos2(X,Y) get_gdat_float((X),(Y),2)
+#define get_gdat_uint_pos3(X,Y) get_gdat_uint((X),(Y),3)
+#define get_gdat_ullong_pos3(X,Y) get_gdat_ullong((X),(Y),3)
+#define get_gdat_ip_pos3(X,Y) get_gdat_ip((X),(Y),3)
+#define get_gdat_ipv6_pos3(X,Y) get_gdat_ipv6((X),(Y),3)
+#define get_gdat_string_pos3(X,Y) get_gdat_string((X),(Y),3)
+#define get_gdat_v_str_pos3(X,Y) get_gdat_string((X),(Y),3)
+#define get_gdat_bool_pos3(X,Y) get_gdat_bool((X),(Y),3)
+#define get_gdat_int_pos3(X,Y) get_gdat_int((X),(Y),3)
+#define get_gdat_llong_pos3(X,Y) get_gdat_llong((X),(Y),3)
+#define get_gdat_float_pos3(X,Y) get_gdat_float((X),(Y),3)
+#define get_gdat_uint_pos4(X,Y) get_gdat_uint((X),(Y),4)
+#define get_gdat_ullong_pos4(X,Y) get_gdat_ullong((X),(Y),4)
+#define get_gdat_ip_pos4(X,Y) get_gdat_ip((X),(Y),4)
+#define get_gdat_ipv6_pos4(X,Y) get_gdat_ipv6((X),(Y),4)
+#define get_gdat_string_pos4(X,Y) get_gdat_string((X),(Y),4)
+#define get_gdat_v_str_pos4(X,Y) get_gdat_string((X),(Y),4)
+#define get_gdat_bool_pos4(X,Y) get_gdat_bool((X),(Y),4)
+#define get_gdat_int_pos4(X,Y) get_gdat_int((X),(Y),4)
+#define get_gdat_llong_pos4(X,Y) get_gdat_llong((X),(Y),4)
+#define get_gdat_float_pos4(X,Y) get_gdat_float((X),(Y),4)
+#define get_gdat_uint_pos5(X,Y) get_gdat_uint((X),(Y),5)
+#define get_gdat_ullong_pos5(X,Y) get_gdat_ullong((X),(Y),5)
+#define get_gdat_ip_pos5(X,Y) get_gdat_ip((X),(Y),5)
+#define get_gdat_ipv6_pos5(X,Y) get_gdat_ipv6((X),(Y),5)
+#define get_gdat_string_pos5(X,Y) get_gdat_string((X),(Y),5)
+#define get_gdat_v_str_pos5(X,Y) get_gdat_string((X),(Y),5)
+#define get_gdat_bool_pos5(X,Y) get_gdat_bool((X),(Y),5)
+#define get_gdat_int_pos5(X,Y) get_gdat_int((X),(Y),5)
+#define get_gdat_llong_pos5(X,Y) get_gdat_llong((X),(Y),5)
+#define get_gdat_float_pos5(X,Y) get_gdat_float((X),(Y),5)
+#define get_gdat_uint_pos6(X,Y) get_gdat_uint((X),(Y),6)
+#define get_gdat_ullong_pos6(X,Y) get_gdat_ullong((X),(Y),6)
+#define get_gdat_ip_pos6(X,Y) get_gdat_ip((X),(Y),6)
+#define get_gdat_ipv6_pos6(X,Y) get_gdat_ipv6((X),(Y),6)
+#define get_gdat_string_pos6(X,Y) get_gdat_string((X),(Y),6)
+#define get_gdat_v_str_pos6(X,Y) get_gdat_string((X),(Y),6)
+#define get_gdat_bool_pos6(X,Y) get_gdat_bool((X),(Y),6)
+#define get_gdat_int_pos6(X,Y) get_gdat_int((X),(Y),6)
+#define get_gdat_llong_pos6(X,Y) get_gdat_llong((X),(Y),6)
+#define get_gdat_float_pos6(X,Y) get_gdat_float((X),(Y),6)
+#define get_gdat_uint_pos7(X,Y) get_gdat_uint((X),(Y),7)
+#define get_gdat_ullong_pos7(X,Y) get_gdat_ullong((X),(Y),7)
+#define get_gdat_ip_pos7(X,Y) get_gdat_ip((X),(Y),7)
+#define get_gdat_ipv6_pos7(X,Y) get_gdat_ipv6((X),(Y),7)
+#define get_gdat_string_pos7(X,Y) get_gdat_string((X),(Y),7)
+#define get_gdat_v_str_pos7(X,Y) get_gdat_string((X),(Y),7)
+#define get_gdat_bool_pos7(X,Y) get_gdat_bool((X),(Y),7)
+#define get_gdat_int_pos7(X,Y) get_gdat_int((X),(Y),7)
+#define get_gdat_llong_pos7(X,Y) get_gdat_llong((X),(Y),7)
+#define get_gdat_float_pos7(X,Y) get_gdat_float((X),(Y),7)
+#define get_gdat_uint_pos8(X,Y) get_gdat_uint((X),(Y),8)
+#define get_gdat_ullong_pos8(X,Y) get_gdat_ullong((X),(Y),8)
+#define get_gdat_ip_pos8(X,Y) get_gdat_ip((X),(Y),8)
+#define get_gdat_ipv6_pos8(X,Y) get_gdat_ipv6((X),(Y),8)
+#define get_gdat_string_pos8(X,Y) get_gdat_string((X),(Y),8)
+#define get_gdat_v_str_pos8(X,Y) get_gdat_string((X),(Y),8)
+#define get_gdat_bool_pos8(X,Y) get_gdat_bool((X),(Y),8)
+#define get_gdat_int_pos8(X,Y) get_gdat_int((X),(Y),8)
+#define get_gdat_llong_pos8(X,Y) get_gdat_llong((X),(Y),8)
+#define get_gdat_float_pos8(X,Y) get_gdat_float((X),(Y),8)
+#define get_gdat_uint_pos9(X,Y) get_gdat_uint((X),(Y),9)
+#define get_gdat_ullong_pos9(X,Y) get_gdat_ullong((X),(Y),9)
+#define get_gdat_ip_pos9(X,Y) get_gdat_ip((X),(Y),9)
+#define get_gdat_ipv6_pos9(X,Y) get_gdat_ipv6((X),(Y),9)
+#define get_gdat_string_pos9(X,Y) get_gdat_string((X),(Y),9)
+#define get_gdat_v_str_pos9(X,Y) get_gdat_string((X),(Y),9)
+#define get_gdat_bool_pos9(X,Y) get_gdat_bool((X),(Y),9)
+#define get_gdat_int_pos9(X,Y) get_gdat_int((X),(Y),9)
+#define get_gdat_llong_pos9(X,Y) get_gdat_llong((X),(Y),9)
+#define get_gdat_float_pos9(X,Y) get_gdat_float((X),(Y),9)
+#define get_gdat_uint_pos10(X,Y) get_gdat_uint((X),(Y),10)
+#define get_gdat_ullong_pos10(X,Y) get_gdat_ullong((X),(Y),10)
+#define get_gdat_ip_pos10(X,Y) get_gdat_ip((X),(Y),10)
+#define get_gdat_ipv6_pos10(X,Y) get_gdat_ipv6((X),(Y),10)
+#define get_gdat_string_pos10(X,Y) get_gdat_string((X),(Y),10)
+#define get_gdat_v_str_pos10(X,Y) get_gdat_string((X),(Y),10)
+#define get_gdat_bool_pos10(X,Y) get_gdat_bool((X),(Y),10)
+#define get_gdat_int_pos10(X,Y) get_gdat_int((X),(Y),10)
+#define get_gdat_llong_pos10(X,Y) get_gdat_llong((X),(Y),10)
+#define get_gdat_float_pos10(X,Y) get_gdat_float((X),(Y),10)
+#define get_gdat_uint_pos11(X,Y) get_gdat_uint((X),(Y),11)
+#define get_gdat_ullong_pos11(X,Y) get_gdat_ullong((X),(Y),11)
+#define get_gdat_ip_pos11(X,Y) get_gdat_ip((X),(Y),11)
+#define get_gdat_ipv6_pos11(X,Y) get_gdat_ipv6((X),(Y),11)
+#define get_gdat_string_pos11(X,Y) get_gdat_string((X),(Y),11)
+#define get_gdat_v_str_pos11(X,Y) get_gdat_string((X),(Y),11)
+#define get_gdat_bool_pos11(X,Y) get_gdat_bool((X),(Y),11)
+#define get_gdat_int_pos11(X,Y) get_gdat_int((X),(Y),11)
+#define get_gdat_llong_pos11(X,Y) get_gdat_llong((X),(Y),11)
+#define get_gdat_float_pos11(X,Y) get_gdat_float((X),(Y),11)
+#define get_gdat_uint_pos12(X,Y) get_gdat_uint((X),(Y),12)
+#define get_gdat_ullong_pos12(X,Y) get_gdat_ullong((X),(Y),12)
+#define get_gdat_ip_pos12(X,Y) get_gdat_ip((X),(Y),12)
+#define get_gdat_ipv6_pos12(X,Y) get_gdat_ipv6((X),(Y),12)
+#define get_gdat_string_pos12(X,Y) get_gdat_string((X),(Y),12)
+#define get_gdat_v_str_pos12(X,Y) get_gdat_string((X),(Y),12)
+#define get_gdat_bool_pos12(X,Y) get_gdat_bool((X),(Y),12)
+#define get_gdat_int_pos12(X,Y) get_gdat_int((X),(Y),12)
+#define get_gdat_llong_pos12(X,Y) get_gdat_llong((X),(Y),12)
+#define get_gdat_float_pos12(X,Y) get_gdat_float((X),(Y),12)
+#define get_gdat_uint_pos13(X,Y) get_gdat_uint((X),(Y),13)
+#define get_gdat_ullong_pos13(X,Y) get_gdat_ullong((X),(Y),13)
+#define get_gdat_ip_pos13(X,Y) get_gdat_ip((X),(Y),13)
+#define get_gdat_ipv6_pos13(X,Y) get_gdat_ipv6((X),(Y),13)
+#define get_gdat_string_pos13(X,Y) get_gdat_string((X),(Y),13)
+#define get_gdat_v_str_pos13(X,Y) get_gdat_string((X),(Y),13)
+#define get_gdat_bool_pos13(X,Y) get_gdat_bool((X),(Y),13)
+#define get_gdat_int_pos13(X,Y) get_gdat_int((X),(Y),13)
+#define get_gdat_llong_pos13(X,Y) get_gdat_llong((X),(Y),13)
+#define get_gdat_float_pos13(X,Y) get_gdat_float((X),(Y),13)
+#define get_gdat_uint_pos14(X,Y) get_gdat_uint((X),(Y),14)
+#define get_gdat_ullong_pos14(X,Y) get_gdat_ullong((X),(Y),14)
+#define get_gdat_ip_pos14(X,Y) get_gdat_ip((X),(Y),14)
+#define get_gdat_ipv6_pos14(X,Y) get_gdat_ipv6((X),(Y),14)
+#define get_gdat_string_pos14(X,Y) get_gdat_string((X),(Y),14)
+#define get_gdat_v_str_pos14(X,Y) get_gdat_string((X),(Y),14)
+#define get_gdat_bool_pos14(X,Y) get_gdat_bool((X),(Y),14)
+#define get_gdat_int_pos14(X,Y) get_gdat_int((X),(Y),14)
+#define get_gdat_llong_pos14(X,Y) get_gdat_llong((X),(Y),14)
+#define get_gdat_float_pos14(X,Y) get_gdat_float((X),(Y),14)
+#define get_gdat_uint_pos15(X,Y) get_gdat_uint((X),(Y),15)
+#define get_gdat_ullong_pos15(X,Y) get_gdat_ullong((X),(Y),15)
+#define get_gdat_ip_pos15(X,Y) get_gdat_ip((X),(Y),15)
+#define get_gdat_ipv6_pos15(X,Y) get_gdat_ipv6((X),(Y),15)
+#define get_gdat_string_pos15(X,Y) get_gdat_string((X),(Y),15)
+#define get_gdat_v_str_pos15(X,Y) get_gdat_string((X),(Y),15)
+#define get_gdat_bool_pos15(X,Y) get_gdat_bool((X),(Y),15)
+#define get_gdat_int_pos15(X,Y) get_gdat_int((X),(Y),15)
+#define get_gdat_llong_pos15(X,Y) get_gdat_llong((X),(Y),15)
+#define get_gdat_float_pos15(X,Y) get_gdat_float((X),(Y),15)
+#define get_gdat_uint_pos16(X,Y) get_gdat_uint((X),(Y),16)
+#define get_gdat_ullong_pos16(X,Y) get_gdat_ullong((X),(Y),16)
+#define get_gdat_ip_pos16(X,Y) get_gdat_ip((X),(Y),16)
+#define get_gdat_ipv6_pos16(X,Y) get_gdat_ipv6((X),(Y),16)
+#define get_gdat_string_pos16(X,Y) get_gdat_string((X),(Y),16)
+#define get_gdat_v_str_pos16(X,Y) get_gdat_string((X),(Y),16)
+#define get_gdat_bool_pos16(X,Y) get_gdat_bool((X),(Y),16)
+#define get_gdat_int_pos16(X,Y) get_gdat_int((X),(Y),16)
+#define get_gdat_llong_pos16(X,Y) get_gdat_llong((X),(Y),16)
+#define get_gdat_float_pos16(X,Y) get_gdat_float((X),(Y),16)
+#define get_gdat_uint_pos17(X,Y) get_gdat_uint((X),(Y),17)
+#define get_gdat_ullong_pos17(X,Y) get_gdat_ullong((X),(Y),17)
+#define get_gdat_ip_pos17(X,Y) get_gdat_ip((X),(Y),17)
+#define get_gdat_ipv6_pos17(X,Y) get_gdat_ipv6((X),(Y),17)
+#define get_gdat_string_pos17(X,Y) get_gdat_string((X),(Y),17)
+#define get_gdat_v_str_pos17(X,Y) get_gdat_string((X),(Y),17)
+#define get_gdat_bool_pos17(X,Y) get_gdat_bool((X),(Y),17)
+#define get_gdat_int_pos17(X,Y) get_gdat_int((X),(Y),17)
+#define get_gdat_llong_pos17(X,Y) get_gdat_llong((X),(Y),17)
+#define get_gdat_float_pos17(X,Y) get_gdat_float((X),(Y),17)
+#define get_gdat_uint_pos18(X,Y) get_gdat_uint((X),(Y),18)
+#define get_gdat_ullong_pos18(X,Y) get_gdat_ullong((X),(Y),18)
+#define get_gdat_ip_pos18(X,Y) get_gdat_ip((X),(Y),18)
+#define get_gdat_ipv6_pos18(X,Y) get_gdat_ipv6((X),(Y),18)
+#define get_gdat_string_pos18(X,Y) get_gdat_string((X),(Y),18)
+#define get_gdat_v_str_pos18(X,Y) get_gdat_string((X),(Y),18)
+#define get_gdat_bool_pos18(X,Y) get_gdat_bool((X),(Y),18)
+#define get_gdat_int_pos18(X,Y) get_gdat_int((X),(Y),18)
+#define get_gdat_llong_pos18(X,Y) get_gdat_llong((X),(Y),18)
+#define get_gdat_float_pos18(X,Y) get_gdat_float((X),(Y),18)
+#define get_gdat_uint_pos19(X,Y) get_gdat_uint((X),(Y),19)
+#define get_gdat_ullong_pos19(X,Y) get_gdat_ullong((X),(Y),19)
+#define get_gdat_ip_pos19(X,Y) get_gdat_ip((X),(Y),19)
+#define get_gdat_ipv6_pos19(X,Y) get_gdat_ipv6((X),(Y),19)
+#define get_gdat_string_pos19(X,Y) get_gdat_string((X),(Y),19)
+#define get_gdat_v_str_pos19(X,Y) get_gdat_string((X),(Y),19)
+#define get_gdat_bool_pos19(X,Y) get_gdat_bool((X),(Y),19)
+#define get_gdat_int_pos19(X,Y) get_gdat_int((X),(Y),19)
+#define get_gdat_llong_pos19(X,Y) get_gdat_llong((X),(Y),19)
+#define get_gdat_float_pos19(X,Y) get_gdat_float((X),(Y),19)
+#define get_gdat_uint_pos20(X,Y) get_gdat_uint((X),(Y),20)
+#define get_gdat_ullong_pos20(X,Y) get_gdat_ullong((X),(Y),20)
+#define get_gdat_ip_pos20(X,Y) get_gdat_ip((X),(Y),20)
+#define get_gdat_ipv6_pos20(X,Y) get_gdat_ipv6((X),(Y),20)
+#define get_gdat_string_pos20(X,Y) get_gdat_string((X),(Y),20)
+#define get_gdat_v_str_pos20(X,Y) get_gdat_string((X),(Y),20)
+#define get_gdat_bool_pos20(X,Y) get_gdat_bool((X),(Y),20)
+#define get_gdat_int_pos20(X,Y) get_gdat_int((X),(Y),20)
+#define get_gdat_llong_pos20(X,Y) get_gdat_llong((X),(Y),20)
+#define get_gdat_float_pos20(X,Y) get_gdat_float((X),(Y),20)
+#define get_gdat_uint_pos21(X,Y) get_gdat_uint((X),(Y),21)
+#define get_gdat_ullong_pos21(X,Y) get_gdat_ullong((X),(Y),21)
+#define get_gdat_ip_pos21(X,Y) get_gdat_ip((X),(Y),21)
+#define get_gdat_ipv6_pos21(X,Y) get_gdat_ipv6((X),(Y),21)
+#define get_gdat_string_pos21(X,Y) get_gdat_string((X),(Y),21)
+#define get_gdat_v_str_pos21(X,Y) get_gdat_string((X),(Y),21)
+#define get_gdat_bool_pos21(X,Y) get_gdat_bool((X),(Y),21)
+#define get_gdat_int_pos21(X,Y) get_gdat_int((X),(Y),21)
+#define get_gdat_llong_pos21(X,Y) get_gdat_llong((X),(Y),21)
+#define get_gdat_float_pos21(X,Y) get_gdat_float((X),(Y),21)
+#define get_gdat_uint_pos22(X,Y) get_gdat_uint((X),(Y),22)
+#define get_gdat_ullong_pos22(X,Y) get_gdat_ullong((X),(Y),22)
+#define get_gdat_ip_pos22(X,Y) get_gdat_ip((X),(Y),22)
+#define get_gdat_ipv6_pos22(X,Y) get_gdat_ipv6((X),(Y),22)
+#define get_gdat_string_pos22(X,Y) get_gdat_string((X),(Y),22)
+#define get_gdat_v_str_pos22(X,Y) get_gdat_string((X),(Y),22)
+#define get_gdat_bool_pos22(X,Y) get_gdat_bool((X),(Y),22)
+#define get_gdat_int_pos22(X,Y) get_gdat_int((X),(Y),22)
+#define get_gdat_llong_pos22(X,Y) get_gdat_llong((X),(Y),22)
+#define get_gdat_float_pos22(X,Y) get_gdat_float((X),(Y),22)
+#define get_gdat_uint_pos23(X,Y) get_gdat_uint((X),(Y),23)
+#define get_gdat_ullong_pos23(X,Y) get_gdat_ullong((X),(Y),23)
+#define get_gdat_ip_pos23(X,Y) get_gdat_ip((X),(Y),23)
+#define get_gdat_ipv6_pos23(X,Y) get_gdat_ipv6((X),(Y),23)
+#define get_gdat_string_pos23(X,Y) get_gdat_string((X),(Y),23)
+#define get_gdat_v_str_pos23(X,Y) get_gdat_string((X),(Y),23)
+#define get_gdat_bool_pos23(X,Y) get_gdat_bool((X),(Y),23)
+#define get_gdat_int_pos23(X,Y) get_gdat_int((X),(Y),23)
+#define get_gdat_llong_pos23(X,Y) get_gdat_llong((X),(Y),23)
+#define get_gdat_float_pos23(X,Y) get_gdat_float((X),(Y),23)
+#define get_gdat_uint_pos24(X,Y) get_gdat_uint((X),(Y),24)
+#define get_gdat_ullong_pos24(X,Y) get_gdat_ullong((X),(Y),24)
+#define get_gdat_ip_pos24(X,Y) get_gdat_ip((X),(Y),24)
+#define get_gdat_ipv6_pos24(X,Y) get_gdat_ipv6((X),(Y),24)
+#define get_gdat_string_pos24(X,Y) get_gdat_string((X),(Y),24)
+#define get_gdat_v_str_pos24(X,Y) get_gdat_string((X),(Y),24)
+#define get_gdat_bool_pos24(X,Y) get_gdat_bool((X),(Y),24)
+#define get_gdat_int_pos24(X,Y) get_gdat_int((X),(Y),24)
+#define get_gdat_llong_pos24(X,Y) get_gdat_llong((X),(Y),24)
+#define get_gdat_float_pos24(X,Y) get_gdat_float((X),(Y),24)
+#define get_gdat_uint_pos25(X,Y) get_gdat_uint((X),(Y),25)
+#define get_gdat_ullong_pos25(X,Y) get_gdat_ullong((X),(Y),25)
+#define get_gdat_ip_pos25(X,Y) get_gdat_ip((X),(Y),25)
+#define get_gdat_ipv6_pos25(X,Y) get_gdat_ipv6((X),(Y),25)
+#define get_gdat_string_pos25(X,Y) get_gdat_string((X),(Y),25)
+#define get_gdat_v_str_pos25(X,Y) get_gdat_string((X),(Y),25)
+#define get_gdat_bool_pos25(X,Y) get_gdat_bool((X),(Y),25)
+#define get_gdat_int_pos25(X,Y) get_gdat_int((X),(Y),25)
+#define get_gdat_llong_pos25(X,Y) get_gdat_llong((X),(Y),25)
+#define get_gdat_float_pos25(X,Y) get_gdat_float((X),(Y),25)
+#define get_gdat_uint_pos26(X,Y) get_gdat_uint((X),(Y),26)
+#define get_gdat_ullong_pos26(X,Y) get_gdat_ullong((X),(Y),26)
+#define get_gdat_ip_pos26(X,Y) get_gdat_ip((X),(Y),26)
+#define get_gdat_ipv6_pos26(X,Y) get_gdat_ipv6((X),(Y),26)
+#define get_gdat_string_pos26(X,Y) get_gdat_string((X),(Y),26)
+#define get_gdat_v_str_pos26(X,Y) get_gdat_string((X),(Y),26)
+#define get_gdat_bool_pos26(X,Y) get_gdat_bool((X),(Y),26)
+#define get_gdat_int_pos26(X,Y) get_gdat_int((X),(Y),26)
+#define get_gdat_llong_pos26(X,Y) get_gdat_llong((X),(Y),26)
+#define get_gdat_float_pos26(X,Y) get_gdat_float((X),(Y),26)
+#define get_gdat_uint_pos27(X,Y) get_gdat_uint((X),(Y),27)
+#define get_gdat_ullong_pos27(X,Y) get_gdat_ullong((X),(Y),27)
+#define get_gdat_ip_pos27(X,Y) get_gdat_ip((X),(Y),27)
+#define get_gdat_ipv6_pos27(X,Y) get_gdat_ipv6((X),(Y),27)
+#define get_gdat_string_pos27(X,Y) get_gdat_string((X),(Y),27)
+#define get_gdat_v_str_pos27(X,Y) get_gdat_string((X),(Y),27)
+#define get_gdat_bool_pos27(X,Y) get_gdat_bool((X),(Y),27)
+#define get_gdat_int_pos27(X,Y) get_gdat_int((X),(Y),27)
+#define get_gdat_llong_pos27(X,Y) get_gdat_llong((X),(Y),27)
+#define get_gdat_float_pos27(X,Y) get_gdat_float((X),(Y),27)
+#define get_gdat_uint_pos28(X,Y) get_gdat_uint((X),(Y),28)
+#define get_gdat_ullong_pos28(X,Y) get_gdat_ullong((X),(Y),28)
+#define get_gdat_ip_pos28(X,Y) get_gdat_ip((X),(Y),28)
+#define get_gdat_ipv6_pos28(X,Y) get_gdat_ipv6((X),(Y),28)
+#define get_gdat_string_pos28(X,Y) get_gdat_string((X),(Y),28)
+#define get_gdat_v_str_pos28(X,Y) get_gdat_string((X),(Y),28)
+#define get_gdat_bool_pos28(X,Y) get_gdat_bool((X),(Y),28)
+#define get_gdat_int_pos28(X,Y) get_gdat_int((X),(Y),28)
+#define get_gdat_llong_pos28(X,Y) get_gdat_llong((X),(Y),28)
+#define get_gdat_float_pos28(X,Y) get_gdat_float((X),(Y),28)
+#define get_gdat_uint_pos29(X,Y) get_gdat_uint((X),(Y),29)
+#define get_gdat_ullong_pos29(X,Y) get_gdat_ullong((X),(Y),29)
+#define get_gdat_ip_pos29(X,Y) get_gdat_ip((X),(Y),29)
+#define get_gdat_ipv6_pos29(X,Y) get_gdat_ipv6((X),(Y),29)
+#define get_gdat_string_pos29(X,Y) get_gdat_string((X),(Y),29)
+#define get_gdat_v_str_pos29(X,Y) get_gdat_string((X),(Y),29)
+#define get_gdat_bool_pos29(X,Y) get_gdat_bool((X),(Y),29)
+#define get_gdat_int_pos29(X,Y) get_gdat_int((X),(Y),29)
+#define get_gdat_llong_pos29(X,Y) get_gdat_llong((X),(Y),29)
+#define get_gdat_float_pos29(X,Y) get_gdat_float((X),(Y),29)
+#define get_gdat_uint_pos30(X,Y) get_gdat_uint((X),(Y),30)
+#define get_gdat_ullong_pos30(X,Y) get_gdat_ullong((X),(Y),30)
+#define get_gdat_ip_pos30(X,Y) get_gdat_ip((X),(Y),30)
+#define get_gdat_ipv6_pos30(X,Y) get_gdat_ipv6((X),(Y),30)
+#define get_gdat_string_pos30(X,Y) get_gdat_string((X),(Y),30)
+#define get_gdat_v_str_pos30(X,Y) get_gdat_string((X),(Y),30)
+#define get_gdat_bool_pos30(X,Y) get_gdat_bool((X),(Y),30)
+#define get_gdat_int_pos30(X,Y) get_gdat_int((X),(Y),30)
+#define get_gdat_llong_pos30(X,Y) get_gdat_llong((X),(Y),30)
+#define get_gdat_float_pos30(X,Y) get_gdat_float((X),(Y),30)
+#define get_gdat_uint_pos31(X,Y) get_gdat_uint((X),(Y),31)
+#define get_gdat_ullong_pos31(X,Y) get_gdat_ullong((X),(Y),31)
+#define get_gdat_ip_pos31(X,Y) get_gdat_ip((X),(Y),31)
+#define get_gdat_ipv6_pos31(X,Y) get_gdat_ipv6((X),(Y),31)
+#define get_gdat_string_pos31(X,Y) get_gdat_string((X),(Y),31)
+#define get_gdat_v_str_pos31(X,Y) get_gdat_string((X),(Y),31)
+#define get_gdat_bool_pos31(X,Y) get_gdat_bool((X),(Y),31)
+#define get_gdat_int_pos31(X,Y) get_gdat_int((X),(Y),31)
+#define get_gdat_llong_pos31(X,Y) get_gdat_llong((X),(Y),31)
+#define get_gdat_float_pos31(X,Y) get_gdat_float((X),(Y),31)
+#define get_gdat_uint_pos32(X,Y) get_gdat_uint((X),(Y),32)
+#define get_gdat_ullong_pos32(X,Y) get_gdat_ullong((X),(Y),32)
+#define get_gdat_ip_pos32(X,Y) get_gdat_ip((X),(Y),32)
+#define get_gdat_ipv6_pos32(X,Y) get_gdat_ipv6((X),(Y),32)
+#define get_gdat_string_pos32(X,Y) get_gdat_string((X),(Y),32)
+#define get_gdat_v_str_pos32(X,Y) get_gdat_string((X),(Y),32)
+#define get_gdat_bool_pos32(X,Y) get_gdat_bool((X),(Y),32)
+#define get_gdat_int_pos32(X,Y) get_gdat_int((X),(Y),32)
+#define get_gdat_llong_pos32(X,Y) get_gdat_llong((X),(Y),32)
+#define get_gdat_float_pos32(X,Y) get_gdat_float((X),(Y),32)
+#define get_gdat_uint_pos33(X,Y) get_gdat_uint((X),(Y),33)
+#define get_gdat_ullong_pos33(X,Y) get_gdat_ullong((X),(Y),33)
+#define get_gdat_ip_pos33(X,Y) get_gdat_ip((X),(Y),33)
+#define get_gdat_ipv6_pos33(X,Y) get_gdat_ipv6((X),(Y),33)
+#define get_gdat_string_pos33(X,Y) get_gdat_string((X),(Y),33)
+#define get_gdat_v_str_pos33(X,Y) get_gdat_string((X),(Y),33)
+#define get_gdat_bool_pos33(X,Y) get_gdat_bool((X),(Y),33)
+#define get_gdat_int_pos33(X,Y) get_gdat_int((X),(Y),33)
+#define get_gdat_llong_pos33(X,Y) get_gdat_llong((X),(Y),33)
+#define get_gdat_float_pos33(X,Y) get_gdat_float((X),(Y),33)
+#define get_gdat_uint_pos34(X,Y) get_gdat_uint((X),(Y),34)
+#define get_gdat_ullong_pos34(X,Y) get_gdat_ullong((X),(Y),34)
+#define get_gdat_ip_pos34(X,Y) get_gdat_ip((X),(Y),34)
+#define get_gdat_ipv6_pos34(X,Y) get_gdat_ipv6((X),(Y),34)
+#define get_gdat_string_pos34(X,Y) get_gdat_string((X),(Y),34)
+#define get_gdat_v_str_pos34(X,Y) get_gdat_string((X),(Y),34)
+#define get_gdat_bool_pos34(X,Y) get_gdat_bool((X),(Y),34)
+#define get_gdat_int_pos34(X,Y) get_gdat_int((X),(Y),34)
+#define get_gdat_llong_pos34(X,Y) get_gdat_llong((X),(Y),34)
+#define get_gdat_float_pos34(X,Y) get_gdat_float((X),(Y),34)
+#define get_gdat_uint_pos35(X,Y) get_gdat_uint((X),(Y),35)
+#define get_gdat_ullong_pos35(X,Y) get_gdat_ullong((X),(Y),35)
+#define get_gdat_ip_pos35(X,Y) get_gdat_ip((X),(Y),35)
+#define get_gdat_ipv6_pos35(X,Y) get_gdat_ipv6((X),(Y),35)
+#define get_gdat_string_pos35(X,Y) get_gdat_string((X),(Y),35)
+#define get_gdat_v_str_pos35(X,Y) get_gdat_string((X),(Y),35)
+#define get_gdat_bool_pos35(X,Y) get_gdat_bool((X),(Y),35)
+#define get_gdat_int_pos35(X,Y) get_gdat_int((X),(Y),35)
+#define get_gdat_llong_pos35(X,Y) get_gdat_llong((X),(Y),35)
+#define get_gdat_float_pos35(X,Y) get_gdat_float((X),(Y),35)
+#define get_gdat_uint_pos36(X,Y) get_gdat_uint((X),(Y),36)
+#define get_gdat_ullong_pos36(X,Y) get_gdat_ullong((X),(Y),36)
+#define get_gdat_ip_pos36(X,Y) get_gdat_ip((X),(Y),36)
+#define get_gdat_ipv6_pos36(X,Y) get_gdat_ipv6((X),(Y),36)
+#define get_gdat_string_pos36(X,Y) get_gdat_string((X),(Y),36)
+#define get_gdat_v_str_pos36(X,Y) get_gdat_string((X),(Y),36)
+#define get_gdat_bool_pos36(X,Y) get_gdat_bool((X),(Y),36)
+#define get_gdat_int_pos36(X,Y) get_gdat_int((X),(Y),36)
+#define get_gdat_llong_pos36(X,Y) get_gdat_llong((X),(Y),36)
+#define get_gdat_float_pos36(X,Y) get_gdat_float((X),(Y),36)
+#define get_gdat_uint_pos37(X,Y) get_gdat_uint((X),(Y),37)
+#define get_gdat_ullong_pos37(X,Y) get_gdat_ullong((X),(Y),37)
+#define get_gdat_ip_pos37(X,Y) get_gdat_ip((X),(Y),37)
+#define get_gdat_ipv6_pos37(X,Y) get_gdat_ipv6((X),(Y),37)
+#define get_gdat_string_pos37(X,Y) get_gdat_string((X),(Y),37)
+#define get_gdat_v_str_pos37(X,Y) get_gdat_string((X),(Y),37)
+#define get_gdat_bool_pos37(X,Y) get_gdat_bool((X),(Y),37)
+#define get_gdat_int_pos37(X,Y) get_gdat_int((X),(Y),37)
+#define get_gdat_llong_pos37(X,Y) get_gdat_llong((X),(Y),37)
+#define get_gdat_float_pos37(X,Y) get_gdat_float((X),(Y),37)
+#define get_gdat_uint_pos38(X,Y) get_gdat_uint((X),(Y),38)
+#define get_gdat_ullong_pos38(X,Y) get_gdat_ullong((X),(Y),38)
+#define get_gdat_ip_pos38(X,Y) get_gdat_ip((X),(Y),38)
+#define get_gdat_ipv6_pos38(X,Y) get_gdat_ipv6((X),(Y),38)
+#define get_gdat_string_pos38(X,Y) get_gdat_string((X),(Y),38)
+#define get_gdat_v_str_pos38(X,Y) get_gdat_string((X),(Y),38)
+#define get_gdat_bool_pos38(X,Y) get_gdat_bool((X),(Y),38)
+#define get_gdat_int_pos38(X,Y) get_gdat_int((X),(Y),38)
+#define get_gdat_llong_pos38(X,Y) get_gdat_llong((X),(Y),38)
+#define get_gdat_float_pos38(X,Y) get_gdat_float((X),(Y),38)
+#define get_gdat_uint_pos39(X,Y) get_gdat_uint((X),(Y),39)
+#define get_gdat_ullong_pos39(X,Y) get_gdat_ullong((X),(Y),39)
+#define get_gdat_ip_pos39(X,Y) get_gdat_ip((X),(Y),39)
+#define get_gdat_ipv6_pos39(X,Y) get_gdat_ipv6((X),(Y),39)
+#define get_gdat_string_pos39(X,Y) get_gdat_string((X),(Y),39)
+#define get_gdat_v_str_pos39(X,Y) get_gdat_string((X),(Y),39)
+#define get_gdat_bool_pos39(X,Y) get_gdat_bool((X),(Y),39)
+#define get_gdat_int_pos39(X,Y) get_gdat_int((X),(Y),39)
+#define get_gdat_llong_pos39(X,Y) get_gdat_llong((X),(Y),39)
+#define get_gdat_float_pos39(X,Y) get_gdat_float((X),(Y),39)
+#define get_gdat_uint_pos40(X,Y) get_gdat_uint((X),(Y),40)
+#define get_gdat_ullong_pos40(X,Y) get_gdat_ullong((X),(Y),40)
+#define get_gdat_ip_pos40(X,Y) get_gdat_ip((X),(Y),40)
+#define get_gdat_ipv6_pos40(X,Y) get_gdat_ipv6((X),(Y),40)
+#define get_gdat_string_pos40(X,Y) get_gdat_string((X),(Y),40)
+#define get_gdat_v_str_pos40(X,Y) get_gdat_string((X),(Y),40)
+#define get_gdat_bool_pos40(X,Y) get_gdat_bool((X),(Y),40)
+#define get_gdat_int_pos40(X,Y) get_gdat_int((X),(Y),40)
+#define get_gdat_llong_pos40(X,Y) get_gdat_llong((X),(Y),40)
+#define get_gdat_float_pos40(X,Y) get_gdat_float((X),(Y),40)
+#define get_gdat_uint_pos41(X,Y) get_gdat_uint((X),(Y),41)
+#define get_gdat_ullong_pos41(X,Y) get_gdat_ullong((X),(Y),41)
+#define get_gdat_ip_pos41(X,Y) get_gdat_ip((X),(Y),41)
+#define get_gdat_ipv6_pos41(X,Y) get_gdat_ipv6((X),(Y),41)
+#define get_gdat_string_pos41(X,Y) get_gdat_string((X),(Y),41)
+#define get_gdat_v_str_pos41(X,Y) get_gdat_string((X),(Y),41)
+#define get_gdat_bool_pos41(X,Y) get_gdat_bool((X),(Y),41)
+#define get_gdat_int_pos41(X,Y) get_gdat_int((X),(Y),41)
+#define get_gdat_llong_pos41(X,Y) get_gdat_llong((X),(Y),41)
+#define get_gdat_float_pos41(X,Y) get_gdat_float((X),(Y),41)
+#define get_gdat_uint_pos42(X,Y) get_gdat_uint((X),(Y),42)
+#define get_gdat_ullong_pos42(X,Y) get_gdat_ullong((X),(Y),42)
+#define get_gdat_ip_pos42(X,Y) get_gdat_ip((X),(Y),42)
+#define get_gdat_ipv6_pos42(X,Y) get_gdat_ipv6((X),(Y),42)
+#define get_gdat_string_pos42(X,Y) get_gdat_string((X),(Y),42)
+#define get_gdat_v_str_pos42(X,Y) get_gdat_string((X),(Y),42)
+#define get_gdat_bool_pos42(X,Y) get_gdat_bool((X),(Y),42)
+#define get_gdat_int_pos42(X,Y) get_gdat_int((X),(Y),42)
+#define get_gdat_llong_pos42(X,Y) get_gdat_llong((X),(Y),42)
+#define get_gdat_float_pos42(X,Y) get_gdat_float((X),(Y),42)
+#define get_gdat_uint_pos43(X,Y) get_gdat_uint((X),(Y),43)
+#define get_gdat_ullong_pos43(X,Y) get_gdat_ullong((X),(Y),43)
+#define get_gdat_ip_pos43(X,Y) get_gdat_ip((X),(Y),43)
+#define get_gdat_ipv6_pos43(X,Y) get_gdat_ipv6((X),(Y),43)
+#define get_gdat_string_pos43(X,Y) get_gdat_string((X),(Y),43)
+#define get_gdat_v_str_pos43(X,Y) get_gdat_string((X),(Y),43)
+#define get_gdat_bool_pos43(X,Y) get_gdat_bool((X),(Y),43)
+#define get_gdat_int_pos43(X,Y) get_gdat_int((X),(Y),43)
+#define get_gdat_llong_pos43(X,Y) get_gdat_llong((X),(Y),43)
+#define get_gdat_float_pos43(X,Y) get_gdat_float((X),(Y),43)
+#define get_gdat_uint_pos44(X,Y) get_gdat_uint((X),(Y),44)
+#define get_gdat_ullong_pos44(X,Y) get_gdat_ullong((X),(Y),44)
+#define get_gdat_ip_pos44(X,Y) get_gdat_ip((X),(Y),44)
+#define get_gdat_ipv6_pos44(X,Y) get_gdat_ipv6((X),(Y),44)
+#define get_gdat_string_pos44(X,Y) get_gdat_string((X),(Y),44)
+#define get_gdat_v_str_pos44(X,Y) get_gdat_string((X),(Y),44)
+#define get_gdat_bool_pos44(X,Y) get_gdat_bool((X),(Y),44)
+#define get_gdat_int_pos44(X,Y) get_gdat_int((X),(Y),44)
+#define get_gdat_llong_pos44(X,Y) get_gdat_llong((X),(Y),44)
+#define get_gdat_float_pos44(X,Y) get_gdat_float((X),(Y),44)
+#define get_gdat_uint_pos45(X,Y) get_gdat_uint((X),(Y),45)
+#define get_gdat_ullong_pos45(X,Y) get_gdat_ullong((X),(Y),45)
+#define get_gdat_ip_pos45(X,Y) get_gdat_ip((X),(Y),45)
+#define get_gdat_ipv6_pos45(X,Y) get_gdat_ipv6((X),(Y),45)
+#define get_gdat_string_pos45(X,Y) get_gdat_string((X),(Y),45)
+#define get_gdat_v_str_pos45(X,Y) get_gdat_string((X),(Y),45)
+#define get_gdat_bool_pos45(X,Y) get_gdat_bool((X),(Y),45)
+#define get_gdat_int_pos45(X,Y) get_gdat_int((X),(Y),45)
+#define get_gdat_llong_pos45(X,Y) get_gdat_llong((X),(Y),45)
+#define get_gdat_float_pos45(X,Y) get_gdat_float((X),(Y),45)
+#define get_gdat_uint_pos46(X,Y) get_gdat_uint((X),(Y),46)
+#define get_gdat_ullong_pos46(X,Y) get_gdat_ullong((X),(Y),46)
+#define get_gdat_ip_pos46(X,Y) get_gdat_ip((X),(Y),46)
+#define get_gdat_ipv6_pos46(X,Y) get_gdat_ipv6((X),(Y),46)
+#define get_gdat_string_pos46(X,Y) get_gdat_string((X),(Y),46)
+#define get_gdat_v_str_pos46(X,Y) get_gdat_string((X),(Y),46)
+#define get_gdat_bool_pos46(X,Y) get_gdat_bool((X),(Y),46)
+#define get_gdat_int_pos46(X,Y) get_gdat_int((X),(Y),46)
+#define get_gdat_llong_pos46(X,Y) get_gdat_llong((X),(Y),46)
+#define get_gdat_float_pos46(X,Y) get_gdat_float((X),(Y),46)
+#define get_gdat_uint_pos47(X,Y) get_gdat_uint((X),(Y),47)
+#define get_gdat_ullong_pos47(X,Y) get_gdat_ullong((X),(Y),47)
+#define get_gdat_ip_pos47(X,Y) get_gdat_ip((X),(Y),47)
+#define get_gdat_ipv6_pos47(X,Y) get_gdat_ipv6((X),(Y),47)
+#define get_gdat_string_pos47(X,Y) get_gdat_string((X),(Y),47)
+#define get_gdat_v_str_pos47(X,Y) get_gdat_string((X),(Y),47)
+#define get_gdat_bool_pos47(X,Y) get_gdat_bool((X),(Y),47)
+#define get_gdat_int_pos47(X,Y) get_gdat_int((X),(Y),47)
+#define get_gdat_llong_pos47(X,Y) get_gdat_llong((X),(Y),47)
+#define get_gdat_float_pos47(X,Y) get_gdat_float((X),(Y),47)
+#define get_gdat_uint_pos48(X,Y) get_gdat_uint((X),(Y),48)
+#define get_gdat_ullong_pos48(X,Y) get_gdat_ullong((X),(Y),48)
+#define get_gdat_ip_pos48(X,Y) get_gdat_ip((X),(Y),48)
+#define get_gdat_ipv6_pos48(X,Y) get_gdat_ipv6((X),(Y),48)
+#define get_gdat_string_pos48(X,Y) get_gdat_string((X),(Y),48)
+#define get_gdat_v_str_pos48(X,Y) get_gdat_string((X),(Y),48)
+#define get_gdat_bool_pos48(X,Y) get_gdat_bool((X),(Y),48)
+#define get_gdat_int_pos48(X,Y) get_gdat_int((X),(Y),48)
+#define get_gdat_llong_pos48(X,Y) get_gdat_llong((X),(Y),48)
+#define get_gdat_float_pos48(X,Y) get_gdat_float((X),(Y),48)
+#define get_gdat_uint_pos49(X,Y) get_gdat_uint((X),(Y),49)
+#define get_gdat_ullong_pos49(X,Y) get_gdat_ullong((X),(Y),49)
+#define get_gdat_ip_pos49(X,Y) get_gdat_ip((X),(Y),49)
+#define get_gdat_ipv6_pos49(X,Y) get_gdat_ipv6((X),(Y),49)
+#define get_gdat_string_pos49(X,Y) get_gdat_string((X),(Y),49)
+#define get_gdat_v_str_pos49(X,Y) get_gdat_string((X),(Y),49)
+#define get_gdat_bool_pos49(X,Y) get_gdat_bool((X),(Y),49)
+#define get_gdat_int_pos49(X,Y) get_gdat_int((X),(Y),49)
+#define get_gdat_llong_pos49(X,Y) get_gdat_llong((X),(Y),49)
+#define get_gdat_float_pos49(X,Y) get_gdat_float((X),(Y),49)
+#define get_gdat_uint_pos50(X,Y) get_gdat_uint((X),(Y),50)
+#define get_gdat_ullong_pos50(X,Y) get_gdat_ullong((X),(Y),50)
+#define get_gdat_ip_pos50(X,Y) get_gdat_ip((X),(Y),50)
+#define get_gdat_ipv6_pos50(X,Y) get_gdat_ipv6((X),(Y),50)
+#define get_gdat_string_pos50(X,Y) get_gdat_string((X),(Y),50)
+#define get_gdat_v_str_pos50(X,Y) get_gdat_string((X),(Y),50)
+#define get_gdat_bool_pos50(X,Y) get_gdat_bool((X),(Y),50)
+#define get_gdat_int_pos50(X,Y) get_gdat_int((X),(Y),50)
+#define get_gdat_llong_pos50(X,Y) get_gdat_llong((X),(Y),50)
+#define get_gdat_float_pos50(X,Y) get_gdat_float((X),(Y),50)
+#define get_gdat_uint_pos51(X,Y) get_gdat_uint((X),(Y),51)
+#define get_gdat_ullong_pos51(X,Y) get_gdat_ullong((X),(Y),51)
+#define get_gdat_ip_pos51(X,Y) get_gdat_ip((X),(Y),51)
+#define get_gdat_ipv6_pos51(X,Y) get_gdat_ipv6((X),(Y),51)
+#define get_gdat_string_pos51(X,Y) get_gdat_string((X),(Y),51)
+#define get_gdat_v_str_pos51(X,Y) get_gdat_string((X),(Y),51)
+#define get_gdat_bool_pos51(X,Y) get_gdat_bool((X),(Y),51)
+#define get_gdat_int_pos51(X,Y) get_gdat_int((X),(Y),51)
+#define get_gdat_llong_pos51(X,Y) get_gdat_llong((X),(Y),51)
+#define get_gdat_float_pos51(X,Y) get_gdat_float((X),(Y),51)
+#define get_gdat_uint_pos52(X,Y) get_gdat_uint((X),(Y),52)
+#define get_gdat_ullong_pos52(X,Y) get_gdat_ullong((X),(Y),52)
+#define get_gdat_ip_pos52(X,Y) get_gdat_ip((X),(Y),52)
+#define get_gdat_ipv6_pos52(X,Y) get_gdat_ipv6((X),(Y),52)
+#define get_gdat_string_pos52(X,Y) get_gdat_string((X),(Y),52)
+#define get_gdat_v_str_pos52(X,Y) get_gdat_string((X),(Y),52)
+#define get_gdat_bool_pos52(X,Y) get_gdat_bool((X),(Y),52)
+#define get_gdat_int_pos52(X,Y) get_gdat_int((X),(Y),52)
+#define get_gdat_llong_pos52(X,Y) get_gdat_llong((X),(Y),52)
+#define get_gdat_float_pos52(X,Y) get_gdat_float((X),(Y),52)
+#define get_gdat_uint_pos53(X,Y) get_gdat_uint((X),(Y),53)
+#define get_gdat_ullong_pos53(X,Y) get_gdat_ullong((X),(Y),53)
+#define get_gdat_ip_pos53(X,Y) get_gdat_ip((X),(Y),53)
+#define get_gdat_ipv6_pos53(X,Y) get_gdat_ipv6((X),(Y),53)
+#define get_gdat_string_pos53(X,Y) get_gdat_string((X),(Y),53)
+#define get_gdat_v_str_pos53(X,Y) get_gdat_string((X),(Y),53)
+#define get_gdat_bool_pos53(X,Y) get_gdat_bool((X),(Y),53)
+#define get_gdat_int_pos53(X,Y) get_gdat_int((X),(Y),53)
+#define get_gdat_llong_pos53(X,Y) get_gdat_llong((X),(Y),53)
+#define get_gdat_float_pos53(X,Y) get_gdat_float((X),(Y),53)
+#define get_gdat_uint_pos54(X,Y) get_gdat_uint((X),(Y),54)
+#define get_gdat_ullong_pos54(X,Y) get_gdat_ullong((X),(Y),54)
+#define get_gdat_ip_pos54(X,Y) get_gdat_ip((X),(Y),54)
+#define get_gdat_ipv6_pos54(X,Y) get_gdat_ipv6((X),(Y),54)
+#define get_gdat_string_pos54(X,Y) get_gdat_string((X),(Y),54)
+#define get_gdat_v_str_pos54(X,Y) get_gdat_string((X),(Y),54)
+#define get_gdat_bool_pos54(X,Y) get_gdat_bool((X),(Y),54)
+#define get_gdat_int_pos54(X,Y) get_gdat_int((X),(Y),54)
+#define get_gdat_llong_pos54(X,Y) get_gdat_llong((X),(Y),54)
+#define get_gdat_float_pos54(X,Y) get_gdat_float((X),(Y),54)
+#define get_gdat_uint_pos55(X,Y) get_gdat_uint((X),(Y),55)
+#define get_gdat_ullong_pos55(X,Y) get_gdat_ullong((X),(Y),55)
+#define get_gdat_ip_pos55(X,Y) get_gdat_ip((X),(Y),55)
+#define get_gdat_ipv6_pos55(X,Y) get_gdat_ipv6((X),(Y),55)
+#define get_gdat_string_pos55(X,Y) get_gdat_string((X),(Y),55)
+#define get_gdat_v_str_pos55(X,Y) get_gdat_string((X),(Y),55)
+#define get_gdat_bool_pos55(X,Y) get_gdat_bool((X),(Y),55)
+#define get_gdat_int_pos55(X,Y) get_gdat_int((X),(Y),55)
+#define get_gdat_llong_pos55(X,Y) get_gdat_llong((X),(Y),55)
+#define get_gdat_float_pos55(X,Y) get_gdat_float((X),(Y),55)
+#define get_gdat_uint_pos56(X,Y) get_gdat_uint((X),(Y),56)
+#define get_gdat_ullong_pos56(X,Y) get_gdat_ullong((X),(Y),56)
+#define get_gdat_ip_pos56(X,Y) get_gdat_ip((X),(Y),56)
+#define get_gdat_ipv6_pos56(X,Y) get_gdat_ipv6((X),(Y),56)
+#define get_gdat_string_pos56(X,Y) get_gdat_string((X),(Y),56)
+#define get_gdat_v_str_pos56(X,Y) get_gdat_string((X),(Y),56)
+#define get_gdat_bool_pos56(X,Y) get_gdat_bool((X),(Y),56)
+#define get_gdat_int_pos56(X,Y) get_gdat_int((X),(Y),56)
+#define get_gdat_llong_pos56(X,Y) get_gdat_llong((X),(Y),56)
+#define get_gdat_float_pos56(X,Y) get_gdat_float((X),(Y),56)
+#define get_gdat_uint_pos57(X,Y) get_gdat_uint((X),(Y),57)
+#define get_gdat_ullong_pos57(X,Y) get_gdat_ullong((X),(Y),57)
+#define get_gdat_ip_pos57(X,Y) get_gdat_ip((X),(Y),57)
+#define get_gdat_ipv6_pos57(X,Y) get_gdat_ipv6((X),(Y),57)
+#define get_gdat_string_pos57(X,Y) get_gdat_string((X),(Y),57)
+#define get_gdat_v_str_pos57(X,Y) get_gdat_string((X),(Y),57)
+#define get_gdat_bool_pos57(X,Y) get_gdat_bool((X),(Y),57)
+#define get_gdat_int_pos57(X,Y) get_gdat_int((X),(Y),57)
+#define get_gdat_llong_pos57(X,Y) get_gdat_llong((X),(Y),57)
+#define get_gdat_float_pos57(X,Y) get_gdat_float((X),(Y),57)
+#define get_gdat_uint_pos58(X,Y) get_gdat_uint((X),(Y),58)
+#define get_gdat_ullong_pos58(X,Y) get_gdat_ullong((X),(Y),58)
+#define get_gdat_ip_pos58(X,Y) get_gdat_ip((X),(Y),58)
+#define get_gdat_ipv6_pos58(X,Y) get_gdat_ipv6((X),(Y),58)
+#define get_gdat_string_pos58(X,Y) get_gdat_string((X),(Y),58)
+#define get_gdat_v_str_pos58(X,Y) get_gdat_string((X),(Y),58)
+#define get_gdat_bool_pos58(X,Y) get_gdat_bool((X),(Y),58)
+#define get_gdat_int_pos58(X,Y) get_gdat_int((X),(Y),58)
+#define get_gdat_llong_pos58(X,Y) get_gdat_llong((X),(Y),58)
+#define get_gdat_float_pos58(X,Y) get_gdat_float((X),(Y),58)
+#define get_gdat_uint_pos59(X,Y) get_gdat_uint((X),(Y),59)
+#define get_gdat_ullong_pos59(X,Y) get_gdat_ullong((X),(Y),59)
+#define get_gdat_ip_pos59(X,Y) get_gdat_ip((X),(Y),59)
+#define get_gdat_ipv6_pos59(X,Y) get_gdat_ipv6((X),(Y),59)
+#define get_gdat_string_pos59(X,Y) get_gdat_string((X),(Y),59)
+#define get_gdat_v_str_pos59(X,Y) get_gdat_string((X),(Y),59)
+#define get_gdat_bool_pos59(X,Y) get_gdat_bool((X),(Y),59)
+#define get_gdat_int_pos59(X,Y) get_gdat_int((X),(Y),59)
+#define get_gdat_llong_pos59(X,Y) get_gdat_llong((X),(Y),59)
+#define get_gdat_float_pos59(X,Y) get_gdat_float((X),(Y),59)
+#define get_gdat_uint_pos60(X,Y) get_gdat_uint((X),(Y),60)
+#define get_gdat_ullong_pos60(X,Y) get_gdat_ullong((X),(Y),60)
+#define get_gdat_ip_pos60(X,Y) get_gdat_ip((X),(Y),60)
+#define get_gdat_ipv6_pos60(X,Y) get_gdat_ipv6((X),(Y),60)
+#define get_gdat_string_pos60(X,Y) get_gdat_string((X),(Y),60)
+#define get_gdat_v_str_pos60(X,Y) get_gdat_string((X),(Y),60)
+#define get_gdat_bool_pos60(X,Y) get_gdat_bool((X),(Y),60)
+#define get_gdat_int_pos60(X,Y) get_gdat_int((X),(Y),60)
+#define get_gdat_llong_pos60(X,Y) get_gdat_llong((X),(Y),60)
+#define get_gdat_float_pos60(X,Y) get_gdat_float((X),(Y),60)
+#define get_gdat_uint_pos61(X,Y) get_gdat_uint((X),(Y),61)
+#define get_gdat_ullong_pos61(X,Y) get_gdat_ullong((X),(Y),61)
+#define get_gdat_ip_pos61(X,Y) get_gdat_ip((X),(Y),61)
+#define get_gdat_ipv6_pos61(X,Y) get_gdat_ipv6((X),(Y),61)
+#define get_gdat_string_pos61(X,Y) get_gdat_string((X),(Y),61)
+#define get_gdat_v_str_pos61(X,Y) get_gdat_string((X),(Y),61)
+#define get_gdat_bool_pos61(X,Y) get_gdat_bool((X),(Y),61)
+#define get_gdat_int_pos61(X,Y) get_gdat_int((X),(Y),61)
+#define get_gdat_llong_pos61(X,Y) get_gdat_llong((X),(Y),61)
+#define get_gdat_float_pos61(X,Y) get_gdat_float((X),(Y),61)
+#define get_gdat_uint_pos62(X,Y) get_gdat_uint((X),(Y),62)
+#define get_gdat_ullong_pos62(X,Y) get_gdat_ullong((X),(Y),62)
+#define get_gdat_ip_pos62(X,Y) get_gdat_ip((X),(Y),62)
+#define get_gdat_ipv6_pos62(X,Y) get_gdat_ipv6((X),(Y),62)
+#define get_gdat_string_pos62(X,Y) get_gdat_string((X),(Y),62)
+#define get_gdat_v_str_pos62(X,Y) get_gdat_string((X),(Y),62)
+#define get_gdat_bool_pos62(X,Y) get_gdat_bool((X),(Y),62)
+#define get_gdat_int_pos62(X,Y) get_gdat_int((X),(Y),62)
+#define get_gdat_llong_pos62(X,Y) get_gdat_llong((X),(Y),62)
+#define get_gdat_float_pos62(X,Y) get_gdat_float((X),(Y),62)
+#define get_gdat_uint_pos63(X,Y) get_gdat_uint((X),(Y),63)
+#define get_gdat_ullong_pos63(X,Y) get_gdat_ullong((X),(Y),63)
+#define get_gdat_ip_pos63(X,Y) get_gdat_ip((X),(Y),63)
+#define get_gdat_ipv6_pos63(X,Y) get_gdat_ipv6((X),(Y),63)
+#define get_gdat_string_pos63(X,Y) get_gdat_string((X),(Y),63)
+#define get_gdat_v_str_pos63(X,Y) get_gdat_string((X),(Y),63)
+#define get_gdat_bool_pos63(X,Y) get_gdat_bool((X),(Y),63)
+#define get_gdat_int_pos63(X,Y) get_gdat_int((X),(Y),63)
+#define get_gdat_llong_pos63(X,Y) get_gdat_llong((X),(Y),63)
+#define get_gdat_float_pos63(X,Y) get_gdat_float((X),(Y),63)
+#define get_gdat_uint_pos64(X,Y) get_gdat_uint((X),(Y),64)
+#define get_gdat_ullong_pos64(X,Y) get_gdat_ullong((X),(Y),64)
+#define get_gdat_ip_pos64(X,Y) get_gdat_ip((X),(Y),64)
+#define get_gdat_ipv6_pos64(X,Y) get_gdat_ipv6((X),(Y),64)
+#define get_gdat_string_pos64(X,Y) get_gdat_string((X),(Y),64)
+#define get_gdat_v_str_pos64(X,Y) get_gdat_string((X),(Y),64)
+#define get_gdat_bool_pos64(X,Y) get_gdat_bool((X),(Y),64)
+#define get_gdat_int_pos64(X,Y) get_gdat_int((X),(Y),64)
+#define get_gdat_llong_pos64(X,Y) get_gdat_llong((X),(Y),64)
+#define get_gdat_float_pos64(X,Y) get_gdat_float((X),(Y),64)
+#define get_gdat_uint_pos65(X,Y) get_gdat_uint((X),(Y),65)
+#define get_gdat_ullong_pos65(X,Y) get_gdat_ullong((X),(Y),65)
+#define get_gdat_ip_pos65(X,Y) get_gdat_ip((X),(Y),65)
+#define get_gdat_ipv6_pos65(X,Y) get_gdat_ipv6((X),(Y),65)
+#define get_gdat_string_pos65(X,Y) get_gdat_string((X),(Y),65)
+#define get_gdat_v_str_pos65(X,Y) get_gdat_string((X),(Y),65)
+#define get_gdat_bool_pos65(X,Y) get_gdat_bool((X),(Y),65)
+#define get_gdat_int_pos65(X,Y) get_gdat_int((X),(Y),65)
+#define get_gdat_llong_pos65(X,Y) get_gdat_llong((X),(Y),65)
+#define get_gdat_float_pos65(X,Y) get_gdat_float((X),(Y),65)
+#define get_gdat_uint_pos66(X,Y) get_gdat_uint((X),(Y),66)
+#define get_gdat_ullong_pos66(X,Y) get_gdat_ullong((X),(Y),66)
+#define get_gdat_ip_pos66(X,Y) get_gdat_ip((X),(Y),66)
+#define get_gdat_ipv6_pos66(X,Y) get_gdat_ipv6((X),(Y),66)
+#define get_gdat_string_pos66(X,Y) get_gdat_string((X),(Y),66)
+#define get_gdat_v_str_pos66(X,Y) get_gdat_string((X),(Y),66)
+#define get_gdat_bool_pos66(X,Y) get_gdat_bool((X),(Y),66)
+#define get_gdat_int_pos66(X,Y) get_gdat_int((X),(Y),66)
+#define get_gdat_llong_pos66(X,Y) get_gdat_llong((X),(Y),66)
+#define get_gdat_float_pos66(X,Y) get_gdat_float((X),(Y),66)
+#define get_gdat_uint_pos67(X,Y) get_gdat_uint((X),(Y),67)
+#define get_gdat_ullong_pos67(X,Y) get_gdat_ullong((X),(Y),67)
+#define get_gdat_ip_pos67(X,Y) get_gdat_ip((X),(Y),67)
+#define get_gdat_ipv6_pos67(X,Y) get_gdat_ipv6((X),(Y),67)
+#define get_gdat_string_pos67(X,Y) get_gdat_string((X),(Y),67)
+#define get_gdat_v_str_pos67(X,Y) get_gdat_string((X),(Y),67)
+#define get_gdat_bool_pos67(X,Y) get_gdat_bool((X),(Y),67)
+#define get_gdat_int_pos67(X,Y) get_gdat_int((X),(Y),67)
+#define get_gdat_llong_pos67(X,Y) get_gdat_llong((X),(Y),67)
+#define get_gdat_float_pos67(X,Y) get_gdat_float((X),(Y),67)
+#define get_gdat_uint_pos68(X,Y) get_gdat_uint((X),(Y),68)
+#define get_gdat_ullong_pos68(X,Y) get_gdat_ullong((X),(Y),68)
+#define get_gdat_ip_pos68(X,Y) get_gdat_ip((X),(Y),68)
+#define get_gdat_ipv6_pos68(X,Y) get_gdat_ipv6((X),(Y),68)
+#define get_gdat_string_pos68(X,Y) get_gdat_string((X),(Y),68)
+#define get_gdat_v_str_pos68(X,Y) get_gdat_string((X),(Y),68)
+#define get_gdat_bool_pos68(X,Y) get_gdat_bool((X),(Y),68)
+#define get_gdat_int_pos68(X,Y) get_gdat_int((X),(Y),68)
+#define get_gdat_llong_pos68(X,Y) get_gdat_llong((X),(Y),68)
+#define get_gdat_float_pos68(X,Y) get_gdat_float((X),(Y),68)
+#define get_gdat_uint_pos69(X,Y) get_gdat_uint((X),(Y),69)
+#define get_gdat_ullong_pos69(X,Y) get_gdat_ullong((X),(Y),69)
+#define get_gdat_ip_pos69(X,Y) get_gdat_ip((X),(Y),69)
+#define get_gdat_ipv6_pos69(X,Y) get_gdat_ipv6((X),(Y),69)
+#define get_gdat_string_pos69(X,Y) get_gdat_string((X),(Y),69)
+#define get_gdat_v_str_pos69(X,Y) get_gdat_string((X),(Y),69)
+#define get_gdat_bool_pos69(X,Y) get_gdat_bool((X),(Y),69)
+#define get_gdat_int_pos69(X,Y) get_gdat_int((X),(Y),69)
+#define get_gdat_llong_pos69(X,Y) get_gdat_llong((X),(Y),69)
+#define get_gdat_float_pos69(X,Y) get_gdat_float((X),(Y),69)
+#define get_gdat_uint_pos70(X,Y) get_gdat_uint((X),(Y),70)
+#define get_gdat_ullong_pos70(X,Y) get_gdat_ullong((X),(Y),70)
+#define get_gdat_ip_pos70(X,Y) get_gdat_ip((X),(Y),70)
+#define get_gdat_ipv6_pos70(X,Y) get_gdat_ipv6((X),(Y),70)
+#define get_gdat_string_pos70(X,Y) get_gdat_string((X),(Y),70)
+#define get_gdat_v_str_pos70(X,Y) get_gdat_string((X),(Y),70)
+#define get_gdat_bool_pos70(X,Y) get_gdat_bool((X),(Y),70)
+#define get_gdat_int_pos70(X,Y) get_gdat_int((X),(Y),70)
+#define get_gdat_llong_pos70(X,Y) get_gdat_llong((X),(Y),70)
+#define get_gdat_float_pos70(X,Y) get_gdat_float((X),(Y),70)
+#define get_gdat_uint_pos71(X,Y) get_gdat_uint((X),(Y),71)
+#define get_gdat_ullong_pos71(X,Y) get_gdat_ullong((X),(Y),71)
+#define get_gdat_ip_pos71(X,Y) get_gdat_ip((X),(Y),71)
+#define get_gdat_ipv6_pos71(X,Y) get_gdat_ipv6((X),(Y),71)
+#define get_gdat_string_pos71(X,Y) get_gdat_string((X),(Y),71)
+#define get_gdat_v_str_pos71(X,Y) get_gdat_string((X),(Y),71)
+#define get_gdat_bool_pos71(X,Y) get_gdat_bool((X),(Y),71)
+#define get_gdat_int_pos71(X,Y) get_gdat_int((X),(Y),71)
+#define get_gdat_llong_pos71(X,Y) get_gdat_llong((X),(Y),71)
+#define get_gdat_float_pos71(X,Y) get_gdat_float((X),(Y),71)
+#define get_gdat_uint_pos72(X,Y) get_gdat_uint((X),(Y),72)
+#define get_gdat_ullong_pos72(X,Y) get_gdat_ullong((X),(Y),72)
+#define get_gdat_ip_pos72(X,Y) get_gdat_ip((X),(Y),72)
+#define get_gdat_ipv6_pos72(X,Y) get_gdat_ipv6((X),(Y),72)
+#define get_gdat_string_pos72(X,Y) get_gdat_string((X),(Y),72)
+#define get_gdat_v_str_pos72(X,Y) get_gdat_string((X),(Y),72)
+#define get_gdat_bool_pos72(X,Y) get_gdat_bool((X),(Y),72)
+#define get_gdat_int_pos72(X,Y) get_gdat_int((X),(Y),72)
+#define get_gdat_llong_pos72(X,Y) get_gdat_llong((X),(Y),72)
+#define get_gdat_float_pos72(X,Y) get_gdat_float((X),(Y),72)
+#define get_gdat_uint_pos73(X,Y) get_gdat_uint((X),(Y),73)
+#define get_gdat_ullong_pos73(X,Y) get_gdat_ullong((X),(Y),73)
+#define get_gdat_ip_pos73(X,Y) get_gdat_ip((X),(Y),73)
+#define get_gdat_ipv6_pos73(X,Y) get_gdat_ipv6((X),(Y),73)
+#define get_gdat_string_pos73(X,Y) get_gdat_string((X),(Y),73)
+#define get_gdat_v_str_pos73(X,Y) get_gdat_string((X),(Y),73)
+#define get_gdat_bool_pos73(X,Y) get_gdat_bool((X),(Y),73)
+#define get_gdat_int_pos73(X,Y) get_gdat_int((X),(Y),73)
+#define get_gdat_llong_pos73(X,Y) get_gdat_llong((X),(Y),73)
+#define get_gdat_float_pos73(X,Y) get_gdat_float((X),(Y),73)
+#define get_gdat_uint_pos74(X,Y) get_gdat_uint((X),(Y),74)
+#define get_gdat_ullong_pos74(X,Y) get_gdat_ullong((X),(Y),74)
+#define get_gdat_ip_pos74(X,Y) get_gdat_ip((X),(Y),74)
+#define get_gdat_ipv6_pos74(X,Y) get_gdat_ipv6((X),(Y),74)
+#define get_gdat_string_pos74(X,Y) get_gdat_string((X),(Y),74)
+#define get_gdat_v_str_pos74(X,Y) get_gdat_string((X),(Y),74)
+#define get_gdat_bool_pos74(X,Y) get_gdat_bool((X),(Y),74)
+#define get_gdat_int_pos74(X,Y) get_gdat_int((X),(Y),74)
+#define get_gdat_llong_pos74(X,Y) get_gdat_llong((X),(Y),74)
+#define get_gdat_float_pos74(X,Y) get_gdat_float((X),(Y),74)
+#define get_gdat_uint_pos75(X,Y) get_gdat_uint((X),(Y),75)
+#define get_gdat_ullong_pos75(X,Y) get_gdat_ullong((X),(Y),75)
+#define get_gdat_ip_pos75(X,Y) get_gdat_ip((X),(Y),75)
+#define get_gdat_ipv6_pos75(X,Y) get_gdat_ipv6((X),(Y),75)
+#define get_gdat_string_pos75(X,Y) get_gdat_string((X),(Y),75)
+#define get_gdat_v_str_pos75(X,Y) get_gdat_string((X),(Y),75)
+#define get_gdat_bool_pos75(X,Y) get_gdat_bool((X),(Y),75)
+#define get_gdat_int_pos75(X,Y) get_gdat_int((X),(Y),75)
+#define get_gdat_llong_pos75(X,Y) get_gdat_llong((X),(Y),75)
+#define get_gdat_float_pos75(X,Y) get_gdat_float((X),(Y),75)
+#define get_gdat_uint_pos76(X,Y) get_gdat_uint((X),(Y),76)
+#define get_gdat_ullong_pos76(X,Y) get_gdat_ullong((X),(Y),76)
+#define get_gdat_ip_pos76(X,Y) get_gdat_ip((X),(Y),76)
+#define get_gdat_ipv6_pos76(X,Y) get_gdat_ipv6((X),(Y),76)
+#define get_gdat_string_pos76(X,Y) get_gdat_string((X),(Y),76)
+#define get_gdat_v_str_pos76(X,Y) get_gdat_string((X),(Y),76)
+#define get_gdat_bool_pos76(X,Y) get_gdat_bool((X),(Y),76)
+#define get_gdat_int_pos76(X,Y) get_gdat_int((X),(Y),76)
+#define get_gdat_llong_pos76(X,Y) get_gdat_llong((X),(Y),76)
+#define get_gdat_float_pos76(X,Y) get_gdat_float((X),(Y),76)
+#define get_gdat_uint_pos77(X,Y) get_gdat_uint((X),(Y),77)
+#define get_gdat_ullong_pos77(X,Y) get_gdat_ullong((X),(Y),77)
+#define get_gdat_ip_pos77(X,Y) get_gdat_ip((X),(Y),77)
+#define get_gdat_ipv6_pos77(X,Y) get_gdat_ipv6((X),(Y),77)
+#define get_gdat_string_pos77(X,Y) get_gdat_string((X),(Y),77)
+#define get_gdat_v_str_pos77(X,Y) get_gdat_string((X),(Y),77)
+#define get_gdat_bool_pos77(X,Y) get_gdat_bool((X),(Y),77)
+#define get_gdat_int_pos77(X,Y) get_gdat_int((X),(Y),77)
+#define get_gdat_llong_pos77(X,Y) get_gdat_llong((X),(Y),77)
+#define get_gdat_float_pos77(X,Y) get_gdat_float((X),(Y),77)
+#define get_gdat_uint_pos78(X,Y) get_gdat_uint((X),(Y),78)
+#define get_gdat_ullong_pos78(X,Y) get_gdat_ullong((X),(Y),78)
+#define get_gdat_ip_pos78(X,Y) get_gdat_ip((X),(Y),78)
+#define get_gdat_ipv6_pos78(X,Y) get_gdat_ipv6((X),(Y),78)
+#define get_gdat_string_pos78(X,Y) get_gdat_string((X),(Y),78)
+#define get_gdat_v_str_pos78(X,Y) get_gdat_string((X),(Y),78)
+#define get_gdat_bool_pos78(X,Y) get_gdat_bool((X),(Y),78)
+#define get_gdat_int_pos78(X,Y) get_gdat_int((X),(Y),78)
+#define get_gdat_llong_pos78(X,Y) get_gdat_llong((X),(Y),78)
+#define get_gdat_float_pos78(X,Y) get_gdat_float((X),(Y),78)
+#define get_gdat_uint_pos79(X,Y) get_gdat_uint((X),(Y),79)
+#define get_gdat_ullong_pos79(X,Y) get_gdat_ullong((X),(Y),79)
+#define get_gdat_ip_pos79(X,Y) get_gdat_ip((X),(Y),79)
+#define get_gdat_ipv6_pos79(X,Y) get_gdat_ipv6((X),(Y),79)
+#define get_gdat_string_pos79(X,Y) get_gdat_string((X),(Y),79)
+#define get_gdat_v_str_pos79(X,Y) get_gdat_string((X),(Y),79)
+#define get_gdat_bool_pos79(X,Y) get_gdat_bool((X),(Y),79)
+#define get_gdat_int_pos79(X,Y) get_gdat_int((X),(Y),79)
+#define get_gdat_llong_pos79(X,Y) get_gdat_llong((X),(Y),79)
+#define get_gdat_float_pos79(X,Y) get_gdat_float((X),(Y),79)
+#define get_gdat_uint_pos80(X,Y) get_gdat_uint((X),(Y),80)
+#define get_gdat_ullong_pos80(X,Y) get_gdat_ullong((X),(Y),80)
+#define get_gdat_ip_pos80(X,Y) get_gdat_ip((X),(Y),80)
+#define get_gdat_ipv6_pos80(X,Y) get_gdat_ipv6((X),(Y),80)
+#define get_gdat_string_pos80(X,Y) get_gdat_string((X),(Y),80)
+#define get_gdat_v_str_pos80(X,Y) get_gdat_string((X),(Y),80)
+#define get_gdat_bool_pos80(X,Y) get_gdat_bool((X),(Y),80)
+#define get_gdat_int_pos80(X,Y) get_gdat_int((X),(Y),80)
+#define get_gdat_llong_pos80(X,Y) get_gdat_llong((X),(Y),80)
+#define get_gdat_float_pos80(X,Y) get_gdat_float((X),(Y),80)
+#define get_gdat_uint_pos81(X,Y) get_gdat_uint((X),(Y),81)
+#define get_gdat_ullong_pos81(X,Y) get_gdat_ullong((X),(Y),81)
+#define get_gdat_ip_pos81(X,Y) get_gdat_ip((X),(Y),81)
+#define get_gdat_ipv6_pos81(X,Y) get_gdat_ipv6((X),(Y),81)
+#define get_gdat_string_pos81(X,Y) get_gdat_string((X),(Y),81)
+#define get_gdat_v_str_pos81(X,Y) get_gdat_string((X),(Y),81)
+#define get_gdat_bool_pos81(X,Y) get_gdat_bool((X),(Y),81)
+#define get_gdat_int_pos81(X,Y) get_gdat_int((X),(Y),81)
+#define get_gdat_llong_pos81(X,Y) get_gdat_llong((X),(Y),81)
+#define get_gdat_float_pos81(X,Y) get_gdat_float((X),(Y),81)
+#define get_gdat_uint_pos82(X,Y) get_gdat_uint((X),(Y),82)
+#define get_gdat_ullong_pos82(X,Y) get_gdat_ullong((X),(Y),82)
+#define get_gdat_ip_pos82(X,Y) get_gdat_ip((X),(Y),82)
+#define get_gdat_ipv6_pos82(X,Y) get_gdat_ipv6((X),(Y),82)
+#define get_gdat_string_pos82(X,Y) get_gdat_string((X),(Y),82)
+#define get_gdat_v_str_pos82(X,Y) get_gdat_string((X),(Y),82)
+#define get_gdat_bool_pos82(X,Y) get_gdat_bool((X),(Y),82)
+#define get_gdat_int_pos82(X,Y) get_gdat_int((X),(Y),82)
+#define get_gdat_llong_pos82(X,Y) get_gdat_llong((X),(Y),82)
+#define get_gdat_float_pos82(X,Y) get_gdat_float((X),(Y),82)
+#define get_gdat_uint_pos83(X,Y) get_gdat_uint((X),(Y),83)
+#define get_gdat_ullong_pos83(X,Y) get_gdat_ullong((X),(Y),83)
+#define get_gdat_ip_pos83(X,Y) get_gdat_ip((X),(Y),83)
+#define get_gdat_ipv6_pos83(X,Y) get_gdat_ipv6((X),(Y),83)
+#define get_gdat_string_pos83(X,Y) get_gdat_string((X),(Y),83)
+#define get_gdat_v_str_pos83(X,Y) get_gdat_string((X),(Y),83)
+#define get_gdat_bool_pos83(X,Y) get_gdat_bool((X),(Y),83)
+#define get_gdat_int_pos83(X,Y) get_gdat_int((X),(Y),83)
+#define get_gdat_llong_pos83(X,Y) get_gdat_llong((X),(Y),83)
+#define get_gdat_float_pos83(X,Y) get_gdat_float((X),(Y),83)
+#define get_gdat_uint_pos84(X,Y) get_gdat_uint((X),(Y),84)
+#define get_gdat_ullong_pos84(X,Y) get_gdat_ullong((X),(Y),84)
+#define get_gdat_ip_pos84(X,Y) get_gdat_ip((X),(Y),84)
+#define get_gdat_ipv6_pos84(X,Y) get_gdat_ipv6((X),(Y),84)
+#define get_gdat_string_pos84(X,Y) get_gdat_string((X),(Y),84)
+#define get_gdat_v_str_pos84(X,Y) get_gdat_string((X),(Y),84)
+#define get_gdat_bool_pos84(X,Y) get_gdat_bool((X),(Y),84)
+#define get_gdat_int_pos84(X,Y) get_gdat_int((X),(Y),84)
+#define get_gdat_llong_pos84(X,Y) get_gdat_llong((X),(Y),84)
+#define get_gdat_float_pos84(X,Y) get_gdat_float((X),(Y),84)
+#define get_gdat_uint_pos85(X,Y) get_gdat_uint((X),(Y),85)
+#define get_gdat_ullong_pos85(X,Y) get_gdat_ullong((X),(Y),85)
+#define get_gdat_ip_pos85(X,Y) get_gdat_ip((X),(Y),85)
+#define get_gdat_ipv6_pos85(X,Y) get_gdat_ipv6((X),(Y),85)
+#define get_gdat_string_pos85(X,Y) get_gdat_string((X),(Y),85)
+#define get_gdat_v_str_pos85(X,Y) get_gdat_string((X),(Y),85)
+#define get_gdat_bool_pos85(X,Y) get_gdat_bool((X),(Y),85)
+#define get_gdat_int_pos85(X,Y) get_gdat_int((X),(Y),85)
+#define get_gdat_llong_pos85(X,Y) get_gdat_llong((X),(Y),85)
+#define get_gdat_float_pos85(X,Y) get_gdat_float((X),(Y),85)
+#define get_gdat_uint_pos86(X,Y) get_gdat_uint((X),(Y),86)
+#define get_gdat_ullong_pos86(X,Y) get_gdat_ullong((X),(Y),86)
+#define get_gdat_ip_pos86(X,Y) get_gdat_ip((X),(Y),86)
+#define get_gdat_ipv6_pos86(X,Y) get_gdat_ipv6((X),(Y),86)
+#define get_gdat_string_pos86(X,Y) get_gdat_string((X),(Y),86)
+#define get_gdat_v_str_pos86(X,Y) get_gdat_string((X),(Y),86)
+#define get_gdat_bool_pos86(X,Y) get_gdat_bool((X),(Y),86)
+#define get_gdat_int_pos86(X,Y) get_gdat_int((X),(Y),86)
+#define get_gdat_llong_pos86(X,Y) get_gdat_llong((X),(Y),86)
+#define get_gdat_float_pos86(X,Y) get_gdat_float((X),(Y),86)
+#define get_gdat_uint_pos87(X,Y) get_gdat_uint((X),(Y),87)
+#define get_gdat_ullong_pos87(X,Y) get_gdat_ullong((X),(Y),87)
+#define get_gdat_ip_pos87(X,Y) get_gdat_ip((X),(Y),87)
+#define get_gdat_ipv6_pos87(X,Y) get_gdat_ipv6((X),(Y),87)
+#define get_gdat_string_pos87(X,Y) get_gdat_string((X),(Y),87)
+#define get_gdat_v_str_pos87(X,Y) get_gdat_string((X),(Y),87)
+#define get_gdat_bool_pos87(X,Y) get_gdat_bool((X),(Y),87)
+#define get_gdat_int_pos87(X,Y) get_gdat_int((X),(Y),87)
+#define get_gdat_llong_pos87(X,Y) get_gdat_llong((X),(Y),87)
+#define get_gdat_float_pos87(X,Y) get_gdat_float((X),(Y),87)
+#define get_gdat_uint_pos88(X,Y) get_gdat_uint((X),(Y),88)
+#define get_gdat_ullong_pos88(X,Y) get_gdat_ullong((X),(Y),88)
+#define get_gdat_ip_pos88(X,Y) get_gdat_ip((X),(Y),88)
+#define get_gdat_ipv6_pos88(X,Y) get_gdat_ipv6((X),(Y),88)
+#define get_gdat_string_pos88(X,Y) get_gdat_string((X),(Y),88)
+#define get_gdat_v_str_pos88(X,Y) get_gdat_string((X),(Y),88)
+#define get_gdat_bool_pos88(X,Y) get_gdat_bool((X),(Y),88)
+#define get_gdat_int_pos88(X,Y) get_gdat_int((X),(Y),88)
+#define get_gdat_llong_pos88(X,Y) get_gdat_llong((X),(Y),88)
+#define get_gdat_float_pos88(X,Y) get_gdat_float((X),(Y),88)
+#define get_gdat_uint_pos89(X,Y) get_gdat_uint((X),(Y),89)
+#define get_gdat_ullong_pos89(X,Y) get_gdat_ullong((X),(Y),89)
+#define get_gdat_ip_pos89(X,Y) get_gdat_ip((X),(Y),89)
+#define get_gdat_ipv6_pos89(X,Y) get_gdat_ipv6((X),(Y),89)
+#define get_gdat_string_pos89(X,Y) get_gdat_string((X),(Y),89)
+#define get_gdat_v_str_pos89(X,Y) get_gdat_string((X),(Y),89)
+#define get_gdat_bool_pos89(X,Y) get_gdat_bool((X),(Y),89)
+#define get_gdat_int_pos89(X,Y) get_gdat_int((X),(Y),89)
+#define get_gdat_llong_pos89(X,Y) get_gdat_llong((X),(Y),89)
+#define get_gdat_float_pos89(X,Y) get_gdat_float((X),(Y),89)
+#define get_gdat_uint_pos90(X,Y) get_gdat_uint((X),(Y),90)
+#define get_gdat_ullong_pos90(X,Y) get_gdat_ullong((X),(Y),90)
+#define get_gdat_ip_pos90(X,Y) get_gdat_ip((X),(Y),90)
+#define get_gdat_ipv6_pos90(X,Y) get_gdat_ipv6((X),(Y),90)
+#define get_gdat_string_pos90(X,Y) get_gdat_string((X),(Y),90)
+#define get_gdat_v_str_pos90(X,Y) get_gdat_string((X),(Y),90)
+#define get_gdat_bool_pos90(X,Y) get_gdat_bool((X),(Y),90)
+#define get_gdat_int_pos90(X,Y) get_gdat_int((X),(Y),90)
+#define get_gdat_llong_pos90(X,Y) get_gdat_llong((X),(Y),90)
+#define get_gdat_float_pos90(X,Y) get_gdat_float((X),(Y),90)
+#define get_gdat_uint_pos91(X,Y) get_gdat_uint((X),(Y),91)
+#define get_gdat_ullong_pos91(X,Y) get_gdat_ullong((X),(Y),91)
+#define get_gdat_ip_pos91(X,Y) get_gdat_ip((X),(Y),91)
+#define get_gdat_ipv6_pos91(X,Y) get_gdat_ipv6((X),(Y),91)
+#define get_gdat_string_pos91(X,Y) get_gdat_string((X),(Y),91)
+#define get_gdat_v_str_pos91(X,Y) get_gdat_string((X),(Y),91)
+#define get_gdat_bool_pos91(X,Y) get_gdat_bool((X),(Y),91)
+#define get_gdat_int_pos91(X,Y) get_gdat_int((X),(Y),91)
+#define get_gdat_llong_pos91(X,Y) get_gdat_llong((X),(Y),91)
+#define get_gdat_float_pos91(X,Y) get_gdat_float((X),(Y),91)
+#define get_gdat_uint_pos92(X,Y) get_gdat_uint((X),(Y),92)
+#define get_gdat_ullong_pos92(X,Y) get_gdat_ullong((X),(Y),92)
+#define get_gdat_ip_pos92(X,Y) get_gdat_ip((X),(Y),92)
+#define get_gdat_ipv6_pos92(X,Y) get_gdat_ipv6((X),(Y),92)
+#define get_gdat_string_pos92(X,Y) get_gdat_string((X),(Y),92)
+#define get_gdat_v_str_pos92(X,Y) get_gdat_string((X),(Y),92)
+#define get_gdat_bool_pos92(X,Y) get_gdat_bool((X),(Y),92)
+#define get_gdat_int_pos92(X,Y) get_gdat_int((X),(Y),92)
+#define get_gdat_llong_pos92(X,Y) get_gdat_llong((X),(Y),92)
+#define get_gdat_float_pos92(X,Y) get_gdat_float((X),(Y),92)
+#define get_gdat_uint_pos93(X,Y) get_gdat_uint((X),(Y),93)
+#define get_gdat_ullong_pos93(X,Y) get_gdat_ullong((X),(Y),93)
+#define get_gdat_ip_pos93(X,Y) get_gdat_ip((X),(Y),93)
+#define get_gdat_ipv6_pos93(X,Y) get_gdat_ipv6((X),(Y),93)
+#define get_gdat_string_pos93(X,Y) get_gdat_string((X),(Y),93)
+#define get_gdat_v_str_pos93(X,Y) get_gdat_string((X),(Y),93)
+#define get_gdat_bool_pos93(X,Y) get_gdat_bool((X),(Y),93)
+#define get_gdat_int_pos93(X,Y) get_gdat_int((X),(Y),93)
+#define get_gdat_llong_pos93(X,Y) get_gdat_llong((X),(Y),93)
+#define get_gdat_float_pos93(X,Y) get_gdat_float((X),(Y),93)
+#define get_gdat_uint_pos94(X,Y) get_gdat_uint((X),(Y),94)
+#define get_gdat_ullong_pos94(X,Y) get_gdat_ullong((X),(Y),94)
+#define get_gdat_ip_pos94(X,Y) get_gdat_ip((X),(Y),94)
+#define get_gdat_ipv6_pos94(X,Y) get_gdat_ipv6((X),(Y),94)
+#define get_gdat_string_pos94(X,Y) get_gdat_string((X),(Y),94)
+#define get_gdat_v_str_pos94(X,Y) get_gdat_string((X),(Y),94)
+#define get_gdat_bool_pos94(X,Y) get_gdat_bool((X),(Y),94)
+#define get_gdat_int_pos94(X,Y) get_gdat_int((X),(Y),94)
+#define get_gdat_llong_pos94(X,Y) get_gdat_llong((X),(Y),94)
+#define get_gdat_float_pos94(X,Y) get_gdat_float((X),(Y),94)
+#define get_gdat_uint_pos95(X,Y) get_gdat_uint((X),(Y),95)
+#define get_gdat_ullong_pos95(X,Y) get_gdat_ullong((X),(Y),95)
+#define get_gdat_ip_pos95(X,Y) get_gdat_ip((X),(Y),95)
+#define get_gdat_ipv6_pos95(X,Y) get_gdat_ipv6((X),(Y),95)
+#define get_gdat_string_pos95(X,Y) get_gdat_string((X),(Y),95)
+#define get_gdat_v_str_pos95(X,Y) get_gdat_string((X),(Y),95)
+#define get_gdat_bool_pos95(X,Y) get_gdat_bool((X),(Y),95)
+#define get_gdat_int_pos95(X,Y) get_gdat_int((X),(Y),95)
+#define get_gdat_llong_pos95(X,Y) get_gdat_llong((X),(Y),95)
+#define get_gdat_float_pos95(X,Y) get_gdat_float((X),(Y),95)
+#define get_gdat_uint_pos96(X,Y) get_gdat_uint((X),(Y),96)
+#define get_gdat_ullong_pos96(X,Y) get_gdat_ullong((X),(Y),96)
+#define get_gdat_ip_pos96(X,Y) get_gdat_ip((X),(Y),96)
+#define get_gdat_ipv6_pos96(X,Y) get_gdat_ipv6((X),(Y),96)
+#define get_gdat_string_pos96(X,Y) get_gdat_string((X),(Y),96)
+#define get_gdat_v_str_pos96(X,Y) get_gdat_string((X),(Y),96)
+#define get_gdat_bool_pos96(X,Y) get_gdat_bool((X),(Y),96)
+#define get_gdat_int_pos96(X,Y) get_gdat_int((X),(Y),96)
+#define get_gdat_llong_pos96(X,Y) get_gdat_llong((X),(Y),96)
+#define get_gdat_float_pos96(X,Y) get_gdat_float((X),(Y),96)
+#define get_gdat_uint_pos97(X,Y) get_gdat_uint((X),(Y),97)
+#define get_gdat_ullong_pos97(X,Y) get_gdat_ullong((X),(Y),97)
+#define get_gdat_ip_pos97(X,Y) get_gdat_ip((X),(Y),97)
+#define get_gdat_ipv6_pos97(X,Y) get_gdat_ipv6((X),(Y),97)
+#define get_gdat_string_pos97(X,Y) get_gdat_string((X),(Y),97)
+#define get_gdat_v_str_pos97(X,Y) get_gdat_string((X),(Y),97)
+#define get_gdat_bool_pos97(X,Y) get_gdat_bool((X),(Y),97)
+#define get_gdat_int_pos97(X,Y) get_gdat_int((X),(Y),97)
+#define get_gdat_llong_pos97(X,Y) get_gdat_llong((X),(Y),97)
+#define get_gdat_float_pos97(X,Y) get_gdat_float((X),(Y),97)
+#define get_gdat_uint_pos98(X,Y) get_gdat_uint((X),(Y),98)
+#define get_gdat_ullong_pos98(X,Y) get_gdat_ullong((X),(Y),98)
+#define get_gdat_ip_pos98(X,Y) get_gdat_ip((X),(Y),98)
+#define get_gdat_ipv6_pos98(X,Y) get_gdat_ipv6((X),(Y),98)
+#define get_gdat_string_pos98(X,Y) get_gdat_string((X),(Y),98)
+#define get_gdat_v_str_pos98(X,Y) get_gdat_string((X),(Y),98)
+#define get_gdat_bool_pos98(X,Y) get_gdat_bool((X),(Y),98)
+#define get_gdat_int_pos98(X,Y) get_gdat_int((X),(Y),98)
+#define get_gdat_llong_pos98(X,Y) get_gdat_llong((X),(Y),98)
+#define get_gdat_float_pos98(X,Y) get_gdat_float((X),(Y),98)
+#define get_gdat_uint_pos99(X,Y) get_gdat_uint((X),(Y),99)
+#define get_gdat_ullong_pos99(X,Y) get_gdat_ullong((X),(Y),99)
+#define get_gdat_ip_pos99(X,Y) get_gdat_ip((X),(Y),99)
+#define get_gdat_ipv6_pos99(X,Y) get_gdat_ipv6((X),(Y),99)
+#define get_gdat_string_pos99(X,Y) get_gdat_string((X),(Y),99)
+#define get_gdat_v_str_pos99(X,Y) get_gdat_string((X),(Y),99)
+#define get_gdat_bool_pos99(X,Y) get_gdat_bool((X),(Y),99)
+#define get_gdat_int_pos99(X,Y) get_gdat_int((X),(Y),99)
+#define get_gdat_llong_pos99(X,Y) get_gdat_llong((X),(Y),99)
+#define get_gdat_float_pos99(X,Y) get_gdat_float((X),(Y),99)
+#define get_gdat_uint_pos100(X,Y) get_gdat_uint((X),(Y),100)
+#define get_gdat_ullong_pos100(X,Y) get_gdat_ullong((X),(Y),100)
+#define get_gdat_ip_pos100(X,Y) get_gdat_ip((X),(Y),100)
+#define get_gdat_ipv6_pos100(X,Y) get_gdat_ipv6((X),(Y),100)
+#define get_gdat_string_pos100(X,Y) get_gdat_string((X),(Y),100)
+#define get_gdat_v_str_pos100(X,Y) get_gdat_string((X),(Y),100)
+#define get_gdat_bool_pos100(X,Y) get_gdat_bool((X),(Y),100)
+#define get_gdat_int_pos100(X,Y) get_gdat_int((X),(Y),100)
+#define get_gdat_llong_pos100(X,Y) get_gdat_llong((X),(Y),100)
+#define get_gdat_float_pos100(X,Y) get_gdat_float((X),(Y),100)
+#define get_gdat_uint_pos101(X,Y) get_gdat_uint((X),(Y),101)
+#define get_gdat_ullong_pos101(X,Y) get_gdat_ullong((X),(Y),101)
+#define get_gdat_ip_pos101(X,Y) get_gdat_ip((X),(Y),101)
+#define get_gdat_ipv6_pos101(X,Y) get_gdat_ipv6((X),(Y),101)
+#define get_gdat_string_pos101(X,Y) get_gdat_string((X),(Y),101)
+#define get_gdat_v_str_pos101(X,Y) get_gdat_string((X),(Y),101)
+#define get_gdat_bool_pos101(X,Y) get_gdat_bool((X),(Y),101)
+#define get_gdat_int_pos101(X,Y) get_gdat_int((X),(Y),101)
+#define get_gdat_llong_pos101(X,Y) get_gdat_llong((X),(Y),101)
+#define get_gdat_float_pos101(X,Y) get_gdat_float((X),(Y),101)
+#define get_gdat_uint_pos102(X,Y) get_gdat_uint((X),(Y),102)
+#define get_gdat_ullong_pos102(X,Y) get_gdat_ullong((X),(Y),102)
+#define get_gdat_ip_pos102(X,Y) get_gdat_ip((X),(Y),102)
+#define get_gdat_ipv6_pos102(X,Y) get_gdat_ipv6((X),(Y),102)
+#define get_gdat_string_pos102(X,Y) get_gdat_string((X),(Y),102)
+#define get_gdat_v_str_pos102(X,Y) get_gdat_string((X),(Y),102)
+#define get_gdat_bool_pos102(X,Y) get_gdat_bool((X),(Y),102)
+#define get_gdat_int_pos102(X,Y) get_gdat_int((X),(Y),102)
+#define get_gdat_llong_pos102(X,Y) get_gdat_llong((X),(Y),102)
+#define get_gdat_float_pos102(X,Y) get_gdat_float((X),(Y),102)
+#define get_gdat_uint_pos103(X,Y) get_gdat_uint((X),(Y),103)
+#define get_gdat_ullong_pos103(X,Y) get_gdat_ullong((X),(Y),103)
+#define get_gdat_ip_pos103(X,Y) get_gdat_ip((X),(Y),103)
+#define get_gdat_ipv6_pos103(X,Y) get_gdat_ipv6((X),(Y),103)
+#define get_gdat_string_pos103(X,Y) get_gdat_string((X),(Y),103)
+#define get_gdat_v_str_pos103(X,Y) get_gdat_string((X),(Y),103)
+#define get_gdat_bool_pos103(X,Y) get_gdat_bool((X),(Y),103)
+#define get_gdat_int_pos103(X,Y) get_gdat_int((X),(Y),103)
+#define get_gdat_llong_pos103(X,Y) get_gdat_llong((X),(Y),103)
+#define get_gdat_float_pos103(X,Y) get_gdat_float((X),(Y),103)
+#define get_gdat_uint_pos104(X,Y) get_gdat_uint((X),(Y),104)
+#define get_gdat_ullong_pos104(X,Y) get_gdat_ullong((X),(Y),104)
+#define get_gdat_ip_pos104(X,Y) get_gdat_ip((X),(Y),104)
+#define get_gdat_ipv6_pos104(X,Y) get_gdat_ipv6((X),(Y),104)
+#define get_gdat_string_pos104(X,Y) get_gdat_string((X),(Y),104)
+#define get_gdat_v_str_pos104(X,Y) get_gdat_string((X),(Y),104)
+#define get_gdat_bool_pos104(X,Y) get_gdat_bool((X),(Y),104)
+#define get_gdat_int_pos104(X,Y) get_gdat_int((X),(Y),104)
+#define get_gdat_llong_pos104(X,Y) get_gdat_llong((X),(Y),104)
+#define get_gdat_float_pos104(X,Y) get_gdat_float((X),(Y),104)
+#define get_gdat_uint_pos105(X,Y) get_gdat_uint((X),(Y),105)
+#define get_gdat_ullong_pos105(X,Y) get_gdat_ullong((X),(Y),105)
+#define get_gdat_ip_pos105(X,Y) get_gdat_ip((X),(Y),105)
+#define get_gdat_ipv6_pos105(X,Y) get_gdat_ipv6((X),(Y),105)
+#define get_gdat_string_pos105(X,Y) get_gdat_string((X),(Y),105)
+#define get_gdat_v_str_pos105(X,Y) get_gdat_string((X),(Y),105)
+#define get_gdat_bool_pos105(X,Y) get_gdat_bool((X),(Y),105)
+#define get_gdat_int_pos105(X,Y) get_gdat_int((X),(Y),105)
+#define get_gdat_llong_pos105(X,Y) get_gdat_llong((X),(Y),105)
+#define get_gdat_float_pos105(X,Y) get_gdat_float((X),(Y),105)
+#define get_gdat_uint_pos106(X,Y) get_gdat_uint((X),(Y),106)
+#define get_gdat_ullong_pos106(X,Y) get_gdat_ullong((X),(Y),106)
+#define get_gdat_ip_pos106(X,Y) get_gdat_ip((X),(Y),106)
+#define get_gdat_ipv6_pos106(X,Y) get_gdat_ipv6((X),(Y),106)
+#define get_gdat_string_pos106(X,Y) get_gdat_string((X),(Y),106)
+#define get_gdat_v_str_pos106(X,Y) get_gdat_string((X),(Y),106)
+#define get_gdat_bool_pos106(X,Y) get_gdat_bool((X),(Y),106)
+#define get_gdat_int_pos106(X,Y) get_gdat_int((X),(Y),106)
+#define get_gdat_llong_pos106(X,Y) get_gdat_llong((X),(Y),106)
+#define get_gdat_float_pos106(X,Y) get_gdat_float((X),(Y),106)
+#define get_gdat_uint_pos107(X,Y) get_gdat_uint((X),(Y),107)
+#define get_gdat_ullong_pos107(X,Y) get_gdat_ullong((X),(Y),107)
+#define get_gdat_ip_pos107(X,Y) get_gdat_ip((X),(Y),107)
+#define get_gdat_ipv6_pos107(X,Y) get_gdat_ipv6((X),(Y),107)
+#define get_gdat_string_pos107(X,Y) get_gdat_string((X),(Y),107)
+#define get_gdat_v_str_pos107(X,Y) get_gdat_string((X),(Y),107)
+#define get_gdat_bool_pos107(X,Y) get_gdat_bool((X),(Y),107)
+#define get_gdat_int_pos107(X,Y) get_gdat_int((X),(Y),107)
+#define get_gdat_llong_pos107(X,Y) get_gdat_llong((X),(Y),107)
+#define get_gdat_float_pos107(X,Y) get_gdat_float((X),(Y),107)
+#define get_gdat_uint_pos108(X,Y) get_gdat_uint((X),(Y),108)
+#define get_gdat_ullong_pos108(X,Y) get_gdat_ullong((X),(Y),108)
+#define get_gdat_ip_pos108(X,Y) get_gdat_ip((X),(Y),108)
+#define get_gdat_ipv6_pos108(X,Y) get_gdat_ipv6((X),(Y),108)
+#define get_gdat_string_pos108(X,Y) get_gdat_string((X),(Y),108)
+#define get_gdat_v_str_pos108(X,Y) get_gdat_string((X),(Y),108)
+#define get_gdat_bool_pos108(X,Y) get_gdat_bool((X),(Y),108)
+#define get_gdat_int_pos108(X,Y) get_gdat_int((X),(Y),108)
+#define get_gdat_llong_pos108(X,Y) get_gdat_llong((X),(Y),108)
+#define get_gdat_float_pos108(X,Y) get_gdat_float((X),(Y),108)
+#define get_gdat_uint_pos109(X,Y) get_gdat_uint((X),(Y),109)
+#define get_gdat_ullong_pos109(X,Y) get_gdat_ullong((X),(Y),109)
+#define get_gdat_ip_pos109(X,Y) get_gdat_ip((X),(Y),109)
+#define get_gdat_ipv6_pos109(X,Y) get_gdat_ipv6((X),(Y),109)
+#define get_gdat_string_pos109(X,Y) get_gdat_string((X),(Y),109)
+#define get_gdat_v_str_pos109(X,Y) get_gdat_string((X),(Y),109)
+#define get_gdat_bool_pos109(X,Y) get_gdat_bool((X),(Y),109)
+#define get_gdat_int_pos109(X,Y) get_gdat_int((X),(Y),109)
+#define get_gdat_llong_pos109(X,Y) get_gdat_llong((X),(Y),109)
+#define get_gdat_float_pos109(X,Y) get_gdat_float((X),(Y),109)
+#define get_gdat_uint_pos110(X,Y) get_gdat_uint((X),(Y),110)
+#define get_gdat_ullong_pos110(X,Y) get_gdat_ullong((X),(Y),110)
+#define get_gdat_ip_pos110(X,Y) get_gdat_ip((X),(Y),110)
+#define get_gdat_ipv6_pos110(X,Y) get_gdat_ipv6((X),(Y),110)
+#define get_gdat_string_pos110(X,Y) get_gdat_string((X),(Y),110)
+#define get_gdat_v_str_pos110(X,Y) get_gdat_string((X),(Y),110)
+#define get_gdat_bool_pos110(X,Y) get_gdat_bool((X),(Y),110)
+#define get_gdat_int_pos110(X,Y) get_gdat_int((X),(Y),110)
+#define get_gdat_llong_pos110(X,Y) get_gdat_llong((X),(Y),110)
+#define get_gdat_float_pos110(X,Y) get_gdat_float((X),(Y),110)
+#define get_gdat_uint_pos111(X,Y) get_gdat_uint((X),(Y),111)
+#define get_gdat_ullong_pos111(X,Y) get_gdat_ullong((X),(Y),111)
+#define get_gdat_ip_pos111(X,Y) get_gdat_ip((X),(Y),111)
+#define get_gdat_ipv6_pos111(X,Y) get_gdat_ipv6((X),(Y),111)
+#define get_gdat_string_pos111(X,Y) get_gdat_string((X),(Y),111)
+#define get_gdat_v_str_pos111(X,Y) get_gdat_string((X),(Y),111)
+#define get_gdat_bool_pos111(X,Y) get_gdat_bool((X),(Y),111)
+#define get_gdat_int_pos111(X,Y) get_gdat_int((X),(Y),111)
+#define get_gdat_llong_pos111(X,Y) get_gdat_llong((X),(Y),111)
+#define get_gdat_float_pos111(X,Y) get_gdat_float((X),(Y),111)
+#define get_gdat_uint_pos112(X,Y) get_gdat_uint((X),(Y),112)
+#define get_gdat_ullong_pos112(X,Y) get_gdat_ullong((X),(Y),112)
+#define get_gdat_ip_pos112(X,Y) get_gdat_ip((X),(Y),112)
+#define get_gdat_ipv6_pos112(X,Y) get_gdat_ipv6((X),(Y),112)
+#define get_gdat_string_pos112(X,Y) get_gdat_string((X),(Y),112)
+#define get_gdat_v_str_pos112(X,Y) get_gdat_string((X),(Y),112)
+#define get_gdat_bool_pos112(X,Y) get_gdat_bool((X),(Y),112)
+#define get_gdat_int_pos112(X,Y) get_gdat_int((X),(Y),112)
+#define get_gdat_llong_pos112(X,Y) get_gdat_llong((X),(Y),112)
+#define get_gdat_float_pos112(X,Y) get_gdat_float((X),(Y),112)
+#define get_gdat_uint_pos113(X,Y) get_gdat_uint((X),(Y),113)
+#define get_gdat_ullong_pos113(X,Y) get_gdat_ullong((X),(Y),113)
+#define get_gdat_ip_pos113(X,Y) get_gdat_ip((X),(Y),113)
+#define get_gdat_ipv6_pos113(X,Y) get_gdat_ipv6((X),(Y),113)
+#define get_gdat_string_pos113(X,Y) get_gdat_string((X),(Y),113)
+#define get_gdat_v_str_pos113(X,Y) get_gdat_string((X),(Y),113)
+#define get_gdat_bool_pos113(X,Y) get_gdat_bool((X),(Y),113)
+#define get_gdat_int_pos113(X,Y) get_gdat_int((X),(Y),113)
+#define get_gdat_llong_pos113(X,Y) get_gdat_llong((X),(Y),113)
+#define get_gdat_float_pos113(X,Y) get_gdat_float((X),(Y),113)
+#define get_gdat_uint_pos114(X,Y) get_gdat_uint((X),(Y),114)
+#define get_gdat_ullong_pos114(X,Y) get_gdat_ullong((X),(Y),114)
+#define get_gdat_ip_pos114(X,Y) get_gdat_ip((X),(Y),114)
+#define get_gdat_ipv6_pos114(X,Y) get_gdat_ipv6((X),(Y),114)
+#define get_gdat_string_pos114(X,Y) get_gdat_string((X),(Y),114)
+#define get_gdat_v_str_pos114(X,Y) get_gdat_string((X),(Y),114)
+#define get_gdat_bool_pos114(X,Y) get_gdat_bool((X),(Y),114)
+#define get_gdat_int_pos114(X,Y) get_gdat_int((X),(Y),114)
+#define get_gdat_llong_pos114(X,Y) get_gdat_llong((X),(Y),114)
+#define get_gdat_float_pos114(X,Y) get_gdat_float((X),(Y),114)
+#define get_gdat_uint_pos115(X,Y) get_gdat_uint((X),(Y),115)
+#define get_gdat_ullong_pos115(X,Y) get_gdat_ullong((X),(Y),115)
+#define get_gdat_ip_pos115(X,Y) get_gdat_ip((X),(Y),115)
+#define get_gdat_ipv6_pos115(X,Y) get_gdat_ipv6((X),(Y),115)
+#define get_gdat_string_pos115(X,Y) get_gdat_string((X),(Y),115)
+#define get_gdat_v_str_pos115(X,Y) get_gdat_string((X),(Y),115)
+#define get_gdat_bool_pos115(X,Y) get_gdat_bool((X),(Y),115)
+#define get_gdat_int_pos115(X,Y) get_gdat_int((X),(Y),115)
+#define get_gdat_llong_pos115(X,Y) get_gdat_llong((X),(Y),115)
+#define get_gdat_float_pos115(X,Y) get_gdat_float((X),(Y),115)
+#define get_gdat_uint_pos116(X,Y) get_gdat_uint((X),(Y),116)
+#define get_gdat_ullong_pos116(X,Y) get_gdat_ullong((X),(Y),116)
+#define get_gdat_ip_pos116(X,Y) get_gdat_ip((X),(Y),116)
+#define get_gdat_ipv6_pos116(X,Y) get_gdat_ipv6((X),(Y),116)
+#define get_gdat_string_pos116(X,Y) get_gdat_string((X),(Y),116)
+#define get_gdat_v_str_pos116(X,Y) get_gdat_string((X),(Y),116)
+#define get_gdat_bool_pos116(X,Y) get_gdat_bool((X),(Y),116)
+#define get_gdat_int_pos116(X,Y) get_gdat_int((X),(Y),116)
+#define get_gdat_llong_pos116(X,Y) get_gdat_llong((X),(Y),116)
+#define get_gdat_float_pos116(X,Y) get_gdat_float((X),(Y),116)
+#define get_gdat_uint_pos117(X,Y) get_gdat_uint((X),(Y),117)
+#define get_gdat_ullong_pos117(X,Y) get_gdat_ullong((X),(Y),117)
+#define get_gdat_ip_pos117(X,Y) get_gdat_ip((X),(Y),117)
+#define get_gdat_ipv6_pos117(X,Y) get_gdat_ipv6((X),(Y),117)
+#define get_gdat_string_pos117(X,Y) get_gdat_string((X),(Y),117)
+#define get_gdat_v_str_pos117(X,Y) get_gdat_string((X),(Y),117)
+#define get_gdat_bool_pos117(X,Y) get_gdat_bool((X),(Y),117)
+#define get_gdat_int_pos117(X,Y) get_gdat_int((X),(Y),117)
+#define get_gdat_llong_pos117(X,Y) get_gdat_llong((X),(Y),117)
+#define get_gdat_float_pos117(X,Y) get_gdat_float((X),(Y),117)
+#define get_gdat_uint_pos118(X,Y) get_gdat_uint((X),(Y),118)
+#define get_gdat_ullong_pos118(X,Y) get_gdat_ullong((X),(Y),118)
+#define get_gdat_ip_pos118(X,Y) get_gdat_ip((X),(Y),118)
+#define get_gdat_ipv6_pos118(X,Y) get_gdat_ipv6((X),(Y),118)
+#define get_gdat_string_pos118(X,Y) get_gdat_string((X),(Y),118)
+#define get_gdat_v_str_pos118(X,Y) get_gdat_string((X),(Y),118)
+#define get_gdat_bool_pos118(X,Y) get_gdat_bool((X),(Y),118)
+#define get_gdat_int_pos118(X,Y) get_gdat_int((X),(Y),118)
+#define get_gdat_llong_pos118(X,Y) get_gdat_llong((X),(Y),118)
+#define get_gdat_float_pos118(X,Y) get_gdat_float((X),(Y),118)
+#define get_gdat_uint_pos119(X,Y) get_gdat_uint((X),(Y),119)
+#define get_gdat_ullong_pos119(X,Y) get_gdat_ullong((X),(Y),119)
+#define get_gdat_ip_pos119(X,Y) get_gdat_ip((X),(Y),119)
+#define get_gdat_ipv6_pos119(X,Y) get_gdat_ipv6((X),(Y),119)
+#define get_gdat_string_pos119(X,Y) get_gdat_string((X),(Y),119)
+#define get_gdat_v_str_pos119(X,Y) get_gdat_string((X),(Y),119)
+#define get_gdat_bool_pos119(X,Y) get_gdat_bool((X),(Y),119)
+#define get_gdat_int_pos119(X,Y) get_gdat_int((X),(Y),119)
+#define get_gdat_llong_pos119(X,Y) get_gdat_llong((X),(Y),119)
+#define get_gdat_float_pos119(X,Y) get_gdat_float((X),(Y),119)
+#define get_gdat_uint_pos120(X,Y) get_gdat_uint((X),(Y),120)
+#define get_gdat_ullong_pos120(X,Y) get_gdat_ullong((X),(Y),120)
+#define get_gdat_ip_pos120(X,Y) get_gdat_ip((X),(Y),120)
+#define get_gdat_ipv6_pos120(X,Y) get_gdat_ipv6((X),(Y),120)
+#define get_gdat_string_pos120(X,Y) get_gdat_string((X),(Y),120)
+#define get_gdat_v_str_pos120(X,Y) get_gdat_string((X),(Y),120)
+#define get_gdat_bool_pos120(X,Y) get_gdat_bool((X),(Y),120)
+#define get_gdat_int_pos120(X,Y) get_gdat_int((X),(Y),120)
+#define get_gdat_llong_pos120(X,Y) get_gdat_llong((X),(Y),120)
+#define get_gdat_float_pos120(X,Y) get_gdat_float((X),(Y),120)
+#define get_gdat_uint_pos121(X,Y) get_gdat_uint((X),(Y),121)
+#define get_gdat_ullong_pos121(X,Y) get_gdat_ullong((X),(Y),121)
+#define get_gdat_ip_pos121(X,Y) get_gdat_ip((X),(Y),121)
+#define get_gdat_ipv6_pos121(X,Y) get_gdat_ipv6((X),(Y),121)
+#define get_gdat_string_pos121(X,Y) get_gdat_string((X),(Y),121)
+#define get_gdat_v_str_pos121(X,Y) get_gdat_string((X),(Y),121)
+#define get_gdat_bool_pos121(X,Y) get_gdat_bool((X),(Y),121)
+#define get_gdat_int_pos121(X,Y) get_gdat_int((X),(Y),121)
+#define get_gdat_llong_pos121(X,Y) get_gdat_llong((X),(Y),121)
+#define get_gdat_float_pos121(X,Y) get_gdat_float((X),(Y),121)
+#define get_gdat_uint_pos122(X,Y) get_gdat_uint((X),(Y),122)
+#define get_gdat_ullong_pos122(X,Y) get_gdat_ullong((X),(Y),122)
+#define get_gdat_ip_pos122(X,Y) get_gdat_ip((X),(Y),122)
+#define get_gdat_ipv6_pos122(X,Y) get_gdat_ipv6((X),(Y),122)
+#define get_gdat_string_pos122(X,Y) get_gdat_string((X),(Y),122)
+#define get_gdat_v_str_pos122(X,Y) get_gdat_string((X),(Y),122)
+#define get_gdat_bool_pos122(X,Y) get_gdat_bool((X),(Y),122)
+#define get_gdat_int_pos122(X,Y) get_gdat_int((X),(Y),122)
+#define get_gdat_llong_pos122(X,Y) get_gdat_llong((X),(Y),122)
+#define get_gdat_float_pos122(X,Y) get_gdat_float((X),(Y),122)
+#define get_gdat_uint_pos123(X,Y) get_gdat_uint((X),(Y),123)
+#define get_gdat_ullong_pos123(X,Y) get_gdat_ullong((X),(Y),123)
+#define get_gdat_ip_pos123(X,Y) get_gdat_ip((X),(Y),123)
+#define get_gdat_ipv6_pos123(X,Y) get_gdat_ipv6((X),(Y),123)
+#define get_gdat_string_pos123(X,Y) get_gdat_string((X),(Y),123)
+#define get_gdat_v_str_pos123(X,Y) get_gdat_string((X),(Y),123)
+#define get_gdat_bool_pos123(X,Y) get_gdat_bool((X),(Y),123)
+#define get_gdat_int_pos123(X,Y) get_gdat_int((X),(Y),123)
+#define get_gdat_llong_pos123(X,Y) get_gdat_llong((X),(Y),123)
+#define get_gdat_float_pos123(X,Y) get_gdat_float((X),(Y),123)
+#define get_gdat_uint_pos124(X,Y) get_gdat_uint((X),(Y),124)
+#define get_gdat_ullong_pos124(X,Y) get_gdat_ullong((X),(Y),124)
+#define get_gdat_ip_pos124(X,Y) get_gdat_ip((X),(Y),124)
+#define get_gdat_ipv6_pos124(X,Y) get_gdat_ipv6((X),(Y),124)
+#define get_gdat_string_pos124(X,Y) get_gdat_string((X),(Y),124)
+#define get_gdat_v_str_pos124(X,Y) get_gdat_string((X),(Y),124)
+#define get_gdat_bool_pos124(X,Y) get_gdat_bool((X),(Y),124)
+#define get_gdat_int_pos124(X,Y) get_gdat_int((X),(Y),124)
+#define get_gdat_llong_pos124(X,Y) get_gdat_llong((X),(Y),124)
+#define get_gdat_float_pos124(X,Y) get_gdat_float((X),(Y),124)
+#define get_gdat_uint_pos125(X,Y) get_gdat_uint((X),(Y),125)
+#define get_gdat_ullong_pos125(X,Y) get_gdat_ullong((X),(Y),125)
+#define get_gdat_ip_pos125(X,Y) get_gdat_ip((X),(Y),125)
+#define get_gdat_ipv6_pos125(X,Y) get_gdat_ipv6((X),(Y),125)
+#define get_gdat_string_pos125(X,Y) get_gdat_string((X),(Y),125)
+#define get_gdat_v_str_pos125(X,Y) get_gdat_string((X),(Y),125)
+#define get_gdat_bool_pos125(X,Y) get_gdat_bool((X),(Y),125)
+#define get_gdat_int_pos125(X,Y) get_gdat_int((X),(Y),125)
+#define get_gdat_llong_pos125(X,Y) get_gdat_llong((X),(Y),125)
+#define get_gdat_float_pos125(X,Y) get_gdat_float((X),(Y),125)
+#define get_gdat_uint_pos126(X,Y) get_gdat_uint((X),(Y),126)
+#define get_gdat_ullong_pos126(X,Y) get_gdat_ullong((X),(Y),126)
+#define get_gdat_ip_pos126(X,Y) get_gdat_ip((X),(Y),126)
+#define get_gdat_ipv6_pos126(X,Y) get_gdat_ipv6((X),(Y),126)
+#define get_gdat_string_pos126(X,Y) get_gdat_string((X),(Y),126)
+#define get_gdat_v_str_pos126(X,Y) get_gdat_string((X),(Y),126)
+#define get_gdat_bool_pos126(X,Y) get_gdat_bool((X),(Y),126)
+#define get_gdat_int_pos126(X,Y) get_gdat_int((X),(Y),126)
+#define get_gdat_llong_pos126(X,Y) get_gdat_llong((X),(Y),126)
+#define get_gdat_float_pos126(X,Y) get_gdat_float((X),(Y),126)
+#define get_gdat_uint_pos127(X,Y) get_gdat_uint((X),(Y),127)
+#define get_gdat_ullong_pos127(X,Y) get_gdat_ullong((X),(Y),127)
+#define get_gdat_ip_pos127(X,Y) get_gdat_ip((X),(Y),127)
+#define get_gdat_ipv6_pos127(X,Y) get_gdat_ipv6((X),(Y),127)
+#define get_gdat_string_pos127(X,Y) get_gdat_string((X),(Y),127)
+#define get_gdat_v_str_pos127(X,Y) get_gdat_string((X),(Y),127)
+#define get_gdat_bool_pos127(X,Y) get_gdat_bool((X),(Y),127)
+#define get_gdat_int_pos127(X,Y) get_gdat_int((X),(Y),127)
+#define get_gdat_llong_pos127(X,Y) get_gdat_llong((X),(Y),127)
+#define get_gdat_float_pos127(X,Y) get_gdat_float((X),(Y),127)
+#define get_gdat_uint_pos128(X,Y) get_gdat_uint((X),(Y),128)
+#define get_gdat_ullong_pos128(X,Y) get_gdat_ullong((X),(Y),128)
+#define get_gdat_ip_pos128(X,Y) get_gdat_ip((X),(Y),128)
+#define get_gdat_ipv6_pos128(X,Y) get_gdat_ipv6((X),(Y),128)
+#define get_gdat_string_pos128(X,Y) get_gdat_string((X),(Y),128)
+#define get_gdat_v_str_pos128(X,Y) get_gdat_string((X),(Y),128)
+#define get_gdat_bool_pos128(X,Y) get_gdat_bool((X),(Y),128)
+#define get_gdat_int_pos128(X,Y) get_gdat_int((X),(Y),128)
+#define get_gdat_llong_pos128(X,Y) get_gdat_llong((X),(Y),128)
+#define get_gdat_float_pos128(X,Y) get_gdat_float((X),(Y),128)
+#define get_gdat_uint_pos129(X,Y) get_gdat_uint((X),(Y),129)
+#define get_gdat_ullong_pos129(X,Y) get_gdat_ullong((X),(Y),129)
+#define get_gdat_ip_pos129(X,Y) get_gdat_ip((X),(Y),129)
+#define get_gdat_ipv6_pos129(X,Y) get_gdat_ipv6((X),(Y),129)
+#define get_gdat_string_pos129(X,Y) get_gdat_string((X),(Y),129)
+#define get_gdat_v_str_pos129(X,Y) get_gdat_string((X),(Y),129)
+#define get_gdat_bool_pos129(X,Y) get_gdat_bool((X),(Y),129)
+#define get_gdat_int_pos129(X,Y) get_gdat_int((X),(Y),129)
+#define get_gdat_llong_pos129(X,Y) get_gdat_llong((X),(Y),129)
+#define get_gdat_float_pos129(X,Y) get_gdat_float((X),(Y),129)
+#define get_gdat_uint_pos130(X,Y) get_gdat_uint((X),(Y),130)
+#define get_gdat_ullong_pos130(X,Y) get_gdat_ullong((X),(Y),130)
+#define get_gdat_ip_pos130(X,Y) get_gdat_ip((X),(Y),130)
+#define get_gdat_ipv6_pos130(X,Y) get_gdat_ipv6((X),(Y),130)
+#define get_gdat_string_pos130(X,Y) get_gdat_string((X),(Y),130)
+#define get_gdat_v_str_pos130(X,Y) get_gdat_string((X),(Y),130)
+#define get_gdat_bool_pos130(X,Y) get_gdat_bool((X),(Y),130)
+#define get_gdat_int_pos130(X,Y) get_gdat_int((X),(Y),130)
+#define get_gdat_llong_pos130(X,Y) get_gdat_llong((X),(Y),130)
+#define get_gdat_float_pos130(X,Y) get_gdat_float((X),(Y),130)
+#define get_gdat_uint_pos131(X,Y) get_gdat_uint((X),(Y),131)
+#define get_gdat_ullong_pos131(X,Y) get_gdat_ullong((X),(Y),131)
+#define get_gdat_ip_pos131(X,Y) get_gdat_ip((X),(Y),131)
+#define get_gdat_ipv6_pos131(X,Y) get_gdat_ipv6((X),(Y),131)
+#define get_gdat_string_pos131(X,Y) get_gdat_string((X),(Y),131)
+#define get_gdat_v_str_pos131(X,Y) get_gdat_string((X),(Y),131)
+#define get_gdat_bool_pos131(X,Y) get_gdat_bool((X),(Y),131)
+#define get_gdat_int_pos131(X,Y) get_gdat_int((X),(Y),131)
+#define get_gdat_llong_pos131(X,Y) get_gdat_llong((X),(Y),131)
+#define get_gdat_float_pos131(X,Y) get_gdat_float((X),(Y),131)
+#define get_gdat_uint_pos132(X,Y) get_gdat_uint((X),(Y),132)
+#define get_gdat_ullong_pos132(X,Y) get_gdat_ullong((X),(Y),132)
+#define get_gdat_ip_pos132(X,Y) get_gdat_ip((X),(Y),132)
+#define get_gdat_ipv6_pos132(X,Y) get_gdat_ipv6((X),(Y),132)
+#define get_gdat_string_pos132(X,Y) get_gdat_string((X),(Y),132)
+#define get_gdat_v_str_pos132(X,Y) get_gdat_string((X),(Y),132)
+#define get_gdat_bool_pos132(X,Y) get_gdat_bool((X),(Y),132)
+#define get_gdat_int_pos132(X,Y) get_gdat_int((X),(Y),132)
+#define get_gdat_llong_pos132(X,Y) get_gdat_llong((X),(Y),132)
+#define get_gdat_float_pos132(X,Y) get_gdat_float((X),(Y),132)
+#define get_gdat_uint_pos133(X,Y) get_gdat_uint((X),(Y),133)
+#define get_gdat_ullong_pos133(X,Y) get_gdat_ullong((X),(Y),133)
+#define get_gdat_ip_pos133(X,Y) get_gdat_ip((X),(Y),133)
+#define get_gdat_ipv6_pos133(X,Y) get_gdat_ipv6((X),(Y),133)
+#define get_gdat_string_pos133(X,Y) get_gdat_string((X),(Y),133)
+#define get_gdat_v_str_pos133(X,Y) get_gdat_string((X),(Y),133)
+#define get_gdat_bool_pos133(X,Y) get_gdat_bool((X),(Y),133)
+#define get_gdat_int_pos133(X,Y) get_gdat_int((X),(Y),133)
+#define get_gdat_llong_pos133(X,Y) get_gdat_llong((X),(Y),133)
+#define get_gdat_float_pos133(X,Y) get_gdat_float((X),(Y),133)
+#define get_gdat_uint_pos134(X,Y) get_gdat_uint((X),(Y),134)
+#define get_gdat_ullong_pos134(X,Y) get_gdat_ullong((X),(Y),134)
+#define get_gdat_ip_pos134(X,Y) get_gdat_ip((X),(Y),134)
+#define get_gdat_ipv6_pos134(X,Y) get_gdat_ipv6((X),(Y),134)
+#define get_gdat_string_pos134(X,Y) get_gdat_string((X),(Y),134)
+#define get_gdat_v_str_pos134(X,Y) get_gdat_string((X),(Y),134)
+#define get_gdat_bool_pos134(X,Y) get_gdat_bool((X),(Y),134)
+#define get_gdat_int_pos134(X,Y) get_gdat_int((X),(Y),134)
+#define get_gdat_llong_pos134(X,Y) get_gdat_llong((X),(Y),134)
+#define get_gdat_float_pos134(X,Y) get_gdat_float((X),(Y),134)
+#define get_gdat_uint_pos135(X,Y) get_gdat_uint((X),(Y),135)
+#define get_gdat_ullong_pos135(X,Y) get_gdat_ullong((X),(Y),135)
+#define get_gdat_ip_pos135(X,Y) get_gdat_ip((X),(Y),135)
+#define get_gdat_ipv6_pos135(X,Y) get_gdat_ipv6((X),(Y),135)
+#define get_gdat_string_pos135(X,Y) get_gdat_string((X),(Y),135)
+#define get_gdat_v_str_pos135(X,Y) get_gdat_string((X),(Y),135)
+#define get_gdat_bool_pos135(X,Y) get_gdat_bool((X),(Y),135)
+#define get_gdat_int_pos135(X,Y) get_gdat_int((X),(Y),135)
+#define get_gdat_llong_pos135(X,Y) get_gdat_llong((X),(Y),135)
+#define get_gdat_float_pos135(X,Y) get_gdat_float((X),(Y),135)
+#define get_gdat_uint_pos136(X,Y) get_gdat_uint((X),(Y),136)
+#define get_gdat_ullong_pos136(X,Y) get_gdat_ullong((X),(Y),136)
+#define get_gdat_ip_pos136(X,Y) get_gdat_ip((X),(Y),136)
+#define get_gdat_ipv6_pos136(X,Y) get_gdat_ipv6((X),(Y),136)
+#define get_gdat_string_pos136(X,Y) get_gdat_string((X),(Y),136)
+#define get_gdat_v_str_pos136(X,Y) get_gdat_string((X),(Y),136)
+#define get_gdat_bool_pos136(X,Y) get_gdat_bool((X),(Y),136)
+#define get_gdat_int_pos136(X,Y) get_gdat_int((X),(Y),136)
+#define get_gdat_llong_pos136(X,Y) get_gdat_llong((X),(Y),136)
+#define get_gdat_float_pos136(X,Y) get_gdat_float((X),(Y),136)
+#define get_gdat_uint_pos137(X,Y) get_gdat_uint((X),(Y),137)
+#define get_gdat_ullong_pos137(X,Y) get_gdat_ullong((X),(Y),137)
+#define get_gdat_ip_pos137(X,Y) get_gdat_ip((X),(Y),137)
+#define get_gdat_ipv6_pos137(X,Y) get_gdat_ipv6((X),(Y),137)
+#define get_gdat_string_pos137(X,Y) get_gdat_string((X),(Y),137)
+#define get_gdat_v_str_pos137(X,Y) get_gdat_string((X),(Y),137)
+#define get_gdat_bool_pos137(X,Y) get_gdat_bool((X),(Y),137)
+#define get_gdat_int_pos137(X,Y) get_gdat_int((X),(Y),137)
+#define get_gdat_llong_pos137(X,Y) get_gdat_llong((X),(Y),137)
+#define get_gdat_float_pos137(X,Y) get_gdat_float((X),(Y),137)
+#define get_gdat_uint_pos138(X,Y) get_gdat_uint((X),(Y),138)
+#define get_gdat_ullong_pos138(X,Y) get_gdat_ullong((X),(Y),138)
+#define get_gdat_ip_pos138(X,Y) get_gdat_ip((X),(Y),138)
+#define get_gdat_ipv6_pos138(X,Y) get_gdat_ipv6((X),(Y),138)
+#define get_gdat_string_pos138(X,Y) get_gdat_string((X),(Y),138)
+#define get_gdat_v_str_pos138(X,Y) get_gdat_string((X),(Y),138)
+#define get_gdat_bool_pos138(X,Y) get_gdat_bool((X),(Y),138)
+#define get_gdat_int_pos138(X,Y) get_gdat_int((X),(Y),138)
+#define get_gdat_llong_pos138(X,Y) get_gdat_llong((X),(Y),138)
+#define get_gdat_float_pos138(X,Y) get_gdat_float((X),(Y),138)
+#define get_gdat_uint_pos139(X,Y) get_gdat_uint((X),(Y),139)
+#define get_gdat_ullong_pos139(X,Y) get_gdat_ullong((X),(Y),139)
+#define get_gdat_ip_pos139(X,Y) get_gdat_ip((X),(Y),139)
+#define get_gdat_ipv6_pos139(X,Y) get_gdat_ipv6((X),(Y),139)
+#define get_gdat_string_pos139(X,Y) get_gdat_string((X),(Y),139)
+#define get_gdat_v_str_pos139(X,Y) get_gdat_string((X),(Y),139)
+#define get_gdat_bool_pos139(X,Y) get_gdat_bool((X),(Y),139)
+#define get_gdat_int_pos139(X,Y) get_gdat_int((X),(Y),139)
+#define get_gdat_llong_pos139(X,Y) get_gdat_llong((X),(Y),139)
+#define get_gdat_float_pos139(X,Y) get_gdat_float((X),(Y),139)
+#define get_gdat_uint_pos140(X,Y) get_gdat_uint((X),(Y),140)
+#define get_gdat_ullong_pos140(X,Y) get_gdat_ullong((X),(Y),140)
+#define get_gdat_ip_pos140(X,Y) get_gdat_ip((X),(Y),140)
+#define get_gdat_ipv6_pos140(X,Y) get_gdat_ipv6((X),(Y),140)
+#define get_gdat_string_pos140(X,Y) get_gdat_string((X),(Y),140)
+#define get_gdat_v_str_pos140(X,Y) get_gdat_string((X),(Y),140)
+#define get_gdat_bool_pos140(X,Y) get_gdat_bool((X),(Y),140)
+#define get_gdat_int_pos140(X,Y) get_gdat_int((X),(Y),140)
+#define get_gdat_llong_pos140(X,Y) get_gdat_llong((X),(Y),140)
+#define get_gdat_float_pos140(X,Y) get_gdat_float((X),(Y),140)
+#define get_gdat_uint_pos141(X,Y) get_gdat_uint((X),(Y),141)
+#define get_gdat_ullong_pos141(X,Y) get_gdat_ullong((X),(Y),141)
+#define get_gdat_ip_pos141(X,Y) get_gdat_ip((X),(Y),141)
+#define get_gdat_ipv6_pos141(X,Y) get_gdat_ipv6((X),(Y),141)
+#define get_gdat_string_pos141(X,Y) get_gdat_string((X),(Y),141)
+#define get_gdat_v_str_pos141(X,Y) get_gdat_string((X),(Y),141)
+#define get_gdat_bool_pos141(X,Y) get_gdat_bool((X),(Y),141)
+#define get_gdat_int_pos141(X,Y) get_gdat_int((X),(Y),141)
+#define get_gdat_llong_pos141(X,Y) get_gdat_llong((X),(Y),141)
+#define get_gdat_float_pos141(X,Y) get_gdat_float((X),(Y),141)
+#define get_gdat_uint_pos142(X,Y) get_gdat_uint((X),(Y),142)
+#define get_gdat_ullong_pos142(X,Y) get_gdat_ullong((X),(Y),142)
+#define get_gdat_ip_pos142(X,Y) get_gdat_ip((X),(Y),142)
+#define get_gdat_ipv6_pos142(X,Y) get_gdat_ipv6((X),(Y),142)
+#define get_gdat_string_pos142(X,Y) get_gdat_string((X),(Y),142)
+#define get_gdat_v_str_pos142(X,Y) get_gdat_string((X),(Y),142)
+#define get_gdat_bool_pos142(X,Y) get_gdat_bool((X),(Y),142)
+#define get_gdat_int_pos142(X,Y) get_gdat_int((X),(Y),142)
+#define get_gdat_llong_pos142(X,Y) get_gdat_llong((X),(Y),142)
+#define get_gdat_float_pos142(X,Y) get_gdat_float((X),(Y),142)
+#define get_gdat_uint_pos143(X,Y) get_gdat_uint((X),(Y),143)
+#define get_gdat_ullong_pos143(X,Y) get_gdat_ullong((X),(Y),143)
+#define get_gdat_ip_pos143(X,Y) get_gdat_ip((X),(Y),143)
+#define get_gdat_ipv6_pos143(X,Y) get_gdat_ipv6((X),(Y),143)
+#define get_gdat_string_pos143(X,Y) get_gdat_string((X),(Y),143)
+#define get_gdat_v_str_pos143(X,Y) get_gdat_string((X),(Y),143)
+#define get_gdat_bool_pos143(X,Y) get_gdat_bool((X),(Y),143)
+#define get_gdat_int_pos143(X,Y) get_gdat_int((X),(Y),143)
+#define get_gdat_llong_pos143(X,Y) get_gdat_llong((X),(Y),143)
+#define get_gdat_float_pos143(X,Y) get_gdat_float((X),(Y),143)
+#define get_gdat_uint_pos144(X,Y) get_gdat_uint((X),(Y),144)
+#define get_gdat_ullong_pos144(X,Y) get_gdat_ullong((X),(Y),144)
+#define get_gdat_ip_pos144(X,Y) get_gdat_ip((X),(Y),144)
+#define get_gdat_ipv6_pos144(X,Y) get_gdat_ipv6((X),(Y),144)
+#define get_gdat_string_pos144(X,Y) get_gdat_string((X),(Y),144)
+#define get_gdat_v_str_pos144(X,Y) get_gdat_string((X),(Y),144)
+#define get_gdat_bool_pos144(X,Y) get_gdat_bool((X),(Y),144)
+#define get_gdat_int_pos144(X,Y) get_gdat_int((X),(Y),144)
+#define get_gdat_llong_pos144(X,Y) get_gdat_llong((X),(Y),144)
+#define get_gdat_float_pos144(X,Y) get_gdat_float((X),(Y),144)
+#define get_gdat_uint_pos145(X,Y) get_gdat_uint((X),(Y),145)
+#define get_gdat_ullong_pos145(X,Y) get_gdat_ullong((X),(Y),145)
+#define get_gdat_ip_pos145(X,Y) get_gdat_ip((X),(Y),145)
+#define get_gdat_ipv6_pos145(X,Y) get_gdat_ipv6((X),(Y),145)
+#define get_gdat_string_pos145(X,Y) get_gdat_string((X),(Y),145)
+#define get_gdat_v_str_pos145(X,Y) get_gdat_string((X),(Y),145)
+#define get_gdat_bool_pos145(X,Y) get_gdat_bool((X),(Y),145)
+#define get_gdat_int_pos145(X,Y) get_gdat_int((X),(Y),145)
+#define get_gdat_llong_pos145(X,Y) get_gdat_llong((X),(Y),145)
+#define get_gdat_float_pos145(X,Y) get_gdat_float((X),(Y),145)
+#define get_gdat_uint_pos146(X,Y) get_gdat_uint((X),(Y),146)
+#define get_gdat_ullong_pos146(X,Y) get_gdat_ullong((X),(Y),146)
+#define get_gdat_ip_pos146(X,Y) get_gdat_ip((X),(Y),146)
+#define get_gdat_ipv6_pos146(X,Y) get_gdat_ipv6((X),(Y),146)
+#define get_gdat_string_pos146(X,Y) get_gdat_string((X),(Y),146)
+#define get_gdat_v_str_pos146(X,Y) get_gdat_string((X),(Y),146)
+#define get_gdat_bool_pos146(X,Y) get_gdat_bool((X),(Y),146)
+#define get_gdat_int_pos146(X,Y) get_gdat_int((X),(Y),146)
+#define get_gdat_llong_pos146(X,Y) get_gdat_llong((X),(Y),146)
+#define get_gdat_float_pos146(X,Y) get_gdat_float((X),(Y),146)
+#define get_gdat_uint_pos147(X,Y) get_gdat_uint((X),(Y),147)
+#define get_gdat_ullong_pos147(X,Y) get_gdat_ullong((X),(Y),147)
+#define get_gdat_ip_pos147(X,Y) get_gdat_ip((X),(Y),147)
+#define get_gdat_ipv6_pos147(X,Y) get_gdat_ipv6((X),(Y),147)
+#define get_gdat_string_pos147(X,Y) get_gdat_string((X),(Y),147)
+#define get_gdat_v_str_pos147(X,Y) get_gdat_string((X),(Y),147)
+#define get_gdat_bool_pos147(X,Y) get_gdat_bool((X),(Y),147)
+#define get_gdat_int_pos147(X,Y) get_gdat_int((X),(Y),147)
+#define get_gdat_llong_pos147(X,Y) get_gdat_llong((X),(Y),147)
+#define get_gdat_float_pos147(X,Y) get_gdat_float((X),(Y),147)
+#define get_gdat_uint_pos148(X,Y) get_gdat_uint((X),(Y),148)
+#define get_gdat_ullong_pos148(X,Y) get_gdat_ullong((X),(Y),148)
+#define get_gdat_ip_pos148(X,Y) get_gdat_ip((X),(Y),148)
+#define get_gdat_ipv6_pos148(X,Y) get_gdat_ipv6((X),(Y),148)
+#define get_gdat_string_pos148(X,Y) get_gdat_string((X),(Y),148)
+#define get_gdat_v_str_pos148(X,Y) get_gdat_string((X),(Y),148)
+#define get_gdat_bool_pos148(X,Y) get_gdat_bool((X),(Y),148)
+#define get_gdat_int_pos148(X,Y) get_gdat_int((X),(Y),148)
+#define get_gdat_llong_pos148(X,Y) get_gdat_llong((X),(Y),148)
+#define get_gdat_float_pos148(X,Y) get_gdat_float((X),(Y),148)
+#define get_gdat_uint_pos149(X,Y) get_gdat_uint((X),(Y),149)
+#define get_gdat_ullong_pos149(X,Y) get_gdat_ullong((X),(Y),149)
+#define get_gdat_ip_pos149(X,Y) get_gdat_ip((X),(Y),149)
+#define get_gdat_ipv6_pos149(X,Y) get_gdat_ipv6((X),(Y),149)
+#define get_gdat_string_pos149(X,Y) get_gdat_string((X),(Y),149)
+#define get_gdat_v_str_pos149(X,Y) get_gdat_string((X),(Y),149)
+#define get_gdat_bool_pos149(X,Y) get_gdat_bool((X),(Y),149)
+#define get_gdat_int_pos149(X,Y) get_gdat_int((X),(Y),149)
+#define get_gdat_llong_pos149(X,Y) get_gdat_llong((X),(Y),149)
+#define get_gdat_float_pos149(X,Y) get_gdat_float((X),(Y),149)
+#define get_gdat_uint_pos150(X,Y) get_gdat_uint((X),(Y),150)
+#define get_gdat_ullong_pos150(X,Y) get_gdat_ullong((X),(Y),150)
+#define get_gdat_ip_pos150(X,Y) get_gdat_ip((X),(Y),150)
+#define get_gdat_ipv6_pos150(X,Y) get_gdat_ipv6((X),(Y),150)
+#define get_gdat_string_pos150(X,Y) get_gdat_string((X),(Y),150)
+#define get_gdat_v_str_pos150(X,Y) get_gdat_string((X),(Y),150)
+#define get_gdat_bool_pos150(X,Y) get_gdat_bool((X),(Y),150)
+#define get_gdat_int_pos150(X,Y) get_gdat_int((X),(Y),150)
+#define get_gdat_llong_pos150(X,Y) get_gdat_llong((X),(Y),150)
+#define get_gdat_float_pos150(X,Y) get_gdat_float((X),(Y),150)
+#define get_gdat_uint_pos151(X,Y) get_gdat_uint((X),(Y),151)
+#define get_gdat_ullong_pos151(X,Y) get_gdat_ullong((X),(Y),151)
+#define get_gdat_ip_pos151(X,Y) get_gdat_ip((X),(Y),151)
+#define get_gdat_ipv6_pos151(X,Y) get_gdat_ipv6((X),(Y),151)
+#define get_gdat_string_pos151(X,Y) get_gdat_string((X),(Y),151)
+#define get_gdat_v_str_pos151(X,Y) get_gdat_string((X),(Y),151)
+#define get_gdat_bool_pos151(X,Y) get_gdat_bool((X),(Y),151)
+#define get_gdat_int_pos151(X,Y) get_gdat_int((X),(Y),151)
+#define get_gdat_llong_pos151(X,Y) get_gdat_llong((X),(Y),151)
+#define get_gdat_float_pos151(X,Y) get_gdat_float((X),(Y),151)
+#define get_gdat_uint_pos152(X,Y) get_gdat_uint((X),(Y),152)
+#define get_gdat_ullong_pos152(X,Y) get_gdat_ullong((X),(Y),152)
+#define get_gdat_ip_pos152(X,Y) get_gdat_ip((X),(Y),152)
+#define get_gdat_ipv6_pos152(X,Y) get_gdat_ipv6((X),(Y),152)
+#define get_gdat_string_pos152(X,Y) get_gdat_string((X),(Y),152)
+#define get_gdat_v_str_pos152(X,Y) get_gdat_string((X),(Y),152)
+#define get_gdat_bool_pos152(X,Y) get_gdat_bool((X),(Y),152)
+#define get_gdat_int_pos152(X,Y) get_gdat_int((X),(Y),152)
+#define get_gdat_llong_pos152(X,Y) get_gdat_llong((X),(Y),152)
+#define get_gdat_float_pos152(X,Y) get_gdat_float((X),(Y),152)
+#define get_gdat_uint_pos153(X,Y) get_gdat_uint((X),(Y),153)
+#define get_gdat_ullong_pos153(X,Y) get_gdat_ullong((X),(Y),153)
+#define get_gdat_ip_pos153(X,Y) get_gdat_ip((X),(Y),153)
+#define get_gdat_ipv6_pos153(X,Y) get_gdat_ipv6((X),(Y),153)
+#define get_gdat_string_pos153(X,Y) get_gdat_string((X),(Y),153)
+#define get_gdat_v_str_pos153(X,Y) get_gdat_string((X),(Y),153)
+#define get_gdat_bool_pos153(X,Y) get_gdat_bool((X),(Y),153)
+#define get_gdat_int_pos153(X,Y) get_gdat_int((X),(Y),153)
+#define get_gdat_llong_pos153(X,Y) get_gdat_llong((X),(Y),153)
+#define get_gdat_float_pos153(X,Y) get_gdat_float((X),(Y),153)
+#define get_gdat_uint_pos154(X,Y) get_gdat_uint((X),(Y),154)
+#define get_gdat_ullong_pos154(X,Y) get_gdat_ullong((X),(Y),154)
+#define get_gdat_ip_pos154(X,Y) get_gdat_ip((X),(Y),154)
+#define get_gdat_ipv6_pos154(X,Y) get_gdat_ipv6((X),(Y),154)
+#define get_gdat_string_pos154(X,Y) get_gdat_string((X),(Y),154)
+#define get_gdat_v_str_pos154(X,Y) get_gdat_string((X),(Y),154)
+#define get_gdat_bool_pos154(X,Y) get_gdat_bool((X),(Y),154)
+#define get_gdat_int_pos154(X,Y) get_gdat_int((X),(Y),154)
+#define get_gdat_llong_pos154(X,Y) get_gdat_llong((X),(Y),154)
+#define get_gdat_float_pos154(X,Y) get_gdat_float((X),(Y),154)
+#define get_gdat_uint_pos155(X,Y) get_gdat_uint((X),(Y),155)
+#define get_gdat_ullong_pos155(X,Y) get_gdat_ullong((X),(Y),155)
+#define get_gdat_ip_pos155(X,Y) get_gdat_ip((X),(Y),155)
+#define get_gdat_ipv6_pos155(X,Y) get_gdat_ipv6((X),(Y),155)
+#define get_gdat_string_pos155(X,Y) get_gdat_string((X),(Y),155)
+#define get_gdat_v_str_pos155(X,Y) get_gdat_string((X),(Y),155)
+#define get_gdat_bool_pos155(X,Y) get_gdat_bool((X),(Y),155)
+#define get_gdat_int_pos155(X,Y) get_gdat_int((X),(Y),155)
+#define get_gdat_llong_pos155(X,Y) get_gdat_llong((X),(Y),155)
+#define get_gdat_float_pos155(X,Y) get_gdat_float((X),(Y),155)
+#define get_gdat_uint_pos156(X,Y) get_gdat_uint((X),(Y),156)
+#define get_gdat_ullong_pos156(X,Y) get_gdat_ullong((X),(Y),156)
+#define get_gdat_ip_pos156(X,Y) get_gdat_ip((X),(Y),156)
+#define get_gdat_ipv6_pos156(X,Y) get_gdat_ipv6((X),(Y),156)
+#define get_gdat_string_pos156(X,Y) get_gdat_string((X),(Y),156)
+#define get_gdat_v_str_pos156(X,Y) get_gdat_string((X),(Y),156)
+#define get_gdat_bool_pos156(X,Y) get_gdat_bool((X),(Y),156)
+#define get_gdat_int_pos156(X,Y) get_gdat_int((X),(Y),156)
+#define get_gdat_llong_pos156(X,Y) get_gdat_llong((X),(Y),156)
+#define get_gdat_float_pos156(X,Y) get_gdat_float((X),(Y),156)
+#define get_gdat_uint_pos157(X,Y) get_gdat_uint((X),(Y),157)
+#define get_gdat_ullong_pos157(X,Y) get_gdat_ullong((X),(Y),157)
+#define get_gdat_ip_pos157(X,Y) get_gdat_ip((X),(Y),157)
+#define get_gdat_ipv6_pos157(X,Y) get_gdat_ipv6((X),(Y),157)
+#define get_gdat_string_pos157(X,Y) get_gdat_string((X),(Y),157)
+#define get_gdat_v_str_pos157(X,Y) get_gdat_string((X),(Y),157)
+#define get_gdat_bool_pos157(X,Y) get_gdat_bool((X),(Y),157)
+#define get_gdat_int_pos157(X,Y) get_gdat_int((X),(Y),157)
+#define get_gdat_llong_pos157(X,Y) get_gdat_llong((X),(Y),157)
+#define get_gdat_float_pos157(X,Y) get_gdat_float((X),(Y),157)
+#define get_gdat_uint_pos158(X,Y) get_gdat_uint((X),(Y),158)
+#define get_gdat_ullong_pos158(X,Y) get_gdat_ullong((X),(Y),158)
+#define get_gdat_ip_pos158(X,Y) get_gdat_ip((X),(Y),158)
+#define get_gdat_ipv6_pos158(X,Y) get_gdat_ipv6((X),(Y),158)
+#define get_gdat_string_pos158(X,Y) get_gdat_string((X),(Y),158)
+#define get_gdat_v_str_pos158(X,Y) get_gdat_string((X),(Y),158)
+#define get_gdat_bool_pos158(X,Y) get_gdat_bool((X),(Y),158)
+#define get_gdat_int_pos158(X,Y) get_gdat_int((X),(Y),158)
+#define get_gdat_llong_pos158(X,Y) get_gdat_llong((X),(Y),158)
+#define get_gdat_float_pos158(X,Y) get_gdat_float((X),(Y),158)
+#define get_gdat_uint_pos159(X,Y) get_gdat_uint((X),(Y),159)
+#define get_gdat_ullong_pos159(X,Y) get_gdat_ullong((X),(Y),159)
+#define get_gdat_ip_pos159(X,Y) get_gdat_ip((X),(Y),159)
+#define get_gdat_ipv6_pos159(X,Y) get_gdat_ipv6((X),(Y),159)
+#define get_gdat_string_pos159(X,Y) get_gdat_string((X),(Y),159)
+#define get_gdat_v_str_pos159(X,Y) get_gdat_string((X),(Y),159)
+#define get_gdat_bool_pos159(X,Y) get_gdat_bool((X),(Y),159)
+#define get_gdat_int_pos159(X,Y) get_gdat_int((X),(Y),159)
+#define get_gdat_llong_pos159(X,Y) get_gdat_llong((X),(Y),159)
+#define get_gdat_float_pos159(X,Y) get_gdat_float((X),(Y),159)
+#define get_gdat_uint_pos160(X,Y) get_gdat_uint((X),(Y),160)
+#define get_gdat_ullong_pos160(X,Y) get_gdat_ullong((X),(Y),160)
+#define get_gdat_ip_pos160(X,Y) get_gdat_ip((X),(Y),160)
+#define get_gdat_ipv6_pos160(X,Y) get_gdat_ipv6((X),(Y),160)
+#define get_gdat_string_pos160(X,Y) get_gdat_string((X),(Y),160)
+#define get_gdat_v_str_pos160(X,Y) get_gdat_string((X),(Y),160)
+#define get_gdat_bool_pos160(X,Y) get_gdat_bool((X),(Y),160)
+#define get_gdat_int_pos160(X,Y) get_gdat_int((X),(Y),160)
+#define get_gdat_llong_pos160(X,Y) get_gdat_llong((X),(Y),160)
+#define get_gdat_float_pos160(X,Y) get_gdat_float((X),(Y),160)
+#define get_gdat_uint_pos161(X,Y) get_gdat_uint((X),(Y),161)
+#define get_gdat_ullong_pos161(X,Y) get_gdat_ullong((X),(Y),161)
+#define get_gdat_ip_pos161(X,Y) get_gdat_ip((X),(Y),161)
+#define get_gdat_ipv6_pos161(X,Y) get_gdat_ipv6((X),(Y),161)
+#define get_gdat_string_pos161(X,Y) get_gdat_string((X),(Y),161)
+#define get_gdat_v_str_pos161(X,Y) get_gdat_string((X),(Y),161)
+#define get_gdat_bool_pos161(X,Y) get_gdat_bool((X),(Y),161)
+#define get_gdat_int_pos161(X,Y) get_gdat_int((X),(Y),161)
+#define get_gdat_llong_pos161(X,Y) get_gdat_llong((X),(Y),161)
+#define get_gdat_float_pos161(X,Y) get_gdat_float((X),(Y),161)
+#define get_gdat_uint_pos162(X,Y) get_gdat_uint((X),(Y),162)
+#define get_gdat_ullong_pos162(X,Y) get_gdat_ullong((X),(Y),162)
+#define get_gdat_ip_pos162(X,Y) get_gdat_ip((X),(Y),162)
+#define get_gdat_ipv6_pos162(X,Y) get_gdat_ipv6((X),(Y),162)
+#define get_gdat_string_pos162(X,Y) get_gdat_string((X),(Y),162)
+#define get_gdat_v_str_pos162(X,Y) get_gdat_string((X),(Y),162)
+#define get_gdat_bool_pos162(X,Y) get_gdat_bool((X),(Y),162)
+#define get_gdat_int_pos162(X,Y) get_gdat_int((X),(Y),162)
+#define get_gdat_llong_pos162(X,Y) get_gdat_llong((X),(Y),162)
+#define get_gdat_float_pos162(X,Y) get_gdat_float((X),(Y),162)
+#define get_gdat_uint_pos163(X,Y) get_gdat_uint((X),(Y),163)
+#define get_gdat_ullong_pos163(X,Y) get_gdat_ullong((X),(Y),163)
+#define get_gdat_ip_pos163(X,Y) get_gdat_ip((X),(Y),163)
+#define get_gdat_ipv6_pos163(X,Y) get_gdat_ipv6((X),(Y),163)
+#define get_gdat_string_pos163(X,Y) get_gdat_string((X),(Y),163)
+#define get_gdat_v_str_pos163(X,Y) get_gdat_string((X),(Y),163)
+#define get_gdat_bool_pos163(X,Y) get_gdat_bool((X),(Y),163)
+#define get_gdat_int_pos163(X,Y) get_gdat_int((X),(Y),163)
+#define get_gdat_llong_pos163(X,Y) get_gdat_llong((X),(Y),163)
+#define get_gdat_float_pos163(X,Y) get_gdat_float((X),(Y),163)
+#define get_gdat_uint_pos164(X,Y) get_gdat_uint((X),(Y),164)
+#define get_gdat_ullong_pos164(X,Y) get_gdat_ullong((X),(Y),164)
+#define get_gdat_ip_pos164(X,Y) get_gdat_ip((X),(Y),164)
+#define get_gdat_ipv6_pos164(X,Y) get_gdat_ipv6((X),(Y),164)
+#define get_gdat_string_pos164(X,Y) get_gdat_string((X),(Y),164)
+#define get_gdat_v_str_pos164(X,Y) get_gdat_string((X),(Y),164)
+#define get_gdat_bool_pos164(X,Y) get_gdat_bool((X),(Y),164)
+#define get_gdat_int_pos164(X,Y) get_gdat_int((X),(Y),164)
+#define get_gdat_llong_pos164(X,Y) get_gdat_llong((X),(Y),164)
+#define get_gdat_float_pos164(X,Y) get_gdat_float((X),(Y),164)
+#define get_gdat_uint_pos165(X,Y) get_gdat_uint((X),(Y),165)
+#define get_gdat_ullong_pos165(X,Y) get_gdat_ullong((X),(Y),165)
+#define get_gdat_ip_pos165(X,Y) get_gdat_ip((X),(Y),165)
+#define get_gdat_ipv6_pos165(X,Y) get_gdat_ipv6((X),(Y),165)
+#define get_gdat_string_pos165(X,Y) get_gdat_string((X),(Y),165)
+#define get_gdat_v_str_pos165(X,Y) get_gdat_string((X),(Y),165)
+#define get_gdat_bool_pos165(X,Y) get_gdat_bool((X),(Y),165)
+#define get_gdat_int_pos165(X,Y) get_gdat_int((X),(Y),165)
+#define get_gdat_llong_pos165(X,Y) get_gdat_llong((X),(Y),165)
+#define get_gdat_float_pos165(X,Y) get_gdat_float((X),(Y),165)
+#define get_gdat_uint_pos166(X,Y) get_gdat_uint((X),(Y),166)
+#define get_gdat_ullong_pos166(X,Y) get_gdat_ullong((X),(Y),166)
+#define get_gdat_ip_pos166(X,Y) get_gdat_ip((X),(Y),166)
+#define get_gdat_ipv6_pos166(X,Y) get_gdat_ipv6((X),(Y),166)
+#define get_gdat_string_pos166(X,Y) get_gdat_string((X),(Y),166)
+#define get_gdat_v_str_pos166(X,Y) get_gdat_string((X),(Y),166)
+#define get_gdat_bool_pos166(X,Y) get_gdat_bool((X),(Y),166)
+#define get_gdat_int_pos166(X,Y) get_gdat_int((X),(Y),166)
+#define get_gdat_llong_pos166(X,Y) get_gdat_llong((X),(Y),166)
+#define get_gdat_float_pos166(X,Y) get_gdat_float((X),(Y),166)
+#define get_gdat_uint_pos167(X,Y) get_gdat_uint((X),(Y),167)
+#define get_gdat_ullong_pos167(X,Y) get_gdat_ullong((X),(Y),167)
+#define get_gdat_ip_pos167(X,Y) get_gdat_ip((X),(Y),167)
+#define get_gdat_ipv6_pos167(X,Y) get_gdat_ipv6((X),(Y),167)
+#define get_gdat_string_pos167(X,Y) get_gdat_string((X),(Y),167)
+#define get_gdat_v_str_pos167(X,Y) get_gdat_string((X),(Y),167)
+#define get_gdat_bool_pos167(X,Y) get_gdat_bool((X),(Y),167)
+#define get_gdat_int_pos167(X,Y) get_gdat_int((X),(Y),167)
+#define get_gdat_llong_pos167(X,Y) get_gdat_llong((X),(Y),167)
+#define get_gdat_float_pos167(X,Y) get_gdat_float((X),(Y),167)
+#define get_gdat_uint_pos168(X,Y) get_gdat_uint((X),(Y),168)
+#define get_gdat_ullong_pos168(X,Y) get_gdat_ullong((X),(Y),168)
+#define get_gdat_ip_pos168(X,Y) get_gdat_ip((X),(Y),168)
+#define get_gdat_ipv6_pos168(X,Y) get_gdat_ipv6((X),(Y),168)
+#define get_gdat_string_pos168(X,Y) get_gdat_string((X),(Y),168)
+#define get_gdat_v_str_pos168(X,Y) get_gdat_string((X),(Y),168)
+#define get_gdat_bool_pos168(X,Y) get_gdat_bool((X),(Y),168)
+#define get_gdat_int_pos168(X,Y) get_gdat_int((X),(Y),168)
+#define get_gdat_llong_pos168(X,Y) get_gdat_llong((X),(Y),168)
+#define get_gdat_float_pos168(X,Y) get_gdat_float((X),(Y),168)
+#define get_gdat_uint_pos169(X,Y) get_gdat_uint((X),(Y),169)
+#define get_gdat_ullong_pos169(X,Y) get_gdat_ullong((X),(Y),169)
+#define get_gdat_ip_pos169(X,Y) get_gdat_ip((X),(Y),169)
+#define get_gdat_ipv6_pos169(X,Y) get_gdat_ipv6((X),(Y),169)
+#define get_gdat_string_pos169(X,Y) get_gdat_string((X),(Y),169)
+#define get_gdat_v_str_pos169(X,Y) get_gdat_string((X),(Y),169)
+#define get_gdat_bool_pos169(X,Y) get_gdat_bool((X),(Y),169)
+#define get_gdat_int_pos169(X,Y) get_gdat_int((X),(Y),169)
+#define get_gdat_llong_pos169(X,Y) get_gdat_llong((X),(Y),169)
+#define get_gdat_float_pos169(X,Y) get_gdat_float((X),(Y),169)
+#define get_gdat_uint_pos170(X,Y) get_gdat_uint((X),(Y),170)
+#define get_gdat_ullong_pos170(X,Y) get_gdat_ullong((X),(Y),170)
+#define get_gdat_ip_pos170(X,Y) get_gdat_ip((X),(Y),170)
+#define get_gdat_ipv6_pos170(X,Y) get_gdat_ipv6((X),(Y),170)
+#define get_gdat_string_pos170(X,Y) get_gdat_string((X),(Y),170)
+#define get_gdat_v_str_pos170(X,Y) get_gdat_string((X),(Y),170)
+#define get_gdat_bool_pos170(X,Y) get_gdat_bool((X),(Y),170)
+#define get_gdat_int_pos170(X,Y) get_gdat_int((X),(Y),170)
+#define get_gdat_llong_pos170(X,Y) get_gdat_llong((X),(Y),170)
+#define get_gdat_float_pos170(X,Y) get_gdat_float((X),(Y),170)
+#define get_gdat_uint_pos171(X,Y) get_gdat_uint((X),(Y),171)
+#define get_gdat_ullong_pos171(X,Y) get_gdat_ullong((X),(Y),171)
+#define get_gdat_ip_pos171(X,Y) get_gdat_ip((X),(Y),171)
+#define get_gdat_ipv6_pos171(X,Y) get_gdat_ipv6((X),(Y),171)
+#define get_gdat_string_pos171(X,Y) get_gdat_string((X),(Y),171)
+#define get_gdat_v_str_pos171(X,Y) get_gdat_string((X),(Y),171)
+#define get_gdat_bool_pos171(X,Y) get_gdat_bool((X),(Y),171)
+#define get_gdat_int_pos171(X,Y) get_gdat_int((X),(Y),171)
+#define get_gdat_llong_pos171(X,Y) get_gdat_llong((X),(Y),171)
+#define get_gdat_float_pos171(X,Y) get_gdat_float((X),(Y),171)
+#define get_gdat_uint_pos172(X,Y) get_gdat_uint((X),(Y),172)
+#define get_gdat_ullong_pos172(X,Y) get_gdat_ullong((X),(Y),172)
+#define get_gdat_ip_pos172(X,Y) get_gdat_ip((X),(Y),172)
+#define get_gdat_ipv6_pos172(X,Y) get_gdat_ipv6((X),(Y),172)
+#define get_gdat_string_pos172(X,Y) get_gdat_string((X),(Y),172)
+#define get_gdat_v_str_pos172(X,Y) get_gdat_string((X),(Y),172)
+#define get_gdat_bool_pos172(X,Y) get_gdat_bool((X),(Y),172)
+#define get_gdat_int_pos172(X,Y) get_gdat_int((X),(Y),172)
+#define get_gdat_llong_pos172(X,Y) get_gdat_llong((X),(Y),172)
+#define get_gdat_float_pos172(X,Y) get_gdat_float((X),(Y),172)
+#define get_gdat_uint_pos173(X,Y) get_gdat_uint((X),(Y),173)
+#define get_gdat_ullong_pos173(X,Y) get_gdat_ullong((X),(Y),173)
+#define get_gdat_ip_pos173(X,Y) get_gdat_ip((X),(Y),173)
+#define get_gdat_ipv6_pos173(X,Y) get_gdat_ipv6((X),(Y),173)
+#define get_gdat_string_pos173(X,Y) get_gdat_string((X),(Y),173)
+#define get_gdat_v_str_pos173(X,Y) get_gdat_string((X),(Y),173)
+#define get_gdat_bool_pos173(X,Y) get_gdat_bool((X),(Y),173)
+#define get_gdat_int_pos173(X,Y) get_gdat_int((X),(Y),173)
+#define get_gdat_llong_pos173(X,Y) get_gdat_llong((X),(Y),173)
+#define get_gdat_float_pos173(X,Y) get_gdat_float((X),(Y),173)
+#define get_gdat_uint_pos174(X,Y) get_gdat_uint((X),(Y),174)
+#define get_gdat_ullong_pos174(X,Y) get_gdat_ullong((X),(Y),174)
+#define get_gdat_ip_pos174(X,Y) get_gdat_ip((X),(Y),174)
+#define get_gdat_ipv6_pos174(X,Y) get_gdat_ipv6((X),(Y),174)
+#define get_gdat_string_pos174(X,Y) get_gdat_string((X),(Y),174)
+#define get_gdat_v_str_pos174(X,Y) get_gdat_string((X),(Y),174)
+#define get_gdat_bool_pos174(X,Y) get_gdat_bool((X),(Y),174)
+#define get_gdat_int_pos174(X,Y) get_gdat_int((X),(Y),174)
+#define get_gdat_llong_pos174(X,Y) get_gdat_llong((X),(Y),174)
+#define get_gdat_float_pos174(X,Y) get_gdat_float((X),(Y),174)
+#define get_gdat_uint_pos175(X,Y) get_gdat_uint((X),(Y),175)
+#define get_gdat_ullong_pos175(X,Y) get_gdat_ullong((X),(Y),175)
+#define get_gdat_ip_pos175(X,Y) get_gdat_ip((X),(Y),175)
+#define get_gdat_ipv6_pos175(X,Y) get_gdat_ipv6((X),(Y),175)
+#define get_gdat_string_pos175(X,Y) get_gdat_string((X),(Y),175)
+#define get_gdat_v_str_pos175(X,Y) get_gdat_string((X),(Y),175)
+#define get_gdat_bool_pos175(X,Y) get_gdat_bool((X),(Y),175)
+#define get_gdat_int_pos175(X,Y) get_gdat_int((X),(Y),175)
+#define get_gdat_llong_pos175(X,Y) get_gdat_llong((X),(Y),175)
+#define get_gdat_float_pos175(X,Y) get_gdat_float((X),(Y),175)
+#define get_gdat_uint_pos176(X,Y) get_gdat_uint((X),(Y),176)
+#define get_gdat_ullong_pos176(X,Y) get_gdat_ullong((X),(Y),176)
+#define get_gdat_ip_pos176(X,Y) get_gdat_ip((X),(Y),176)
+#define get_gdat_ipv6_pos176(X,Y) get_gdat_ipv6((X),(Y),176)
+#define get_gdat_string_pos176(X,Y) get_gdat_string((X),(Y),176)
+#define get_gdat_v_str_pos176(X,Y) get_gdat_string((X),(Y),176)
+#define get_gdat_bool_pos176(X,Y) get_gdat_bool((X),(Y),176)
+#define get_gdat_int_pos176(X,Y) get_gdat_int((X),(Y),176)
+#define get_gdat_llong_pos176(X,Y) get_gdat_llong((X),(Y),176)
+#define get_gdat_float_pos176(X,Y) get_gdat_float((X),(Y),176)
+#define get_gdat_uint_pos177(X,Y) get_gdat_uint((X),(Y),177)
+#define get_gdat_ullong_pos177(X,Y) get_gdat_ullong((X),(Y),177)
+#define get_gdat_ip_pos177(X,Y) get_gdat_ip((X),(Y),177)
+#define get_gdat_ipv6_pos177(X,Y) get_gdat_ipv6((X),(Y),177)
+#define get_gdat_string_pos177(X,Y) get_gdat_string((X),(Y),177)
+#define get_gdat_v_str_pos177(X,Y) get_gdat_string((X),(Y),177)
+#define get_gdat_bool_pos177(X,Y) get_gdat_bool((X),(Y),177)
+#define get_gdat_int_pos177(X,Y) get_gdat_int((X),(Y),177)
+#define get_gdat_llong_pos177(X,Y) get_gdat_llong((X),(Y),177)
+#define get_gdat_float_pos177(X,Y) get_gdat_float((X),(Y),177)
+#define get_gdat_uint_pos178(X,Y) get_gdat_uint((X),(Y),178)
+#define get_gdat_ullong_pos178(X,Y) get_gdat_ullong((X),(Y),178)
+#define get_gdat_ip_pos178(X,Y) get_gdat_ip((X),(Y),178)
+#define get_gdat_ipv6_pos178(X,Y) get_gdat_ipv6((X),(Y),178)
+#define get_gdat_string_pos178(X,Y) get_gdat_string((X),(Y),178)
+#define get_gdat_v_str_pos178(X,Y) get_gdat_string((X),(Y),178)
+#define get_gdat_bool_pos178(X,Y) get_gdat_bool((X),(Y),178)
+#define get_gdat_int_pos178(X,Y) get_gdat_int((X),(Y),178)
+#define get_gdat_llong_pos178(X,Y) get_gdat_llong((X),(Y),178)
+#define get_gdat_float_pos178(X,Y) get_gdat_float((X),(Y),178)
+#define get_gdat_uint_pos179(X,Y) get_gdat_uint((X),(Y),179)
+#define get_gdat_ullong_pos179(X,Y) get_gdat_ullong((X),(Y),179)
+#define get_gdat_ip_pos179(X,Y) get_gdat_ip((X),(Y),179)
+#define get_gdat_ipv6_pos179(X,Y) get_gdat_ipv6((X),(Y),179)
+#define get_gdat_string_pos179(X,Y) get_gdat_string((X),(Y),179)
+#define get_gdat_v_str_pos179(X,Y) get_gdat_string((X),(Y),179)
+#define get_gdat_bool_pos179(X,Y) get_gdat_bool((X),(Y),179)
+#define get_gdat_int_pos179(X,Y) get_gdat_int((X),(Y),179)
+#define get_gdat_llong_pos179(X,Y) get_gdat_llong((X),(Y),179)
+#define get_gdat_float_pos179(X,Y) get_gdat_float((X),(Y),179)
+#define get_gdat_uint_pos180(X,Y) get_gdat_uint((X),(Y),180)
+#define get_gdat_ullong_pos180(X,Y) get_gdat_ullong((X),(Y),180)
+#define get_gdat_ip_pos180(X,Y) get_gdat_ip((X),(Y),180)
+#define get_gdat_ipv6_pos180(X,Y) get_gdat_ipv6((X),(Y),180)
+#define get_gdat_string_pos180(X,Y) get_gdat_string((X),(Y),180)
+#define get_gdat_v_str_pos180(X,Y) get_gdat_string((X),(Y),180)
+#define get_gdat_bool_pos180(X,Y) get_gdat_bool((X),(Y),180)
+#define get_gdat_int_pos180(X,Y) get_gdat_int((X),(Y),180)
+#define get_gdat_llong_pos180(X,Y) get_gdat_llong((X),(Y),180)
+#define get_gdat_float_pos180(X,Y) get_gdat_float((X),(Y),180)
+#define get_gdat_uint_pos181(X,Y) get_gdat_uint((X),(Y),181)
+#define get_gdat_ullong_pos181(X,Y) get_gdat_ullong((X),(Y),181)
+#define get_gdat_ip_pos181(X,Y) get_gdat_ip((X),(Y),181)
+#define get_gdat_ipv6_pos181(X,Y) get_gdat_ipv6((X),(Y),181)
+#define get_gdat_string_pos181(X,Y) get_gdat_string((X),(Y),181)
+#define get_gdat_v_str_pos181(X,Y) get_gdat_string((X),(Y),181)
+#define get_gdat_bool_pos181(X,Y) get_gdat_bool((X),(Y),181)
+#define get_gdat_int_pos181(X,Y) get_gdat_int((X),(Y),181)
+#define get_gdat_llong_pos181(X,Y) get_gdat_llong((X),(Y),181)
+#define get_gdat_float_pos181(X,Y) get_gdat_float((X),(Y),181)
+#define get_gdat_uint_pos182(X,Y) get_gdat_uint((X),(Y),182)
+#define get_gdat_ullong_pos182(X,Y) get_gdat_ullong((X),(Y),182)
+#define get_gdat_ip_pos182(X,Y) get_gdat_ip((X),(Y),182)
+#define get_gdat_ipv6_pos182(X,Y) get_gdat_ipv6((X),(Y),182)
+#define get_gdat_string_pos182(X,Y) get_gdat_string((X),(Y),182)
+#define get_gdat_v_str_pos182(X,Y) get_gdat_string((X),(Y),182)
+#define get_gdat_bool_pos182(X,Y) get_gdat_bool((X),(Y),182)
+#define get_gdat_int_pos182(X,Y) get_gdat_int((X),(Y),182)
+#define get_gdat_llong_pos182(X,Y) get_gdat_llong((X),(Y),182)
+#define get_gdat_float_pos182(X,Y) get_gdat_float((X),(Y),182)
+#define get_gdat_uint_pos183(X,Y) get_gdat_uint((X),(Y),183)
+#define get_gdat_ullong_pos183(X,Y) get_gdat_ullong((X),(Y),183)
+#define get_gdat_ip_pos183(X,Y) get_gdat_ip((X),(Y),183)
+#define get_gdat_ipv6_pos183(X,Y) get_gdat_ipv6((X),(Y),183)
+#define get_gdat_string_pos183(X,Y) get_gdat_string((X),(Y),183)
+#define get_gdat_v_str_pos183(X,Y) get_gdat_string((X),(Y),183)
+#define get_gdat_bool_pos183(X,Y) get_gdat_bool((X),(Y),183)
+#define get_gdat_int_pos183(X,Y) get_gdat_int((X),(Y),183)
+#define get_gdat_llong_pos183(X,Y) get_gdat_llong((X),(Y),183)
+#define get_gdat_float_pos183(X,Y) get_gdat_float((X),(Y),183)
+#define get_gdat_uint_pos184(X,Y) get_gdat_uint((X),(Y),184)
+#define get_gdat_ullong_pos184(X,Y) get_gdat_ullong((X),(Y),184)
+#define get_gdat_ip_pos184(X,Y) get_gdat_ip((X),(Y),184)
+#define get_gdat_ipv6_pos184(X,Y) get_gdat_ipv6((X),(Y),184)
+#define get_gdat_string_pos184(X,Y) get_gdat_string((X),(Y),184)
+#define get_gdat_v_str_pos184(X,Y) get_gdat_string((X),(Y),184)
+#define get_gdat_bool_pos184(X,Y) get_gdat_bool((X),(Y),184)
+#define get_gdat_int_pos184(X,Y) get_gdat_int((X),(Y),184)
+#define get_gdat_llong_pos184(X,Y) get_gdat_llong((X),(Y),184)
+#define get_gdat_float_pos184(X,Y) get_gdat_float((X),(Y),184)
+#define get_gdat_uint_pos185(X,Y) get_gdat_uint((X),(Y),185)
+#define get_gdat_ullong_pos185(X,Y) get_gdat_ullong((X),(Y),185)
+#define get_gdat_ip_pos185(X,Y) get_gdat_ip((X),(Y),185)
+#define get_gdat_ipv6_pos185(X,Y) get_gdat_ipv6((X),(Y),185)
+#define get_gdat_string_pos185(X,Y) get_gdat_string((X),(Y),185)
+#define get_gdat_v_str_pos185(X,Y) get_gdat_string((X),(Y),185)
+#define get_gdat_bool_pos185(X,Y) get_gdat_bool((X),(Y),185)
+#define get_gdat_int_pos185(X,Y) get_gdat_int((X),(Y),185)
+#define get_gdat_llong_pos185(X,Y) get_gdat_llong((X),(Y),185)
+#define get_gdat_float_pos185(X,Y) get_gdat_float((X),(Y),185)
+#define get_gdat_uint_pos186(X,Y) get_gdat_uint((X),(Y),186)
+#define get_gdat_ullong_pos186(X,Y) get_gdat_ullong((X),(Y),186)
+#define get_gdat_ip_pos186(X,Y) get_gdat_ip((X),(Y),186)
+#define get_gdat_ipv6_pos186(X,Y) get_gdat_ipv6((X),(Y),186)
+#define get_gdat_string_pos186(X,Y) get_gdat_string((X),(Y),186)
+#define get_gdat_v_str_pos186(X,Y) get_gdat_string((X),(Y),186)
+#define get_gdat_bool_pos186(X,Y) get_gdat_bool((X),(Y),186)
+#define get_gdat_int_pos186(X,Y) get_gdat_int((X),(Y),186)
+#define get_gdat_llong_pos186(X,Y) get_gdat_llong((X),(Y),186)
+#define get_gdat_float_pos186(X,Y) get_gdat_float((X),(Y),186)
+#define get_gdat_uint_pos187(X,Y) get_gdat_uint((X),(Y),187)
+#define get_gdat_ullong_pos187(X,Y) get_gdat_ullong((X),(Y),187)
+#define get_gdat_ip_pos187(X,Y) get_gdat_ip((X),(Y),187)
+#define get_gdat_ipv6_pos187(X,Y) get_gdat_ipv6((X),(Y),187)
+#define get_gdat_string_pos187(X,Y) get_gdat_string((X),(Y),187)
+#define get_gdat_v_str_pos187(X,Y) get_gdat_string((X),(Y),187)
+#define get_gdat_bool_pos187(X,Y) get_gdat_bool((X),(Y),187)
+#define get_gdat_int_pos187(X,Y) get_gdat_int((X),(Y),187)
+#define get_gdat_llong_pos187(X,Y) get_gdat_llong((X),(Y),187)
+#define get_gdat_float_pos187(X,Y) get_gdat_float((X),(Y),187)
+#define get_gdat_uint_pos188(X,Y) get_gdat_uint((X),(Y),188)
+#define get_gdat_ullong_pos188(X,Y) get_gdat_ullong((X),(Y),188)
+#define get_gdat_ip_pos188(X,Y) get_gdat_ip((X),(Y),188)
+#define get_gdat_ipv6_pos188(X,Y) get_gdat_ipv6((X),(Y),188)
+#define get_gdat_string_pos188(X,Y) get_gdat_string((X),(Y),188)
+#define get_gdat_v_str_pos188(X,Y) get_gdat_string((X),(Y),188)
+#define get_gdat_bool_pos188(X,Y) get_gdat_bool((X),(Y),188)
+#define get_gdat_int_pos188(X,Y) get_gdat_int((X),(Y),188)
+#define get_gdat_llong_pos188(X,Y) get_gdat_llong((X),(Y),188)
+#define get_gdat_float_pos188(X,Y) get_gdat_float((X),(Y),188)
+#define get_gdat_uint_pos189(X,Y) get_gdat_uint((X),(Y),189)
+#define get_gdat_ullong_pos189(X,Y) get_gdat_ullong((X),(Y),189)
+#define get_gdat_ip_pos189(X,Y) get_gdat_ip((X),(Y),189)
+#define get_gdat_ipv6_pos189(X,Y) get_gdat_ipv6((X),(Y),189)
+#define get_gdat_string_pos189(X,Y) get_gdat_string((X),(Y),189)
+#define get_gdat_v_str_pos189(X,Y) get_gdat_string((X),(Y),189)
+#define get_gdat_bool_pos189(X,Y) get_gdat_bool((X),(Y),189)
+#define get_gdat_int_pos189(X,Y) get_gdat_int((X),(Y),189)
+#define get_gdat_llong_pos189(X,Y) get_gdat_llong((X),(Y),189)
+#define get_gdat_float_pos189(X,Y) get_gdat_float((X),(Y),189)
+#define get_gdat_uint_pos190(X,Y) get_gdat_uint((X),(Y),190)
+#define get_gdat_ullong_pos190(X,Y) get_gdat_ullong((X),(Y),190)
+#define get_gdat_ip_pos190(X,Y) get_gdat_ip((X),(Y),190)
+#define get_gdat_ipv6_pos190(X,Y) get_gdat_ipv6((X),(Y),190)
+#define get_gdat_string_pos190(X,Y) get_gdat_string((X),(Y),190)
+#define get_gdat_v_str_pos190(X,Y) get_gdat_string((X),(Y),190)
+#define get_gdat_bool_pos190(X,Y) get_gdat_bool((X),(Y),190)
+#define get_gdat_int_pos190(X,Y) get_gdat_int((X),(Y),190)
+#define get_gdat_llong_pos190(X,Y) get_gdat_llong((X),(Y),190)
+#define get_gdat_float_pos190(X,Y) get_gdat_float((X),(Y),190)
+#define get_gdat_uint_pos191(X,Y) get_gdat_uint((X),(Y),191)
+#define get_gdat_ullong_pos191(X,Y) get_gdat_ullong((X),(Y),191)
+#define get_gdat_ip_pos191(X,Y) get_gdat_ip((X),(Y),191)
+#define get_gdat_ipv6_pos191(X,Y) get_gdat_ipv6((X),(Y),191)
+#define get_gdat_string_pos191(X,Y) get_gdat_string((X),(Y),191)
+#define get_gdat_v_str_pos191(X,Y) get_gdat_string((X),(Y),191)
+#define get_gdat_bool_pos191(X,Y) get_gdat_bool((X),(Y),191)
+#define get_gdat_int_pos191(X,Y) get_gdat_int((X),(Y),191)
+#define get_gdat_llong_pos191(X,Y) get_gdat_llong((X),(Y),191)
+#define get_gdat_float_pos191(X,Y) get_gdat_float((X),(Y),191)
+#define get_gdat_uint_pos192(X,Y) get_gdat_uint((X),(Y),192)
+#define get_gdat_ullong_pos192(X,Y) get_gdat_ullong((X),(Y),192)
+#define get_gdat_ip_pos192(X,Y) get_gdat_ip((X),(Y),192)
+#define get_gdat_ipv6_pos192(X,Y) get_gdat_ipv6((X),(Y),192)
+#define get_gdat_string_pos192(X,Y) get_gdat_string((X),(Y),192)
+#define get_gdat_v_str_pos192(X,Y) get_gdat_string((X),(Y),192)
+#define get_gdat_bool_pos192(X,Y) get_gdat_bool((X),(Y),192)
+#define get_gdat_int_pos192(X,Y) get_gdat_int((X),(Y),192)
+#define get_gdat_llong_pos192(X,Y) get_gdat_llong((X),(Y),192)
+#define get_gdat_float_pos192(X,Y) get_gdat_float((X),(Y),192)
+#define get_gdat_uint_pos193(X,Y) get_gdat_uint((X),(Y),193)
+#define get_gdat_ullong_pos193(X,Y) get_gdat_ullong((X),(Y),193)
+#define get_gdat_ip_pos193(X,Y) get_gdat_ip((X),(Y),193)
+#define get_gdat_ipv6_pos193(X,Y) get_gdat_ipv6((X),(Y),193)
+#define get_gdat_string_pos193(X,Y) get_gdat_string((X),(Y),193)
+#define get_gdat_v_str_pos193(X,Y) get_gdat_string((X),(Y),193)
+#define get_gdat_bool_pos193(X,Y) get_gdat_bool((X),(Y),193)
+#define get_gdat_int_pos193(X,Y) get_gdat_int((X),(Y),193)
+#define get_gdat_llong_pos193(X,Y) get_gdat_llong((X),(Y),193)
+#define get_gdat_float_pos193(X,Y) get_gdat_float((X),(Y),193)
+#define get_gdat_uint_pos194(X,Y) get_gdat_uint((X),(Y),194)
+#define get_gdat_ullong_pos194(X,Y) get_gdat_ullong((X),(Y),194)
+#define get_gdat_ip_pos194(X,Y) get_gdat_ip((X),(Y),194)
+#define get_gdat_ipv6_pos194(X,Y) get_gdat_ipv6((X),(Y),194)
+#define get_gdat_string_pos194(X,Y) get_gdat_string((X),(Y),194)
+#define get_gdat_v_str_pos194(X,Y) get_gdat_string((X),(Y),194)
+#define get_gdat_bool_pos194(X,Y) get_gdat_bool((X),(Y),194)
+#define get_gdat_int_pos194(X,Y) get_gdat_int((X),(Y),194)
+#define get_gdat_llong_pos194(X,Y) get_gdat_llong((X),(Y),194)
+#define get_gdat_float_pos194(X,Y) get_gdat_float((X),(Y),194)
+#define get_gdat_uint_pos195(X,Y) get_gdat_uint((X),(Y),195)
+#define get_gdat_ullong_pos195(X,Y) get_gdat_ullong((X),(Y),195)
+#define get_gdat_ip_pos195(X,Y) get_gdat_ip((X),(Y),195)
+#define get_gdat_ipv6_pos195(X,Y) get_gdat_ipv6((X),(Y),195)
+#define get_gdat_string_pos195(X,Y) get_gdat_string((X),(Y),195)
+#define get_gdat_v_str_pos195(X,Y) get_gdat_string((X),(Y),195)
+#define get_gdat_bool_pos195(X,Y) get_gdat_bool((X),(Y),195)
+#define get_gdat_int_pos195(X,Y) get_gdat_int((X),(Y),195)
+#define get_gdat_llong_pos195(X,Y) get_gdat_llong((X),(Y),195)
+#define get_gdat_float_pos195(X,Y) get_gdat_float((X),(Y),195)
+#define get_gdat_uint_pos196(X,Y) get_gdat_uint((X),(Y),196)
+#define get_gdat_ullong_pos196(X,Y) get_gdat_ullong((X),(Y),196)
+#define get_gdat_ip_pos196(X,Y) get_gdat_ip((X),(Y),196)
+#define get_gdat_ipv6_pos196(X,Y) get_gdat_ipv6((X),(Y),196)
+#define get_gdat_string_pos196(X,Y) get_gdat_string((X),(Y),196)
+#define get_gdat_v_str_pos196(X,Y) get_gdat_string((X),(Y),196)
+#define get_gdat_bool_pos196(X,Y) get_gdat_bool((X),(Y),196)
+#define get_gdat_int_pos196(X,Y) get_gdat_int((X),(Y),196)
+#define get_gdat_llong_pos196(X,Y) get_gdat_llong((X),(Y),196)
+#define get_gdat_float_pos196(X,Y) get_gdat_float((X),(Y),196)
+#define get_gdat_uint_pos197(X,Y) get_gdat_uint((X),(Y),197)
+#define get_gdat_ullong_pos197(X,Y) get_gdat_ullong((X),(Y),197)
+#define get_gdat_ip_pos197(X,Y) get_gdat_ip((X),(Y),197)
+#define get_gdat_ipv6_pos197(X,Y) get_gdat_ipv6((X),(Y),197)
+#define get_gdat_string_pos197(X,Y) get_gdat_string((X),(Y),197)
+#define get_gdat_v_str_pos197(X,Y) get_gdat_string((X),(Y),197)
+#define get_gdat_bool_pos197(X,Y) get_gdat_bool((X),(Y),197)
+#define get_gdat_int_pos197(X,Y) get_gdat_int((X),(Y),197)
+#define get_gdat_llong_pos197(X,Y) get_gdat_llong((X),(Y),197)
+#define get_gdat_float_pos197(X,Y) get_gdat_float((X),(Y),197)
+#define get_gdat_uint_pos198(X,Y) get_gdat_uint((X),(Y),198)
+#define get_gdat_ullong_pos198(X,Y) get_gdat_ullong((X),(Y),198)
+#define get_gdat_ip_pos198(X,Y) get_gdat_ip((X),(Y),198)
+#define get_gdat_ipv6_pos198(X,Y) get_gdat_ipv6((X),(Y),198)
+#define get_gdat_string_pos198(X,Y) get_gdat_string((X),(Y),198)
+#define get_gdat_v_str_pos198(X,Y) get_gdat_string((X),(Y),198)
+#define get_gdat_bool_pos198(X,Y) get_gdat_bool((X),(Y),198)
+#define get_gdat_int_pos198(X,Y) get_gdat_int((X),(Y),198)
+#define get_gdat_llong_pos198(X,Y) get_gdat_llong((X),(Y),198)
+#define get_gdat_float_pos198(X,Y) get_gdat_float((X),(Y),198)
+#define get_gdat_uint_pos199(X,Y) get_gdat_uint((X),(Y),199)
+#define get_gdat_ullong_pos199(X,Y) get_gdat_ullong((X),(Y),199)
+#define get_gdat_ip_pos199(X,Y) get_gdat_ip((X),(Y),199)
+#define get_gdat_ipv6_pos199(X,Y) get_gdat_ipv6((X),(Y),199)
+#define get_gdat_string_pos199(X,Y) get_gdat_string((X),(Y),199)
+#define get_gdat_v_str_pos199(X,Y) get_gdat_string((X),(Y),199)
+#define get_gdat_bool_pos199(X,Y) get_gdat_bool((X),(Y),199)
+#define get_gdat_int_pos199(X,Y) get_gdat_int((X),(Y),199)
+#define get_gdat_llong_pos199(X,Y) get_gdat_llong((X),(Y),199)
+#define get_gdat_float_pos199(X,Y) get_gdat_float((X),(Y),199)
+#define get_gdat_uint_pos200(X,Y) get_gdat_uint((X),(Y),200)
+#define get_gdat_ullong_pos200(X,Y) get_gdat_ullong((X),(Y),200)
+#define get_gdat_ip_pos200(X,Y) get_gdat_ip((X),(Y),200)
+#define get_gdat_ipv6_pos200(X,Y) get_gdat_ipv6((X),(Y),200)
+#define get_gdat_string_pos200(X,Y) get_gdat_string((X),(Y),200)
+#define get_gdat_v_str_pos200(X,Y) get_gdat_string((X),(Y),200)
+#define get_gdat_bool_pos200(X,Y) get_gdat_bool((X),(Y),200)
+#define get_gdat_int_pos200(X,Y) get_gdat_int((X),(Y),200)
+#define get_gdat_llong_pos200(X,Y) get_gdat_llong((X),(Y),200)
+#define get_gdat_float_pos200(X,Y) get_gdat_float((X),(Y),200)
+#define get_gdat_uint_pos201(X,Y) get_gdat_uint((X),(Y),201)
+#define get_gdat_ullong_pos201(X,Y) get_gdat_ullong((X),(Y),201)
+#define get_gdat_ip_pos201(X,Y) get_gdat_ip((X),(Y),201)
+#define get_gdat_ipv6_pos201(X,Y) get_gdat_ipv6((X),(Y),201)
+#define get_gdat_string_pos201(X,Y) get_gdat_string((X),(Y),201)
+#define get_gdat_v_str_pos201(X,Y) get_gdat_string((X),(Y),201)
+#define get_gdat_bool_pos201(X,Y) get_gdat_bool((X),(Y),201)
+#define get_gdat_int_pos201(X,Y) get_gdat_int((X),(Y),201)
+#define get_gdat_llong_pos201(X,Y) get_gdat_llong((X),(Y),201)
+#define get_gdat_float_pos201(X,Y) get_gdat_float((X),(Y),201)
+#define get_gdat_uint_pos202(X,Y) get_gdat_uint((X),(Y),202)
+#define get_gdat_ullong_pos202(X,Y) get_gdat_ullong((X),(Y),202)
+#define get_gdat_ip_pos202(X,Y) get_gdat_ip((X),(Y),202)
+#define get_gdat_ipv6_pos202(X,Y) get_gdat_ipv6((X),(Y),202)
+#define get_gdat_string_pos202(X,Y) get_gdat_string((X),(Y),202)
+#define get_gdat_v_str_pos202(X,Y) get_gdat_string((X),(Y),202)
+#define get_gdat_bool_pos202(X,Y) get_gdat_bool((X),(Y),202)
+#define get_gdat_int_pos202(X,Y) get_gdat_int((X),(Y),202)
+#define get_gdat_llong_pos202(X,Y) get_gdat_llong((X),(Y),202)
+#define get_gdat_float_pos202(X,Y) get_gdat_float((X),(Y),202)
+#define get_gdat_uint_pos203(X,Y) get_gdat_uint((X),(Y),203)
+#define get_gdat_ullong_pos203(X,Y) get_gdat_ullong((X),(Y),203)
+#define get_gdat_ip_pos203(X,Y) get_gdat_ip((X),(Y),203)
+#define get_gdat_ipv6_pos203(X,Y) get_gdat_ipv6((X),(Y),203)
+#define get_gdat_string_pos203(X,Y) get_gdat_string((X),(Y),203)
+#define get_gdat_v_str_pos203(X,Y) get_gdat_string((X),(Y),203)
+#define get_gdat_bool_pos203(X,Y) get_gdat_bool((X),(Y),203)
+#define get_gdat_int_pos203(X,Y) get_gdat_int((X),(Y),203)
+#define get_gdat_llong_pos203(X,Y) get_gdat_llong((X),(Y),203)
+#define get_gdat_float_pos203(X,Y) get_gdat_float((X),(Y),203)
+#define get_gdat_uint_pos204(X,Y) get_gdat_uint((X),(Y),204)
+#define get_gdat_ullong_pos204(X,Y) get_gdat_ullong((X),(Y),204)
+#define get_gdat_ip_pos204(X,Y) get_gdat_ip((X),(Y),204)
+#define get_gdat_ipv6_pos204(X,Y) get_gdat_ipv6((X),(Y),204)
+#define get_gdat_string_pos204(X,Y) get_gdat_string((X),(Y),204)
+#define get_gdat_v_str_pos204(X,Y) get_gdat_string((X),(Y),204)
+#define get_gdat_bool_pos204(X,Y) get_gdat_bool((X),(Y),204)
+#define get_gdat_int_pos204(X,Y) get_gdat_int((X),(Y),204)
+#define get_gdat_llong_pos204(X,Y) get_gdat_llong((X),(Y),204)
+#define get_gdat_float_pos204(X,Y) get_gdat_float((X),(Y),204)
+#define get_gdat_uint_pos205(X,Y) get_gdat_uint((X),(Y),205)
+#define get_gdat_ullong_pos205(X,Y) get_gdat_ullong((X),(Y),205)
+#define get_gdat_ip_pos205(X,Y) get_gdat_ip((X),(Y),205)
+#define get_gdat_ipv6_pos205(X,Y) get_gdat_ipv6((X),(Y),205)
+#define get_gdat_string_pos205(X,Y) get_gdat_string((X),(Y),205)
+#define get_gdat_v_str_pos205(X,Y) get_gdat_string((X),(Y),205)
+#define get_gdat_bool_pos205(X,Y) get_gdat_bool((X),(Y),205)
+#define get_gdat_int_pos205(X,Y) get_gdat_int((X),(Y),205)
+#define get_gdat_llong_pos205(X,Y) get_gdat_llong((X),(Y),205)
+#define get_gdat_float_pos205(X,Y) get_gdat_float((X),(Y),205)
+#define get_gdat_uint_pos206(X,Y) get_gdat_uint((X),(Y),206)
+#define get_gdat_ullong_pos206(X,Y) get_gdat_ullong((X),(Y),206)
+#define get_gdat_ip_pos206(X,Y) get_gdat_ip((X),(Y),206)
+#define get_gdat_ipv6_pos206(X,Y) get_gdat_ipv6((X),(Y),206)
+#define get_gdat_string_pos206(X,Y) get_gdat_string((X),(Y),206)
+#define get_gdat_v_str_pos206(X,Y) get_gdat_string((X),(Y),206)
+#define get_gdat_bool_pos206(X,Y) get_gdat_bool((X),(Y),206)
+#define get_gdat_int_pos206(X,Y) get_gdat_int((X),(Y),206)
+#define get_gdat_llong_pos206(X,Y) get_gdat_llong((X),(Y),206)
+#define get_gdat_float_pos206(X,Y) get_gdat_float((X),(Y),206)
+#define get_gdat_uint_pos207(X,Y) get_gdat_uint((X),(Y),207)
+#define get_gdat_ullong_pos207(X,Y) get_gdat_ullong((X),(Y),207)
+#define get_gdat_ip_pos207(X,Y) get_gdat_ip((X),(Y),207)
+#define get_gdat_ipv6_pos207(X,Y) get_gdat_ipv6((X),(Y),207)
+#define get_gdat_string_pos207(X,Y) get_gdat_string((X),(Y),207)
+#define get_gdat_v_str_pos207(X,Y) get_gdat_string((X),(Y),207)
+#define get_gdat_bool_pos207(X,Y) get_gdat_bool((X),(Y),207)
+#define get_gdat_int_pos207(X,Y) get_gdat_int((X),(Y),207)
+#define get_gdat_llong_pos207(X,Y) get_gdat_llong((X),(Y),207)
+#define get_gdat_float_pos207(X,Y) get_gdat_float((X),(Y),207)
+#define get_gdat_uint_pos208(X,Y) get_gdat_uint((X),(Y),208)
+#define get_gdat_ullong_pos208(X,Y) get_gdat_ullong((X),(Y),208)
+#define get_gdat_ip_pos208(X,Y) get_gdat_ip((X),(Y),208)
+#define get_gdat_ipv6_pos208(X,Y) get_gdat_ipv6((X),(Y),208)
+#define get_gdat_string_pos208(X,Y) get_gdat_string((X),(Y),208)
+#define get_gdat_v_str_pos208(X,Y) get_gdat_string((X),(Y),208)
+#define get_gdat_bool_pos208(X,Y) get_gdat_bool((X),(Y),208)
+#define get_gdat_int_pos208(X,Y) get_gdat_int((X),(Y),208)
+#define get_gdat_llong_pos208(X,Y) get_gdat_llong((X),(Y),208)
+#define get_gdat_float_pos208(X,Y) get_gdat_float((X),(Y),208)
+#define get_gdat_uint_pos209(X,Y) get_gdat_uint((X),(Y),209)
+#define get_gdat_ullong_pos209(X,Y) get_gdat_ullong((X),(Y),209)
+#define get_gdat_ip_pos209(X,Y) get_gdat_ip((X),(Y),209)
+#define get_gdat_ipv6_pos209(X,Y) get_gdat_ipv6((X),(Y),209)
+#define get_gdat_string_pos209(X,Y) get_gdat_string((X),(Y),209)
+#define get_gdat_v_str_pos209(X,Y) get_gdat_string((X),(Y),209)
+#define get_gdat_bool_pos209(X,Y) get_gdat_bool((X),(Y),209)
+#define get_gdat_int_pos209(X,Y) get_gdat_int((X),(Y),209)
+#define get_gdat_llong_pos209(X,Y) get_gdat_llong((X),(Y),209)
+#define get_gdat_float_pos209(X,Y) get_gdat_float((X),(Y),209)
+#define get_gdat_uint_pos210(X,Y) get_gdat_uint((X),(Y),210)
+#define get_gdat_ullong_pos210(X,Y) get_gdat_ullong((X),(Y),210)
+#define get_gdat_ip_pos210(X,Y) get_gdat_ip((X),(Y),210)
+#define get_gdat_ipv6_pos210(X,Y) get_gdat_ipv6((X),(Y),210)
+#define get_gdat_string_pos210(X,Y) get_gdat_string((X),(Y),210)
+#define get_gdat_v_str_pos210(X,Y) get_gdat_string((X),(Y),210)
+#define get_gdat_bool_pos210(X,Y) get_gdat_bool((X),(Y),210)
+#define get_gdat_int_pos210(X,Y) get_gdat_int((X),(Y),210)
+#define get_gdat_llong_pos210(X,Y) get_gdat_llong((X),(Y),210)
+#define get_gdat_float_pos210(X,Y) get_gdat_float((X),(Y),210)
+#define get_gdat_uint_pos211(X,Y) get_gdat_uint((X),(Y),211)
+#define get_gdat_ullong_pos211(X,Y) get_gdat_ullong((X),(Y),211)
+#define get_gdat_ip_pos211(X,Y) get_gdat_ip((X),(Y),211)
+#define get_gdat_ipv6_pos211(X,Y) get_gdat_ipv6((X),(Y),211)
+#define get_gdat_string_pos211(X,Y) get_gdat_string((X),(Y),211)
+#define get_gdat_v_str_pos211(X,Y) get_gdat_string((X),(Y),211)
+#define get_gdat_bool_pos211(X,Y) get_gdat_bool((X),(Y),211)
+#define get_gdat_int_pos211(X,Y) get_gdat_int((X),(Y),211)
+#define get_gdat_llong_pos211(X,Y) get_gdat_llong((X),(Y),211)
+#define get_gdat_float_pos211(X,Y) get_gdat_float((X),(Y),211)
+#define get_gdat_uint_pos212(X,Y) get_gdat_uint((X),(Y),212)
+#define get_gdat_ullong_pos212(X,Y) get_gdat_ullong((X),(Y),212)
+#define get_gdat_ip_pos212(X,Y) get_gdat_ip((X),(Y),212)
+#define get_gdat_ipv6_pos212(X,Y) get_gdat_ipv6((X),(Y),212)
+#define get_gdat_string_pos212(X,Y) get_gdat_string((X),(Y),212)
+#define get_gdat_v_str_pos212(X,Y) get_gdat_string((X),(Y),212)
+#define get_gdat_bool_pos212(X,Y) get_gdat_bool((X),(Y),212)
+#define get_gdat_int_pos212(X,Y) get_gdat_int((X),(Y),212)
+#define get_gdat_llong_pos212(X,Y) get_gdat_llong((X),(Y),212)
+#define get_gdat_float_pos212(X,Y) get_gdat_float((X),(Y),212)
+#define get_gdat_uint_pos213(X,Y) get_gdat_uint((X),(Y),213)
+#define get_gdat_ullong_pos213(X,Y) get_gdat_ullong((X),(Y),213)
+#define get_gdat_ip_pos213(X,Y) get_gdat_ip((X),(Y),213)
+#define get_gdat_ipv6_pos213(X,Y) get_gdat_ipv6((X),(Y),213)
+#define get_gdat_string_pos213(X,Y) get_gdat_string((X),(Y),213)
+#define get_gdat_v_str_pos213(X,Y) get_gdat_string((X),(Y),213)
+#define get_gdat_bool_pos213(X,Y) get_gdat_bool((X),(Y),213)
+#define get_gdat_int_pos213(X,Y) get_gdat_int((X),(Y),213)
+#define get_gdat_llong_pos213(X,Y) get_gdat_llong((X),(Y),213)
+#define get_gdat_float_pos213(X,Y) get_gdat_float((X),(Y),213)
+#define get_gdat_uint_pos214(X,Y) get_gdat_uint((X),(Y),214)
+#define get_gdat_ullong_pos214(X,Y) get_gdat_ullong((X),(Y),214)
+#define get_gdat_ip_pos214(X,Y) get_gdat_ip((X),(Y),214)
+#define get_gdat_ipv6_pos214(X,Y) get_gdat_ipv6((X),(Y),214)
+#define get_gdat_string_pos214(X,Y) get_gdat_string((X),(Y),214)
+#define get_gdat_v_str_pos214(X,Y) get_gdat_string((X),(Y),214)
+#define get_gdat_bool_pos214(X,Y) get_gdat_bool((X),(Y),214)
+#define get_gdat_int_pos214(X,Y) get_gdat_int((X),(Y),214)
+#define get_gdat_llong_pos214(X,Y) get_gdat_llong((X),(Y),214)
+#define get_gdat_float_pos214(X,Y) get_gdat_float((X),(Y),214)
+#define get_gdat_uint_pos215(X,Y) get_gdat_uint((X),(Y),215)
+#define get_gdat_ullong_pos215(X,Y) get_gdat_ullong((X),(Y),215)
+#define get_gdat_ip_pos215(X,Y) get_gdat_ip((X),(Y),215)
+#define get_gdat_ipv6_pos215(X,Y) get_gdat_ipv6((X),(Y),215)
+#define get_gdat_string_pos215(X,Y) get_gdat_string((X),(Y),215)
+#define get_gdat_v_str_pos215(X,Y) get_gdat_string((X),(Y),215)
+#define get_gdat_bool_pos215(X,Y) get_gdat_bool((X),(Y),215)
+#define get_gdat_int_pos215(X,Y) get_gdat_int((X),(Y),215)
+#define get_gdat_llong_pos215(X,Y) get_gdat_llong((X),(Y),215)
+#define get_gdat_float_pos215(X,Y) get_gdat_float((X),(Y),215)
+#define get_gdat_uint_pos216(X,Y) get_gdat_uint((X),(Y),216)
+#define get_gdat_ullong_pos216(X,Y) get_gdat_ullong((X),(Y),216)
+#define get_gdat_ip_pos216(X,Y) get_gdat_ip((X),(Y),216)
+#define get_gdat_ipv6_pos216(X,Y) get_gdat_ipv6((X),(Y),216)
+#define get_gdat_string_pos216(X,Y) get_gdat_string((X),(Y),216)
+#define get_gdat_v_str_pos216(X,Y) get_gdat_string((X),(Y),216)
+#define get_gdat_bool_pos216(X,Y) get_gdat_bool((X),(Y),216)
+#define get_gdat_int_pos216(X,Y) get_gdat_int((X),(Y),216)
+#define get_gdat_llong_pos216(X,Y) get_gdat_llong((X),(Y),216)
+#define get_gdat_float_pos216(X,Y) get_gdat_float((X),(Y),216)
+#define get_gdat_uint_pos217(X,Y) get_gdat_uint((X),(Y),217)
+#define get_gdat_ullong_pos217(X,Y) get_gdat_ullong((X),(Y),217)
+#define get_gdat_ip_pos217(X,Y) get_gdat_ip((X),(Y),217)
+#define get_gdat_ipv6_pos217(X,Y) get_gdat_ipv6((X),(Y),217)
+#define get_gdat_string_pos217(X,Y) get_gdat_string((X),(Y),217)
+#define get_gdat_v_str_pos217(X,Y) get_gdat_string((X),(Y),217)
+#define get_gdat_bool_pos217(X,Y) get_gdat_bool((X),(Y),217)
+#define get_gdat_int_pos217(X,Y) get_gdat_int((X),(Y),217)
+#define get_gdat_llong_pos217(X,Y) get_gdat_llong((X),(Y),217)
+#define get_gdat_float_pos217(X,Y) get_gdat_float((X),(Y),217)
+#define get_gdat_uint_pos218(X,Y) get_gdat_uint((X),(Y),218)
+#define get_gdat_ullong_pos218(X,Y) get_gdat_ullong((X),(Y),218)
+#define get_gdat_ip_pos218(X,Y) get_gdat_ip((X),(Y),218)
+#define get_gdat_ipv6_pos218(X,Y) get_gdat_ipv6((X),(Y),218)
+#define get_gdat_string_pos218(X,Y) get_gdat_string((X),(Y),218)
+#define get_gdat_v_str_pos218(X,Y) get_gdat_string((X),(Y),218)
+#define get_gdat_bool_pos218(X,Y) get_gdat_bool((X),(Y),218)
+#define get_gdat_int_pos218(X,Y) get_gdat_int((X),(Y),218)
+#define get_gdat_llong_pos218(X,Y) get_gdat_llong((X),(Y),218)
+#define get_gdat_float_pos218(X,Y) get_gdat_float((X),(Y),218)
+#define get_gdat_uint_pos219(X,Y) get_gdat_uint((X),(Y),219)
+#define get_gdat_ullong_pos219(X,Y) get_gdat_ullong((X),(Y),219)
+#define get_gdat_ip_pos219(X,Y) get_gdat_ip((X),(Y),219)
+#define get_gdat_ipv6_pos219(X,Y) get_gdat_ipv6((X),(Y),219)
+#define get_gdat_string_pos219(X,Y) get_gdat_string((X),(Y),219)
+#define get_gdat_v_str_pos219(X,Y) get_gdat_string((X),(Y),219)
+#define get_gdat_bool_pos219(X,Y) get_gdat_bool((X),(Y),219)
+#define get_gdat_int_pos219(X,Y) get_gdat_int((X),(Y),219)
+#define get_gdat_llong_pos219(X,Y) get_gdat_llong((X),(Y),219)
+#define get_gdat_float_pos219(X,Y) get_gdat_float((X),(Y),219)
+#define get_gdat_uint_pos220(X,Y) get_gdat_uint((X),(Y),220)
+#define get_gdat_ullong_pos220(X,Y) get_gdat_ullong((X),(Y),220)
+#define get_gdat_ip_pos220(X,Y) get_gdat_ip((X),(Y),220)
+#define get_gdat_ipv6_pos220(X,Y) get_gdat_ipv6((X),(Y),220)
+#define get_gdat_string_pos220(X,Y) get_gdat_string((X),(Y),220)
+#define get_gdat_v_str_pos220(X,Y) get_gdat_string((X),(Y),220)
+#define get_gdat_bool_pos220(X,Y) get_gdat_bool((X),(Y),220)
+#define get_gdat_int_pos220(X,Y) get_gdat_int((X),(Y),220)
+#define get_gdat_llong_pos220(X,Y) get_gdat_llong((X),(Y),220)
+#define get_gdat_float_pos220(X,Y) get_gdat_float((X),(Y),220)
+#define get_gdat_uint_pos221(X,Y) get_gdat_uint((X),(Y),221)
+#define get_gdat_ullong_pos221(X,Y) get_gdat_ullong((X),(Y),221)
+#define get_gdat_ip_pos221(X,Y) get_gdat_ip((X),(Y),221)
+#define get_gdat_ipv6_pos221(X,Y) get_gdat_ipv6((X),(Y),221)
+#define get_gdat_string_pos221(X,Y) get_gdat_string((X),(Y),221)
+#define get_gdat_v_str_pos221(X,Y) get_gdat_string((X),(Y),221)
+#define get_gdat_bool_pos221(X,Y) get_gdat_bool((X),(Y),221)
+#define get_gdat_int_pos221(X,Y) get_gdat_int((X),(Y),221)
+#define get_gdat_llong_pos221(X,Y) get_gdat_llong((X),(Y),221)
+#define get_gdat_float_pos221(X,Y) get_gdat_float((X),(Y),221)
+#define get_gdat_uint_pos222(X,Y) get_gdat_uint((X),(Y),222)
+#define get_gdat_ullong_pos222(X,Y) get_gdat_ullong((X),(Y),222)
+#define get_gdat_ip_pos222(X,Y) get_gdat_ip((X),(Y),222)
+#define get_gdat_ipv6_pos222(X,Y) get_gdat_ipv6((X),(Y),222)
+#define get_gdat_string_pos222(X,Y) get_gdat_string((X),(Y),222)
+#define get_gdat_v_str_pos222(X,Y) get_gdat_string((X),(Y),222)
+#define get_gdat_bool_pos222(X,Y) get_gdat_bool((X),(Y),222)
+#define get_gdat_int_pos222(X,Y) get_gdat_int((X),(Y),222)
+#define get_gdat_llong_pos222(X,Y) get_gdat_llong((X),(Y),222)
+#define get_gdat_float_pos222(X,Y) get_gdat_float((X),(Y),222)
+#define get_gdat_uint_pos223(X,Y) get_gdat_uint((X),(Y),223)
+#define get_gdat_ullong_pos223(X,Y) get_gdat_ullong((X),(Y),223)
+#define get_gdat_ip_pos223(X,Y) get_gdat_ip((X),(Y),223)
+#define get_gdat_ipv6_pos223(X,Y) get_gdat_ipv6((X),(Y),223)
+#define get_gdat_string_pos223(X,Y) get_gdat_string((X),(Y),223)
+#define get_gdat_v_str_pos223(X,Y) get_gdat_string((X),(Y),223)
+#define get_gdat_bool_pos223(X,Y) get_gdat_bool((X),(Y),223)
+#define get_gdat_int_pos223(X,Y) get_gdat_int((X),(Y),223)
+#define get_gdat_llong_pos223(X,Y) get_gdat_llong((X),(Y),223)
+#define get_gdat_float_pos223(X,Y) get_gdat_float((X),(Y),223)
+#define get_gdat_uint_pos224(X,Y) get_gdat_uint((X),(Y),224)
+#define get_gdat_ullong_pos224(X,Y) get_gdat_ullong((X),(Y),224)
+#define get_gdat_ip_pos224(X,Y) get_gdat_ip((X),(Y),224)
+#define get_gdat_ipv6_pos224(X,Y) get_gdat_ipv6((X),(Y),224)
+#define get_gdat_string_pos224(X,Y) get_gdat_string((X),(Y),224)
+#define get_gdat_v_str_pos224(X,Y) get_gdat_string((X),(Y),224)
+#define get_gdat_bool_pos224(X,Y) get_gdat_bool((X),(Y),224)
+#define get_gdat_int_pos224(X,Y) get_gdat_int((X),(Y),224)
+#define get_gdat_llong_pos224(X,Y) get_gdat_llong((X),(Y),224)
+#define get_gdat_float_pos224(X,Y) get_gdat_float((X),(Y),224)
+#define get_gdat_uint_pos225(X,Y) get_gdat_uint((X),(Y),225)
+#define get_gdat_ullong_pos225(X,Y) get_gdat_ullong((X),(Y),225)
+#define get_gdat_ip_pos225(X,Y) get_gdat_ip((X),(Y),225)
+#define get_gdat_ipv6_pos225(X,Y) get_gdat_ipv6((X),(Y),225)
+#define get_gdat_string_pos225(X,Y) get_gdat_string((X),(Y),225)
+#define get_gdat_v_str_pos225(X,Y) get_gdat_string((X),(Y),225)
+#define get_gdat_bool_pos225(X,Y) get_gdat_bool((X),(Y),225)
+#define get_gdat_int_pos225(X,Y) get_gdat_int((X),(Y),225)
+#define get_gdat_llong_pos225(X,Y) get_gdat_llong((X),(Y),225)
+#define get_gdat_float_pos225(X,Y) get_gdat_float((X),(Y),225)
+#define get_gdat_uint_pos226(X,Y) get_gdat_uint((X),(Y),226)
+#define get_gdat_ullong_pos226(X,Y) get_gdat_ullong((X),(Y),226)
+#define get_gdat_ip_pos226(X,Y) get_gdat_ip((X),(Y),226)
+#define get_gdat_ipv6_pos226(X,Y) get_gdat_ipv6((X),(Y),226)
+#define get_gdat_string_pos226(X,Y) get_gdat_string((X),(Y),226)
+#define get_gdat_v_str_pos226(X,Y) get_gdat_string((X),(Y),226)
+#define get_gdat_bool_pos226(X,Y) get_gdat_bool((X),(Y),226)
+#define get_gdat_int_pos226(X,Y) get_gdat_int((X),(Y),226)
+#define get_gdat_llong_pos226(X,Y) get_gdat_llong((X),(Y),226)
+#define get_gdat_float_pos226(X,Y) get_gdat_float((X),(Y),226)
+#define get_gdat_uint_pos227(X,Y) get_gdat_uint((X),(Y),227)
+#define get_gdat_ullong_pos227(X,Y) get_gdat_ullong((X),(Y),227)
+#define get_gdat_ip_pos227(X,Y) get_gdat_ip((X),(Y),227)
+#define get_gdat_ipv6_pos227(X,Y) get_gdat_ipv6((X),(Y),227)
+#define get_gdat_string_pos227(X,Y) get_gdat_string((X),(Y),227)
+#define get_gdat_v_str_pos227(X,Y) get_gdat_string((X),(Y),227)
+#define get_gdat_bool_pos227(X,Y) get_gdat_bool((X),(Y),227)
+#define get_gdat_int_pos227(X,Y) get_gdat_int((X),(Y),227)
+#define get_gdat_llong_pos227(X,Y) get_gdat_llong((X),(Y),227)
+#define get_gdat_float_pos227(X,Y) get_gdat_float((X),(Y),227)
+#define get_gdat_uint_pos228(X,Y) get_gdat_uint((X),(Y),228)
+#define get_gdat_ullong_pos228(X,Y) get_gdat_ullong((X),(Y),228)
+#define get_gdat_ip_pos228(X,Y) get_gdat_ip((X),(Y),228)
+#define get_gdat_ipv6_pos228(X,Y) get_gdat_ipv6((X),(Y),228)
+#define get_gdat_string_pos228(X,Y) get_gdat_string((X),(Y),228)
+#define get_gdat_v_str_pos228(X,Y) get_gdat_string((X),(Y),228)
+#define get_gdat_bool_pos228(X,Y) get_gdat_bool((X),(Y),228)
+#define get_gdat_int_pos228(X,Y) get_gdat_int((X),(Y),228)
+#define get_gdat_llong_pos228(X,Y) get_gdat_llong((X),(Y),228)
+#define get_gdat_float_pos228(X,Y) get_gdat_float((X),(Y),228)
+#define get_gdat_uint_pos229(X,Y) get_gdat_uint((X),(Y),229)
+#define get_gdat_ullong_pos229(X,Y) get_gdat_ullong((X),(Y),229)
+#define get_gdat_ip_pos229(X,Y) get_gdat_ip((X),(Y),229)
+#define get_gdat_ipv6_pos229(X,Y) get_gdat_ipv6((X),(Y),229)
+#define get_gdat_string_pos229(X,Y) get_gdat_string((X),(Y),229)
+#define get_gdat_v_str_pos229(X,Y) get_gdat_string((X),(Y),229)
+#define get_gdat_bool_pos229(X,Y) get_gdat_bool((X),(Y),229)
+#define get_gdat_int_pos229(X,Y) get_gdat_int((X),(Y),229)
+#define get_gdat_llong_pos229(X,Y) get_gdat_llong((X),(Y),229)
+#define get_gdat_float_pos229(X,Y) get_gdat_float((X),(Y),229)
+#define get_gdat_uint_pos230(X,Y) get_gdat_uint((X),(Y),230)
+#define get_gdat_ullong_pos230(X,Y) get_gdat_ullong((X),(Y),230)
+#define get_gdat_ip_pos230(X,Y) get_gdat_ip((X),(Y),230)
+#define get_gdat_ipv6_pos230(X,Y) get_gdat_ipv6((X),(Y),230)
+#define get_gdat_string_pos230(X,Y) get_gdat_string((X),(Y),230)
+#define get_gdat_v_str_pos230(X,Y) get_gdat_string((X),(Y),230)
+#define get_gdat_bool_pos230(X,Y) get_gdat_bool((X),(Y),230)
+#define get_gdat_int_pos230(X,Y) get_gdat_int((X),(Y),230)
+#define get_gdat_llong_pos230(X,Y) get_gdat_llong((X),(Y),230)
+#define get_gdat_float_pos230(X,Y) get_gdat_float((X),(Y),230)
+#define get_gdat_uint_pos231(X,Y) get_gdat_uint((X),(Y),231)
+#define get_gdat_ullong_pos231(X,Y) get_gdat_ullong((X),(Y),231)
+#define get_gdat_ip_pos231(X,Y) get_gdat_ip((X),(Y),231)
+#define get_gdat_ipv6_pos231(X,Y) get_gdat_ipv6((X),(Y),231)
+#define get_gdat_string_pos231(X,Y) get_gdat_string((X),(Y),231)
+#define get_gdat_v_str_pos231(X,Y) get_gdat_string((X),(Y),231)
+#define get_gdat_bool_pos231(X,Y) get_gdat_bool((X),(Y),231)
+#define get_gdat_int_pos231(X,Y) get_gdat_int((X),(Y),231)
+#define get_gdat_llong_pos231(X,Y) get_gdat_llong((X),(Y),231)
+#define get_gdat_float_pos231(X,Y) get_gdat_float((X),(Y),231)
+#define get_gdat_uint_pos232(X,Y) get_gdat_uint((X),(Y),232)
+#define get_gdat_ullong_pos232(X,Y) get_gdat_ullong((X),(Y),232)
+#define get_gdat_ip_pos232(X,Y) get_gdat_ip((X),(Y),232)
+#define get_gdat_ipv6_pos232(X,Y) get_gdat_ipv6((X),(Y),232)
+#define get_gdat_string_pos232(X,Y) get_gdat_string((X),(Y),232)
+#define get_gdat_v_str_pos232(X,Y) get_gdat_string((X),(Y),232)
+#define get_gdat_bool_pos232(X,Y) get_gdat_bool((X),(Y),232)
+#define get_gdat_int_pos232(X,Y) get_gdat_int((X),(Y),232)
+#define get_gdat_llong_pos232(X,Y) get_gdat_llong((X),(Y),232)
+#define get_gdat_float_pos232(X,Y) get_gdat_float((X),(Y),232)
+#define get_gdat_uint_pos233(X,Y) get_gdat_uint((X),(Y),233)
+#define get_gdat_ullong_pos233(X,Y) get_gdat_ullong((X),(Y),233)
+#define get_gdat_ip_pos233(X,Y) get_gdat_ip((X),(Y),233)
+#define get_gdat_ipv6_pos233(X,Y) get_gdat_ipv6((X),(Y),233)
+#define get_gdat_string_pos233(X,Y) get_gdat_string((X),(Y),233)
+#define get_gdat_v_str_pos233(X,Y) get_gdat_string((X),(Y),233)
+#define get_gdat_bool_pos233(X,Y) get_gdat_bool((X),(Y),233)
+#define get_gdat_int_pos233(X,Y) get_gdat_int((X),(Y),233)
+#define get_gdat_llong_pos233(X,Y) get_gdat_llong((X),(Y),233)
+#define get_gdat_float_pos233(X,Y) get_gdat_float((X),(Y),233)
+#define get_gdat_uint_pos234(X,Y) get_gdat_uint((X),(Y),234)
+#define get_gdat_ullong_pos234(X,Y) get_gdat_ullong((X),(Y),234)
+#define get_gdat_ip_pos234(X,Y) get_gdat_ip((X),(Y),234)
+#define get_gdat_ipv6_pos234(X,Y) get_gdat_ipv6((X),(Y),234)
+#define get_gdat_string_pos234(X,Y) get_gdat_string((X),(Y),234)
+#define get_gdat_v_str_pos234(X,Y) get_gdat_string((X),(Y),234)
+#define get_gdat_bool_pos234(X,Y) get_gdat_bool((X),(Y),234)
+#define get_gdat_int_pos234(X,Y) get_gdat_int((X),(Y),234)
+#define get_gdat_llong_pos234(X,Y) get_gdat_llong((X),(Y),234)
+#define get_gdat_float_pos234(X,Y) get_gdat_float((X),(Y),234)
+#define get_gdat_uint_pos235(X,Y) get_gdat_uint((X),(Y),235)
+#define get_gdat_ullong_pos235(X,Y) get_gdat_ullong((X),(Y),235)
+#define get_gdat_ip_pos235(X,Y) get_gdat_ip((X),(Y),235)
+#define get_gdat_ipv6_pos235(X,Y) get_gdat_ipv6((X),(Y),235)
+#define get_gdat_string_pos235(X,Y) get_gdat_string((X),(Y),235)
+#define get_gdat_v_str_pos235(X,Y) get_gdat_string((X),(Y),235)
+#define get_gdat_bool_pos235(X,Y) get_gdat_bool((X),(Y),235)
+#define get_gdat_int_pos235(X,Y) get_gdat_int((X),(Y),235)
+#define get_gdat_llong_pos235(X,Y) get_gdat_llong((X),(Y),235)
+#define get_gdat_float_pos235(X,Y) get_gdat_float((X),(Y),235)
+#define get_gdat_uint_pos236(X,Y) get_gdat_uint((X),(Y),236)
+#define get_gdat_ullong_pos236(X,Y) get_gdat_ullong((X),(Y),236)
+#define get_gdat_ip_pos236(X,Y) get_gdat_ip((X),(Y),236)
+#define get_gdat_ipv6_pos236(X,Y) get_gdat_ipv6((X),(Y),236)
+#define get_gdat_string_pos236(X,Y) get_gdat_string((X),(Y),236)
+#define get_gdat_v_str_pos236(X,Y) get_gdat_string((X),(Y),236)
+#define get_gdat_bool_pos236(X,Y) get_gdat_bool((X),(Y),236)
+#define get_gdat_int_pos236(X,Y) get_gdat_int((X),(Y),236)
+#define get_gdat_llong_pos236(X,Y) get_gdat_llong((X),(Y),236)
+#define get_gdat_float_pos236(X,Y) get_gdat_float((X),(Y),236)
+#define get_gdat_uint_pos237(X,Y) get_gdat_uint((X),(Y),237)
+#define get_gdat_ullong_pos237(X,Y) get_gdat_ullong((X),(Y),237)
+#define get_gdat_ip_pos237(X,Y) get_gdat_ip((X),(Y),237)
+#define get_gdat_ipv6_pos237(X,Y) get_gdat_ipv6((X),(Y),237)
+#define get_gdat_string_pos237(X,Y) get_gdat_string((X),(Y),237)
+#define get_gdat_v_str_pos237(X,Y) get_gdat_string((X),(Y),237)
+#define get_gdat_bool_pos237(X,Y) get_gdat_bool((X),(Y),237)
+#define get_gdat_int_pos237(X,Y) get_gdat_int((X),(Y),237)
+#define get_gdat_llong_pos237(X,Y) get_gdat_llong((X),(Y),237)
+#define get_gdat_float_pos237(X,Y) get_gdat_float((X),(Y),237)
+#define get_gdat_uint_pos238(X,Y) get_gdat_uint((X),(Y),238)
+#define get_gdat_ullong_pos238(X,Y) get_gdat_ullong((X),(Y),238)
+#define get_gdat_ip_pos238(X,Y) get_gdat_ip((X),(Y),238)
+#define get_gdat_ipv6_pos238(X,Y) get_gdat_ipv6((X),(Y),238)
+#define get_gdat_string_pos238(X,Y) get_gdat_string((X),(Y),238)
+#define get_gdat_v_str_pos238(X,Y) get_gdat_string((X),(Y),238)
+#define get_gdat_bool_pos238(X,Y) get_gdat_bool((X),(Y),238)
+#define get_gdat_int_pos238(X,Y) get_gdat_int((X),(Y),238)
+#define get_gdat_llong_pos238(X,Y) get_gdat_llong((X),(Y),238)
+#define get_gdat_float_pos238(X,Y) get_gdat_float((X),(Y),238)
+#define get_gdat_uint_pos239(X,Y) get_gdat_uint((X),(Y),239)
+#define get_gdat_ullong_pos239(X,Y) get_gdat_ullong((X),(Y),239)
+#define get_gdat_ip_pos239(X,Y) get_gdat_ip((X),(Y),239)
+#define get_gdat_ipv6_pos239(X,Y) get_gdat_ipv6((X),(Y),239)
+#define get_gdat_string_pos239(X,Y) get_gdat_string((X),(Y),239)
+#define get_gdat_v_str_pos239(X,Y) get_gdat_string((X),(Y),239)
+#define get_gdat_bool_pos239(X,Y) get_gdat_bool((X),(Y),239)
+#define get_gdat_int_pos239(X,Y) get_gdat_int((X),(Y),239)
+#define get_gdat_llong_pos239(X,Y) get_gdat_llong((X),(Y),239)
+#define get_gdat_float_pos239(X,Y) get_gdat_float((X),(Y),239)
+#define get_gdat_uint_pos240(X,Y) get_gdat_uint((X),(Y),240)
+#define get_gdat_ullong_pos240(X,Y) get_gdat_ullong((X),(Y),240)
+#define get_gdat_ip_pos240(X,Y) get_gdat_ip((X),(Y),240)
+#define get_gdat_ipv6_pos240(X,Y) get_gdat_ipv6((X),(Y),240)
+#define get_gdat_string_pos240(X,Y) get_gdat_string((X),(Y),240)
+#define get_gdat_v_str_pos240(X,Y) get_gdat_string((X),(Y),240)
+#define get_gdat_bool_pos240(X,Y) get_gdat_bool((X),(Y),240)
+#define get_gdat_int_pos240(X,Y) get_gdat_int((X),(Y),240)
+#define get_gdat_llong_pos240(X,Y) get_gdat_llong((X),(Y),240)
+#define get_gdat_float_pos240(X,Y) get_gdat_float((X),(Y),240)
+#define get_gdat_uint_pos241(X,Y) get_gdat_uint((X),(Y),241)
+#define get_gdat_ullong_pos241(X,Y) get_gdat_ullong((X),(Y),241)
+#define get_gdat_ip_pos241(X,Y) get_gdat_ip((X),(Y),241)
+#define get_gdat_ipv6_pos241(X,Y) get_gdat_ipv6((X),(Y),241)
+#define get_gdat_string_pos241(X,Y) get_gdat_string((X),(Y),241)
+#define get_gdat_v_str_pos241(X,Y) get_gdat_string((X),(Y),241)
+#define get_gdat_bool_pos241(X,Y) get_gdat_bool((X),(Y),241)
+#define get_gdat_int_pos241(X,Y) get_gdat_int((X),(Y),241)
+#define get_gdat_llong_pos241(X,Y) get_gdat_llong((X),(Y),241)
+#define get_gdat_float_pos241(X,Y) get_gdat_float((X),(Y),241)
+#define get_gdat_uint_pos242(X,Y) get_gdat_uint((X),(Y),242)
+#define get_gdat_ullong_pos242(X,Y) get_gdat_ullong((X),(Y),242)
+#define get_gdat_ip_pos242(X,Y) get_gdat_ip((X),(Y),242)
+#define get_gdat_ipv6_pos242(X,Y) get_gdat_ipv6((X),(Y),242)
+#define get_gdat_string_pos242(X,Y) get_gdat_string((X),(Y),242)
+#define get_gdat_v_str_pos242(X,Y) get_gdat_string((X),(Y),242)
+#define get_gdat_bool_pos242(X,Y) get_gdat_bool((X),(Y),242)
+#define get_gdat_int_pos242(X,Y) get_gdat_int((X),(Y),242)
+#define get_gdat_llong_pos242(X,Y) get_gdat_llong((X),(Y),242)
+#define get_gdat_float_pos242(X,Y) get_gdat_float((X),(Y),242)
+#define get_gdat_uint_pos243(X,Y) get_gdat_uint((X),(Y),243)
+#define get_gdat_ullong_pos243(X,Y) get_gdat_ullong((X),(Y),243)
+#define get_gdat_ip_pos243(X,Y) get_gdat_ip((X),(Y),243)
+#define get_gdat_ipv6_pos243(X,Y) get_gdat_ipv6((X),(Y),243)
+#define get_gdat_string_pos243(X,Y) get_gdat_string((X),(Y),243)
+#define get_gdat_v_str_pos243(X,Y) get_gdat_string((X),(Y),243)
+#define get_gdat_bool_pos243(X,Y) get_gdat_bool((X),(Y),243)
+#define get_gdat_int_pos243(X,Y) get_gdat_int((X),(Y),243)
+#define get_gdat_llong_pos243(X,Y) get_gdat_llong((X),(Y),243)
+#define get_gdat_float_pos243(X,Y) get_gdat_float((X),(Y),243)
+#define get_gdat_uint_pos244(X,Y) get_gdat_uint((X),(Y),244)
+#define get_gdat_ullong_pos244(X,Y) get_gdat_ullong((X),(Y),244)
+#define get_gdat_ip_pos244(X,Y) get_gdat_ip((X),(Y),244)
+#define get_gdat_ipv6_pos244(X,Y) get_gdat_ipv6((X),(Y),244)
+#define get_gdat_string_pos244(X,Y) get_gdat_string((X),(Y),244)
+#define get_gdat_v_str_pos244(X,Y) get_gdat_string((X),(Y),244)
+#define get_gdat_bool_pos244(X,Y) get_gdat_bool((X),(Y),244)
+#define get_gdat_int_pos244(X,Y) get_gdat_int((X),(Y),244)
+#define get_gdat_llong_pos244(X,Y) get_gdat_llong((X),(Y),244)
+#define get_gdat_float_pos244(X,Y) get_gdat_float((X),(Y),244)
+#define get_gdat_uint_pos245(X,Y) get_gdat_uint((X),(Y),245)
+#define get_gdat_ullong_pos245(X,Y) get_gdat_ullong((X),(Y),245)
+#define get_gdat_ip_pos245(X,Y) get_gdat_ip((X),(Y),245)
+#define get_gdat_ipv6_pos245(X,Y) get_gdat_ipv6((X),(Y),245)
+#define get_gdat_string_pos245(X,Y) get_gdat_string((X),(Y),245)
+#define get_gdat_v_str_pos245(X,Y) get_gdat_string((X),(Y),245)
+#define get_gdat_bool_pos245(X,Y) get_gdat_bool((X),(Y),245)
+#define get_gdat_int_pos245(X,Y) get_gdat_int((X),(Y),245)
+#define get_gdat_llong_pos245(X,Y) get_gdat_llong((X),(Y),245)
+#define get_gdat_float_pos245(X,Y) get_gdat_float((X),(Y),245)
+#define get_gdat_uint_pos246(X,Y) get_gdat_uint((X),(Y),246)
+#define get_gdat_ullong_pos246(X,Y) get_gdat_ullong((X),(Y),246)
+#define get_gdat_ip_pos246(X,Y) get_gdat_ip((X),(Y),246)
+#define get_gdat_ipv6_pos246(X,Y) get_gdat_ipv6((X),(Y),246)
+#define get_gdat_string_pos246(X,Y) get_gdat_string((X),(Y),246)
+#define get_gdat_v_str_pos246(X,Y) get_gdat_string((X),(Y),246)
+#define get_gdat_bool_pos246(X,Y) get_gdat_bool((X),(Y),246)
+#define get_gdat_int_pos246(X,Y) get_gdat_int((X),(Y),246)
+#define get_gdat_llong_pos246(X,Y) get_gdat_llong((X),(Y),246)
+#define get_gdat_float_pos246(X,Y) get_gdat_float((X),(Y),246)
+#define get_gdat_uint_pos247(X,Y) get_gdat_uint((X),(Y),247)
+#define get_gdat_ullong_pos247(X,Y) get_gdat_ullong((X),(Y),247)
+#define get_gdat_ip_pos247(X,Y) get_gdat_ip((X),(Y),247)
+#define get_gdat_ipv6_pos247(X,Y) get_gdat_ipv6((X),(Y),247)
+#define get_gdat_string_pos247(X,Y) get_gdat_string((X),(Y),247)
+#define get_gdat_v_str_pos247(X,Y) get_gdat_string((X),(Y),247)
+#define get_gdat_bool_pos247(X,Y) get_gdat_bool((X),(Y),247)
+#define get_gdat_int_pos247(X,Y) get_gdat_int((X),(Y),247)
+#define get_gdat_llong_pos247(X,Y) get_gdat_llong((X),(Y),247)
+#define get_gdat_float_pos247(X,Y) get_gdat_float((X),(Y),247)
+#define get_gdat_uint_pos248(X,Y) get_gdat_uint((X),(Y),248)
+#define get_gdat_ullong_pos248(X,Y) get_gdat_ullong((X),(Y),248)
+#define get_gdat_ip_pos248(X,Y) get_gdat_ip((X),(Y),248)
+#define get_gdat_ipv6_pos248(X,Y) get_gdat_ipv6((X),(Y),248)
+#define get_gdat_string_pos248(X,Y) get_gdat_string((X),(Y),248)
+#define get_gdat_v_str_pos248(X,Y) get_gdat_string((X),(Y),248)
+#define get_gdat_bool_pos248(X,Y) get_gdat_bool((X),(Y),248)
+#define get_gdat_int_pos248(X,Y) get_gdat_int((X),(Y),248)
+#define get_gdat_llong_pos248(X,Y) get_gdat_llong((X),(Y),248)
+#define get_gdat_float_pos248(X,Y) get_gdat_float((X),(Y),248)
+#define get_gdat_uint_pos249(X,Y) get_gdat_uint((X),(Y),249)
+#define get_gdat_ullong_pos249(X,Y) get_gdat_ullong((X),(Y),249)
+#define get_gdat_ip_pos249(X,Y) get_gdat_ip((X),(Y),249)
+#define get_gdat_ipv6_pos249(X,Y) get_gdat_ipv6((X),(Y),249)
+#define get_gdat_string_pos249(X,Y) get_gdat_string((X),(Y),249)
+#define get_gdat_v_str_pos249(X,Y) get_gdat_string((X),(Y),249)
+#define get_gdat_bool_pos249(X,Y) get_gdat_bool((X),(Y),249)
+#define get_gdat_int_pos249(X,Y) get_gdat_int((X),(Y),249)
+#define get_gdat_llong_pos249(X,Y) get_gdat_llong((X),(Y),249)
+#define get_gdat_float_pos249(X,Y) get_gdat_float((X),(Y),249)
+#define get_gdat_uint_pos250(X,Y) get_gdat_uint((X),(Y),250)
+#define get_gdat_ullong_pos250(X,Y) get_gdat_ullong((X),(Y),250)
+#define get_gdat_ip_pos250(X,Y) get_gdat_ip((X),(Y),250)
+#define get_gdat_ipv6_pos250(X,Y) get_gdat_ipv6((X),(Y),250)
+#define get_gdat_string_pos250(X,Y) get_gdat_string((X),(Y),250)
+#define get_gdat_v_str_pos250(X,Y) get_gdat_string((X),(Y),250)
+#define get_gdat_bool_pos250(X,Y) get_gdat_bool((X),(Y),250)
+#define get_gdat_int_pos250(X,Y) get_gdat_int((X),(Y),250)
+#define get_gdat_llong_pos250(X,Y) get_gdat_llong((X),(Y),250)
+#define get_gdat_float_pos250(X,Y) get_gdat_float((X),(Y),250)
+#define get_gdat_uint_pos251(X,Y) get_gdat_uint((X),(Y),251)
+#define get_gdat_ullong_pos251(X,Y) get_gdat_ullong((X),(Y),251)
+#define get_gdat_ip_pos251(X,Y) get_gdat_ip((X),(Y),251)
+#define get_gdat_ipv6_pos251(X,Y) get_gdat_ipv6((X),(Y),251)
+#define get_gdat_string_pos251(X,Y) get_gdat_string((X),(Y),251)
+#define get_gdat_v_str_pos251(X,Y) get_gdat_string((X),(Y),251)
+#define get_gdat_bool_pos251(X,Y) get_gdat_bool((X),(Y),251)
+#define get_gdat_int_pos251(X,Y) get_gdat_int((X),(Y),251)
+#define get_gdat_llong_pos251(X,Y) get_gdat_llong((X),(Y),251)
+#define get_gdat_float_pos251(X,Y) get_gdat_float((X),(Y),251)
+#define get_gdat_uint_pos252(X,Y) get_gdat_uint((X),(Y),252)
+#define get_gdat_ullong_pos252(X,Y) get_gdat_ullong((X),(Y),252)
+#define get_gdat_ip_pos252(X,Y) get_gdat_ip((X),(Y),252)
+#define get_gdat_ipv6_pos252(X,Y) get_gdat_ipv6((X),(Y),252)
+#define get_gdat_string_pos252(X,Y) get_gdat_string((X),(Y),252)
+#define get_gdat_v_str_pos252(X,Y) get_gdat_string((X),(Y),252)
+#define get_gdat_bool_pos252(X,Y) get_gdat_bool((X),(Y),252)
+#define get_gdat_int_pos252(X,Y) get_gdat_int((X),(Y),252)
+#define get_gdat_llong_pos252(X,Y) get_gdat_llong((X),(Y),252)
+#define get_gdat_float_pos252(X,Y) get_gdat_float((X),(Y),252)
+#define get_gdat_uint_pos253(X,Y) get_gdat_uint((X),(Y),253)
+#define get_gdat_ullong_pos253(X,Y) get_gdat_ullong((X),(Y),253)
+#define get_gdat_ip_pos253(X,Y) get_gdat_ip((X),(Y),253)
+#define get_gdat_ipv6_pos253(X,Y) get_gdat_ipv6((X),(Y),253)
+#define get_gdat_string_pos253(X,Y) get_gdat_string((X),(Y),253)
+#define get_gdat_v_str_pos253(X,Y) get_gdat_string((X),(Y),253)
+#define get_gdat_bool_pos253(X,Y) get_gdat_bool((X),(Y),253)
+#define get_gdat_int_pos253(X,Y) get_gdat_int((X),(Y),253)
+#define get_gdat_llong_pos253(X,Y) get_gdat_llong((X),(Y),253)
+#define get_gdat_float_pos253(X,Y) get_gdat_float((X),(Y),253)
+#define get_gdat_uint_pos254(X,Y) get_gdat_uint((X),(Y),254)
+#define get_gdat_ullong_pos254(X,Y) get_gdat_ullong((X),(Y),254)
+#define get_gdat_ip_pos254(X,Y) get_gdat_ip((X),(Y),254)
+#define get_gdat_ipv6_pos254(X,Y) get_gdat_ipv6((X),(Y),254)
+#define get_gdat_string_pos254(X,Y) get_gdat_string((X),(Y),254)
+#define get_gdat_v_str_pos254(X,Y) get_gdat_string((X),(Y),254)
+#define get_gdat_bool_pos254(X,Y) get_gdat_bool((X),(Y),254)
+#define get_gdat_int_pos254(X,Y) get_gdat_int((X),(Y),254)
+#define get_gdat_llong_pos254(X,Y) get_gdat_llong((X),(Y),254)
+#define get_gdat_float_pos254(X,Y) get_gdat_float((X),(Y),254)
+#define get_gdat_uint_pos255(X,Y) get_gdat_uint((X),(Y),255)
+#define get_gdat_ullong_pos255(X,Y) get_gdat_ullong((X),(Y),255)
+#define get_gdat_ip_pos255(X,Y) get_gdat_ip((X),(Y),255)
+#define get_gdat_ipv6_pos255(X,Y) get_gdat_ipv6((X),(Y),255)
+#define get_gdat_string_pos255(X,Y) get_gdat_string((X),(Y),255)
+#define get_gdat_v_str_pos255(X,Y) get_gdat_string((X),(Y),255)
+#define get_gdat_bool_pos255(X,Y) get_gdat_bool((X),(Y),255)
+#define get_gdat_int_pos255(X,Y) get_gdat_int((X),(Y),255)
+#define get_gdat_llong_pos255(X,Y) get_gdat_llong((X),(Y),255)
+#define get_gdat_float_pos255(X,Y) get_gdat_float((X),(Y),255)
+#define get_gdat_uint_pos256(X,Y) get_gdat_uint((X),(Y),256)
+#define get_gdat_ullong_pos256(X,Y) get_gdat_ullong((X),(Y),256)
+#define get_gdat_ip_pos256(X,Y) get_gdat_ip((X),(Y),256)
+#define get_gdat_ipv6_pos256(X,Y) get_gdat_ipv6((X),(Y),256)
+#define get_gdat_string_pos256(X,Y) get_gdat_string((X),(Y),256)
+#define get_gdat_v_str_pos256(X,Y) get_gdat_string((X),(Y),256)
+#define get_gdat_bool_pos256(X,Y) get_gdat_bool((X),(Y),256)
+#define get_gdat_int_pos256(X,Y) get_gdat_int((X),(Y),256)
+#define get_gdat_llong_pos256(X,Y) get_gdat_llong((X),(Y),256)
+#define get_gdat_float_pos256(X,Y) get_gdat_float((X),(Y),256)
+#define get_gdat_uint_pos257(X,Y) get_gdat_uint((X),(Y),257)
+#define get_gdat_ullong_pos257(X,Y) get_gdat_ullong((X),(Y),257)
+#define get_gdat_ip_pos257(X,Y) get_gdat_ip((X),(Y),257)
+#define get_gdat_ipv6_pos257(X,Y) get_gdat_ipv6((X),(Y),257)
+#define get_gdat_string_pos257(X,Y) get_gdat_string((X),(Y),257)
+#define get_gdat_v_str_pos257(X,Y) get_gdat_string((X),(Y),257)
+#define get_gdat_bool_pos257(X,Y) get_gdat_bool((X),(Y),257)
+#define get_gdat_int_pos257(X,Y) get_gdat_int((X),(Y),257)
+#define get_gdat_llong_pos257(X,Y) get_gdat_llong((X),(Y),257)
+#define get_gdat_float_pos257(X,Y) get_gdat_float((X),(Y),257)
+#define get_gdat_uint_pos258(X,Y) get_gdat_uint((X),(Y),258)
+#define get_gdat_ullong_pos258(X,Y) get_gdat_ullong((X),(Y),258)
+#define get_gdat_ip_pos258(X,Y) get_gdat_ip((X),(Y),258)
+#define get_gdat_ipv6_pos258(X,Y) get_gdat_ipv6((X),(Y),258)
+#define get_gdat_string_pos258(X,Y) get_gdat_string((X),(Y),258)
+#define get_gdat_v_str_pos258(X,Y) get_gdat_string((X),(Y),258)
+#define get_gdat_bool_pos258(X,Y) get_gdat_bool((X),(Y),258)
+#define get_gdat_int_pos258(X,Y) get_gdat_int((X),(Y),258)
+#define get_gdat_llong_pos258(X,Y) get_gdat_llong((X),(Y),258)
+#define get_gdat_float_pos258(X,Y) get_gdat_float((X),(Y),258)
+#define get_gdat_uint_pos259(X,Y) get_gdat_uint((X),(Y),259)
+#define get_gdat_ullong_pos259(X,Y) get_gdat_ullong((X),(Y),259)
+#define get_gdat_ip_pos259(X,Y) get_gdat_ip((X),(Y),259)
+#define get_gdat_ipv6_pos259(X,Y) get_gdat_ipv6((X),(Y),259)
+#define get_gdat_string_pos259(X,Y) get_gdat_string((X),(Y),259)
+#define get_gdat_v_str_pos259(X,Y) get_gdat_string((X),(Y),259)
+#define get_gdat_bool_pos259(X,Y) get_gdat_bool((X),(Y),259)
+#define get_gdat_int_pos259(X,Y) get_gdat_int((X),(Y),259)
+#define get_gdat_llong_pos259(X,Y) get_gdat_llong((X),(Y),259)
+#define get_gdat_float_pos259(X,Y) get_gdat_float((X),(Y),259)
+#define get_gdat_uint_pos260(X,Y) get_gdat_uint((X),(Y),260)
+#define get_gdat_ullong_pos260(X,Y) get_gdat_ullong((X),(Y),260)
+#define get_gdat_ip_pos260(X,Y) get_gdat_ip((X),(Y),260)
+#define get_gdat_ipv6_pos260(X,Y) get_gdat_ipv6((X),(Y),260)
+#define get_gdat_string_pos260(X,Y) get_gdat_string((X),(Y),260)
+#define get_gdat_v_str_pos260(X,Y) get_gdat_string((X),(Y),260)
+#define get_gdat_bool_pos260(X,Y) get_gdat_bool((X),(Y),260)
+#define get_gdat_int_pos260(X,Y) get_gdat_int((X),(Y),260)
+#define get_gdat_llong_pos260(X,Y) get_gdat_llong((X),(Y),260)
+#define get_gdat_float_pos260(X,Y) get_gdat_float((X),(Y),260)
+#define get_gdat_uint_pos261(X,Y) get_gdat_uint((X),(Y),261)
+#define get_gdat_ullong_pos261(X,Y) get_gdat_ullong((X),(Y),261)
+#define get_gdat_ip_pos261(X,Y) get_gdat_ip((X),(Y),261)
+#define get_gdat_ipv6_pos261(X,Y) get_gdat_ipv6((X),(Y),261)
+#define get_gdat_string_pos261(X,Y) get_gdat_string((X),(Y),261)
+#define get_gdat_v_str_pos261(X,Y) get_gdat_string((X),(Y),261)
+#define get_gdat_bool_pos261(X,Y) get_gdat_bool((X),(Y),261)
+#define get_gdat_int_pos261(X,Y) get_gdat_int((X),(Y),261)
+#define get_gdat_llong_pos261(X,Y) get_gdat_llong((X),(Y),261)
+#define get_gdat_float_pos261(X,Y) get_gdat_float((X),(Y),261)
+#define get_gdat_uint_pos262(X,Y) get_gdat_uint((X),(Y),262)
+#define get_gdat_ullong_pos262(X,Y) get_gdat_ullong((X),(Y),262)
+#define get_gdat_ip_pos262(X,Y) get_gdat_ip((X),(Y),262)
+#define get_gdat_ipv6_pos262(X,Y) get_gdat_ipv6((X),(Y),262)
+#define get_gdat_string_pos262(X,Y) get_gdat_string((X),(Y),262)
+#define get_gdat_v_str_pos262(X,Y) get_gdat_string((X),(Y),262)
+#define get_gdat_bool_pos262(X,Y) get_gdat_bool((X),(Y),262)
+#define get_gdat_int_pos262(X,Y) get_gdat_int((X),(Y),262)
+#define get_gdat_llong_pos262(X,Y) get_gdat_llong((X),(Y),262)
+#define get_gdat_float_pos262(X,Y) get_gdat_float((X),(Y),262)
+#define get_gdat_uint_pos263(X,Y) get_gdat_uint((X),(Y),263)
+#define get_gdat_ullong_pos263(X,Y) get_gdat_ullong((X),(Y),263)
+#define get_gdat_ip_pos263(X,Y) get_gdat_ip((X),(Y),263)
+#define get_gdat_ipv6_pos263(X,Y) get_gdat_ipv6((X),(Y),263)
+#define get_gdat_string_pos263(X,Y) get_gdat_string((X),(Y),263)
+#define get_gdat_v_str_pos263(X,Y) get_gdat_string((X),(Y),263)
+#define get_gdat_bool_pos263(X,Y) get_gdat_bool((X),(Y),263)
+#define get_gdat_int_pos263(X,Y) get_gdat_int((X),(Y),263)
+#define get_gdat_llong_pos263(X,Y) get_gdat_llong((X),(Y),263)
+#define get_gdat_float_pos263(X,Y) get_gdat_float((X),(Y),263)
+#define get_gdat_uint_pos264(X,Y) get_gdat_uint((X),(Y),264)
+#define get_gdat_ullong_pos264(X,Y) get_gdat_ullong((X),(Y),264)
+#define get_gdat_ip_pos264(X,Y) get_gdat_ip((X),(Y),264)
+#define get_gdat_ipv6_pos264(X,Y) get_gdat_ipv6((X),(Y),264)
+#define get_gdat_string_pos264(X,Y) get_gdat_string((X),(Y),264)
+#define get_gdat_v_str_pos264(X,Y) get_gdat_string((X),(Y),264)
+#define get_gdat_bool_pos264(X,Y) get_gdat_bool((X),(Y),264)
+#define get_gdat_int_pos264(X,Y) get_gdat_int((X),(Y),264)
+#define get_gdat_llong_pos264(X,Y) get_gdat_llong((X),(Y),264)
+#define get_gdat_float_pos264(X,Y) get_gdat_float((X),(Y),264)
+#define get_gdat_uint_pos265(X,Y) get_gdat_uint((X),(Y),265)
+#define get_gdat_ullong_pos265(X,Y) get_gdat_ullong((X),(Y),265)
+#define get_gdat_ip_pos265(X,Y) get_gdat_ip((X),(Y),265)
+#define get_gdat_ipv6_pos265(X,Y) get_gdat_ipv6((X),(Y),265)
+#define get_gdat_string_pos265(X,Y) get_gdat_string((X),(Y),265)
+#define get_gdat_v_str_pos265(X,Y) get_gdat_string((X),(Y),265)
+#define get_gdat_bool_pos265(X,Y) get_gdat_bool((X),(Y),265)
+#define get_gdat_int_pos265(X,Y) get_gdat_int((X),(Y),265)
+#define get_gdat_llong_pos265(X,Y) get_gdat_llong((X),(Y),265)
+#define get_gdat_float_pos265(X,Y) get_gdat_float((X),(Y),265)
+#define get_gdat_uint_pos266(X,Y) get_gdat_uint((X),(Y),266)
+#define get_gdat_ullong_pos266(X,Y) get_gdat_ullong((X),(Y),266)
+#define get_gdat_ip_pos266(X,Y) get_gdat_ip((X),(Y),266)
+#define get_gdat_ipv6_pos266(X,Y) get_gdat_ipv6((X),(Y),266)
+#define get_gdat_string_pos266(X,Y) get_gdat_string((X),(Y),266)
+#define get_gdat_v_str_pos266(X,Y) get_gdat_string((X),(Y),266)
+#define get_gdat_bool_pos266(X,Y) get_gdat_bool((X),(Y),266)
+#define get_gdat_int_pos266(X,Y) get_gdat_int((X),(Y),266)
+#define get_gdat_llong_pos266(X,Y) get_gdat_llong((X),(Y),266)
+#define get_gdat_float_pos266(X,Y) get_gdat_float((X),(Y),266)
+#define get_gdat_uint_pos267(X,Y) get_gdat_uint((X),(Y),267)
+#define get_gdat_ullong_pos267(X,Y) get_gdat_ullong((X),(Y),267)
+#define get_gdat_ip_pos267(X,Y) get_gdat_ip((X),(Y),267)
+#define get_gdat_ipv6_pos267(X,Y) get_gdat_ipv6((X),(Y),267)
+#define get_gdat_string_pos267(X,Y) get_gdat_string((X),(Y),267)
+#define get_gdat_v_str_pos267(X,Y) get_gdat_string((X),(Y),267)
+#define get_gdat_bool_pos267(X,Y) get_gdat_bool((X),(Y),267)
+#define get_gdat_int_pos267(X,Y) get_gdat_int((X),(Y),267)
+#define get_gdat_llong_pos267(X,Y) get_gdat_llong((X),(Y),267)
+#define get_gdat_float_pos267(X,Y) get_gdat_float((X),(Y),267)
+#define get_gdat_uint_pos268(X,Y) get_gdat_uint((X),(Y),268)
+#define get_gdat_ullong_pos268(X,Y) get_gdat_ullong((X),(Y),268)
+#define get_gdat_ip_pos268(X,Y) get_gdat_ip((X),(Y),268)
+#define get_gdat_ipv6_pos268(X,Y) get_gdat_ipv6((X),(Y),268)
+#define get_gdat_string_pos268(X,Y) get_gdat_string((X),(Y),268)
+#define get_gdat_v_str_pos268(X,Y) get_gdat_string((X),(Y),268)
+#define get_gdat_bool_pos268(X,Y) get_gdat_bool((X),(Y),268)
+#define get_gdat_int_pos268(X,Y) get_gdat_int((X),(Y),268)
+#define get_gdat_llong_pos268(X,Y) get_gdat_llong((X),(Y),268)
+#define get_gdat_float_pos268(X,Y) get_gdat_float((X),(Y),268)
+#define get_gdat_uint_pos269(X,Y) get_gdat_uint((X),(Y),269)
+#define get_gdat_ullong_pos269(X,Y) get_gdat_ullong((X),(Y),269)
+#define get_gdat_ip_pos269(X,Y) get_gdat_ip((X),(Y),269)
+#define get_gdat_ipv6_pos269(X,Y) get_gdat_ipv6((X),(Y),269)
+#define get_gdat_string_pos269(X,Y) get_gdat_string((X),(Y),269)
+#define get_gdat_v_str_pos269(X,Y) get_gdat_string((X),(Y),269)
+#define get_gdat_bool_pos269(X,Y) get_gdat_bool((X),(Y),269)
+#define get_gdat_int_pos269(X,Y) get_gdat_int((X),(Y),269)
+#define get_gdat_llong_pos269(X,Y) get_gdat_llong((X),(Y),269)
+#define get_gdat_float_pos269(X,Y) get_gdat_float((X),(Y),269)
+#define get_gdat_uint_pos270(X,Y) get_gdat_uint((X),(Y),270)
+#define get_gdat_ullong_pos270(X,Y) get_gdat_ullong((X),(Y),270)
+#define get_gdat_ip_pos270(X,Y) get_gdat_ip((X),(Y),270)
+#define get_gdat_ipv6_pos270(X,Y) get_gdat_ipv6((X),(Y),270)
+#define get_gdat_string_pos270(X,Y) get_gdat_string((X),(Y),270)
+#define get_gdat_v_str_pos270(X,Y) get_gdat_string((X),(Y),270)
+#define get_gdat_bool_pos270(X,Y) get_gdat_bool((X),(Y),270)
+#define get_gdat_int_pos270(X,Y) get_gdat_int((X),(Y),270)
+#define get_gdat_llong_pos270(X,Y) get_gdat_llong((X),(Y),270)
+#define get_gdat_float_pos270(X,Y) get_gdat_float((X),(Y),270)
+#define get_gdat_uint_pos271(X,Y) get_gdat_uint((X),(Y),271)
+#define get_gdat_ullong_pos271(X,Y) get_gdat_ullong((X),(Y),271)
+#define get_gdat_ip_pos271(X,Y) get_gdat_ip((X),(Y),271)
+#define get_gdat_ipv6_pos271(X,Y) get_gdat_ipv6((X),(Y),271)
+#define get_gdat_string_pos271(X,Y) get_gdat_string((X),(Y),271)
+#define get_gdat_v_str_pos271(X,Y) get_gdat_string((X),(Y),271)
+#define get_gdat_bool_pos271(X,Y) get_gdat_bool((X),(Y),271)
+#define get_gdat_int_pos271(X,Y) get_gdat_int((X),(Y),271)
+#define get_gdat_llong_pos271(X,Y) get_gdat_llong((X),(Y),271)
+#define get_gdat_float_pos271(X,Y) get_gdat_float((X),(Y),271)
+#define get_gdat_uint_pos272(X,Y) get_gdat_uint((X),(Y),272)
+#define get_gdat_ullong_pos272(X,Y) get_gdat_ullong((X),(Y),272)
+#define get_gdat_ip_pos272(X,Y) get_gdat_ip((X),(Y),272)
+#define get_gdat_ipv6_pos272(X,Y) get_gdat_ipv6((X),(Y),272)
+#define get_gdat_string_pos272(X,Y) get_gdat_string((X),(Y),272)
+#define get_gdat_v_str_pos272(X,Y) get_gdat_string((X),(Y),272)
+#define get_gdat_bool_pos272(X,Y) get_gdat_bool((X),(Y),272)
+#define get_gdat_int_pos272(X,Y) get_gdat_int((X),(Y),272)
+#define get_gdat_llong_pos272(X,Y) get_gdat_llong((X),(Y),272)
+#define get_gdat_float_pos272(X,Y) get_gdat_float((X),(Y),272)
+#define get_gdat_uint_pos273(X,Y) get_gdat_uint((X),(Y),273)
+#define get_gdat_ullong_pos273(X,Y) get_gdat_ullong((X),(Y),273)
+#define get_gdat_ip_pos273(X,Y) get_gdat_ip((X),(Y),273)
+#define get_gdat_ipv6_pos273(X,Y) get_gdat_ipv6((X),(Y),273)
+#define get_gdat_string_pos273(X,Y) get_gdat_string((X),(Y),273)
+#define get_gdat_v_str_pos273(X,Y) get_gdat_string((X),(Y),273)
+#define get_gdat_bool_pos273(X,Y) get_gdat_bool((X),(Y),273)
+#define get_gdat_int_pos273(X,Y) get_gdat_int((X),(Y),273)
+#define get_gdat_llong_pos273(X,Y) get_gdat_llong((X),(Y),273)
+#define get_gdat_float_pos273(X,Y) get_gdat_float((X),(Y),273)
+#define get_gdat_uint_pos274(X,Y) get_gdat_uint((X),(Y),274)
+#define get_gdat_ullong_pos274(X,Y) get_gdat_ullong((X),(Y),274)
+#define get_gdat_ip_pos274(X,Y) get_gdat_ip((X),(Y),274)
+#define get_gdat_ipv6_pos274(X,Y) get_gdat_ipv6((X),(Y),274)
+#define get_gdat_string_pos274(X,Y) get_gdat_string((X),(Y),274)
+#define get_gdat_v_str_pos274(X,Y) get_gdat_string((X),(Y),274)
+#define get_gdat_bool_pos274(X,Y) get_gdat_bool((X),(Y),274)
+#define get_gdat_int_pos274(X,Y) get_gdat_int((X),(Y),274)
+#define get_gdat_llong_pos274(X,Y) get_gdat_llong((X),(Y),274)
+#define get_gdat_float_pos274(X,Y) get_gdat_float((X),(Y),274)
+#define get_gdat_uint_pos275(X,Y) get_gdat_uint((X),(Y),275)
+#define get_gdat_ullong_pos275(X,Y) get_gdat_ullong((X),(Y),275)
+#define get_gdat_ip_pos275(X,Y) get_gdat_ip((X),(Y),275)
+#define get_gdat_ipv6_pos275(X,Y) get_gdat_ipv6((X),(Y),275)
+#define get_gdat_string_pos275(X,Y) get_gdat_string((X),(Y),275)
+#define get_gdat_v_str_pos275(X,Y) get_gdat_string((X),(Y),275)
+#define get_gdat_bool_pos275(X,Y) get_gdat_bool((X),(Y),275)
+#define get_gdat_int_pos275(X,Y) get_gdat_int((X),(Y),275)
+#define get_gdat_llong_pos275(X,Y) get_gdat_llong((X),(Y),275)
+#define get_gdat_float_pos275(X,Y) get_gdat_float((X),(Y),275)
+#define get_gdat_uint_pos276(X,Y) get_gdat_uint((X),(Y),276)
+#define get_gdat_ullong_pos276(X,Y) get_gdat_ullong((X),(Y),276)
+#define get_gdat_ip_pos276(X,Y) get_gdat_ip((X),(Y),276)
+#define get_gdat_ipv6_pos276(X,Y) get_gdat_ipv6((X),(Y),276)
+#define get_gdat_string_pos276(X,Y) get_gdat_string((X),(Y),276)
+#define get_gdat_v_str_pos276(X,Y) get_gdat_string((X),(Y),276)
+#define get_gdat_bool_pos276(X,Y) get_gdat_bool((X),(Y),276)
+#define get_gdat_int_pos276(X,Y) get_gdat_int((X),(Y),276)
+#define get_gdat_llong_pos276(X,Y) get_gdat_llong((X),(Y),276)
+#define get_gdat_float_pos276(X,Y) get_gdat_float((X),(Y),276)
+#define get_gdat_uint_pos277(X,Y) get_gdat_uint((X),(Y),277)
+#define get_gdat_ullong_pos277(X,Y) get_gdat_ullong((X),(Y),277)
+#define get_gdat_ip_pos277(X,Y) get_gdat_ip((X),(Y),277)
+#define get_gdat_ipv6_pos277(X,Y) get_gdat_ipv6((X),(Y),277)
+#define get_gdat_string_pos277(X,Y) get_gdat_string((X),(Y),277)
+#define get_gdat_v_str_pos277(X,Y) get_gdat_string((X),(Y),277)
+#define get_gdat_bool_pos277(X,Y) get_gdat_bool((X),(Y),277)
+#define get_gdat_int_pos277(X,Y) get_gdat_int((X),(Y),277)
+#define get_gdat_llong_pos277(X,Y) get_gdat_llong((X),(Y),277)
+#define get_gdat_float_pos277(X,Y) get_gdat_float((X),(Y),277)
+#define get_gdat_uint_pos278(X,Y) get_gdat_uint((X),(Y),278)
+#define get_gdat_ullong_pos278(X,Y) get_gdat_ullong((X),(Y),278)
+#define get_gdat_ip_pos278(X,Y) get_gdat_ip((X),(Y),278)
+#define get_gdat_ipv6_pos278(X,Y) get_gdat_ipv6((X),(Y),278)
+#define get_gdat_string_pos278(X,Y) get_gdat_string((X),(Y),278)
+#define get_gdat_v_str_pos278(X,Y) get_gdat_string((X),(Y),278)
+#define get_gdat_bool_pos278(X,Y) get_gdat_bool((X),(Y),278)
+#define get_gdat_int_pos278(X,Y) get_gdat_int((X),(Y),278)
+#define get_gdat_llong_pos278(X,Y) get_gdat_llong((X),(Y),278)
+#define get_gdat_float_pos278(X,Y) get_gdat_float((X),(Y),278)
+#define get_gdat_uint_pos279(X,Y) get_gdat_uint((X),(Y),279)
+#define get_gdat_ullong_pos279(X,Y) get_gdat_ullong((X),(Y),279)
+#define get_gdat_ip_pos279(X,Y) get_gdat_ip((X),(Y),279)
+#define get_gdat_ipv6_pos279(X,Y) get_gdat_ipv6((X),(Y),279)
+#define get_gdat_string_pos279(X,Y) get_gdat_string((X),(Y),279)
+#define get_gdat_v_str_pos279(X,Y) get_gdat_string((X),(Y),279)
+#define get_gdat_bool_pos279(X,Y) get_gdat_bool((X),(Y),279)
+#define get_gdat_int_pos279(X,Y) get_gdat_int((X),(Y),279)
+#define get_gdat_llong_pos279(X,Y) get_gdat_llong((X),(Y),279)
+#define get_gdat_float_pos279(X,Y) get_gdat_float((X),(Y),279)
+#define get_gdat_uint_pos280(X,Y) get_gdat_uint((X),(Y),280)
+#define get_gdat_ullong_pos280(X,Y) get_gdat_ullong((X),(Y),280)
+#define get_gdat_ip_pos280(X,Y) get_gdat_ip((X),(Y),280)
+#define get_gdat_ipv6_pos280(X,Y) get_gdat_ipv6((X),(Y),280)
+#define get_gdat_string_pos280(X,Y) get_gdat_string((X),(Y),280)
+#define get_gdat_v_str_pos280(X,Y) get_gdat_string((X),(Y),280)
+#define get_gdat_bool_pos280(X,Y) get_gdat_bool((X),(Y),280)
+#define get_gdat_int_pos280(X,Y) get_gdat_int((X),(Y),280)
+#define get_gdat_llong_pos280(X,Y) get_gdat_llong((X),(Y),280)
+#define get_gdat_float_pos280(X,Y) get_gdat_float((X),(Y),280)
+#define get_gdat_uint_pos281(X,Y) get_gdat_uint((X),(Y),281)
+#define get_gdat_ullong_pos281(X,Y) get_gdat_ullong((X),(Y),281)
+#define get_gdat_ip_pos281(X,Y) get_gdat_ip((X),(Y),281)
+#define get_gdat_ipv6_pos281(X,Y) get_gdat_ipv6((X),(Y),281)
+#define get_gdat_string_pos281(X,Y) get_gdat_string((X),(Y),281)
+#define get_gdat_v_str_pos281(X,Y) get_gdat_string((X),(Y),281)
+#define get_gdat_bool_pos281(X,Y) get_gdat_bool((X),(Y),281)
+#define get_gdat_int_pos281(X,Y) get_gdat_int((X),(Y),281)
+#define get_gdat_llong_pos281(X,Y) get_gdat_llong((X),(Y),281)
+#define get_gdat_float_pos281(X,Y) get_gdat_float((X),(Y),281)
+#define get_gdat_uint_pos282(X,Y) get_gdat_uint((X),(Y),282)
+#define get_gdat_ullong_pos282(X,Y) get_gdat_ullong((X),(Y),282)
+#define get_gdat_ip_pos282(X,Y) get_gdat_ip((X),(Y),282)
+#define get_gdat_ipv6_pos282(X,Y) get_gdat_ipv6((X),(Y),282)
+#define get_gdat_string_pos282(X,Y) get_gdat_string((X),(Y),282)
+#define get_gdat_v_str_pos282(X,Y) get_gdat_string((X),(Y),282)
+#define get_gdat_bool_pos282(X,Y) get_gdat_bool((X),(Y),282)
+#define get_gdat_int_pos282(X,Y) get_gdat_int((X),(Y),282)
+#define get_gdat_llong_pos282(X,Y) get_gdat_llong((X),(Y),282)
+#define get_gdat_float_pos282(X,Y) get_gdat_float((X),(Y),282)
+#define get_gdat_uint_pos283(X,Y) get_gdat_uint((X),(Y),283)
+#define get_gdat_ullong_pos283(X,Y) get_gdat_ullong((X),(Y),283)
+#define get_gdat_ip_pos283(X,Y) get_gdat_ip((X),(Y),283)
+#define get_gdat_ipv6_pos283(X,Y) get_gdat_ipv6((X),(Y),283)
+#define get_gdat_string_pos283(X,Y) get_gdat_string((X),(Y),283)
+#define get_gdat_v_str_pos283(X,Y) get_gdat_string((X),(Y),283)
+#define get_gdat_bool_pos283(X,Y) get_gdat_bool((X),(Y),283)
+#define get_gdat_int_pos283(X,Y) get_gdat_int((X),(Y),283)
+#define get_gdat_llong_pos283(X,Y) get_gdat_llong((X),(Y),283)
+#define get_gdat_float_pos283(X,Y) get_gdat_float((X),(Y),283)
+#define get_gdat_uint_pos284(X,Y) get_gdat_uint((X),(Y),284)
+#define get_gdat_ullong_pos284(X,Y) get_gdat_ullong((X),(Y),284)
+#define get_gdat_ip_pos284(X,Y) get_gdat_ip((X),(Y),284)
+#define get_gdat_ipv6_pos284(X,Y) get_gdat_ipv6((X),(Y),284)
+#define get_gdat_string_pos284(X,Y) get_gdat_string((X),(Y),284)
+#define get_gdat_v_str_pos284(X,Y) get_gdat_string((X),(Y),284)
+#define get_gdat_bool_pos284(X,Y) get_gdat_bool((X),(Y),284)
+#define get_gdat_int_pos284(X,Y) get_gdat_int((X),(Y),284)
+#define get_gdat_llong_pos284(X,Y) get_gdat_llong((X),(Y),284)
+#define get_gdat_float_pos284(X,Y) get_gdat_float((X),(Y),284)
+#define get_gdat_uint_pos285(X,Y) get_gdat_uint((X),(Y),285)
+#define get_gdat_ullong_pos285(X,Y) get_gdat_ullong((X),(Y),285)
+#define get_gdat_ip_pos285(X,Y) get_gdat_ip((X),(Y),285)
+#define get_gdat_ipv6_pos285(X,Y) get_gdat_ipv6((X),(Y),285)
+#define get_gdat_string_pos285(X,Y) get_gdat_string((X),(Y),285)
+#define get_gdat_v_str_pos285(X,Y) get_gdat_string((X),(Y),285)
+#define get_gdat_bool_pos285(X,Y) get_gdat_bool((X),(Y),285)
+#define get_gdat_int_pos285(X,Y) get_gdat_int((X),(Y),285)
+#define get_gdat_llong_pos285(X,Y) get_gdat_llong((X),(Y),285)
+#define get_gdat_float_pos285(X,Y) get_gdat_float((X),(Y),285)
+#define get_gdat_uint_pos286(X,Y) get_gdat_uint((X),(Y),286)
+#define get_gdat_ullong_pos286(X,Y) get_gdat_ullong((X),(Y),286)
+#define get_gdat_ip_pos286(X,Y) get_gdat_ip((X),(Y),286)
+#define get_gdat_ipv6_pos286(X,Y) get_gdat_ipv6((X),(Y),286)
+#define get_gdat_string_pos286(X,Y) get_gdat_string((X),(Y),286)
+#define get_gdat_v_str_pos286(X,Y) get_gdat_string((X),(Y),286)
+#define get_gdat_bool_pos286(X,Y) get_gdat_bool((X),(Y),286)
+#define get_gdat_int_pos286(X,Y) get_gdat_int((X),(Y),286)
+#define get_gdat_llong_pos286(X,Y) get_gdat_llong((X),(Y),286)
+#define get_gdat_float_pos286(X,Y) get_gdat_float((X),(Y),286)
+#define get_gdat_uint_pos287(X,Y) get_gdat_uint((X),(Y),287)
+#define get_gdat_ullong_pos287(X,Y) get_gdat_ullong((X),(Y),287)
+#define get_gdat_ip_pos287(X,Y) get_gdat_ip((X),(Y),287)
+#define get_gdat_ipv6_pos287(X,Y) get_gdat_ipv6((X),(Y),287)
+#define get_gdat_string_pos287(X,Y) get_gdat_string((X),(Y),287)
+#define get_gdat_v_str_pos287(X,Y) get_gdat_string((X),(Y),287)
+#define get_gdat_bool_pos287(X,Y) get_gdat_bool((X),(Y),287)
+#define get_gdat_int_pos287(X,Y) get_gdat_int((X),(Y),287)
+#define get_gdat_llong_pos287(X,Y) get_gdat_llong((X),(Y),287)
+#define get_gdat_float_pos287(X,Y) get_gdat_float((X),(Y),287)
+#define get_gdat_uint_pos288(X,Y) get_gdat_uint((X),(Y),288)
+#define get_gdat_ullong_pos288(X,Y) get_gdat_ullong((X),(Y),288)
+#define get_gdat_ip_pos288(X,Y) get_gdat_ip((X),(Y),288)
+#define get_gdat_ipv6_pos288(X,Y) get_gdat_ipv6((X),(Y),288)
+#define get_gdat_string_pos288(X,Y) get_gdat_string((X),(Y),288)
+#define get_gdat_v_str_pos288(X,Y) get_gdat_string((X),(Y),288)
+#define get_gdat_bool_pos288(X,Y) get_gdat_bool((X),(Y),288)
+#define get_gdat_int_pos288(X,Y) get_gdat_int((X),(Y),288)
+#define get_gdat_llong_pos288(X,Y) get_gdat_llong((X),(Y),288)
+#define get_gdat_float_pos288(X,Y) get_gdat_float((X),(Y),288)
+#define get_gdat_uint_pos289(X,Y) get_gdat_uint((X),(Y),289)
+#define get_gdat_ullong_pos289(X,Y) get_gdat_ullong((X),(Y),289)
+#define get_gdat_ip_pos289(X,Y) get_gdat_ip((X),(Y),289)
+#define get_gdat_ipv6_pos289(X,Y) get_gdat_ipv6((X),(Y),289)
+#define get_gdat_string_pos289(X,Y) get_gdat_string((X),(Y),289)
+#define get_gdat_v_str_pos289(X,Y) get_gdat_string((X),(Y),289)
+#define get_gdat_bool_pos289(X,Y) get_gdat_bool((X),(Y),289)
+#define get_gdat_int_pos289(X,Y) get_gdat_int((X),(Y),289)
+#define get_gdat_llong_pos289(X,Y) get_gdat_llong((X),(Y),289)
+#define get_gdat_float_pos289(X,Y) get_gdat_float((X),(Y),289)
+#define get_gdat_uint_pos290(X,Y) get_gdat_uint((X),(Y),290)
+#define get_gdat_ullong_pos290(X,Y) get_gdat_ullong((X),(Y),290)
+#define get_gdat_ip_pos290(X,Y) get_gdat_ip((X),(Y),290)
+#define get_gdat_ipv6_pos290(X,Y) get_gdat_ipv6((X),(Y),290)
+#define get_gdat_string_pos290(X,Y) get_gdat_string((X),(Y),290)
+#define get_gdat_v_str_pos290(X,Y) get_gdat_string((X),(Y),290)
+#define get_gdat_bool_pos290(X,Y) get_gdat_bool((X),(Y),290)
+#define get_gdat_int_pos290(X,Y) get_gdat_int((X),(Y),290)
+#define get_gdat_llong_pos290(X,Y) get_gdat_llong((X),(Y),290)
+#define get_gdat_float_pos290(X,Y) get_gdat_float((X),(Y),290)
+#define get_gdat_uint_pos291(X,Y) get_gdat_uint((X),(Y),291)
+#define get_gdat_ullong_pos291(X,Y) get_gdat_ullong((X),(Y),291)
+#define get_gdat_ip_pos291(X,Y) get_gdat_ip((X),(Y),291)
+#define get_gdat_ipv6_pos291(X,Y) get_gdat_ipv6((X),(Y),291)
+#define get_gdat_string_pos291(X,Y) get_gdat_string((X),(Y),291)
+#define get_gdat_v_str_pos291(X,Y) get_gdat_string((X),(Y),291)
+#define get_gdat_bool_pos291(X,Y) get_gdat_bool((X),(Y),291)
+#define get_gdat_int_pos291(X,Y) get_gdat_int((X),(Y),291)
+#define get_gdat_llong_pos291(X,Y) get_gdat_llong((X),(Y),291)
+#define get_gdat_float_pos291(X,Y) get_gdat_float((X),(Y),291)
+#define get_gdat_uint_pos292(X,Y) get_gdat_uint((X),(Y),292)
+#define get_gdat_ullong_pos292(X,Y) get_gdat_ullong((X),(Y),292)
+#define get_gdat_ip_pos292(X,Y) get_gdat_ip((X),(Y),292)
+#define get_gdat_ipv6_pos292(X,Y) get_gdat_ipv6((X),(Y),292)
+#define get_gdat_string_pos292(X,Y) get_gdat_string((X),(Y),292)
+#define get_gdat_v_str_pos292(X,Y) get_gdat_string((X),(Y),292)
+#define get_gdat_bool_pos292(X,Y) get_gdat_bool((X),(Y),292)
+#define get_gdat_int_pos292(X,Y) get_gdat_int((X),(Y),292)
+#define get_gdat_llong_pos292(X,Y) get_gdat_llong((X),(Y),292)
+#define get_gdat_float_pos292(X,Y) get_gdat_float((X),(Y),292)
+#define get_gdat_uint_pos293(X,Y) get_gdat_uint((X),(Y),293)
+#define get_gdat_ullong_pos293(X,Y) get_gdat_ullong((X),(Y),293)
+#define get_gdat_ip_pos293(X,Y) get_gdat_ip((X),(Y),293)
+#define get_gdat_ipv6_pos293(X,Y) get_gdat_ipv6((X),(Y),293)
+#define get_gdat_string_pos293(X,Y) get_gdat_string((X),(Y),293)
+#define get_gdat_v_str_pos293(X,Y) get_gdat_string((X),(Y),293)
+#define get_gdat_bool_pos293(X,Y) get_gdat_bool((X),(Y),293)
+#define get_gdat_int_pos293(X,Y) get_gdat_int((X),(Y),293)
+#define get_gdat_llong_pos293(X,Y) get_gdat_llong((X),(Y),293)
+#define get_gdat_float_pos293(X,Y) get_gdat_float((X),(Y),293)
+#define get_gdat_uint_pos294(X,Y) get_gdat_uint((X),(Y),294)
+#define get_gdat_ullong_pos294(X,Y) get_gdat_ullong((X),(Y),294)
+#define get_gdat_ip_pos294(X,Y) get_gdat_ip((X),(Y),294)
+#define get_gdat_ipv6_pos294(X,Y) get_gdat_ipv6((X),(Y),294)
+#define get_gdat_string_pos294(X,Y) get_gdat_string((X),(Y),294)
+#define get_gdat_v_str_pos294(X,Y) get_gdat_string((X),(Y),294)
+#define get_gdat_bool_pos294(X,Y) get_gdat_bool((X),(Y),294)
+#define get_gdat_int_pos294(X,Y) get_gdat_int((X),(Y),294)
+#define get_gdat_llong_pos294(X,Y) get_gdat_llong((X),(Y),294)
+#define get_gdat_float_pos294(X,Y) get_gdat_float((X),(Y),294)
+#define get_gdat_uint_pos295(X,Y) get_gdat_uint((X),(Y),295)
+#define get_gdat_ullong_pos295(X,Y) get_gdat_ullong((X),(Y),295)
+#define get_gdat_ip_pos295(X,Y) get_gdat_ip((X),(Y),295)
+#define get_gdat_ipv6_pos295(X,Y) get_gdat_ipv6((X),(Y),295)
+#define get_gdat_string_pos295(X,Y) get_gdat_string((X),(Y),295)
+#define get_gdat_v_str_pos295(X,Y) get_gdat_string((X),(Y),295)
+#define get_gdat_bool_pos295(X,Y) get_gdat_bool((X),(Y),295)
+#define get_gdat_int_pos295(X,Y) get_gdat_int((X),(Y),295)
+#define get_gdat_llong_pos295(X,Y) get_gdat_llong((X),(Y),295)
+#define get_gdat_float_pos295(X,Y) get_gdat_float((X),(Y),295)
+#define get_gdat_uint_pos296(X,Y) get_gdat_uint((X),(Y),296)
+#define get_gdat_ullong_pos296(X,Y) get_gdat_ullong((X),(Y),296)
+#define get_gdat_ip_pos296(X,Y) get_gdat_ip((X),(Y),296)
+#define get_gdat_ipv6_pos296(X,Y) get_gdat_ipv6((X),(Y),296)
+#define get_gdat_string_pos296(X,Y) get_gdat_string((X),(Y),296)
+#define get_gdat_v_str_pos296(X,Y) get_gdat_string((X),(Y),296)
+#define get_gdat_bool_pos296(X,Y) get_gdat_bool((X),(Y),296)
+#define get_gdat_int_pos296(X,Y) get_gdat_int((X),(Y),296)
+#define get_gdat_llong_pos296(X,Y) get_gdat_llong((X),(Y),296)
+#define get_gdat_float_pos296(X,Y) get_gdat_float((X),(Y),296)
+#define get_gdat_uint_pos297(X,Y) get_gdat_uint((X),(Y),297)
+#define get_gdat_ullong_pos297(X,Y) get_gdat_ullong((X),(Y),297)
+#define get_gdat_ip_pos297(X,Y) get_gdat_ip((X),(Y),297)
+#define get_gdat_ipv6_pos297(X,Y) get_gdat_ipv6((X),(Y),297)
+#define get_gdat_string_pos297(X,Y) get_gdat_string((X),(Y),297)
+#define get_gdat_v_str_pos297(X,Y) get_gdat_string((X),(Y),297)
+#define get_gdat_bool_pos297(X,Y) get_gdat_bool((X),(Y),297)
+#define get_gdat_int_pos297(X,Y) get_gdat_int((X),(Y),297)
+#define get_gdat_llong_pos297(X,Y) get_gdat_llong((X),(Y),297)
+#define get_gdat_float_pos297(X,Y) get_gdat_float((X),(Y),297)
+#define get_gdat_uint_pos298(X,Y) get_gdat_uint((X),(Y),298)
+#define get_gdat_ullong_pos298(X,Y) get_gdat_ullong((X),(Y),298)
+#define get_gdat_ip_pos298(X,Y) get_gdat_ip((X),(Y),298)
+#define get_gdat_ipv6_pos298(X,Y) get_gdat_ipv6((X),(Y),298)
+#define get_gdat_string_pos298(X,Y) get_gdat_string((X),(Y),298)
+#define get_gdat_v_str_pos298(X,Y) get_gdat_string((X),(Y),298)
+#define get_gdat_bool_pos298(X,Y) get_gdat_bool((X),(Y),298)
+#define get_gdat_int_pos298(X,Y) get_gdat_int((X),(Y),298)
+#define get_gdat_llong_pos298(X,Y) get_gdat_llong((X),(Y),298)
+#define get_gdat_float_pos298(X,Y) get_gdat_float((X),(Y),298)
+#define get_gdat_uint_pos299(X,Y) get_gdat_uint((X),(Y),299)
+#define get_gdat_ullong_pos299(X,Y) get_gdat_ullong((X),(Y),299)
+#define get_gdat_ip_pos299(X,Y) get_gdat_ip((X),(Y),299)
+#define get_gdat_ipv6_pos299(X,Y) get_gdat_ipv6((X),(Y),299)
+#define get_gdat_string_pos299(X,Y) get_gdat_string((X),(Y),299)
+#define get_gdat_v_str_pos299(X,Y) get_gdat_string((X),(Y),299)
+#define get_gdat_bool_pos299(X,Y) get_gdat_bool((X),(Y),299)
+#define get_gdat_int_pos299(X,Y) get_gdat_int((X),(Y),299)
+#define get_gdat_llong_pos299(X,Y) get_gdat_llong((X),(Y),299)
+#define get_gdat_float_pos299(X,Y) get_gdat_float((X),(Y),299)
+#define get_gdat_uint_pos300(X,Y) get_gdat_uint((X),(Y),300)
+#define get_gdat_ullong_pos300(X,Y) get_gdat_ullong((X),(Y),300)
+#define get_gdat_ip_pos300(X,Y) get_gdat_ip((X),(Y),300)
+#define get_gdat_ipv6_pos300(X,Y) get_gdat_ipv6((X),(Y),300)
+#define get_gdat_string_pos300(X,Y) get_gdat_string((X),(Y),300)
+#define get_gdat_v_str_pos300(X,Y) get_gdat_string((X),(Y),300)
+#define get_gdat_bool_pos300(X,Y) get_gdat_bool((X),(Y),300)
+#define get_gdat_int_pos300(X,Y) get_gdat_int((X),(Y),300)
+#define get_gdat_llong_pos300(X,Y) get_gdat_llong((X),(Y),300)
+#define get_gdat_float_pos300(X,Y) get_gdat_float((X),(Y),300)
+#define get_gdat_uint_pos301(X,Y) get_gdat_uint((X),(Y),301)
+#define get_gdat_ullong_pos301(X,Y) get_gdat_ullong((X),(Y),301)
+#define get_gdat_ip_pos301(X,Y) get_gdat_ip((X),(Y),301)
+#define get_gdat_ipv6_pos301(X,Y) get_gdat_ipv6((X),(Y),301)
+#define get_gdat_string_pos301(X,Y) get_gdat_string((X),(Y),301)
+#define get_gdat_v_str_pos301(X,Y) get_gdat_string((X),(Y),301)
+#define get_gdat_bool_pos301(X,Y) get_gdat_bool((X),(Y),301)
+#define get_gdat_int_pos301(X,Y) get_gdat_int((X),(Y),301)
+#define get_gdat_llong_pos301(X,Y) get_gdat_llong((X),(Y),301)
+#define get_gdat_float_pos301(X,Y) get_gdat_float((X),(Y),301)
+#define get_gdat_uint_pos302(X,Y) get_gdat_uint((X),(Y),302)
+#define get_gdat_ullong_pos302(X,Y) get_gdat_ullong((X),(Y),302)
+#define get_gdat_ip_pos302(X,Y) get_gdat_ip((X),(Y),302)
+#define get_gdat_ipv6_pos302(X,Y) get_gdat_ipv6((X),(Y),302)
+#define get_gdat_string_pos302(X,Y) get_gdat_string((X),(Y),302)
+#define get_gdat_v_str_pos302(X,Y) get_gdat_string((X),(Y),302)
+#define get_gdat_bool_pos302(X,Y) get_gdat_bool((X),(Y),302)
+#define get_gdat_int_pos302(X,Y) get_gdat_int((X),(Y),302)
+#define get_gdat_llong_pos302(X,Y) get_gdat_llong((X),(Y),302)
+#define get_gdat_float_pos302(X,Y) get_gdat_float((X),(Y),302)
+#define get_gdat_uint_pos303(X,Y) get_gdat_uint((X),(Y),303)
+#define get_gdat_ullong_pos303(X,Y) get_gdat_ullong((X),(Y),303)
+#define get_gdat_ip_pos303(X,Y) get_gdat_ip((X),(Y),303)
+#define get_gdat_ipv6_pos303(X,Y) get_gdat_ipv6((X),(Y),303)
+#define get_gdat_string_pos303(X,Y) get_gdat_string((X),(Y),303)
+#define get_gdat_v_str_pos303(X,Y) get_gdat_string((X),(Y),303)
+#define get_gdat_bool_pos303(X,Y) get_gdat_bool((X),(Y),303)
+#define get_gdat_int_pos303(X,Y) get_gdat_int((X),(Y),303)
+#define get_gdat_llong_pos303(X,Y) get_gdat_llong((X),(Y),303)
+#define get_gdat_float_pos303(X,Y) get_gdat_float((X),(Y),303)
+#define get_gdat_uint_pos304(X,Y) get_gdat_uint((X),(Y),304)
+#define get_gdat_ullong_pos304(X,Y) get_gdat_ullong((X),(Y),304)
+#define get_gdat_ip_pos304(X,Y) get_gdat_ip((X),(Y),304)
+#define get_gdat_ipv6_pos304(X,Y) get_gdat_ipv6((X),(Y),304)
+#define get_gdat_string_pos304(X,Y) get_gdat_string((X),(Y),304)
+#define get_gdat_v_str_pos304(X,Y) get_gdat_string((X),(Y),304)
+#define get_gdat_bool_pos304(X,Y) get_gdat_bool((X),(Y),304)
+#define get_gdat_int_pos304(X,Y) get_gdat_int((X),(Y),304)
+#define get_gdat_llong_pos304(X,Y) get_gdat_llong((X),(Y),304)
+#define get_gdat_float_pos304(X,Y) get_gdat_float((X),(Y),304)
+#define get_gdat_uint_pos305(X,Y) get_gdat_uint((X),(Y),305)
+#define get_gdat_ullong_pos305(X,Y) get_gdat_ullong((X),(Y),305)
+#define get_gdat_ip_pos305(X,Y) get_gdat_ip((X),(Y),305)
+#define get_gdat_ipv6_pos305(X,Y) get_gdat_ipv6((X),(Y),305)
+#define get_gdat_string_pos305(X,Y) get_gdat_string((X),(Y),305)
+#define get_gdat_v_str_pos305(X,Y) get_gdat_string((X),(Y),305)
+#define get_gdat_bool_pos305(X,Y) get_gdat_bool((X),(Y),305)
+#define get_gdat_int_pos305(X,Y) get_gdat_int((X),(Y),305)
+#define get_gdat_llong_pos305(X,Y) get_gdat_llong((X),(Y),305)
+#define get_gdat_float_pos305(X,Y) get_gdat_float((X),(Y),305)
+#define get_gdat_uint_pos306(X,Y) get_gdat_uint((X),(Y),306)
+#define get_gdat_ullong_pos306(X,Y) get_gdat_ullong((X),(Y),306)
+#define get_gdat_ip_pos306(X,Y) get_gdat_ip((X),(Y),306)
+#define get_gdat_ipv6_pos306(X,Y) get_gdat_ipv6((X),(Y),306)
+#define get_gdat_string_pos306(X,Y) get_gdat_string((X),(Y),306)
+#define get_gdat_v_str_pos306(X,Y) get_gdat_string((X),(Y),306)
+#define get_gdat_bool_pos306(X,Y) get_gdat_bool((X),(Y),306)
+#define get_gdat_int_pos306(X,Y) get_gdat_int((X),(Y),306)
+#define get_gdat_llong_pos306(X,Y) get_gdat_llong((X),(Y),306)
+#define get_gdat_float_pos306(X,Y) get_gdat_float((X),(Y),306)
+#define get_gdat_uint_pos307(X,Y) get_gdat_uint((X),(Y),307)
+#define get_gdat_ullong_pos307(X,Y) get_gdat_ullong((X),(Y),307)
+#define get_gdat_ip_pos307(X,Y) get_gdat_ip((X),(Y),307)
+#define get_gdat_ipv6_pos307(X,Y) get_gdat_ipv6((X),(Y),307)
+#define get_gdat_string_pos307(X,Y) get_gdat_string((X),(Y),307)
+#define get_gdat_v_str_pos307(X,Y) get_gdat_string((X),(Y),307)
+#define get_gdat_bool_pos307(X,Y) get_gdat_bool((X),(Y),307)
+#define get_gdat_int_pos307(X,Y) get_gdat_int((X),(Y),307)
+#define get_gdat_llong_pos307(X,Y) get_gdat_llong((X),(Y),307)
+#define get_gdat_float_pos307(X,Y) get_gdat_float((X),(Y),307)
+#define get_gdat_uint_pos308(X,Y) get_gdat_uint((X),(Y),308)
+#define get_gdat_ullong_pos308(X,Y) get_gdat_ullong((X),(Y),308)
+#define get_gdat_ip_pos308(X,Y) get_gdat_ip((X),(Y),308)
+#define get_gdat_ipv6_pos308(X,Y) get_gdat_ipv6((X),(Y),308)
+#define get_gdat_string_pos308(X,Y) get_gdat_string((X),(Y),308)
+#define get_gdat_v_str_pos308(X,Y) get_gdat_string((X),(Y),308)
+#define get_gdat_bool_pos308(X,Y) get_gdat_bool((X),(Y),308)
+#define get_gdat_int_pos308(X,Y) get_gdat_int((X),(Y),308)
+#define get_gdat_llong_pos308(X,Y) get_gdat_llong((X),(Y),308)
+#define get_gdat_float_pos308(X,Y) get_gdat_float((X),(Y),308)
+#define get_gdat_uint_pos309(X,Y) get_gdat_uint((X),(Y),309)
+#define get_gdat_ullong_pos309(X,Y) get_gdat_ullong((X),(Y),309)
+#define get_gdat_ip_pos309(X,Y) get_gdat_ip((X),(Y),309)
+#define get_gdat_ipv6_pos309(X,Y) get_gdat_ipv6((X),(Y),309)
+#define get_gdat_string_pos309(X,Y) get_gdat_string((X),(Y),309)
+#define get_gdat_v_str_pos309(X,Y) get_gdat_string((X),(Y),309)
+#define get_gdat_bool_pos309(X,Y) get_gdat_bool((X),(Y),309)
+#define get_gdat_int_pos309(X,Y) get_gdat_int((X),(Y),309)
+#define get_gdat_llong_pos309(X,Y) get_gdat_llong((X),(Y),309)
+#define get_gdat_float_pos309(X,Y) get_gdat_float((X),(Y),309)
+#define get_gdat_uint_pos310(X,Y) get_gdat_uint((X),(Y),310)
+#define get_gdat_ullong_pos310(X,Y) get_gdat_ullong((X),(Y),310)
+#define get_gdat_ip_pos310(X,Y) get_gdat_ip((X),(Y),310)
+#define get_gdat_ipv6_pos310(X,Y) get_gdat_ipv6((X),(Y),310)
+#define get_gdat_string_pos310(X,Y) get_gdat_string((X),(Y),310)
+#define get_gdat_v_str_pos310(X,Y) get_gdat_string((X),(Y),310)
+#define get_gdat_bool_pos310(X,Y) get_gdat_bool((X),(Y),310)
+#define get_gdat_int_pos310(X,Y) get_gdat_int((X),(Y),310)
+#define get_gdat_llong_pos310(X,Y) get_gdat_llong((X),(Y),310)
+#define get_gdat_float_pos310(X,Y) get_gdat_float((X),(Y),310)
+#define get_gdat_uint_pos311(X,Y) get_gdat_uint((X),(Y),311)
+#define get_gdat_ullong_pos311(X,Y) get_gdat_ullong((X),(Y),311)
+#define get_gdat_ip_pos311(X,Y) get_gdat_ip((X),(Y),311)
+#define get_gdat_ipv6_pos311(X,Y) get_gdat_ipv6((X),(Y),311)
+#define get_gdat_string_pos311(X,Y) get_gdat_string((X),(Y),311)
+#define get_gdat_v_str_pos311(X,Y) get_gdat_string((X),(Y),311)
+#define get_gdat_bool_pos311(X,Y) get_gdat_bool((X),(Y),311)
+#define get_gdat_int_pos311(X,Y) get_gdat_int((X),(Y),311)
+#define get_gdat_llong_pos311(X,Y) get_gdat_llong((X),(Y),311)
+#define get_gdat_float_pos311(X,Y) get_gdat_float((X),(Y),311)
+#define get_gdat_uint_pos312(X,Y) get_gdat_uint((X),(Y),312)
+#define get_gdat_ullong_pos312(X,Y) get_gdat_ullong((X),(Y),312)
+#define get_gdat_ip_pos312(X,Y) get_gdat_ip((X),(Y),312)
+#define get_gdat_ipv6_pos312(X,Y) get_gdat_ipv6((X),(Y),312)
+#define get_gdat_string_pos312(X,Y) get_gdat_string((X),(Y),312)
+#define get_gdat_v_str_pos312(X,Y) get_gdat_string((X),(Y),312)
+#define get_gdat_bool_pos312(X,Y) get_gdat_bool((X),(Y),312)
+#define get_gdat_int_pos312(X,Y) get_gdat_int((X),(Y),312)
+#define get_gdat_llong_pos312(X,Y) get_gdat_llong((X),(Y),312)
+#define get_gdat_float_pos312(X,Y) get_gdat_float((X),(Y),312)
+#define get_gdat_uint_pos313(X,Y) get_gdat_uint((X),(Y),313)
+#define get_gdat_ullong_pos313(X,Y) get_gdat_ullong((X),(Y),313)
+#define get_gdat_ip_pos313(X,Y) get_gdat_ip((X),(Y),313)
+#define get_gdat_ipv6_pos313(X,Y) get_gdat_ipv6((X),(Y),313)
+#define get_gdat_string_pos313(X,Y) get_gdat_string((X),(Y),313)
+#define get_gdat_v_str_pos313(X,Y) get_gdat_string((X),(Y),313)
+#define get_gdat_bool_pos313(X,Y) get_gdat_bool((X),(Y),313)
+#define get_gdat_int_pos313(X,Y) get_gdat_int((X),(Y),313)
+#define get_gdat_llong_pos313(X,Y) get_gdat_llong((X),(Y),313)
+#define get_gdat_float_pos313(X,Y) get_gdat_float((X),(Y),313)
+#define get_gdat_uint_pos314(X,Y) get_gdat_uint((X),(Y),314)
+#define get_gdat_ullong_pos314(X,Y) get_gdat_ullong((X),(Y),314)
+#define get_gdat_ip_pos314(X,Y) get_gdat_ip((X),(Y),314)
+#define get_gdat_ipv6_pos314(X,Y) get_gdat_ipv6((X),(Y),314)
+#define get_gdat_string_pos314(X,Y) get_gdat_string((X),(Y),314)
+#define get_gdat_v_str_pos314(X,Y) get_gdat_string((X),(Y),314)
+#define get_gdat_bool_pos314(X,Y) get_gdat_bool((X),(Y),314)
+#define get_gdat_int_pos314(X,Y) get_gdat_int((X),(Y),314)
+#define get_gdat_llong_pos314(X,Y) get_gdat_llong((X),(Y),314)
+#define get_gdat_float_pos314(X,Y) get_gdat_float((X),(Y),314)
+#define get_gdat_uint_pos315(X,Y) get_gdat_uint((X),(Y),315)
+#define get_gdat_ullong_pos315(X,Y) get_gdat_ullong((X),(Y),315)
+#define get_gdat_ip_pos315(X,Y) get_gdat_ip((X),(Y),315)
+#define get_gdat_ipv6_pos315(X,Y) get_gdat_ipv6((X),(Y),315)
+#define get_gdat_string_pos315(X,Y) get_gdat_string((X),(Y),315)
+#define get_gdat_v_str_pos315(X,Y) get_gdat_string((X),(Y),315)
+#define get_gdat_bool_pos315(X,Y) get_gdat_bool((X),(Y),315)
+#define get_gdat_int_pos315(X,Y) get_gdat_int((X),(Y),315)
+#define get_gdat_llong_pos315(X,Y) get_gdat_llong((X),(Y),315)
+#define get_gdat_float_pos315(X,Y) get_gdat_float((X),(Y),315)
+#define get_gdat_uint_pos316(X,Y) get_gdat_uint((X),(Y),316)
+#define get_gdat_ullong_pos316(X,Y) get_gdat_ullong((X),(Y),316)
+#define get_gdat_ip_pos316(X,Y) get_gdat_ip((X),(Y),316)
+#define get_gdat_ipv6_pos316(X,Y) get_gdat_ipv6((X),(Y),316)
+#define get_gdat_string_pos316(X,Y) get_gdat_string((X),(Y),316)
+#define get_gdat_v_str_pos316(X,Y) get_gdat_string((X),(Y),316)
+#define get_gdat_bool_pos316(X,Y) get_gdat_bool((X),(Y),316)
+#define get_gdat_int_pos316(X,Y) get_gdat_int((X),(Y),316)
+#define get_gdat_llong_pos316(X,Y) get_gdat_llong((X),(Y),316)
+#define get_gdat_float_pos316(X,Y) get_gdat_float((X),(Y),316)
+#define get_gdat_uint_pos317(X,Y) get_gdat_uint((X),(Y),317)
+#define get_gdat_ullong_pos317(X,Y) get_gdat_ullong((X),(Y),317)
+#define get_gdat_ip_pos317(X,Y) get_gdat_ip((X),(Y),317)
+#define get_gdat_ipv6_pos317(X,Y) get_gdat_ipv6((X),(Y),317)
+#define get_gdat_string_pos317(X,Y) get_gdat_string((X),(Y),317)
+#define get_gdat_v_str_pos317(X,Y) get_gdat_string((X),(Y),317)
+#define get_gdat_bool_pos317(X,Y) get_gdat_bool((X),(Y),317)
+#define get_gdat_int_pos317(X,Y) get_gdat_int((X),(Y),317)
+#define get_gdat_llong_pos317(X,Y) get_gdat_llong((X),(Y),317)
+#define get_gdat_float_pos317(X,Y) get_gdat_float((X),(Y),317)
+#define get_gdat_uint_pos318(X,Y) get_gdat_uint((X),(Y),318)
+#define get_gdat_ullong_pos318(X,Y) get_gdat_ullong((X),(Y),318)
+#define get_gdat_ip_pos318(X,Y) get_gdat_ip((X),(Y),318)
+#define get_gdat_ipv6_pos318(X,Y) get_gdat_ipv6((X),(Y),318)
+#define get_gdat_string_pos318(X,Y) get_gdat_string((X),(Y),318)
+#define get_gdat_v_str_pos318(X,Y) get_gdat_string((X),(Y),318)
+#define get_gdat_bool_pos318(X,Y) get_gdat_bool((X),(Y),318)
+#define get_gdat_int_pos318(X,Y) get_gdat_int((X),(Y),318)
+#define get_gdat_llong_pos318(X,Y) get_gdat_llong((X),(Y),318)
+#define get_gdat_float_pos318(X,Y) get_gdat_float((X),(Y),318)
+#define get_gdat_uint_pos319(X,Y) get_gdat_uint((X),(Y),319)
+#define get_gdat_ullong_pos319(X,Y) get_gdat_ullong((X),(Y),319)
+#define get_gdat_ip_pos319(X,Y) get_gdat_ip((X),(Y),319)
+#define get_gdat_ipv6_pos319(X,Y) get_gdat_ipv6((X),(Y),319)
+#define get_gdat_string_pos319(X,Y) get_gdat_string((X),(Y),319)
+#define get_gdat_v_str_pos319(X,Y) get_gdat_string((X),(Y),319)
+#define get_gdat_bool_pos319(X,Y) get_gdat_bool((X),(Y),319)
+#define get_gdat_int_pos319(X,Y) get_gdat_int((X),(Y),319)
+#define get_gdat_llong_pos319(X,Y) get_gdat_llong((X),(Y),319)
+#define get_gdat_float_pos319(X,Y) get_gdat_float((X),(Y),319)
+#define get_gdat_uint_pos320(X,Y) get_gdat_uint((X),(Y),320)
+#define get_gdat_ullong_pos320(X,Y) get_gdat_ullong((X),(Y),320)
+#define get_gdat_ip_pos320(X,Y) get_gdat_ip((X),(Y),320)
+#define get_gdat_ipv6_pos320(X,Y) get_gdat_ipv6((X),(Y),320)
+#define get_gdat_string_pos320(X,Y) get_gdat_string((X),(Y),320)
+#define get_gdat_v_str_pos320(X,Y) get_gdat_string((X),(Y),320)
+#define get_gdat_bool_pos320(X,Y) get_gdat_bool((X),(Y),320)
+#define get_gdat_int_pos320(X,Y) get_gdat_int((X),(Y),320)
+#define get_gdat_llong_pos320(X,Y) get_gdat_llong((X),(Y),320)
+#define get_gdat_float_pos320(X,Y) get_gdat_float((X),(Y),320)
+#define get_gdat_uint_pos321(X,Y) get_gdat_uint((X),(Y),321)
+#define get_gdat_ullong_pos321(X,Y) get_gdat_ullong((X),(Y),321)
+#define get_gdat_ip_pos321(X,Y) get_gdat_ip((X),(Y),321)
+#define get_gdat_ipv6_pos321(X,Y) get_gdat_ipv6((X),(Y),321)
+#define get_gdat_string_pos321(X,Y) get_gdat_string((X),(Y),321)
+#define get_gdat_v_str_pos321(X,Y) get_gdat_string((X),(Y),321)
+#define get_gdat_bool_pos321(X,Y) get_gdat_bool((X),(Y),321)
+#define get_gdat_int_pos321(X,Y) get_gdat_int((X),(Y),321)
+#define get_gdat_llong_pos321(X,Y) get_gdat_llong((X),(Y),321)
+#define get_gdat_float_pos321(X,Y) get_gdat_float((X),(Y),321)
+#define get_gdat_uint_pos322(X,Y) get_gdat_uint((X),(Y),322)
+#define get_gdat_ullong_pos322(X,Y) get_gdat_ullong((X),(Y),322)
+#define get_gdat_ip_pos322(X,Y) get_gdat_ip((X),(Y),322)
+#define get_gdat_ipv6_pos322(X,Y) get_gdat_ipv6((X),(Y),322)
+#define get_gdat_string_pos322(X,Y) get_gdat_string((X),(Y),322)
+#define get_gdat_v_str_pos322(X,Y) get_gdat_string((X),(Y),322)
+#define get_gdat_bool_pos322(X,Y) get_gdat_bool((X),(Y),322)
+#define get_gdat_int_pos322(X,Y) get_gdat_int((X),(Y),322)
+#define get_gdat_llong_pos322(X,Y) get_gdat_llong((X),(Y),322)
+#define get_gdat_float_pos322(X,Y) get_gdat_float((X),(Y),322)
+#define get_gdat_uint_pos323(X,Y) get_gdat_uint((X),(Y),323)
+#define get_gdat_ullong_pos323(X,Y) get_gdat_ullong((X),(Y),323)
+#define get_gdat_ip_pos323(X,Y) get_gdat_ip((X),(Y),323)
+#define get_gdat_ipv6_pos323(X,Y) get_gdat_ipv6((X),(Y),323)
+#define get_gdat_string_pos323(X,Y) get_gdat_string((X),(Y),323)
+#define get_gdat_v_str_pos323(X,Y) get_gdat_string((X),(Y),323)
+#define get_gdat_bool_pos323(X,Y) get_gdat_bool((X),(Y),323)
+#define get_gdat_int_pos323(X,Y) get_gdat_int((X),(Y),323)
+#define get_gdat_llong_pos323(X,Y) get_gdat_llong((X),(Y),323)
+#define get_gdat_float_pos323(X,Y) get_gdat_float((X),(Y),323)
+#define get_gdat_uint_pos324(X,Y) get_gdat_uint((X),(Y),324)
+#define get_gdat_ullong_pos324(X,Y) get_gdat_ullong((X),(Y),324)
+#define get_gdat_ip_pos324(X,Y) get_gdat_ip((X),(Y),324)
+#define get_gdat_ipv6_pos324(X,Y) get_gdat_ipv6((X),(Y),324)
+#define get_gdat_string_pos324(X,Y) get_gdat_string((X),(Y),324)
+#define get_gdat_v_str_pos324(X,Y) get_gdat_string((X),(Y),324)
+#define get_gdat_bool_pos324(X,Y) get_gdat_bool((X),(Y),324)
+#define get_gdat_int_pos324(X,Y) get_gdat_int((X),(Y),324)
+#define get_gdat_llong_pos324(X,Y) get_gdat_llong((X),(Y),324)
+#define get_gdat_float_pos324(X,Y) get_gdat_float((X),(Y),324)
+#define get_gdat_uint_pos325(X,Y) get_gdat_uint((X),(Y),325)
+#define get_gdat_ullong_pos325(X,Y) get_gdat_ullong((X),(Y),325)
+#define get_gdat_ip_pos325(X,Y) get_gdat_ip((X),(Y),325)
+#define get_gdat_ipv6_pos325(X,Y) get_gdat_ipv6((X),(Y),325)
+#define get_gdat_string_pos325(X,Y) get_gdat_string((X),(Y),325)
+#define get_gdat_v_str_pos325(X,Y) get_gdat_string((X),(Y),325)
+#define get_gdat_bool_pos325(X,Y) get_gdat_bool((X),(Y),325)
+#define get_gdat_int_pos325(X,Y) get_gdat_int((X),(Y),325)
+#define get_gdat_llong_pos325(X,Y) get_gdat_llong((X),(Y),325)
+#define get_gdat_float_pos325(X,Y) get_gdat_float((X),(Y),325)
+#define get_gdat_uint_pos326(X,Y) get_gdat_uint((X),(Y),326)
+#define get_gdat_ullong_pos326(X,Y) get_gdat_ullong((X),(Y),326)
+#define get_gdat_ip_pos326(X,Y) get_gdat_ip((X),(Y),326)
+#define get_gdat_ipv6_pos326(X,Y) get_gdat_ipv6((X),(Y),326)
+#define get_gdat_string_pos326(X,Y) get_gdat_string((X),(Y),326)
+#define get_gdat_v_str_pos326(X,Y) get_gdat_string((X),(Y),326)
+#define get_gdat_bool_pos326(X,Y) get_gdat_bool((X),(Y),326)
+#define get_gdat_int_pos326(X,Y) get_gdat_int((X),(Y),326)
+#define get_gdat_llong_pos326(X,Y) get_gdat_llong((X),(Y),326)
+#define get_gdat_float_pos326(X,Y) get_gdat_float((X),(Y),326)
+#define get_gdat_uint_pos327(X,Y) get_gdat_uint((X),(Y),327)
+#define get_gdat_ullong_pos327(X,Y) get_gdat_ullong((X),(Y),327)
+#define get_gdat_ip_pos327(X,Y) get_gdat_ip((X),(Y),327)
+#define get_gdat_ipv6_pos327(X,Y) get_gdat_ipv6((X),(Y),327)
+#define get_gdat_string_pos327(X,Y) get_gdat_string((X),(Y),327)
+#define get_gdat_v_str_pos327(X,Y) get_gdat_string((X),(Y),327)
+#define get_gdat_bool_pos327(X,Y) get_gdat_bool((X),(Y),327)
+#define get_gdat_int_pos327(X,Y) get_gdat_int((X),(Y),327)
+#define get_gdat_llong_pos327(X,Y) get_gdat_llong((X),(Y),327)
+#define get_gdat_float_pos327(X,Y) get_gdat_float((X),(Y),327)
+#define get_gdat_uint_pos328(X,Y) get_gdat_uint((X),(Y),328)
+#define get_gdat_ullong_pos328(X,Y) get_gdat_ullong((X),(Y),328)
+#define get_gdat_ip_pos328(X,Y) get_gdat_ip((X),(Y),328)
+#define get_gdat_ipv6_pos328(X,Y) get_gdat_ipv6((X),(Y),328)
+#define get_gdat_string_pos328(X,Y) get_gdat_string((X),(Y),328)
+#define get_gdat_v_str_pos328(X,Y) get_gdat_string((X),(Y),328)
+#define get_gdat_bool_pos328(X,Y) get_gdat_bool((X),(Y),328)
+#define get_gdat_int_pos328(X,Y) get_gdat_int((X),(Y),328)
+#define get_gdat_llong_pos328(X,Y) get_gdat_llong((X),(Y),328)
+#define get_gdat_float_pos328(X,Y) get_gdat_float((X),(Y),328)
+#define get_gdat_uint_pos329(X,Y) get_gdat_uint((X),(Y),329)
+#define get_gdat_ullong_pos329(X,Y) get_gdat_ullong((X),(Y),329)
+#define get_gdat_ip_pos329(X,Y) get_gdat_ip((X),(Y),329)
+#define get_gdat_ipv6_pos329(X,Y) get_gdat_ipv6((X),(Y),329)
+#define get_gdat_string_pos329(X,Y) get_gdat_string((X),(Y),329)
+#define get_gdat_v_str_pos329(X,Y) get_gdat_string((X),(Y),329)
+#define get_gdat_bool_pos329(X,Y) get_gdat_bool((X),(Y),329)
+#define get_gdat_int_pos329(X,Y) get_gdat_int((X),(Y),329)
+#define get_gdat_llong_pos329(X,Y) get_gdat_llong((X),(Y),329)
+#define get_gdat_float_pos329(X,Y) get_gdat_float((X),(Y),329)
+#define get_gdat_uint_pos330(X,Y) get_gdat_uint((X),(Y),330)
+#define get_gdat_ullong_pos330(X,Y) get_gdat_ullong((X),(Y),330)
+#define get_gdat_ip_pos330(X,Y) get_gdat_ip((X),(Y),330)
+#define get_gdat_ipv6_pos330(X,Y) get_gdat_ipv6((X),(Y),330)
+#define get_gdat_string_pos330(X,Y) get_gdat_string((X),(Y),330)
+#define get_gdat_v_str_pos330(X,Y) get_gdat_string((X),(Y),330)
+#define get_gdat_bool_pos330(X,Y) get_gdat_bool((X),(Y),330)
+#define get_gdat_int_pos330(X,Y) get_gdat_int((X),(Y),330)
+#define get_gdat_llong_pos330(X,Y) get_gdat_llong((X),(Y),330)
+#define get_gdat_float_pos330(X,Y) get_gdat_float((X),(Y),330)
+#define get_gdat_uint_pos331(X,Y) get_gdat_uint((X),(Y),331)
+#define get_gdat_ullong_pos331(X,Y) get_gdat_ullong((X),(Y),331)
+#define get_gdat_ip_pos331(X,Y) get_gdat_ip((X),(Y),331)
+#define get_gdat_ipv6_pos331(X,Y) get_gdat_ipv6((X),(Y),331)
+#define get_gdat_string_pos331(X,Y) get_gdat_string((X),(Y),331)
+#define get_gdat_v_str_pos331(X,Y) get_gdat_string((X),(Y),331)
+#define get_gdat_bool_pos331(X,Y) get_gdat_bool((X),(Y),331)
+#define get_gdat_int_pos331(X,Y) get_gdat_int((X),(Y),331)
+#define get_gdat_llong_pos331(X,Y) get_gdat_llong((X),(Y),331)
+#define get_gdat_float_pos331(X,Y) get_gdat_float((X),(Y),331)
+#define get_gdat_uint_pos332(X,Y) get_gdat_uint((X),(Y),332)
+#define get_gdat_ullong_pos332(X,Y) get_gdat_ullong((X),(Y),332)
+#define get_gdat_ip_pos332(X,Y) get_gdat_ip((X),(Y),332)
+#define get_gdat_ipv6_pos332(X,Y) get_gdat_ipv6((X),(Y),332)
+#define get_gdat_string_pos332(X,Y) get_gdat_string((X),(Y),332)
+#define get_gdat_v_str_pos332(X,Y) get_gdat_string((X),(Y),332)
+#define get_gdat_bool_pos332(X,Y) get_gdat_bool((X),(Y),332)
+#define get_gdat_int_pos332(X,Y) get_gdat_int((X),(Y),332)
+#define get_gdat_llong_pos332(X,Y) get_gdat_llong((X),(Y),332)
+#define get_gdat_float_pos332(X,Y) get_gdat_float((X),(Y),332)
+#define get_gdat_uint_pos333(X,Y) get_gdat_uint((X),(Y),333)
+#define get_gdat_ullong_pos333(X,Y) get_gdat_ullong((X),(Y),333)
+#define get_gdat_ip_pos333(X,Y) get_gdat_ip((X),(Y),333)
+#define get_gdat_ipv6_pos333(X,Y) get_gdat_ipv6((X),(Y),333)
+#define get_gdat_string_pos333(X,Y) get_gdat_string((X),(Y),333)
+#define get_gdat_v_str_pos333(X,Y) get_gdat_string((X),(Y),333)
+#define get_gdat_bool_pos333(X,Y) get_gdat_bool((X),(Y),333)
+#define get_gdat_int_pos333(X,Y) get_gdat_int((X),(Y),333)
+#define get_gdat_llong_pos333(X,Y) get_gdat_llong((X),(Y),333)
+#define get_gdat_float_pos333(X,Y) get_gdat_float((X),(Y),333)
+#define get_gdat_uint_pos334(X,Y) get_gdat_uint((X),(Y),334)
+#define get_gdat_ullong_pos334(X,Y) get_gdat_ullong((X),(Y),334)
+#define get_gdat_ip_pos334(X,Y) get_gdat_ip((X),(Y),334)
+#define get_gdat_ipv6_pos334(X,Y) get_gdat_ipv6((X),(Y),334)
+#define get_gdat_string_pos334(X,Y) get_gdat_string((X),(Y),334)
+#define get_gdat_v_str_pos334(X,Y) get_gdat_string((X),(Y),334)
+#define get_gdat_bool_pos334(X,Y) get_gdat_bool((X),(Y),334)
+#define get_gdat_int_pos334(X,Y) get_gdat_int((X),(Y),334)
+#define get_gdat_llong_pos334(X,Y) get_gdat_llong((X),(Y),334)
+#define get_gdat_float_pos334(X,Y) get_gdat_float((X),(Y),334)
+#define get_gdat_uint_pos335(X,Y) get_gdat_uint((X),(Y),335)
+#define get_gdat_ullong_pos335(X,Y) get_gdat_ullong((X),(Y),335)
+#define get_gdat_ip_pos335(X,Y) get_gdat_ip((X),(Y),335)
+#define get_gdat_ipv6_pos335(X,Y) get_gdat_ipv6((X),(Y),335)
+#define get_gdat_string_pos335(X,Y) get_gdat_string((X),(Y),335)
+#define get_gdat_v_str_pos335(X,Y) get_gdat_string((X),(Y),335)
+#define get_gdat_bool_pos335(X,Y) get_gdat_bool((X),(Y),335)
+#define get_gdat_int_pos335(X,Y) get_gdat_int((X),(Y),335)
+#define get_gdat_llong_pos335(X,Y) get_gdat_llong((X),(Y),335)
+#define get_gdat_float_pos335(X,Y) get_gdat_float((X),(Y),335)
+#define get_gdat_uint_pos336(X,Y) get_gdat_uint((X),(Y),336)
+#define get_gdat_ullong_pos336(X,Y) get_gdat_ullong((X),(Y),336)
+#define get_gdat_ip_pos336(X,Y) get_gdat_ip((X),(Y),336)
+#define get_gdat_ipv6_pos336(X,Y) get_gdat_ipv6((X),(Y),336)
+#define get_gdat_string_pos336(X,Y) get_gdat_string((X),(Y),336)
+#define get_gdat_v_str_pos336(X,Y) get_gdat_string((X),(Y),336)
+#define get_gdat_bool_pos336(X,Y) get_gdat_bool((X),(Y),336)
+#define get_gdat_int_pos336(X,Y) get_gdat_int((X),(Y),336)
+#define get_gdat_llong_pos336(X,Y) get_gdat_llong((X),(Y),336)
+#define get_gdat_float_pos336(X,Y) get_gdat_float((X),(Y),336)
+#define get_gdat_uint_pos337(X,Y) get_gdat_uint((X),(Y),337)
+#define get_gdat_ullong_pos337(X,Y) get_gdat_ullong((X),(Y),337)
+#define get_gdat_ip_pos337(X,Y) get_gdat_ip((X),(Y),337)
+#define get_gdat_ipv6_pos337(X,Y) get_gdat_ipv6((X),(Y),337)
+#define get_gdat_string_pos337(X,Y) get_gdat_string((X),(Y),337)
+#define get_gdat_v_str_pos337(X,Y) get_gdat_string((X),(Y),337)
+#define get_gdat_bool_pos337(X,Y) get_gdat_bool((X),(Y),337)
+#define get_gdat_int_pos337(X,Y) get_gdat_int((X),(Y),337)
+#define get_gdat_llong_pos337(X,Y) get_gdat_llong((X),(Y),337)
+#define get_gdat_float_pos337(X,Y) get_gdat_float((X),(Y),337)
+#define get_gdat_uint_pos338(X,Y) get_gdat_uint((X),(Y),338)
+#define get_gdat_ullong_pos338(X,Y) get_gdat_ullong((X),(Y),338)
+#define get_gdat_ip_pos338(X,Y) get_gdat_ip((X),(Y),338)
+#define get_gdat_ipv6_pos338(X,Y) get_gdat_ipv6((X),(Y),338)
+#define get_gdat_string_pos338(X,Y) get_gdat_string((X),(Y),338)
+#define get_gdat_v_str_pos338(X,Y) get_gdat_string((X),(Y),338)
+#define get_gdat_bool_pos338(X,Y) get_gdat_bool((X),(Y),338)
+#define get_gdat_int_pos338(X,Y) get_gdat_int((X),(Y),338)
+#define get_gdat_llong_pos338(X,Y) get_gdat_llong((X),(Y),338)
+#define get_gdat_float_pos338(X,Y) get_gdat_float((X),(Y),338)
+#define get_gdat_uint_pos339(X,Y) get_gdat_uint((X),(Y),339)
+#define get_gdat_ullong_pos339(X,Y) get_gdat_ullong((X),(Y),339)
+#define get_gdat_ip_pos339(X,Y) get_gdat_ip((X),(Y),339)
+#define get_gdat_ipv6_pos339(X,Y) get_gdat_ipv6((X),(Y),339)
+#define get_gdat_string_pos339(X,Y) get_gdat_string((X),(Y),339)
+#define get_gdat_v_str_pos339(X,Y) get_gdat_string((X),(Y),339)
+#define get_gdat_bool_pos339(X,Y) get_gdat_bool((X),(Y),339)
+#define get_gdat_int_pos339(X,Y) get_gdat_int((X),(Y),339)
+#define get_gdat_llong_pos339(X,Y) get_gdat_llong((X),(Y),339)
+#define get_gdat_float_pos339(X,Y) get_gdat_float((X),(Y),339)
+#define get_gdat_uint_pos340(X,Y) get_gdat_uint((X),(Y),340)
+#define get_gdat_ullong_pos340(X,Y) get_gdat_ullong((X),(Y),340)
+#define get_gdat_ip_pos340(X,Y) get_gdat_ip((X),(Y),340)
+#define get_gdat_ipv6_pos340(X,Y) get_gdat_ipv6((X),(Y),340)
+#define get_gdat_string_pos340(X,Y) get_gdat_string((X),(Y),340)
+#define get_gdat_v_str_pos340(X,Y) get_gdat_string((X),(Y),340)
+#define get_gdat_bool_pos340(X,Y) get_gdat_bool((X),(Y),340)
+#define get_gdat_int_pos340(X,Y) get_gdat_int((X),(Y),340)
+#define get_gdat_llong_pos340(X,Y) get_gdat_llong((X),(Y),340)
+#define get_gdat_float_pos340(X,Y) get_gdat_float((X),(Y),340)
+#define get_gdat_uint_pos341(X,Y) get_gdat_uint((X),(Y),341)
+#define get_gdat_ullong_pos341(X,Y) get_gdat_ullong((X),(Y),341)
+#define get_gdat_ip_pos341(X,Y) get_gdat_ip((X),(Y),341)
+#define get_gdat_ipv6_pos341(X,Y) get_gdat_ipv6((X),(Y),341)
+#define get_gdat_string_pos341(X,Y) get_gdat_string((X),(Y),341)
+#define get_gdat_v_str_pos341(X,Y) get_gdat_string((X),(Y),341)
+#define get_gdat_bool_pos341(X,Y) get_gdat_bool((X),(Y),341)
+#define get_gdat_int_pos341(X,Y) get_gdat_int((X),(Y),341)
+#define get_gdat_llong_pos341(X,Y) get_gdat_llong((X),(Y),341)
+#define get_gdat_float_pos341(X,Y) get_gdat_float((X),(Y),341)
+#define get_gdat_uint_pos342(X,Y) get_gdat_uint((X),(Y),342)
+#define get_gdat_ullong_pos342(X,Y) get_gdat_ullong((X),(Y),342)
+#define get_gdat_ip_pos342(X,Y) get_gdat_ip((X),(Y),342)
+#define get_gdat_ipv6_pos342(X,Y) get_gdat_ipv6((X),(Y),342)
+#define get_gdat_string_pos342(X,Y) get_gdat_string((X),(Y),342)
+#define get_gdat_v_str_pos342(X,Y) get_gdat_string((X),(Y),342)
+#define get_gdat_bool_pos342(X,Y) get_gdat_bool((X),(Y),342)
+#define get_gdat_int_pos342(X,Y) get_gdat_int((X),(Y),342)
+#define get_gdat_llong_pos342(X,Y) get_gdat_llong((X),(Y),342)
+#define get_gdat_float_pos342(X,Y) get_gdat_float((X),(Y),342)
+#define get_gdat_uint_pos343(X,Y) get_gdat_uint((X),(Y),343)
+#define get_gdat_ullong_pos343(X,Y) get_gdat_ullong((X),(Y),343)
+#define get_gdat_ip_pos343(X,Y) get_gdat_ip((X),(Y),343)
+#define get_gdat_ipv6_pos343(X,Y) get_gdat_ipv6((X),(Y),343)
+#define get_gdat_string_pos343(X,Y) get_gdat_string((X),(Y),343)
+#define get_gdat_v_str_pos343(X,Y) get_gdat_string((X),(Y),343)
+#define get_gdat_bool_pos343(X,Y) get_gdat_bool((X),(Y),343)
+#define get_gdat_int_pos343(X,Y) get_gdat_int((X),(Y),343)
+#define get_gdat_llong_pos343(X,Y) get_gdat_llong((X),(Y),343)
+#define get_gdat_float_pos343(X,Y) get_gdat_float((X),(Y),343)
+#define get_gdat_uint_pos344(X,Y) get_gdat_uint((X),(Y),344)
+#define get_gdat_ullong_pos344(X,Y) get_gdat_ullong((X),(Y),344)
+#define get_gdat_ip_pos344(X,Y) get_gdat_ip((X),(Y),344)
+#define get_gdat_ipv6_pos344(X,Y) get_gdat_ipv6((X),(Y),344)
+#define get_gdat_string_pos344(X,Y) get_gdat_string((X),(Y),344)
+#define get_gdat_v_str_pos344(X,Y) get_gdat_string((X),(Y),344)
+#define get_gdat_bool_pos344(X,Y) get_gdat_bool((X),(Y),344)
+#define get_gdat_int_pos344(X,Y) get_gdat_int((X),(Y),344)
+#define get_gdat_llong_pos344(X,Y) get_gdat_llong((X),(Y),344)
+#define get_gdat_float_pos344(X,Y) get_gdat_float((X),(Y),344)
+#define get_gdat_uint_pos345(X,Y) get_gdat_uint((X),(Y),345)
+#define get_gdat_ullong_pos345(X,Y) get_gdat_ullong((X),(Y),345)
+#define get_gdat_ip_pos345(X,Y) get_gdat_ip((X),(Y),345)
+#define get_gdat_ipv6_pos345(X,Y) get_gdat_ipv6((X),(Y),345)
+#define get_gdat_string_pos345(X,Y) get_gdat_string((X),(Y),345)
+#define get_gdat_v_str_pos345(X,Y) get_gdat_string((X),(Y),345)
+#define get_gdat_bool_pos345(X,Y) get_gdat_bool((X),(Y),345)
+#define get_gdat_int_pos345(X,Y) get_gdat_int((X),(Y),345)
+#define get_gdat_llong_pos345(X,Y) get_gdat_llong((X),(Y),345)
+#define get_gdat_float_pos345(X,Y) get_gdat_float((X),(Y),345)
+#define get_gdat_uint_pos346(X,Y) get_gdat_uint((X),(Y),346)
+#define get_gdat_ullong_pos346(X,Y) get_gdat_ullong((X),(Y),346)
+#define get_gdat_ip_pos346(X,Y) get_gdat_ip((X),(Y),346)
+#define get_gdat_ipv6_pos346(X,Y) get_gdat_ipv6((X),(Y),346)
+#define get_gdat_string_pos346(X,Y) get_gdat_string((X),(Y),346)
+#define get_gdat_v_str_pos346(X,Y) get_gdat_string((X),(Y),346)
+#define get_gdat_bool_pos346(X,Y) get_gdat_bool((X),(Y),346)
+#define get_gdat_int_pos346(X,Y) get_gdat_int((X),(Y),346)
+#define get_gdat_llong_pos346(X,Y) get_gdat_llong((X),(Y),346)
+#define get_gdat_float_pos346(X,Y) get_gdat_float((X),(Y),346)
+#define get_gdat_uint_pos347(X,Y) get_gdat_uint((X),(Y),347)
+#define get_gdat_ullong_pos347(X,Y) get_gdat_ullong((X),(Y),347)
+#define get_gdat_ip_pos347(X,Y) get_gdat_ip((X),(Y),347)
+#define get_gdat_ipv6_pos347(X,Y) get_gdat_ipv6((X),(Y),347)
+#define get_gdat_string_pos347(X,Y) get_gdat_string((X),(Y),347)
+#define get_gdat_v_str_pos347(X,Y) get_gdat_string((X),(Y),347)
+#define get_gdat_bool_pos347(X,Y) get_gdat_bool((X),(Y),347)
+#define get_gdat_int_pos347(X,Y) get_gdat_int((X),(Y),347)
+#define get_gdat_llong_pos347(X,Y) get_gdat_llong((X),(Y),347)
+#define get_gdat_float_pos347(X,Y) get_gdat_float((X),(Y),347)
+#define get_gdat_uint_pos348(X,Y) get_gdat_uint((X),(Y),348)
+#define get_gdat_ullong_pos348(X,Y) get_gdat_ullong((X),(Y),348)
+#define get_gdat_ip_pos348(X,Y) get_gdat_ip((X),(Y),348)
+#define get_gdat_ipv6_pos348(X,Y) get_gdat_ipv6((X),(Y),348)
+#define get_gdat_string_pos348(X,Y) get_gdat_string((X),(Y),348)
+#define get_gdat_v_str_pos348(X,Y) get_gdat_string((X),(Y),348)
+#define get_gdat_bool_pos348(X,Y) get_gdat_bool((X),(Y),348)
+#define get_gdat_int_pos348(X,Y) get_gdat_int((X),(Y),348)
+#define get_gdat_llong_pos348(X,Y) get_gdat_llong((X),(Y),348)
+#define get_gdat_float_pos348(X,Y) get_gdat_float((X),(Y),348)
+#define get_gdat_uint_pos349(X,Y) get_gdat_uint((X),(Y),349)
+#define get_gdat_ullong_pos349(X,Y) get_gdat_ullong((X),(Y),349)
+#define get_gdat_ip_pos349(X,Y) get_gdat_ip((X),(Y),349)
+#define get_gdat_ipv6_pos349(X,Y) get_gdat_ipv6((X),(Y),349)
+#define get_gdat_string_pos349(X,Y) get_gdat_string((X),(Y),349)
+#define get_gdat_v_str_pos349(X,Y) get_gdat_string((X),(Y),349)
+#define get_gdat_bool_pos349(X,Y) get_gdat_bool((X),(Y),349)
+#define get_gdat_int_pos349(X,Y) get_gdat_int((X),(Y),349)
+#define get_gdat_llong_pos349(X,Y) get_gdat_llong((X),(Y),349)
+#define get_gdat_float_pos349(X,Y) get_gdat_float((X),(Y),349)
+#define get_gdat_uint_pos350(X,Y) get_gdat_uint((X),(Y),350)
+#define get_gdat_ullong_pos350(X,Y) get_gdat_ullong((X),(Y),350)
+#define get_gdat_ip_pos350(X,Y) get_gdat_ip((X),(Y),350)
+#define get_gdat_ipv6_pos350(X,Y) get_gdat_ipv6((X),(Y),350)
+#define get_gdat_string_pos350(X,Y) get_gdat_string((X),(Y),350)
+#define get_gdat_v_str_pos350(X,Y) get_gdat_string((X),(Y),350)
+#define get_gdat_bool_pos350(X,Y) get_gdat_bool((X),(Y),350)
+#define get_gdat_int_pos350(X,Y) get_gdat_int((X),(Y),350)
+#define get_gdat_llong_pos350(X,Y) get_gdat_llong((X),(Y),350)
+#define get_gdat_float_pos350(X,Y) get_gdat_float((X),(Y),350)
+#define get_gdat_uint_pos351(X,Y) get_gdat_uint((X),(Y),351)
+#define get_gdat_ullong_pos351(X,Y) get_gdat_ullong((X),(Y),351)
+#define get_gdat_ip_pos351(X,Y) get_gdat_ip((X),(Y),351)
+#define get_gdat_ipv6_pos351(X,Y) get_gdat_ipv6((X),(Y),351)
+#define get_gdat_string_pos351(X,Y) get_gdat_string((X),(Y),351)
+#define get_gdat_v_str_pos351(X,Y) get_gdat_string((X),(Y),351)
+#define get_gdat_bool_pos351(X,Y) get_gdat_bool((X),(Y),351)
+#define get_gdat_int_pos351(X,Y) get_gdat_int((X),(Y),351)
+#define get_gdat_llong_pos351(X,Y) get_gdat_llong((X),(Y),351)
+#define get_gdat_float_pos351(X,Y) get_gdat_float((X),(Y),351)
+#define get_gdat_uint_pos352(X,Y) get_gdat_uint((X),(Y),352)
+#define get_gdat_ullong_pos352(X,Y) get_gdat_ullong((X),(Y),352)
+#define get_gdat_ip_pos352(X,Y) get_gdat_ip((X),(Y),352)
+#define get_gdat_ipv6_pos352(X,Y) get_gdat_ipv6((X),(Y),352)
+#define get_gdat_string_pos352(X,Y) get_gdat_string((X),(Y),352)
+#define get_gdat_v_str_pos352(X,Y) get_gdat_string((X),(Y),352)
+#define get_gdat_bool_pos352(X,Y) get_gdat_bool((X),(Y),352)
+#define get_gdat_int_pos352(X,Y) get_gdat_int((X),(Y),352)
+#define get_gdat_llong_pos352(X,Y) get_gdat_llong((X),(Y),352)
+#define get_gdat_float_pos352(X,Y) get_gdat_float((X),(Y),352)
+#define get_gdat_uint_pos353(X,Y) get_gdat_uint((X),(Y),353)
+#define get_gdat_ullong_pos353(X,Y) get_gdat_ullong((X),(Y),353)
+#define get_gdat_ip_pos353(X,Y) get_gdat_ip((X),(Y),353)
+#define get_gdat_ipv6_pos353(X,Y) get_gdat_ipv6((X),(Y),353)
+#define get_gdat_string_pos353(X,Y) get_gdat_string((X),(Y),353)
+#define get_gdat_v_str_pos353(X,Y) get_gdat_string((X),(Y),353)
+#define get_gdat_bool_pos353(X,Y) get_gdat_bool((X),(Y),353)
+#define get_gdat_int_pos353(X,Y) get_gdat_int((X),(Y),353)
+#define get_gdat_llong_pos353(X,Y) get_gdat_llong((X),(Y),353)
+#define get_gdat_float_pos353(X,Y) get_gdat_float((X),(Y),353)
+#define get_gdat_uint_pos354(X,Y) get_gdat_uint((X),(Y),354)
+#define get_gdat_ullong_pos354(X,Y) get_gdat_ullong((X),(Y),354)
+#define get_gdat_ip_pos354(X,Y) get_gdat_ip((X),(Y),354)
+#define get_gdat_ipv6_pos354(X,Y) get_gdat_ipv6((X),(Y),354)
+#define get_gdat_string_pos354(X,Y) get_gdat_string((X),(Y),354)
+#define get_gdat_v_str_pos354(X,Y) get_gdat_string((X),(Y),354)
+#define get_gdat_bool_pos354(X,Y) get_gdat_bool((X),(Y),354)
+#define get_gdat_int_pos354(X,Y) get_gdat_int((X),(Y),354)
+#define get_gdat_llong_pos354(X,Y) get_gdat_llong((X),(Y),354)
+#define get_gdat_float_pos354(X,Y) get_gdat_float((X),(Y),354)
+#define get_gdat_uint_pos355(X,Y) get_gdat_uint((X),(Y),355)
+#define get_gdat_ullong_pos355(X,Y) get_gdat_ullong((X),(Y),355)
+#define get_gdat_ip_pos355(X,Y) get_gdat_ip((X),(Y),355)
+#define get_gdat_ipv6_pos355(X,Y) get_gdat_ipv6((X),(Y),355)
+#define get_gdat_string_pos355(X,Y) get_gdat_string((X),(Y),355)
+#define get_gdat_v_str_pos355(X,Y) get_gdat_string((X),(Y),355)
+#define get_gdat_bool_pos355(X,Y) get_gdat_bool((X),(Y),355)
+#define get_gdat_int_pos355(X,Y) get_gdat_int((X),(Y),355)
+#define get_gdat_llong_pos355(X,Y) get_gdat_llong((X),(Y),355)
+#define get_gdat_float_pos355(X,Y) get_gdat_float((X),(Y),355)
+#define get_gdat_uint_pos356(X,Y) get_gdat_uint((X),(Y),356)
+#define get_gdat_ullong_pos356(X,Y) get_gdat_ullong((X),(Y),356)
+#define get_gdat_ip_pos356(X,Y) get_gdat_ip((X),(Y),356)
+#define get_gdat_ipv6_pos356(X,Y) get_gdat_ipv6((X),(Y),356)
+#define get_gdat_string_pos356(X,Y) get_gdat_string((X),(Y),356)
+#define get_gdat_v_str_pos356(X,Y) get_gdat_string((X),(Y),356)
+#define get_gdat_bool_pos356(X,Y) get_gdat_bool((X),(Y),356)
+#define get_gdat_int_pos356(X,Y) get_gdat_int((X),(Y),356)
+#define get_gdat_llong_pos356(X,Y) get_gdat_llong((X),(Y),356)
+#define get_gdat_float_pos356(X,Y) get_gdat_float((X),(Y),356)
+#define get_gdat_uint_pos357(X,Y) get_gdat_uint((X),(Y),357)
+#define get_gdat_ullong_pos357(X,Y) get_gdat_ullong((X),(Y),357)
+#define get_gdat_ip_pos357(X,Y) get_gdat_ip((X),(Y),357)
+#define get_gdat_ipv6_pos357(X,Y) get_gdat_ipv6((X),(Y),357)
+#define get_gdat_string_pos357(X,Y) get_gdat_string((X),(Y),357)
+#define get_gdat_v_str_pos357(X,Y) get_gdat_string((X),(Y),357)
+#define get_gdat_bool_pos357(X,Y) get_gdat_bool((X),(Y),357)
+#define get_gdat_int_pos357(X,Y) get_gdat_int((X),(Y),357)
+#define get_gdat_llong_pos357(X,Y) get_gdat_llong((X),(Y),357)
+#define get_gdat_float_pos357(X,Y) get_gdat_float((X),(Y),357)
+#define get_gdat_uint_pos358(X,Y) get_gdat_uint((X),(Y),358)
+#define get_gdat_ullong_pos358(X,Y) get_gdat_ullong((X),(Y),358)
+#define get_gdat_ip_pos358(X,Y) get_gdat_ip((X),(Y),358)
+#define get_gdat_ipv6_pos358(X,Y) get_gdat_ipv6((X),(Y),358)
+#define get_gdat_string_pos358(X,Y) get_gdat_string((X),(Y),358)
+#define get_gdat_v_str_pos358(X,Y) get_gdat_string((X),(Y),358)
+#define get_gdat_bool_pos358(X,Y) get_gdat_bool((X),(Y),358)
+#define get_gdat_int_pos358(X,Y) get_gdat_int((X),(Y),358)
+#define get_gdat_llong_pos358(X,Y) get_gdat_llong((X),(Y),358)
+#define get_gdat_float_pos358(X,Y) get_gdat_float((X),(Y),358)
+#define get_gdat_uint_pos359(X,Y) get_gdat_uint((X),(Y),359)
+#define get_gdat_ullong_pos359(X,Y) get_gdat_ullong((X),(Y),359)
+#define get_gdat_ip_pos359(X,Y) get_gdat_ip((X),(Y),359)
+#define get_gdat_ipv6_pos359(X,Y) get_gdat_ipv6((X),(Y),359)
+#define get_gdat_string_pos359(X,Y) get_gdat_string((X),(Y),359)
+#define get_gdat_v_str_pos359(X,Y) get_gdat_string((X),(Y),359)
+#define get_gdat_bool_pos359(X,Y) get_gdat_bool((X),(Y),359)
+#define get_gdat_int_pos359(X,Y) get_gdat_int((X),(Y),359)
+#define get_gdat_llong_pos359(X,Y) get_gdat_llong((X),(Y),359)
+#define get_gdat_float_pos359(X,Y) get_gdat_float((X),(Y),359)
+#define get_gdat_uint_pos360(X,Y) get_gdat_uint((X),(Y),360)
+#define get_gdat_ullong_pos360(X,Y) get_gdat_ullong((X),(Y),360)
+#define get_gdat_ip_pos360(X,Y) get_gdat_ip((X),(Y),360)
+#define get_gdat_ipv6_pos360(X,Y) get_gdat_ipv6((X),(Y),360)
+#define get_gdat_string_pos360(X,Y) get_gdat_string((X),(Y),360)
+#define get_gdat_v_str_pos360(X,Y) get_gdat_string((X),(Y),360)
+#define get_gdat_bool_pos360(X,Y) get_gdat_bool((X),(Y),360)
+#define get_gdat_int_pos360(X,Y) get_gdat_int((X),(Y),360)
+#define get_gdat_llong_pos360(X,Y) get_gdat_llong((X),(Y),360)
+#define get_gdat_float_pos360(X,Y) get_gdat_float((X),(Y),360)
+#define get_gdat_uint_pos361(X,Y) get_gdat_uint((X),(Y),361)
+#define get_gdat_ullong_pos361(X,Y) get_gdat_ullong((X),(Y),361)
+#define get_gdat_ip_pos361(X,Y) get_gdat_ip((X),(Y),361)
+#define get_gdat_ipv6_pos361(X,Y) get_gdat_ipv6((X),(Y),361)
+#define get_gdat_string_pos361(X,Y) get_gdat_string((X),(Y),361)
+#define get_gdat_v_str_pos361(X,Y) get_gdat_string((X),(Y),361)
+#define get_gdat_bool_pos361(X,Y) get_gdat_bool((X),(Y),361)
+#define get_gdat_int_pos361(X,Y) get_gdat_int((X),(Y),361)
+#define get_gdat_llong_pos361(X,Y) get_gdat_llong((X),(Y),361)
+#define get_gdat_float_pos361(X,Y) get_gdat_float((X),(Y),361)
+#define get_gdat_uint_pos362(X,Y) get_gdat_uint((X),(Y),362)
+#define get_gdat_ullong_pos362(X,Y) get_gdat_ullong((X),(Y),362)
+#define get_gdat_ip_pos362(X,Y) get_gdat_ip((X),(Y),362)
+#define get_gdat_ipv6_pos362(X,Y) get_gdat_ipv6((X),(Y),362)
+#define get_gdat_string_pos362(X,Y) get_gdat_string((X),(Y),362)
+#define get_gdat_v_str_pos362(X,Y) get_gdat_string((X),(Y),362)
+#define get_gdat_bool_pos362(X,Y) get_gdat_bool((X),(Y),362)
+#define get_gdat_int_pos362(X,Y) get_gdat_int((X),(Y),362)
+#define get_gdat_llong_pos362(X,Y) get_gdat_llong((X),(Y),362)
+#define get_gdat_float_pos362(X,Y) get_gdat_float((X),(Y),362)
+#define get_gdat_uint_pos363(X,Y) get_gdat_uint((X),(Y),363)
+#define get_gdat_ullong_pos363(X,Y) get_gdat_ullong((X),(Y),363)
+#define get_gdat_ip_pos363(X,Y) get_gdat_ip((X),(Y),363)
+#define get_gdat_ipv6_pos363(X,Y) get_gdat_ipv6((X),(Y),363)
+#define get_gdat_string_pos363(X,Y) get_gdat_string((X),(Y),363)
+#define get_gdat_v_str_pos363(X,Y) get_gdat_string((X),(Y),363)
+#define get_gdat_bool_pos363(X,Y) get_gdat_bool((X),(Y),363)
+#define get_gdat_int_pos363(X,Y) get_gdat_int((X),(Y),363)
+#define get_gdat_llong_pos363(X,Y) get_gdat_llong((X),(Y),363)
+#define get_gdat_float_pos363(X,Y) get_gdat_float((X),(Y),363)
+#define get_gdat_uint_pos364(X,Y) get_gdat_uint((X),(Y),364)
+#define get_gdat_ullong_pos364(X,Y) get_gdat_ullong((X),(Y),364)
+#define get_gdat_ip_pos364(X,Y) get_gdat_ip((X),(Y),364)
+#define get_gdat_ipv6_pos364(X,Y) get_gdat_ipv6((X),(Y),364)
+#define get_gdat_string_pos364(X,Y) get_gdat_string((X),(Y),364)
+#define get_gdat_v_str_pos364(X,Y) get_gdat_string((X),(Y),364)
+#define get_gdat_bool_pos364(X,Y) get_gdat_bool((X),(Y),364)
+#define get_gdat_int_pos364(X,Y) get_gdat_int((X),(Y),364)
+#define get_gdat_llong_pos364(X,Y) get_gdat_llong((X),(Y),364)
+#define get_gdat_float_pos364(X,Y) get_gdat_float((X),(Y),364)
+#define get_gdat_uint_pos365(X,Y) get_gdat_uint((X),(Y),365)
+#define get_gdat_ullong_pos365(X,Y) get_gdat_ullong((X),(Y),365)
+#define get_gdat_ip_pos365(X,Y) get_gdat_ip((X),(Y),365)
+#define get_gdat_ipv6_pos365(X,Y) get_gdat_ipv6((X),(Y),365)
+#define get_gdat_string_pos365(X,Y) get_gdat_string((X),(Y),365)
+#define get_gdat_v_str_pos365(X,Y) get_gdat_string((X),(Y),365)
+#define get_gdat_bool_pos365(X,Y) get_gdat_bool((X),(Y),365)
+#define get_gdat_int_pos365(X,Y) get_gdat_int((X),(Y),365)
+#define get_gdat_llong_pos365(X,Y) get_gdat_llong((X),(Y),365)
+#define get_gdat_float_pos365(X,Y) get_gdat_float((X),(Y),365)
+#define get_gdat_uint_pos366(X,Y) get_gdat_uint((X),(Y),366)
+#define get_gdat_ullong_pos366(X,Y) get_gdat_ullong((X),(Y),366)
+#define get_gdat_ip_pos366(X,Y) get_gdat_ip((X),(Y),366)
+#define get_gdat_ipv6_pos366(X,Y) get_gdat_ipv6((X),(Y),366)
+#define get_gdat_string_pos366(X,Y) get_gdat_string((X),(Y),366)
+#define get_gdat_v_str_pos366(X,Y) get_gdat_string((X),(Y),366)
+#define get_gdat_bool_pos366(X,Y) get_gdat_bool((X),(Y),366)
+#define get_gdat_int_pos366(X,Y) get_gdat_int((X),(Y),366)
+#define get_gdat_llong_pos366(X,Y) get_gdat_llong((X),(Y),366)
+#define get_gdat_float_pos366(X,Y) get_gdat_float((X),(Y),366)
+#define get_gdat_uint_pos367(X,Y) get_gdat_uint((X),(Y),367)
+#define get_gdat_ullong_pos367(X,Y) get_gdat_ullong((X),(Y),367)
+#define get_gdat_ip_pos367(X,Y) get_gdat_ip((X),(Y),367)
+#define get_gdat_ipv6_pos367(X,Y) get_gdat_ipv6((X),(Y),367)
+#define get_gdat_string_pos367(X,Y) get_gdat_string((X),(Y),367)
+#define get_gdat_v_str_pos367(X,Y) get_gdat_string((X),(Y),367)
+#define get_gdat_bool_pos367(X,Y) get_gdat_bool((X),(Y),367)
+#define get_gdat_int_pos367(X,Y) get_gdat_int((X),(Y),367)
+#define get_gdat_llong_pos367(X,Y) get_gdat_llong((X),(Y),367)
+#define get_gdat_float_pos367(X,Y) get_gdat_float((X),(Y),367)
+#define get_gdat_uint_pos368(X,Y) get_gdat_uint((X),(Y),368)
+#define get_gdat_ullong_pos368(X,Y) get_gdat_ullong((X),(Y),368)
+#define get_gdat_ip_pos368(X,Y) get_gdat_ip((X),(Y),368)
+#define get_gdat_ipv6_pos368(X,Y) get_gdat_ipv6((X),(Y),368)
+#define get_gdat_string_pos368(X,Y) get_gdat_string((X),(Y),368)
+#define get_gdat_v_str_pos368(X,Y) get_gdat_string((X),(Y),368)
+#define get_gdat_bool_pos368(X,Y) get_gdat_bool((X),(Y),368)
+#define get_gdat_int_pos368(X,Y) get_gdat_int((X),(Y),368)
+#define get_gdat_llong_pos368(X,Y) get_gdat_llong((X),(Y),368)
+#define get_gdat_float_pos368(X,Y) get_gdat_float((X),(Y),368)
+#define get_gdat_uint_pos369(X,Y) get_gdat_uint((X),(Y),369)
+#define get_gdat_ullong_pos369(X,Y) get_gdat_ullong((X),(Y),369)
+#define get_gdat_ip_pos369(X,Y) get_gdat_ip((X),(Y),369)
+#define get_gdat_ipv6_pos369(X,Y) get_gdat_ipv6((X),(Y),369)
+#define get_gdat_string_pos369(X,Y) get_gdat_string((X),(Y),369)
+#define get_gdat_v_str_pos369(X,Y) get_gdat_string((X),(Y),369)
+#define get_gdat_bool_pos369(X,Y) get_gdat_bool((X),(Y),369)
+#define get_gdat_int_pos369(X,Y) get_gdat_int((X),(Y),369)
+#define get_gdat_llong_pos369(X,Y) get_gdat_llong((X),(Y),369)
+#define get_gdat_float_pos369(X,Y) get_gdat_float((X),(Y),369)
+#define get_gdat_uint_pos370(X,Y) get_gdat_uint((X),(Y),370)
+#define get_gdat_ullong_pos370(X,Y) get_gdat_ullong((X),(Y),370)
+#define get_gdat_ip_pos370(X,Y) get_gdat_ip((X),(Y),370)
+#define get_gdat_ipv6_pos370(X,Y) get_gdat_ipv6((X),(Y),370)
+#define get_gdat_string_pos370(X,Y) get_gdat_string((X),(Y),370)
+#define get_gdat_v_str_pos370(X,Y) get_gdat_string((X),(Y),370)
+#define get_gdat_bool_pos370(X,Y) get_gdat_bool((X),(Y),370)
+#define get_gdat_int_pos370(X,Y) get_gdat_int((X),(Y),370)
+#define get_gdat_llong_pos370(X,Y) get_gdat_llong((X),(Y),370)
+#define get_gdat_float_pos370(X,Y) get_gdat_float((X),(Y),370)
+#define get_gdat_uint_pos371(X,Y) get_gdat_uint((X),(Y),371)
+#define get_gdat_ullong_pos371(X,Y) get_gdat_ullong((X),(Y),371)
+#define get_gdat_ip_pos371(X,Y) get_gdat_ip((X),(Y),371)
+#define get_gdat_ipv6_pos371(X,Y) get_gdat_ipv6((X),(Y),371)
+#define get_gdat_string_pos371(X,Y) get_gdat_string((X),(Y),371)
+#define get_gdat_v_str_pos371(X,Y) get_gdat_string((X),(Y),371)
+#define get_gdat_bool_pos371(X,Y) get_gdat_bool((X),(Y),371)
+#define get_gdat_int_pos371(X,Y) get_gdat_int((X),(Y),371)
+#define get_gdat_llong_pos371(X,Y) get_gdat_llong((X),(Y),371)
+#define get_gdat_float_pos371(X,Y) get_gdat_float((X),(Y),371)
+#define get_gdat_uint_pos372(X,Y) get_gdat_uint((X),(Y),372)
+#define get_gdat_ullong_pos372(X,Y) get_gdat_ullong((X),(Y),372)
+#define get_gdat_ip_pos372(X,Y) get_gdat_ip((X),(Y),372)
+#define get_gdat_ipv6_pos372(X,Y) get_gdat_ipv6((X),(Y),372)
+#define get_gdat_string_pos372(X,Y) get_gdat_string((X),(Y),372)
+#define get_gdat_v_str_pos372(X,Y) get_gdat_string((X),(Y),372)
+#define get_gdat_bool_pos372(X,Y) get_gdat_bool((X),(Y),372)
+#define get_gdat_int_pos372(X,Y) get_gdat_int((X),(Y),372)
+#define get_gdat_llong_pos372(X,Y) get_gdat_llong((X),(Y),372)
+#define get_gdat_float_pos372(X,Y) get_gdat_float((X),(Y),372)
+#define get_gdat_uint_pos373(X,Y) get_gdat_uint((X),(Y),373)
+#define get_gdat_ullong_pos373(X,Y) get_gdat_ullong((X),(Y),373)
+#define get_gdat_ip_pos373(X,Y) get_gdat_ip((X),(Y),373)
+#define get_gdat_ipv6_pos373(X,Y) get_gdat_ipv6((X),(Y),373)
+#define get_gdat_string_pos373(X,Y) get_gdat_string((X),(Y),373)
+#define get_gdat_v_str_pos373(X,Y) get_gdat_string((X),(Y),373)
+#define get_gdat_bool_pos373(X,Y) get_gdat_bool((X),(Y),373)
+#define get_gdat_int_pos373(X,Y) get_gdat_int((X),(Y),373)
+#define get_gdat_llong_pos373(X,Y) get_gdat_llong((X),(Y),373)
+#define get_gdat_float_pos373(X,Y) get_gdat_float((X),(Y),373)
+#define get_gdat_uint_pos374(X,Y) get_gdat_uint((X),(Y),374)
+#define get_gdat_ullong_pos374(X,Y) get_gdat_ullong((X),(Y),374)
+#define get_gdat_ip_pos374(X,Y) get_gdat_ip((X),(Y),374)
+#define get_gdat_ipv6_pos374(X,Y) get_gdat_ipv6((X),(Y),374)
+#define get_gdat_string_pos374(X,Y) get_gdat_string((X),(Y),374)
+#define get_gdat_v_str_pos374(X,Y) get_gdat_string((X),(Y),374)
+#define get_gdat_bool_pos374(X,Y) get_gdat_bool((X),(Y),374)
+#define get_gdat_int_pos374(X,Y) get_gdat_int((X),(Y),374)
+#define get_gdat_llong_pos374(X,Y) get_gdat_llong((X),(Y),374)
+#define get_gdat_float_pos374(X,Y) get_gdat_float((X),(Y),374)
+#define get_gdat_uint_pos375(X,Y) get_gdat_uint((X),(Y),375)
+#define get_gdat_ullong_pos375(X,Y) get_gdat_ullong((X),(Y),375)
+#define get_gdat_ip_pos375(X,Y) get_gdat_ip((X),(Y),375)
+#define get_gdat_ipv6_pos375(X,Y) get_gdat_ipv6((X),(Y),375)
+#define get_gdat_string_pos375(X,Y) get_gdat_string((X),(Y),375)
+#define get_gdat_v_str_pos375(X,Y) get_gdat_string((X),(Y),375)
+#define get_gdat_bool_pos375(X,Y) get_gdat_bool((X),(Y),375)
+#define get_gdat_int_pos375(X,Y) get_gdat_int((X),(Y),375)
+#define get_gdat_llong_pos375(X,Y) get_gdat_llong((X),(Y),375)
+#define get_gdat_float_pos375(X,Y) get_gdat_float((X),(Y),375)
+#define get_gdat_uint_pos376(X,Y) get_gdat_uint((X),(Y),376)
+#define get_gdat_ullong_pos376(X,Y) get_gdat_ullong((X),(Y),376)
+#define get_gdat_ip_pos376(X,Y) get_gdat_ip((X),(Y),376)
+#define get_gdat_ipv6_pos376(X,Y) get_gdat_ipv6((X),(Y),376)
+#define get_gdat_string_pos376(X,Y) get_gdat_string((X),(Y),376)
+#define get_gdat_v_str_pos376(X,Y) get_gdat_string((X),(Y),376)
+#define get_gdat_bool_pos376(X,Y) get_gdat_bool((X),(Y),376)
+#define get_gdat_int_pos376(X,Y) get_gdat_int((X),(Y),376)
+#define get_gdat_llong_pos376(X,Y) get_gdat_llong((X),(Y),376)
+#define get_gdat_float_pos376(X,Y) get_gdat_float((X),(Y),376)
+#define get_gdat_uint_pos377(X,Y) get_gdat_uint((X),(Y),377)
+#define get_gdat_ullong_pos377(X,Y) get_gdat_ullong((X),(Y),377)
+#define get_gdat_ip_pos377(X,Y) get_gdat_ip((X),(Y),377)
+#define get_gdat_ipv6_pos377(X,Y) get_gdat_ipv6((X),(Y),377)
+#define get_gdat_string_pos377(X,Y) get_gdat_string((X),(Y),377)
+#define get_gdat_v_str_pos377(X,Y) get_gdat_string((X),(Y),377)
+#define get_gdat_bool_pos377(X,Y) get_gdat_bool((X),(Y),377)
+#define get_gdat_int_pos377(X,Y) get_gdat_int((X),(Y),377)
+#define get_gdat_llong_pos377(X,Y) get_gdat_llong((X),(Y),377)
+#define get_gdat_float_pos377(X,Y) get_gdat_float((X),(Y),377)
+#define get_gdat_uint_pos378(X,Y) get_gdat_uint((X),(Y),378)
+#define get_gdat_ullong_pos378(X,Y) get_gdat_ullong((X),(Y),378)
+#define get_gdat_ip_pos378(X,Y) get_gdat_ip((X),(Y),378)
+#define get_gdat_ipv6_pos378(X,Y) get_gdat_ipv6((X),(Y),378)
+#define get_gdat_string_pos378(X,Y) get_gdat_string((X),(Y),378)
+#define get_gdat_v_str_pos378(X,Y) get_gdat_string((X),(Y),378)
+#define get_gdat_bool_pos378(X,Y) get_gdat_bool((X),(Y),378)
+#define get_gdat_int_pos378(X,Y) get_gdat_int((X),(Y),378)
+#define get_gdat_llong_pos378(X,Y) get_gdat_llong((X),(Y),378)
+#define get_gdat_float_pos378(X,Y) get_gdat_float((X),(Y),378)
+#define get_gdat_uint_pos379(X,Y) get_gdat_uint((X),(Y),379)
+#define get_gdat_ullong_pos379(X,Y) get_gdat_ullong((X),(Y),379)
+#define get_gdat_ip_pos379(X,Y) get_gdat_ip((X),(Y),379)
+#define get_gdat_ipv6_pos379(X,Y) get_gdat_ipv6((X),(Y),379)
+#define get_gdat_string_pos379(X,Y) get_gdat_string((X),(Y),379)
+#define get_gdat_v_str_pos379(X,Y) get_gdat_string((X),(Y),379)
+#define get_gdat_bool_pos379(X,Y) get_gdat_bool((X),(Y),379)
+#define get_gdat_int_pos379(X,Y) get_gdat_int((X),(Y),379)
+#define get_gdat_llong_pos379(X,Y) get_gdat_llong((X),(Y),379)
+#define get_gdat_float_pos379(X,Y) get_gdat_float((X),(Y),379)
+#define get_gdat_uint_pos380(X,Y) get_gdat_uint((X),(Y),380)
+#define get_gdat_ullong_pos380(X,Y) get_gdat_ullong((X),(Y),380)
+#define get_gdat_ip_pos380(X,Y) get_gdat_ip((X),(Y),380)
+#define get_gdat_ipv6_pos380(X,Y) get_gdat_ipv6((X),(Y),380)
+#define get_gdat_string_pos380(X,Y) get_gdat_string((X),(Y),380)
+#define get_gdat_v_str_pos380(X,Y) get_gdat_string((X),(Y),380)
+#define get_gdat_bool_pos380(X,Y) get_gdat_bool((X),(Y),380)
+#define get_gdat_int_pos380(X,Y) get_gdat_int((X),(Y),380)
+#define get_gdat_llong_pos380(X,Y) get_gdat_llong((X),(Y),380)
+#define get_gdat_float_pos380(X,Y) get_gdat_float((X),(Y),380)
+#define get_gdat_uint_pos381(X,Y) get_gdat_uint((X),(Y),381)
+#define get_gdat_ullong_pos381(X,Y) get_gdat_ullong((X),(Y),381)
+#define get_gdat_ip_pos381(X,Y) get_gdat_ip((X),(Y),381)
+#define get_gdat_ipv6_pos381(X,Y) get_gdat_ipv6((X),(Y),381)
+#define get_gdat_string_pos381(X,Y) get_gdat_string((X),(Y),381)
+#define get_gdat_v_str_pos381(X,Y) get_gdat_string((X),(Y),381)
+#define get_gdat_bool_pos381(X,Y) get_gdat_bool((X),(Y),381)
+#define get_gdat_int_pos381(X,Y) get_gdat_int((X),(Y),381)
+#define get_gdat_llong_pos381(X,Y) get_gdat_llong((X),(Y),381)
+#define get_gdat_float_pos381(X,Y) get_gdat_float((X),(Y),381)
+#define get_gdat_uint_pos382(X,Y) get_gdat_uint((X),(Y),382)
+#define get_gdat_ullong_pos382(X,Y) get_gdat_ullong((X),(Y),382)
+#define get_gdat_ip_pos382(X,Y) get_gdat_ip((X),(Y),382)
+#define get_gdat_ipv6_pos382(X,Y) get_gdat_ipv6((X),(Y),382)
+#define get_gdat_string_pos382(X,Y) get_gdat_string((X),(Y),382)
+#define get_gdat_v_str_pos382(X,Y) get_gdat_string((X),(Y),382)
+#define get_gdat_bool_pos382(X,Y) get_gdat_bool((X),(Y),382)
+#define get_gdat_int_pos382(X,Y) get_gdat_int((X),(Y),382)
+#define get_gdat_llong_pos382(X,Y) get_gdat_llong((X),(Y),382)
+#define get_gdat_float_pos382(X,Y) get_gdat_float((X),(Y),382)
+#define get_gdat_uint_pos383(X,Y) get_gdat_uint((X),(Y),383)
+#define get_gdat_ullong_pos383(X,Y) get_gdat_ullong((X),(Y),383)
+#define get_gdat_ip_pos383(X,Y) get_gdat_ip((X),(Y),383)
+#define get_gdat_ipv6_pos383(X,Y) get_gdat_ipv6((X),(Y),383)
+#define get_gdat_string_pos383(X,Y) get_gdat_string((X),(Y),383)
+#define get_gdat_v_str_pos383(X,Y) get_gdat_string((X),(Y),383)
+#define get_gdat_bool_pos383(X,Y) get_gdat_bool((X),(Y),383)
+#define get_gdat_int_pos383(X,Y) get_gdat_int((X),(Y),383)
+#define get_gdat_llong_pos383(X,Y) get_gdat_llong((X),(Y),383)
+#define get_gdat_float_pos383(X,Y) get_gdat_float((X),(Y),383)
+#define get_gdat_uint_pos384(X,Y) get_gdat_uint((X),(Y),384)
+#define get_gdat_ullong_pos384(X,Y) get_gdat_ullong((X),(Y),384)
+#define get_gdat_ip_pos384(X,Y) get_gdat_ip((X),(Y),384)
+#define get_gdat_ipv6_pos384(X,Y) get_gdat_ipv6((X),(Y),384)
+#define get_gdat_string_pos384(X,Y) get_gdat_string((X),(Y),384)
+#define get_gdat_v_str_pos384(X,Y) get_gdat_string((X),(Y),384)
+#define get_gdat_bool_pos384(X,Y) get_gdat_bool((X),(Y),384)
+#define get_gdat_int_pos384(X,Y) get_gdat_int((X),(Y),384)
+#define get_gdat_llong_pos384(X,Y) get_gdat_llong((X),(Y),384)
+#define get_gdat_float_pos384(X,Y) get_gdat_float((X),(Y),384)
+#define get_gdat_uint_pos385(X,Y) get_gdat_uint((X),(Y),385)
+#define get_gdat_ullong_pos385(X,Y) get_gdat_ullong((X),(Y),385)
+#define get_gdat_ip_pos385(X,Y) get_gdat_ip((X),(Y),385)
+#define get_gdat_ipv6_pos385(X,Y) get_gdat_ipv6((X),(Y),385)
+#define get_gdat_string_pos385(X,Y) get_gdat_string((X),(Y),385)
+#define get_gdat_v_str_pos385(X,Y) get_gdat_string((X),(Y),385)
+#define get_gdat_bool_pos385(X,Y) get_gdat_bool((X),(Y),385)
+#define get_gdat_int_pos385(X,Y) get_gdat_int((X),(Y),385)
+#define get_gdat_llong_pos385(X,Y) get_gdat_llong((X),(Y),385)
+#define get_gdat_float_pos385(X,Y) get_gdat_float((X),(Y),385)
+#define get_gdat_uint_pos386(X,Y) get_gdat_uint((X),(Y),386)
+#define get_gdat_ullong_pos386(X,Y) get_gdat_ullong((X),(Y),386)
+#define get_gdat_ip_pos386(X,Y) get_gdat_ip((X),(Y),386)
+#define get_gdat_ipv6_pos386(X,Y) get_gdat_ipv6((X),(Y),386)
+#define get_gdat_string_pos386(X,Y) get_gdat_string((X),(Y),386)
+#define get_gdat_v_str_pos386(X,Y) get_gdat_string((X),(Y),386)
+#define get_gdat_bool_pos386(X,Y) get_gdat_bool((X),(Y),386)
+#define get_gdat_int_pos386(X,Y) get_gdat_int((X),(Y),386)
+#define get_gdat_llong_pos386(X,Y) get_gdat_llong((X),(Y),386)
+#define get_gdat_float_pos386(X,Y) get_gdat_float((X),(Y),386)
+#define get_gdat_uint_pos387(X,Y) get_gdat_uint((X),(Y),387)
+#define get_gdat_ullong_pos387(X,Y) get_gdat_ullong((X),(Y),387)
+#define get_gdat_ip_pos387(X,Y) get_gdat_ip((X),(Y),387)
+#define get_gdat_ipv6_pos387(X,Y) get_gdat_ipv6((X),(Y),387)
+#define get_gdat_string_pos387(X,Y) get_gdat_string((X),(Y),387)
+#define get_gdat_v_str_pos387(X,Y) get_gdat_string((X),(Y),387)
+#define get_gdat_bool_pos387(X,Y) get_gdat_bool((X),(Y),387)
+#define get_gdat_int_pos387(X,Y) get_gdat_int((X),(Y),387)
+#define get_gdat_llong_pos387(X,Y) get_gdat_llong((X),(Y),387)
+#define get_gdat_float_pos387(X,Y) get_gdat_float((X),(Y),387)
+#define get_gdat_uint_pos388(X,Y) get_gdat_uint((X),(Y),388)
+#define get_gdat_ullong_pos388(X,Y) get_gdat_ullong((X),(Y),388)
+#define get_gdat_ip_pos388(X,Y) get_gdat_ip((X),(Y),388)
+#define get_gdat_ipv6_pos388(X,Y) get_gdat_ipv6((X),(Y),388)
+#define get_gdat_string_pos388(X,Y) get_gdat_string((X),(Y),388)
+#define get_gdat_v_str_pos388(X,Y) get_gdat_string((X),(Y),388)
+#define get_gdat_bool_pos388(X,Y) get_gdat_bool((X),(Y),388)
+#define get_gdat_int_pos388(X,Y) get_gdat_int((X),(Y),388)
+#define get_gdat_llong_pos388(X,Y) get_gdat_llong((X),(Y),388)
+#define get_gdat_float_pos388(X,Y) get_gdat_float((X),(Y),388)
+#define get_gdat_uint_pos389(X,Y) get_gdat_uint((X),(Y),389)
+#define get_gdat_ullong_pos389(X,Y) get_gdat_ullong((X),(Y),389)
+#define get_gdat_ip_pos389(X,Y) get_gdat_ip((X),(Y),389)
+#define get_gdat_ipv6_pos389(X,Y) get_gdat_ipv6((X),(Y),389)
+#define get_gdat_string_pos389(X,Y) get_gdat_string((X),(Y),389)
+#define get_gdat_v_str_pos389(X,Y) get_gdat_string((X),(Y),389)
+#define get_gdat_bool_pos389(X,Y) get_gdat_bool((X),(Y),389)
+#define get_gdat_int_pos389(X,Y) get_gdat_int((X),(Y),389)
+#define get_gdat_llong_pos389(X,Y) get_gdat_llong((X),(Y),389)
+#define get_gdat_float_pos389(X,Y) get_gdat_float((X),(Y),389)
+#define get_gdat_uint_pos390(X,Y) get_gdat_uint((X),(Y),390)
+#define get_gdat_ullong_pos390(X,Y) get_gdat_ullong((X),(Y),390)
+#define get_gdat_ip_pos390(X,Y) get_gdat_ip((X),(Y),390)
+#define get_gdat_ipv6_pos390(X,Y) get_gdat_ipv6((X),(Y),390)
+#define get_gdat_string_pos390(X,Y) get_gdat_string((X),(Y),390)
+#define get_gdat_v_str_pos390(X,Y) get_gdat_string((X),(Y),390)
+#define get_gdat_bool_pos390(X,Y) get_gdat_bool((X),(Y),390)
+#define get_gdat_int_pos390(X,Y) get_gdat_int((X),(Y),390)
+#define get_gdat_llong_pos390(X,Y) get_gdat_llong((X),(Y),390)
+#define get_gdat_float_pos390(X,Y) get_gdat_float((X),(Y),390)
+#define get_gdat_uint_pos391(X,Y) get_gdat_uint((X),(Y),391)
+#define get_gdat_ullong_pos391(X,Y) get_gdat_ullong((X),(Y),391)
+#define get_gdat_ip_pos391(X,Y) get_gdat_ip((X),(Y),391)
+#define get_gdat_ipv6_pos391(X,Y) get_gdat_ipv6((X),(Y),391)
+#define get_gdat_string_pos391(X,Y) get_gdat_string((X),(Y),391)
+#define get_gdat_v_str_pos391(X,Y) get_gdat_string((X),(Y),391)
+#define get_gdat_bool_pos391(X,Y) get_gdat_bool((X),(Y),391)
+#define get_gdat_int_pos391(X,Y) get_gdat_int((X),(Y),391)
+#define get_gdat_llong_pos391(X,Y) get_gdat_llong((X),(Y),391)
+#define get_gdat_float_pos391(X,Y) get_gdat_float((X),(Y),391)
+#define get_gdat_uint_pos392(X,Y) get_gdat_uint((X),(Y),392)
+#define get_gdat_ullong_pos392(X,Y) get_gdat_ullong((X),(Y),392)
+#define get_gdat_ip_pos392(X,Y) get_gdat_ip((X),(Y),392)
+#define get_gdat_ipv6_pos392(X,Y) get_gdat_ipv6((X),(Y),392)
+#define get_gdat_string_pos392(X,Y) get_gdat_string((X),(Y),392)
+#define get_gdat_v_str_pos392(X,Y) get_gdat_string((X),(Y),392)
+#define get_gdat_bool_pos392(X,Y) get_gdat_bool((X),(Y),392)
+#define get_gdat_int_pos392(X,Y) get_gdat_int((X),(Y),392)
+#define get_gdat_llong_pos392(X,Y) get_gdat_llong((X),(Y),392)
+#define get_gdat_float_pos392(X,Y) get_gdat_float((X),(Y),392)
+#define get_gdat_uint_pos393(X,Y) get_gdat_uint((X),(Y),393)
+#define get_gdat_ullong_pos393(X,Y) get_gdat_ullong((X),(Y),393)
+#define get_gdat_ip_pos393(X,Y) get_gdat_ip((X),(Y),393)
+#define get_gdat_ipv6_pos393(X,Y) get_gdat_ipv6((X),(Y),393)
+#define get_gdat_string_pos393(X,Y) get_gdat_string((X),(Y),393)
+#define get_gdat_v_str_pos393(X,Y) get_gdat_string((X),(Y),393)
+#define get_gdat_bool_pos393(X,Y) get_gdat_bool((X),(Y),393)
+#define get_gdat_int_pos393(X,Y) get_gdat_int((X),(Y),393)
+#define get_gdat_llong_pos393(X,Y) get_gdat_llong((X),(Y),393)
+#define get_gdat_float_pos393(X,Y) get_gdat_float((X),(Y),393)
+#define get_gdat_uint_pos394(X,Y) get_gdat_uint((X),(Y),394)
+#define get_gdat_ullong_pos394(X,Y) get_gdat_ullong((X),(Y),394)
+#define get_gdat_ip_pos394(X,Y) get_gdat_ip((X),(Y),394)
+#define get_gdat_ipv6_pos394(X,Y) get_gdat_ipv6((X),(Y),394)
+#define get_gdat_string_pos394(X,Y) get_gdat_string((X),(Y),394)
+#define get_gdat_v_str_pos394(X,Y) get_gdat_string((X),(Y),394)
+#define get_gdat_bool_pos394(X,Y) get_gdat_bool((X),(Y),394)
+#define get_gdat_int_pos394(X,Y) get_gdat_int((X),(Y),394)
+#define get_gdat_llong_pos394(X,Y) get_gdat_llong((X),(Y),394)
+#define get_gdat_float_pos394(X,Y) get_gdat_float((X),(Y),394)
+#define get_gdat_uint_pos395(X,Y) get_gdat_uint((X),(Y),395)
+#define get_gdat_ullong_pos395(X,Y) get_gdat_ullong((X),(Y),395)
+#define get_gdat_ip_pos395(X,Y) get_gdat_ip((X),(Y),395)
+#define get_gdat_ipv6_pos395(X,Y) get_gdat_ipv6((X),(Y),395)
+#define get_gdat_string_pos395(X,Y) get_gdat_string((X),(Y),395)
+#define get_gdat_v_str_pos395(X,Y) get_gdat_string((X),(Y),395)
+#define get_gdat_bool_pos395(X,Y) get_gdat_bool((X),(Y),395)
+#define get_gdat_int_pos395(X,Y) get_gdat_int((X),(Y),395)
+#define get_gdat_llong_pos395(X,Y) get_gdat_llong((X),(Y),395)
+#define get_gdat_float_pos395(X,Y) get_gdat_float((X),(Y),395)
+#define get_gdat_uint_pos396(X,Y) get_gdat_uint((X),(Y),396)
+#define get_gdat_ullong_pos396(X,Y) get_gdat_ullong((X),(Y),396)
+#define get_gdat_ip_pos396(X,Y) get_gdat_ip((X),(Y),396)
+#define get_gdat_ipv6_pos396(X,Y) get_gdat_ipv6((X),(Y),396)
+#define get_gdat_string_pos396(X,Y) get_gdat_string((X),(Y),396)
+#define get_gdat_v_str_pos396(X,Y) get_gdat_string((X),(Y),396)
+#define get_gdat_bool_pos396(X,Y) get_gdat_bool((X),(Y),396)
+#define get_gdat_int_pos396(X,Y) get_gdat_int((X),(Y),396)
+#define get_gdat_llong_pos396(X,Y) get_gdat_llong((X),(Y),396)
+#define get_gdat_float_pos396(X,Y) get_gdat_float((X),(Y),396)
+#define get_gdat_uint_pos397(X,Y) get_gdat_uint((X),(Y),397)
+#define get_gdat_ullong_pos397(X,Y) get_gdat_ullong((X),(Y),397)
+#define get_gdat_ip_pos397(X,Y) get_gdat_ip((X),(Y),397)
+#define get_gdat_ipv6_pos397(X,Y) get_gdat_ipv6((X),(Y),397)
+#define get_gdat_string_pos397(X,Y) get_gdat_string((X),(Y),397)
+#define get_gdat_v_str_pos397(X,Y) get_gdat_string((X),(Y),397)
+#define get_gdat_bool_pos397(X,Y) get_gdat_bool((X),(Y),397)
+#define get_gdat_int_pos397(X,Y) get_gdat_int((X),(Y),397)
+#define get_gdat_llong_pos397(X,Y) get_gdat_llong((X),(Y),397)
+#define get_gdat_float_pos397(X,Y) get_gdat_float((X),(Y),397)
+#define get_gdat_uint_pos398(X,Y) get_gdat_uint((X),(Y),398)
+#define get_gdat_ullong_pos398(X,Y) get_gdat_ullong((X),(Y),398)
+#define get_gdat_ip_pos398(X,Y) get_gdat_ip((X),(Y),398)
+#define get_gdat_ipv6_pos398(X,Y) get_gdat_ipv6((X),(Y),398)
+#define get_gdat_string_pos398(X,Y) get_gdat_string((X),(Y),398)
+#define get_gdat_v_str_pos398(X,Y) get_gdat_string((X),(Y),398)
+#define get_gdat_bool_pos398(X,Y) get_gdat_bool((X),(Y),398)
+#define get_gdat_int_pos398(X,Y) get_gdat_int((X),(Y),398)
+#define get_gdat_llong_pos398(X,Y) get_gdat_llong((X),(Y),398)
+#define get_gdat_float_pos398(X,Y) get_gdat_float((X),(Y),398)
+#define get_gdat_uint_pos399(X,Y) get_gdat_uint((X),(Y),399)
+#define get_gdat_ullong_pos399(X,Y) get_gdat_ullong((X),(Y),399)
+#define get_gdat_ip_pos399(X,Y) get_gdat_ip((X),(Y),399)
+#define get_gdat_ipv6_pos399(X,Y) get_gdat_ipv6((X),(Y),399)
+#define get_gdat_string_pos399(X,Y) get_gdat_string((X),(Y),399)
+#define get_gdat_v_str_pos399(X,Y) get_gdat_string((X),(Y),399)
+#define get_gdat_bool_pos399(X,Y) get_gdat_bool((X),(Y),399)
+#define get_gdat_int_pos399(X,Y) get_gdat_int((X),(Y),399)
+#define get_gdat_llong_pos399(X,Y) get_gdat_llong((X),(Y),399)
+#define get_gdat_float_pos399(X,Y) get_gdat_float((X),(Y),399)
+#define get_gdat_uint_pos400(X,Y) get_gdat_uint((X),(Y),400)
+#define get_gdat_ullong_pos400(X,Y) get_gdat_ullong((X),(Y),400)
+#define get_gdat_ip_pos400(X,Y) get_gdat_ip((X),(Y),400)
+#define get_gdat_ipv6_pos400(X,Y) get_gdat_ipv6((X),(Y),400)
+#define get_gdat_string_pos400(X,Y) get_gdat_string((X),(Y),400)
+#define get_gdat_v_str_pos400(X,Y) get_gdat_string((X),(Y),400)
+#define get_gdat_bool_pos400(X,Y) get_gdat_bool((X),(Y),400)
+#define get_gdat_int_pos400(X,Y) get_gdat_int((X),(Y),400)
+#define get_gdat_llong_pos400(X,Y) get_gdat_llong((X),(Y),400)
+#define get_gdat_float_pos400(X,Y) get_gdat_float((X),(Y),400)
+#define get_gdat_uint_pos401(X,Y) get_gdat_uint((X),(Y),401)
+#define get_gdat_ullong_pos401(X,Y) get_gdat_ullong((X),(Y),401)
+#define get_gdat_ip_pos401(X,Y) get_gdat_ip((X),(Y),401)
+#define get_gdat_ipv6_pos401(X,Y) get_gdat_ipv6((X),(Y),401)
+#define get_gdat_string_pos401(X,Y) get_gdat_string((X),(Y),401)
+#define get_gdat_v_str_pos401(X,Y) get_gdat_string((X),(Y),401)
+#define get_gdat_bool_pos401(X,Y) get_gdat_bool((X),(Y),401)
+#define get_gdat_int_pos401(X,Y) get_gdat_int((X),(Y),401)
+#define get_gdat_llong_pos401(X,Y) get_gdat_llong((X),(Y),401)
+#define get_gdat_float_pos401(X,Y) get_gdat_float((X),(Y),401)
+#define get_gdat_uint_pos402(X,Y) get_gdat_uint((X),(Y),402)
+#define get_gdat_ullong_pos402(X,Y) get_gdat_ullong((X),(Y),402)
+#define get_gdat_ip_pos402(X,Y) get_gdat_ip((X),(Y),402)
+#define get_gdat_ipv6_pos402(X,Y) get_gdat_ipv6((X),(Y),402)
+#define get_gdat_string_pos402(X,Y) get_gdat_string((X),(Y),402)
+#define get_gdat_v_str_pos402(X,Y) get_gdat_string((X),(Y),402)
+#define get_gdat_bool_pos402(X,Y) get_gdat_bool((X),(Y),402)
+#define get_gdat_int_pos402(X,Y) get_gdat_int((X),(Y),402)
+#define get_gdat_llong_pos402(X,Y) get_gdat_llong((X),(Y),402)
+#define get_gdat_float_pos402(X,Y) get_gdat_float((X),(Y),402)
+#define get_gdat_uint_pos403(X,Y) get_gdat_uint((X),(Y),403)
+#define get_gdat_ullong_pos403(X,Y) get_gdat_ullong((X),(Y),403)
+#define get_gdat_ip_pos403(X,Y) get_gdat_ip((X),(Y),403)
+#define get_gdat_ipv6_pos403(X,Y) get_gdat_ipv6((X),(Y),403)
+#define get_gdat_string_pos403(X,Y) get_gdat_string((X),(Y),403)
+#define get_gdat_v_str_pos403(X,Y) get_gdat_string((X),(Y),403)
+#define get_gdat_bool_pos403(X,Y) get_gdat_bool((X),(Y),403)
+#define get_gdat_int_pos403(X,Y) get_gdat_int((X),(Y),403)
+#define get_gdat_llong_pos403(X,Y) get_gdat_llong((X),(Y),403)
+#define get_gdat_float_pos403(X,Y) get_gdat_float((X),(Y),403)
+#define get_gdat_uint_pos404(X,Y) get_gdat_uint((X),(Y),404)
+#define get_gdat_ullong_pos404(X,Y) get_gdat_ullong((X),(Y),404)
+#define get_gdat_ip_pos404(X,Y) get_gdat_ip((X),(Y),404)
+#define get_gdat_ipv6_pos404(X,Y) get_gdat_ipv6((X),(Y),404)
+#define get_gdat_string_pos404(X,Y) get_gdat_string((X),(Y),404)
+#define get_gdat_v_str_pos404(X,Y) get_gdat_string((X),(Y),404)
+#define get_gdat_bool_pos404(X,Y) get_gdat_bool((X),(Y),404)
+#define get_gdat_int_pos404(X,Y) get_gdat_int((X),(Y),404)
+#define get_gdat_llong_pos404(X,Y) get_gdat_llong((X),(Y),404)
+#define get_gdat_float_pos404(X,Y) get_gdat_float((X),(Y),404)
+#define get_gdat_uint_pos405(X,Y) get_gdat_uint((X),(Y),405)
+#define get_gdat_ullong_pos405(X,Y) get_gdat_ullong((X),(Y),405)
+#define get_gdat_ip_pos405(X,Y) get_gdat_ip((X),(Y),405)
+#define get_gdat_ipv6_pos405(X,Y) get_gdat_ipv6((X),(Y),405)
+#define get_gdat_string_pos405(X,Y) get_gdat_string((X),(Y),405)
+#define get_gdat_v_str_pos405(X,Y) get_gdat_string((X),(Y),405)
+#define get_gdat_bool_pos405(X,Y) get_gdat_bool((X),(Y),405)
+#define get_gdat_int_pos405(X,Y) get_gdat_int((X),(Y),405)
+#define get_gdat_llong_pos405(X,Y) get_gdat_llong((X),(Y),405)
+#define get_gdat_float_pos405(X,Y) get_gdat_float((X),(Y),405)
+#define get_gdat_uint_pos406(X,Y) get_gdat_uint((X),(Y),406)
+#define get_gdat_ullong_pos406(X,Y) get_gdat_ullong((X),(Y),406)
+#define get_gdat_ip_pos406(X,Y) get_gdat_ip((X),(Y),406)
+#define get_gdat_ipv6_pos406(X,Y) get_gdat_ipv6((X),(Y),406)
+#define get_gdat_string_pos406(X,Y) get_gdat_string((X),(Y),406)
+#define get_gdat_v_str_pos406(X,Y) get_gdat_string((X),(Y),406)
+#define get_gdat_bool_pos406(X,Y) get_gdat_bool((X),(Y),406)
+#define get_gdat_int_pos406(X,Y) get_gdat_int((X),(Y),406)
+#define get_gdat_llong_pos406(X,Y) get_gdat_llong((X),(Y),406)
+#define get_gdat_float_pos406(X,Y) get_gdat_float((X),(Y),406)
+#define get_gdat_uint_pos407(X,Y) get_gdat_uint((X),(Y),407)
+#define get_gdat_ullong_pos407(X,Y) get_gdat_ullong((X),(Y),407)
+#define get_gdat_ip_pos407(X,Y) get_gdat_ip((X),(Y),407)
+#define get_gdat_ipv6_pos407(X,Y) get_gdat_ipv6((X),(Y),407)
+#define get_gdat_string_pos407(X,Y) get_gdat_string((X),(Y),407)
+#define get_gdat_v_str_pos407(X,Y) get_gdat_string((X),(Y),407)
+#define get_gdat_bool_pos407(X,Y) get_gdat_bool((X),(Y),407)
+#define get_gdat_int_pos407(X,Y) get_gdat_int((X),(Y),407)
+#define get_gdat_llong_pos407(X,Y) get_gdat_llong((X),(Y),407)
+#define get_gdat_float_pos407(X,Y) get_gdat_float((X),(Y),407)
+#define get_gdat_uint_pos408(X,Y) get_gdat_uint((X),(Y),408)
+#define get_gdat_ullong_pos408(X,Y) get_gdat_ullong((X),(Y),408)
+#define get_gdat_ip_pos408(X,Y) get_gdat_ip((X),(Y),408)
+#define get_gdat_ipv6_pos408(X,Y) get_gdat_ipv6((X),(Y),408)
+#define get_gdat_string_pos408(X,Y) get_gdat_string((X),(Y),408)
+#define get_gdat_v_str_pos408(X,Y) get_gdat_string((X),(Y),408)
+#define get_gdat_bool_pos408(X,Y) get_gdat_bool((X),(Y),408)
+#define get_gdat_int_pos408(X,Y) get_gdat_int((X),(Y),408)
+#define get_gdat_llong_pos408(X,Y) get_gdat_llong((X),(Y),408)
+#define get_gdat_float_pos408(X,Y) get_gdat_float((X),(Y),408)
+#define get_gdat_uint_pos409(X,Y) get_gdat_uint((X),(Y),409)
+#define get_gdat_ullong_pos409(X,Y) get_gdat_ullong((X),(Y),409)
+#define get_gdat_ip_pos409(X,Y) get_gdat_ip((X),(Y),409)
+#define get_gdat_ipv6_pos409(X,Y) get_gdat_ipv6((X),(Y),409)
+#define get_gdat_string_pos409(X,Y) get_gdat_string((X),(Y),409)
+#define get_gdat_v_str_pos409(X,Y) get_gdat_string((X),(Y),409)
+#define get_gdat_bool_pos409(X,Y) get_gdat_bool((X),(Y),409)
+#define get_gdat_int_pos409(X,Y) get_gdat_int((X),(Y),409)
+#define get_gdat_llong_pos409(X,Y) get_gdat_llong((X),(Y),409)
+#define get_gdat_float_pos409(X,Y) get_gdat_float((X),(Y),409)
+#define get_gdat_uint_pos410(X,Y) get_gdat_uint((X),(Y),410)
+#define get_gdat_ullong_pos410(X,Y) get_gdat_ullong((X),(Y),410)
+#define get_gdat_ip_pos410(X,Y) get_gdat_ip((X),(Y),410)
+#define get_gdat_ipv6_pos410(X,Y) get_gdat_ipv6((X),(Y),410)
+#define get_gdat_string_pos410(X,Y) get_gdat_string((X),(Y),410)
+#define get_gdat_v_str_pos410(X,Y) get_gdat_string((X),(Y),410)
+#define get_gdat_bool_pos410(X,Y) get_gdat_bool((X),(Y),410)
+#define get_gdat_int_pos410(X,Y) get_gdat_int((X),(Y),410)
+#define get_gdat_llong_pos410(X,Y) get_gdat_llong((X),(Y),410)
+#define get_gdat_float_pos410(X,Y) get_gdat_float((X),(Y),410)
+#define get_gdat_uint_pos411(X,Y) get_gdat_uint((X),(Y),411)
+#define get_gdat_ullong_pos411(X,Y) get_gdat_ullong((X),(Y),411)
+#define get_gdat_ip_pos411(X,Y) get_gdat_ip((X),(Y),411)
+#define get_gdat_ipv6_pos411(X,Y) get_gdat_ipv6((X),(Y),411)
+#define get_gdat_string_pos411(X,Y) get_gdat_string((X),(Y),411)
+#define get_gdat_v_str_pos411(X,Y) get_gdat_string((X),(Y),411)
+#define get_gdat_bool_pos411(X,Y) get_gdat_bool((X),(Y),411)
+#define get_gdat_int_pos411(X,Y) get_gdat_int((X),(Y),411)
+#define get_gdat_llong_pos411(X,Y) get_gdat_llong((X),(Y),411)
+#define get_gdat_float_pos411(X,Y) get_gdat_float((X),(Y),411)
+#define get_gdat_uint_pos412(X,Y) get_gdat_uint((X),(Y),412)
+#define get_gdat_ullong_pos412(X,Y) get_gdat_ullong((X),(Y),412)
+#define get_gdat_ip_pos412(X,Y) get_gdat_ip((X),(Y),412)
+#define get_gdat_ipv6_pos412(X,Y) get_gdat_ipv6((X),(Y),412)
+#define get_gdat_string_pos412(X,Y) get_gdat_string((X),(Y),412)
+#define get_gdat_v_str_pos412(X,Y) get_gdat_string((X),(Y),412)
+#define get_gdat_bool_pos412(X,Y) get_gdat_bool((X),(Y),412)
+#define get_gdat_int_pos412(X,Y) get_gdat_int((X),(Y),412)
+#define get_gdat_llong_pos412(X,Y) get_gdat_llong((X),(Y),412)
+#define get_gdat_float_pos412(X,Y) get_gdat_float((X),(Y),412)
+#define get_gdat_uint_pos413(X,Y) get_gdat_uint((X),(Y),413)
+#define get_gdat_ullong_pos413(X,Y) get_gdat_ullong((X),(Y),413)
+#define get_gdat_ip_pos413(X,Y) get_gdat_ip((X),(Y),413)
+#define get_gdat_ipv6_pos413(X,Y) get_gdat_ipv6((X),(Y),413)
+#define get_gdat_string_pos413(X,Y) get_gdat_string((X),(Y),413)
+#define get_gdat_v_str_pos413(X,Y) get_gdat_string((X),(Y),413)
+#define get_gdat_bool_pos413(X,Y) get_gdat_bool((X),(Y),413)
+#define get_gdat_int_pos413(X,Y) get_gdat_int((X),(Y),413)
+#define get_gdat_llong_pos413(X,Y) get_gdat_llong((X),(Y),413)
+#define get_gdat_float_pos413(X,Y) get_gdat_float((X),(Y),413)
+#define get_gdat_uint_pos414(X,Y) get_gdat_uint((X),(Y),414)
+#define get_gdat_ullong_pos414(X,Y) get_gdat_ullong((X),(Y),414)
+#define get_gdat_ip_pos414(X,Y) get_gdat_ip((X),(Y),414)
+#define get_gdat_ipv6_pos414(X,Y) get_gdat_ipv6((X),(Y),414)
+#define get_gdat_string_pos414(X,Y) get_gdat_string((X),(Y),414)
+#define get_gdat_v_str_pos414(X,Y) get_gdat_string((X),(Y),414)
+#define get_gdat_bool_pos414(X,Y) get_gdat_bool((X),(Y),414)
+#define get_gdat_int_pos414(X,Y) get_gdat_int((X),(Y),414)
+#define get_gdat_llong_pos414(X,Y) get_gdat_llong((X),(Y),414)
+#define get_gdat_float_pos414(X,Y) get_gdat_float((X),(Y),414)
+#define get_gdat_uint_pos415(X,Y) get_gdat_uint((X),(Y),415)
+#define get_gdat_ullong_pos415(X,Y) get_gdat_ullong((X),(Y),415)
+#define get_gdat_ip_pos415(X,Y) get_gdat_ip((X),(Y),415)
+#define get_gdat_ipv6_pos415(X,Y) get_gdat_ipv6((X),(Y),415)
+#define get_gdat_string_pos415(X,Y) get_gdat_string((X),(Y),415)
+#define get_gdat_v_str_pos415(X,Y) get_gdat_string((X),(Y),415)
+#define get_gdat_bool_pos415(X,Y) get_gdat_bool((X),(Y),415)
+#define get_gdat_int_pos415(X,Y) get_gdat_int((X),(Y),415)
+#define get_gdat_llong_pos415(X,Y) get_gdat_llong((X),(Y),415)
+#define get_gdat_float_pos415(X,Y) get_gdat_float((X),(Y),415)
+#define get_gdat_uint_pos416(X,Y) get_gdat_uint((X),(Y),416)
+#define get_gdat_ullong_pos416(X,Y) get_gdat_ullong((X),(Y),416)
+#define get_gdat_ip_pos416(X,Y) get_gdat_ip((X),(Y),416)
+#define get_gdat_ipv6_pos416(X,Y) get_gdat_ipv6((X),(Y),416)
+#define get_gdat_string_pos416(X,Y) get_gdat_string((X),(Y),416)
+#define get_gdat_v_str_pos416(X,Y) get_gdat_string((X),(Y),416)
+#define get_gdat_bool_pos416(X,Y) get_gdat_bool((X),(Y),416)
+#define get_gdat_int_pos416(X,Y) get_gdat_int((X),(Y),416)
+#define get_gdat_llong_pos416(X,Y) get_gdat_llong((X),(Y),416)
+#define get_gdat_float_pos416(X,Y) get_gdat_float((X),(Y),416)
+#define get_gdat_uint_pos417(X,Y) get_gdat_uint((X),(Y),417)
+#define get_gdat_ullong_pos417(X,Y) get_gdat_ullong((X),(Y),417)
+#define get_gdat_ip_pos417(X,Y) get_gdat_ip((X),(Y),417)
+#define get_gdat_ipv6_pos417(X,Y) get_gdat_ipv6((X),(Y),417)
+#define get_gdat_string_pos417(X,Y) get_gdat_string((X),(Y),417)
+#define get_gdat_v_str_pos417(X,Y) get_gdat_string((X),(Y),417)
+#define get_gdat_bool_pos417(X,Y) get_gdat_bool((X),(Y),417)
+#define get_gdat_int_pos417(X,Y) get_gdat_int((X),(Y),417)
+#define get_gdat_llong_pos417(X,Y) get_gdat_llong((X),(Y),417)
+#define get_gdat_float_pos417(X,Y) get_gdat_float((X),(Y),417)
+#define get_gdat_uint_pos418(X,Y) get_gdat_uint((X),(Y),418)
+#define get_gdat_ullong_pos418(X,Y) get_gdat_ullong((X),(Y),418)
+#define get_gdat_ip_pos418(X,Y) get_gdat_ip((X),(Y),418)
+#define get_gdat_ipv6_pos418(X,Y) get_gdat_ipv6((X),(Y),418)
+#define get_gdat_string_pos418(X,Y) get_gdat_string((X),(Y),418)
+#define get_gdat_v_str_pos418(X,Y) get_gdat_string((X),(Y),418)
+#define get_gdat_bool_pos418(X,Y) get_gdat_bool((X),(Y),418)
+#define get_gdat_int_pos418(X,Y) get_gdat_int((X),(Y),418)
+#define get_gdat_llong_pos418(X,Y) get_gdat_llong((X),(Y),418)
+#define get_gdat_float_pos418(X,Y) get_gdat_float((X),(Y),418)
+#define get_gdat_uint_pos419(X,Y) get_gdat_uint((X),(Y),419)
+#define get_gdat_ullong_pos419(X,Y) get_gdat_ullong((X),(Y),419)
+#define get_gdat_ip_pos419(X,Y) get_gdat_ip((X),(Y),419)
+#define get_gdat_ipv6_pos419(X,Y) get_gdat_ipv6((X),(Y),419)
+#define get_gdat_string_pos419(X,Y) get_gdat_string((X),(Y),419)
+#define get_gdat_v_str_pos419(X,Y) get_gdat_string((X),(Y),419)
+#define get_gdat_bool_pos419(X,Y) get_gdat_bool((X),(Y),419)
+#define get_gdat_int_pos419(X,Y) get_gdat_int((X),(Y),419)
+#define get_gdat_llong_pos419(X,Y) get_gdat_llong((X),(Y),419)
+#define get_gdat_float_pos419(X,Y) get_gdat_float((X),(Y),419)
+#define get_gdat_uint_pos420(X,Y) get_gdat_uint((X),(Y),420)
+#define get_gdat_ullong_pos420(X,Y) get_gdat_ullong((X),(Y),420)
+#define get_gdat_ip_pos420(X,Y) get_gdat_ip((X),(Y),420)
+#define get_gdat_ipv6_pos420(X,Y) get_gdat_ipv6((X),(Y),420)
+#define get_gdat_string_pos420(X,Y) get_gdat_string((X),(Y),420)
+#define get_gdat_v_str_pos420(X,Y) get_gdat_string((X),(Y),420)
+#define get_gdat_bool_pos420(X,Y) get_gdat_bool((X),(Y),420)
+#define get_gdat_int_pos420(X,Y) get_gdat_int((X),(Y),420)
+#define get_gdat_llong_pos420(X,Y) get_gdat_llong((X),(Y),420)
+#define get_gdat_float_pos420(X,Y) get_gdat_float((X),(Y),420)
+#define get_gdat_uint_pos421(X,Y) get_gdat_uint((X),(Y),421)
+#define get_gdat_ullong_pos421(X,Y) get_gdat_ullong((X),(Y),421)
+#define get_gdat_ip_pos421(X,Y) get_gdat_ip((X),(Y),421)
+#define get_gdat_ipv6_pos421(X,Y) get_gdat_ipv6((X),(Y),421)
+#define get_gdat_string_pos421(X,Y) get_gdat_string((X),(Y),421)
+#define get_gdat_v_str_pos421(X,Y) get_gdat_string((X),(Y),421)
+#define get_gdat_bool_pos421(X,Y) get_gdat_bool((X),(Y),421)
+#define get_gdat_int_pos421(X,Y) get_gdat_int((X),(Y),421)
+#define get_gdat_llong_pos421(X,Y) get_gdat_llong((X),(Y),421)
+#define get_gdat_float_pos421(X,Y) get_gdat_float((X),(Y),421)
+#define get_gdat_uint_pos422(X,Y) get_gdat_uint((X),(Y),422)
+#define get_gdat_ullong_pos422(X,Y) get_gdat_ullong((X),(Y),422)
+#define get_gdat_ip_pos422(X,Y) get_gdat_ip((X),(Y),422)
+#define get_gdat_ipv6_pos422(X,Y) get_gdat_ipv6((X),(Y),422)
+#define get_gdat_string_pos422(X,Y) get_gdat_string((X),(Y),422)
+#define get_gdat_v_str_pos422(X,Y) get_gdat_string((X),(Y),422)
+#define get_gdat_bool_pos422(X,Y) get_gdat_bool((X),(Y),422)
+#define get_gdat_int_pos422(X,Y) get_gdat_int((X),(Y),422)
+#define get_gdat_llong_pos422(X,Y) get_gdat_llong((X),(Y),422)
+#define get_gdat_float_pos422(X,Y) get_gdat_float((X),(Y),422)
+#define get_gdat_uint_pos423(X,Y) get_gdat_uint((X),(Y),423)
+#define get_gdat_ullong_pos423(X,Y) get_gdat_ullong((X),(Y),423)
+#define get_gdat_ip_pos423(X,Y) get_gdat_ip((X),(Y),423)
+#define get_gdat_ipv6_pos423(X,Y) get_gdat_ipv6((X),(Y),423)
+#define get_gdat_string_pos423(X,Y) get_gdat_string((X),(Y),423)
+#define get_gdat_v_str_pos423(X,Y) get_gdat_string((X),(Y),423)
+#define get_gdat_bool_pos423(X,Y) get_gdat_bool((X),(Y),423)
+#define get_gdat_int_pos423(X,Y) get_gdat_int((X),(Y),423)
+#define get_gdat_llong_pos423(X,Y) get_gdat_llong((X),(Y),423)
+#define get_gdat_float_pos423(X,Y) get_gdat_float((X),(Y),423)
+#define get_gdat_uint_pos424(X,Y) get_gdat_uint((X),(Y),424)
+#define get_gdat_ullong_pos424(X,Y) get_gdat_ullong((X),(Y),424)
+#define get_gdat_ip_pos424(X,Y) get_gdat_ip((X),(Y),424)
+#define get_gdat_ipv6_pos424(X,Y) get_gdat_ipv6((X),(Y),424)
+#define get_gdat_string_pos424(X,Y) get_gdat_string((X),(Y),424)
+#define get_gdat_v_str_pos424(X,Y) get_gdat_string((X),(Y),424)
+#define get_gdat_bool_pos424(X,Y) get_gdat_bool((X),(Y),424)
+#define get_gdat_int_pos424(X,Y) get_gdat_int((X),(Y),424)
+#define get_gdat_llong_pos424(X,Y) get_gdat_llong((X),(Y),424)
+#define get_gdat_float_pos424(X,Y) get_gdat_float((X),(Y),424)
+#define get_gdat_uint_pos425(X,Y) get_gdat_uint((X),(Y),425)
+#define get_gdat_ullong_pos425(X,Y) get_gdat_ullong((X),(Y),425)
+#define get_gdat_ip_pos425(X,Y) get_gdat_ip((X),(Y),425)
+#define get_gdat_ipv6_pos425(X,Y) get_gdat_ipv6((X),(Y),425)
+#define get_gdat_string_pos425(X,Y) get_gdat_string((X),(Y),425)
+#define get_gdat_v_str_pos425(X,Y) get_gdat_string((X),(Y),425)
+#define get_gdat_bool_pos425(X,Y) get_gdat_bool((X),(Y),425)
+#define get_gdat_int_pos425(X,Y) get_gdat_int((X),(Y),425)
+#define get_gdat_llong_pos425(X,Y) get_gdat_llong((X),(Y),425)
+#define get_gdat_float_pos425(X,Y) get_gdat_float((X),(Y),425)
+#define get_gdat_uint_pos426(X,Y) get_gdat_uint((X),(Y),426)
+#define get_gdat_ullong_pos426(X,Y) get_gdat_ullong((X),(Y),426)
+#define get_gdat_ip_pos426(X,Y) get_gdat_ip((X),(Y),426)
+#define get_gdat_ipv6_pos426(X,Y) get_gdat_ipv6((X),(Y),426)
+#define get_gdat_string_pos426(X,Y) get_gdat_string((X),(Y),426)
+#define get_gdat_v_str_pos426(X,Y) get_gdat_string((X),(Y),426)
+#define get_gdat_bool_pos426(X,Y) get_gdat_bool((X),(Y),426)
+#define get_gdat_int_pos426(X,Y) get_gdat_int((X),(Y),426)
+#define get_gdat_llong_pos426(X,Y) get_gdat_llong((X),(Y),426)
+#define get_gdat_float_pos426(X,Y) get_gdat_float((X),(Y),426)
+#define get_gdat_uint_pos427(X,Y) get_gdat_uint((X),(Y),427)
+#define get_gdat_ullong_pos427(X,Y) get_gdat_ullong((X),(Y),427)
+#define get_gdat_ip_pos427(X,Y) get_gdat_ip((X),(Y),427)
+#define get_gdat_ipv6_pos427(X,Y) get_gdat_ipv6((X),(Y),427)
+#define get_gdat_string_pos427(X,Y) get_gdat_string((X),(Y),427)
+#define get_gdat_v_str_pos427(X,Y) get_gdat_string((X),(Y),427)
+#define get_gdat_bool_pos427(X,Y) get_gdat_bool((X),(Y),427)
+#define get_gdat_int_pos427(X,Y) get_gdat_int((X),(Y),427)
+#define get_gdat_llong_pos427(X,Y) get_gdat_llong((X),(Y),427)
+#define get_gdat_float_pos427(X,Y) get_gdat_float((X),(Y),427)
+#define get_gdat_uint_pos428(X,Y) get_gdat_uint((X),(Y),428)
+#define get_gdat_ullong_pos428(X,Y) get_gdat_ullong((X),(Y),428)
+#define get_gdat_ip_pos428(X,Y) get_gdat_ip((X),(Y),428)
+#define get_gdat_ipv6_pos428(X,Y) get_gdat_ipv6((X),(Y),428)
+#define get_gdat_string_pos428(X,Y) get_gdat_string((X),(Y),428)
+#define get_gdat_v_str_pos428(X,Y) get_gdat_string((X),(Y),428)
+#define get_gdat_bool_pos428(X,Y) get_gdat_bool((X),(Y),428)
+#define get_gdat_int_pos428(X,Y) get_gdat_int((X),(Y),428)
+#define get_gdat_llong_pos428(X,Y) get_gdat_llong((X),(Y),428)
+#define get_gdat_float_pos428(X,Y) get_gdat_float((X),(Y),428)
+#define get_gdat_uint_pos429(X,Y) get_gdat_uint((X),(Y),429)
+#define get_gdat_ullong_pos429(X,Y) get_gdat_ullong((X),(Y),429)
+#define get_gdat_ip_pos429(X,Y) get_gdat_ip((X),(Y),429)
+#define get_gdat_ipv6_pos429(X,Y) get_gdat_ipv6((X),(Y),429)
+#define get_gdat_string_pos429(X,Y) get_gdat_string((X),(Y),429)
+#define get_gdat_v_str_pos429(X,Y) get_gdat_string((X),(Y),429)
+#define get_gdat_bool_pos429(X,Y) get_gdat_bool((X),(Y),429)
+#define get_gdat_int_pos429(X,Y) get_gdat_int((X),(Y),429)
+#define get_gdat_llong_pos429(X,Y) get_gdat_llong((X),(Y),429)
+#define get_gdat_float_pos429(X,Y) get_gdat_float((X),(Y),429)
+#define get_gdat_uint_pos430(X,Y) get_gdat_uint((X),(Y),430)
+#define get_gdat_ullong_pos430(X,Y) get_gdat_ullong((X),(Y),430)
+#define get_gdat_ip_pos430(X,Y) get_gdat_ip((X),(Y),430)
+#define get_gdat_ipv6_pos430(X,Y) get_gdat_ipv6((X),(Y),430)
+#define get_gdat_string_pos430(X,Y) get_gdat_string((X),(Y),430)
+#define get_gdat_v_str_pos430(X,Y) get_gdat_string((X),(Y),430)
+#define get_gdat_bool_pos430(X,Y) get_gdat_bool((X),(Y),430)
+#define get_gdat_int_pos430(X,Y) get_gdat_int((X),(Y),430)
+#define get_gdat_llong_pos430(X,Y) get_gdat_llong((X),(Y),430)
+#define get_gdat_float_pos430(X,Y) get_gdat_float((X),(Y),430)
+#define get_gdat_uint_pos431(X,Y) get_gdat_uint((X),(Y),431)
+#define get_gdat_ullong_pos431(X,Y) get_gdat_ullong((X),(Y),431)
+#define get_gdat_ip_pos431(X,Y) get_gdat_ip((X),(Y),431)
+#define get_gdat_ipv6_pos431(X,Y) get_gdat_ipv6((X),(Y),431)
+#define get_gdat_string_pos431(X,Y) get_gdat_string((X),(Y),431)
+#define get_gdat_v_str_pos431(X,Y) get_gdat_string((X),(Y),431)
+#define get_gdat_bool_pos431(X,Y) get_gdat_bool((X),(Y),431)
+#define get_gdat_int_pos431(X,Y) get_gdat_int((X),(Y),431)
+#define get_gdat_llong_pos431(X,Y) get_gdat_llong((X),(Y),431)
+#define get_gdat_float_pos431(X,Y) get_gdat_float((X),(Y),431)
+#define get_gdat_uint_pos432(X,Y) get_gdat_uint((X),(Y),432)
+#define get_gdat_ullong_pos432(X,Y) get_gdat_ullong((X),(Y),432)
+#define get_gdat_ip_pos432(X,Y) get_gdat_ip((X),(Y),432)
+#define get_gdat_ipv6_pos432(X,Y) get_gdat_ipv6((X),(Y),432)
+#define get_gdat_string_pos432(X,Y) get_gdat_string((X),(Y),432)
+#define get_gdat_v_str_pos432(X,Y) get_gdat_string((X),(Y),432)
+#define get_gdat_bool_pos432(X,Y) get_gdat_bool((X),(Y),432)
+#define get_gdat_int_pos432(X,Y) get_gdat_int((X),(Y),432)
+#define get_gdat_llong_pos432(X,Y) get_gdat_llong((X),(Y),432)
+#define get_gdat_float_pos432(X,Y) get_gdat_float((X),(Y),432)
+#define get_gdat_uint_pos433(X,Y) get_gdat_uint((X),(Y),433)
+#define get_gdat_ullong_pos433(X,Y) get_gdat_ullong((X),(Y),433)
+#define get_gdat_ip_pos433(X,Y) get_gdat_ip((X),(Y),433)
+#define get_gdat_ipv6_pos433(X,Y) get_gdat_ipv6((X),(Y),433)
+#define get_gdat_string_pos433(X,Y) get_gdat_string((X),(Y),433)
+#define get_gdat_v_str_pos433(X,Y) get_gdat_string((X),(Y),433)
+#define get_gdat_bool_pos433(X,Y) get_gdat_bool((X),(Y),433)
+#define get_gdat_int_pos433(X,Y) get_gdat_int((X),(Y),433)
+#define get_gdat_llong_pos433(X,Y) get_gdat_llong((X),(Y),433)
+#define get_gdat_float_pos433(X,Y) get_gdat_float((X),(Y),433)
+#define get_gdat_uint_pos434(X,Y) get_gdat_uint((X),(Y),434)
+#define get_gdat_ullong_pos434(X,Y) get_gdat_ullong((X),(Y),434)
+#define get_gdat_ip_pos434(X,Y) get_gdat_ip((X),(Y),434)
+#define get_gdat_ipv6_pos434(X,Y) get_gdat_ipv6((X),(Y),434)
+#define get_gdat_string_pos434(X,Y) get_gdat_string((X),(Y),434)
+#define get_gdat_v_str_pos434(X,Y) get_gdat_string((X),(Y),434)
+#define get_gdat_bool_pos434(X,Y) get_gdat_bool((X),(Y),434)
+#define get_gdat_int_pos434(X,Y) get_gdat_int((X),(Y),434)
+#define get_gdat_llong_pos434(X,Y) get_gdat_llong((X),(Y),434)
+#define get_gdat_float_pos434(X,Y) get_gdat_float((X),(Y),434)
+#define get_gdat_uint_pos435(X,Y) get_gdat_uint((X),(Y),435)
+#define get_gdat_ullong_pos435(X,Y) get_gdat_ullong((X),(Y),435)
+#define get_gdat_ip_pos435(X,Y) get_gdat_ip((X),(Y),435)
+#define get_gdat_ipv6_pos435(X,Y) get_gdat_ipv6((X),(Y),435)
+#define get_gdat_string_pos435(X,Y) get_gdat_string((X),(Y),435)
+#define get_gdat_v_str_pos435(X,Y) get_gdat_string((X),(Y),435)
+#define get_gdat_bool_pos435(X,Y) get_gdat_bool((X),(Y),435)
+#define get_gdat_int_pos435(X,Y) get_gdat_int((X),(Y),435)
+#define get_gdat_llong_pos435(X,Y) get_gdat_llong((X),(Y),435)
+#define get_gdat_float_pos435(X,Y) get_gdat_float((X),(Y),435)
+#define get_gdat_uint_pos436(X,Y) get_gdat_uint((X),(Y),436)
+#define get_gdat_ullong_pos436(X,Y) get_gdat_ullong((X),(Y),436)
+#define get_gdat_ip_pos436(X,Y) get_gdat_ip((X),(Y),436)
+#define get_gdat_ipv6_pos436(X,Y) get_gdat_ipv6((X),(Y),436)
+#define get_gdat_string_pos436(X,Y) get_gdat_string((X),(Y),436)
+#define get_gdat_v_str_pos436(X,Y) get_gdat_string((X),(Y),436)
+#define get_gdat_bool_pos436(X,Y) get_gdat_bool((X),(Y),436)
+#define get_gdat_int_pos436(X,Y) get_gdat_int((X),(Y),436)
+#define get_gdat_llong_pos436(X,Y) get_gdat_llong((X),(Y),436)
+#define get_gdat_float_pos436(X,Y) get_gdat_float((X),(Y),436)
+#define get_gdat_uint_pos437(X,Y) get_gdat_uint((X),(Y),437)
+#define get_gdat_ullong_pos437(X,Y) get_gdat_ullong((X),(Y),437)
+#define get_gdat_ip_pos437(X,Y) get_gdat_ip((X),(Y),437)
+#define get_gdat_ipv6_pos437(X,Y) get_gdat_ipv6((X),(Y),437)
+#define get_gdat_string_pos437(X,Y) get_gdat_string((X),(Y),437)
+#define get_gdat_v_str_pos437(X,Y) get_gdat_string((X),(Y),437)
+#define get_gdat_bool_pos437(X,Y) get_gdat_bool((X),(Y),437)
+#define get_gdat_int_pos437(X,Y) get_gdat_int((X),(Y),437)
+#define get_gdat_llong_pos437(X,Y) get_gdat_llong((X),(Y),437)
+#define get_gdat_float_pos437(X,Y) get_gdat_float((X),(Y),437)
+#define get_gdat_uint_pos438(X,Y) get_gdat_uint((X),(Y),438)
+#define get_gdat_ullong_pos438(X,Y) get_gdat_ullong((X),(Y),438)
+#define get_gdat_ip_pos438(X,Y) get_gdat_ip((X),(Y),438)
+#define get_gdat_ipv6_pos438(X,Y) get_gdat_ipv6((X),(Y),438)
+#define get_gdat_string_pos438(X,Y) get_gdat_string((X),(Y),438)
+#define get_gdat_v_str_pos438(X,Y) get_gdat_string((X),(Y),438)
+#define get_gdat_bool_pos438(X,Y) get_gdat_bool((X),(Y),438)
+#define get_gdat_int_pos438(X,Y) get_gdat_int((X),(Y),438)
+#define get_gdat_llong_pos438(X,Y) get_gdat_llong((X),(Y),438)
+#define get_gdat_float_pos438(X,Y) get_gdat_float((X),(Y),438)
+#define get_gdat_uint_pos439(X,Y) get_gdat_uint((X),(Y),439)
+#define get_gdat_ullong_pos439(X,Y) get_gdat_ullong((X),(Y),439)
+#define get_gdat_ip_pos439(X,Y) get_gdat_ip((X),(Y),439)
+#define get_gdat_ipv6_pos439(X,Y) get_gdat_ipv6((X),(Y),439)
+#define get_gdat_string_pos439(X,Y) get_gdat_string((X),(Y),439)
+#define get_gdat_v_str_pos439(X,Y) get_gdat_string((X),(Y),439)
+#define get_gdat_bool_pos439(X,Y) get_gdat_bool((X),(Y),439)
+#define get_gdat_int_pos439(X,Y) get_gdat_int((X),(Y),439)
+#define get_gdat_llong_pos439(X,Y) get_gdat_llong((X),(Y),439)
+#define get_gdat_float_pos439(X,Y) get_gdat_float((X),(Y),439)
+#define get_gdat_uint_pos440(X,Y) get_gdat_uint((X),(Y),440)
+#define get_gdat_ullong_pos440(X,Y) get_gdat_ullong((X),(Y),440)
+#define get_gdat_ip_pos440(X,Y) get_gdat_ip((X),(Y),440)
+#define get_gdat_ipv6_pos440(X,Y) get_gdat_ipv6((X),(Y),440)
+#define get_gdat_string_pos440(X,Y) get_gdat_string((X),(Y),440)
+#define get_gdat_v_str_pos440(X,Y) get_gdat_string((X),(Y),440)
+#define get_gdat_bool_pos440(X,Y) get_gdat_bool((X),(Y),440)
+#define get_gdat_int_pos440(X,Y) get_gdat_int((X),(Y),440)
+#define get_gdat_llong_pos440(X,Y) get_gdat_llong((X),(Y),440)
+#define get_gdat_float_pos440(X,Y) get_gdat_float((X),(Y),440)
+#define get_gdat_uint_pos441(X,Y) get_gdat_uint((X),(Y),441)
+#define get_gdat_ullong_pos441(X,Y) get_gdat_ullong((X),(Y),441)
+#define get_gdat_ip_pos441(X,Y) get_gdat_ip((X),(Y),441)
+#define get_gdat_ipv6_pos441(X,Y) get_gdat_ipv6((X),(Y),441)
+#define get_gdat_string_pos441(X,Y) get_gdat_string((X),(Y),441)
+#define get_gdat_v_str_pos441(X,Y) get_gdat_string((X),(Y),441)
+#define get_gdat_bool_pos441(X,Y) get_gdat_bool((X),(Y),441)
+#define get_gdat_int_pos441(X,Y) get_gdat_int((X),(Y),441)
+#define get_gdat_llong_pos441(X,Y) get_gdat_llong((X),(Y),441)
+#define get_gdat_float_pos441(X,Y) get_gdat_float((X),(Y),441)
+#define get_gdat_uint_pos442(X,Y) get_gdat_uint((X),(Y),442)
+#define get_gdat_ullong_pos442(X,Y) get_gdat_ullong((X),(Y),442)
+#define get_gdat_ip_pos442(X,Y) get_gdat_ip((X),(Y),442)
+#define get_gdat_ipv6_pos442(X,Y) get_gdat_ipv6((X),(Y),442)
+#define get_gdat_string_pos442(X,Y) get_gdat_string((X),(Y),442)
+#define get_gdat_v_str_pos442(X,Y) get_gdat_string((X),(Y),442)
+#define get_gdat_bool_pos442(X,Y) get_gdat_bool((X),(Y),442)
+#define get_gdat_int_pos442(X,Y) get_gdat_int((X),(Y),442)
+#define get_gdat_llong_pos442(X,Y) get_gdat_llong((X),(Y),442)
+#define get_gdat_float_pos442(X,Y) get_gdat_float((X),(Y),442)
+#define get_gdat_uint_pos443(X,Y) get_gdat_uint((X),(Y),443)
+#define get_gdat_ullong_pos443(X,Y) get_gdat_ullong((X),(Y),443)
+#define get_gdat_ip_pos443(X,Y) get_gdat_ip((X),(Y),443)
+#define get_gdat_ipv6_pos443(X,Y) get_gdat_ipv6((X),(Y),443)
+#define get_gdat_string_pos443(X,Y) get_gdat_string((X),(Y),443)
+#define get_gdat_v_str_pos443(X,Y) get_gdat_string((X),(Y),443)
+#define get_gdat_bool_pos443(X,Y) get_gdat_bool((X),(Y),443)
+#define get_gdat_int_pos443(X,Y) get_gdat_int((X),(Y),443)
+#define get_gdat_llong_pos443(X,Y) get_gdat_llong((X),(Y),443)
+#define get_gdat_float_pos443(X,Y) get_gdat_float((X),(Y),443)
+#define get_gdat_uint_pos444(X,Y) get_gdat_uint((X),(Y),444)
+#define get_gdat_ullong_pos444(X,Y) get_gdat_ullong((X),(Y),444)
+#define get_gdat_ip_pos444(X,Y) get_gdat_ip((X),(Y),444)
+#define get_gdat_ipv6_pos444(X,Y) get_gdat_ipv6((X),(Y),444)
+#define get_gdat_string_pos444(X,Y) get_gdat_string((X),(Y),444)
+#define get_gdat_v_str_pos444(X,Y) get_gdat_string((X),(Y),444)
+#define get_gdat_bool_pos444(X,Y) get_gdat_bool((X),(Y),444)
+#define get_gdat_int_pos444(X,Y) get_gdat_int((X),(Y),444)
+#define get_gdat_llong_pos444(X,Y) get_gdat_llong((X),(Y),444)
+#define get_gdat_float_pos444(X,Y) get_gdat_float((X),(Y),444)
+#define get_gdat_uint_pos445(X,Y) get_gdat_uint((X),(Y),445)
+#define get_gdat_ullong_pos445(X,Y) get_gdat_ullong((X),(Y),445)
+#define get_gdat_ip_pos445(X,Y) get_gdat_ip((X),(Y),445)
+#define get_gdat_ipv6_pos445(X,Y) get_gdat_ipv6((X),(Y),445)
+#define get_gdat_string_pos445(X,Y) get_gdat_string((X),(Y),445)
+#define get_gdat_v_str_pos445(X,Y) get_gdat_string((X),(Y),445)
+#define get_gdat_bool_pos445(X,Y) get_gdat_bool((X),(Y),445)
+#define get_gdat_int_pos445(X,Y) get_gdat_int((X),(Y),445)
+#define get_gdat_llong_pos445(X,Y) get_gdat_llong((X),(Y),445)
+#define get_gdat_float_pos445(X,Y) get_gdat_float((X),(Y),445)
+#define get_gdat_uint_pos446(X,Y) get_gdat_uint((X),(Y),446)
+#define get_gdat_ullong_pos446(X,Y) get_gdat_ullong((X),(Y),446)
+#define get_gdat_ip_pos446(X,Y) get_gdat_ip((X),(Y),446)
+#define get_gdat_ipv6_pos446(X,Y) get_gdat_ipv6((X),(Y),446)
+#define get_gdat_string_pos446(X,Y) get_gdat_string((X),(Y),446)
+#define get_gdat_v_str_pos446(X,Y) get_gdat_string((X),(Y),446)
+#define get_gdat_bool_pos446(X,Y) get_gdat_bool((X),(Y),446)
+#define get_gdat_int_pos446(X,Y) get_gdat_int((X),(Y),446)
+#define get_gdat_llong_pos446(X,Y) get_gdat_llong((X),(Y),446)
+#define get_gdat_float_pos446(X,Y) get_gdat_float((X),(Y),446)
+#define get_gdat_uint_pos447(X,Y) get_gdat_uint((X),(Y),447)
+#define get_gdat_ullong_pos447(X,Y) get_gdat_ullong((X),(Y),447)
+#define get_gdat_ip_pos447(X,Y) get_gdat_ip((X),(Y),447)
+#define get_gdat_ipv6_pos447(X,Y) get_gdat_ipv6((X),(Y),447)
+#define get_gdat_string_pos447(X,Y) get_gdat_string((X),(Y),447)
+#define get_gdat_v_str_pos447(X,Y) get_gdat_string((X),(Y),447)
+#define get_gdat_bool_pos447(X,Y) get_gdat_bool((X),(Y),447)
+#define get_gdat_int_pos447(X,Y) get_gdat_int((X),(Y),447)
+#define get_gdat_llong_pos447(X,Y) get_gdat_llong((X),(Y),447)
+#define get_gdat_float_pos447(X,Y) get_gdat_float((X),(Y),447)
+#define get_gdat_uint_pos448(X,Y) get_gdat_uint((X),(Y),448)
+#define get_gdat_ullong_pos448(X,Y) get_gdat_ullong((X),(Y),448)
+#define get_gdat_ip_pos448(X,Y) get_gdat_ip((X),(Y),448)
+#define get_gdat_ipv6_pos448(X,Y) get_gdat_ipv6((X),(Y),448)
+#define get_gdat_string_pos448(X,Y) get_gdat_string((X),(Y),448)
+#define get_gdat_v_str_pos448(X,Y) get_gdat_string((X),(Y),448)
+#define get_gdat_bool_pos448(X,Y) get_gdat_bool((X),(Y),448)
+#define get_gdat_int_pos448(X,Y) get_gdat_int((X),(Y),448)
+#define get_gdat_llong_pos448(X,Y) get_gdat_llong((X),(Y),448)
+#define get_gdat_float_pos448(X,Y) get_gdat_float((X),(Y),448)
+#define get_gdat_uint_pos449(X,Y) get_gdat_uint((X),(Y),449)
+#define get_gdat_ullong_pos449(X,Y) get_gdat_ullong((X),(Y),449)
+#define get_gdat_ip_pos449(X,Y) get_gdat_ip((X),(Y),449)
+#define get_gdat_ipv6_pos449(X,Y) get_gdat_ipv6((X),(Y),449)
+#define get_gdat_string_pos449(X,Y) get_gdat_string((X),(Y),449)
+#define get_gdat_v_str_pos449(X,Y) get_gdat_string((X),(Y),449)
+#define get_gdat_bool_pos449(X,Y) get_gdat_bool((X),(Y),449)
+#define get_gdat_int_pos449(X,Y) get_gdat_int((X),(Y),449)
+#define get_gdat_llong_pos449(X,Y) get_gdat_llong((X),(Y),449)
+#define get_gdat_float_pos449(X,Y) get_gdat_float((X),(Y),449)
+#define get_gdat_uint_pos450(X,Y) get_gdat_uint((X),(Y),450)
+#define get_gdat_ullong_pos450(X,Y) get_gdat_ullong((X),(Y),450)
+#define get_gdat_ip_pos450(X,Y) get_gdat_ip((X),(Y),450)
+#define get_gdat_ipv6_pos450(X,Y) get_gdat_ipv6((X),(Y),450)
+#define get_gdat_string_pos450(X,Y) get_gdat_string((X),(Y),450)
+#define get_gdat_v_str_pos450(X,Y) get_gdat_string((X),(Y),450)
+#define get_gdat_bool_pos450(X,Y) get_gdat_bool((X),(Y),450)
+#define get_gdat_int_pos450(X,Y) get_gdat_int((X),(Y),450)
+#define get_gdat_llong_pos450(X,Y) get_gdat_llong((X),(Y),450)
+#define get_gdat_float_pos450(X,Y) get_gdat_float((X),(Y),450)
+#define get_gdat_uint_pos451(X,Y) get_gdat_uint((X),(Y),451)
+#define get_gdat_ullong_pos451(X,Y) get_gdat_ullong((X),(Y),451)
+#define get_gdat_ip_pos451(X,Y) get_gdat_ip((X),(Y),451)
+#define get_gdat_ipv6_pos451(X,Y) get_gdat_ipv6((X),(Y),451)
+#define get_gdat_string_pos451(X,Y) get_gdat_string((X),(Y),451)
+#define get_gdat_v_str_pos451(X,Y) get_gdat_string((X),(Y),451)
+#define get_gdat_bool_pos451(X,Y) get_gdat_bool((X),(Y),451)
+#define get_gdat_int_pos451(X,Y) get_gdat_int((X),(Y),451)
+#define get_gdat_llong_pos451(X,Y) get_gdat_llong((X),(Y),451)
+#define get_gdat_float_pos451(X,Y) get_gdat_float((X),(Y),451)
+#define get_gdat_uint_pos452(X,Y) get_gdat_uint((X),(Y),452)
+#define get_gdat_ullong_pos452(X,Y) get_gdat_ullong((X),(Y),452)
+#define get_gdat_ip_pos452(X,Y) get_gdat_ip((X),(Y),452)
+#define get_gdat_ipv6_pos452(X,Y) get_gdat_ipv6((X),(Y),452)
+#define get_gdat_string_pos452(X,Y) get_gdat_string((X),(Y),452)
+#define get_gdat_v_str_pos452(X,Y) get_gdat_string((X),(Y),452)
+#define get_gdat_bool_pos452(X,Y) get_gdat_bool((X),(Y),452)
+#define get_gdat_int_pos452(X,Y) get_gdat_int((X),(Y),452)
+#define get_gdat_llong_pos452(X,Y) get_gdat_llong((X),(Y),452)
+#define get_gdat_float_pos452(X,Y) get_gdat_float((X),(Y),452)
+#define get_gdat_uint_pos453(X,Y) get_gdat_uint((X),(Y),453)
+#define get_gdat_ullong_pos453(X,Y) get_gdat_ullong((X),(Y),453)
+#define get_gdat_ip_pos453(X,Y) get_gdat_ip((X),(Y),453)
+#define get_gdat_ipv6_pos453(X,Y) get_gdat_ipv6((X),(Y),453)
+#define get_gdat_string_pos453(X,Y) get_gdat_string((X),(Y),453)
+#define get_gdat_v_str_pos453(X,Y) get_gdat_string((X),(Y),453)
+#define get_gdat_bool_pos453(X,Y) get_gdat_bool((X),(Y),453)
+#define get_gdat_int_pos453(X,Y) get_gdat_int((X),(Y),453)
+#define get_gdat_llong_pos453(X,Y) get_gdat_llong((X),(Y),453)
+#define get_gdat_float_pos453(X,Y) get_gdat_float((X),(Y),453)
+#define get_gdat_uint_pos454(X,Y) get_gdat_uint((X),(Y),454)
+#define get_gdat_ullong_pos454(X,Y) get_gdat_ullong((X),(Y),454)
+#define get_gdat_ip_pos454(X,Y) get_gdat_ip((X),(Y),454)
+#define get_gdat_ipv6_pos454(X,Y) get_gdat_ipv6((X),(Y),454)
+#define get_gdat_string_pos454(X,Y) get_gdat_string((X),(Y),454)
+#define get_gdat_v_str_pos454(X,Y) get_gdat_string((X),(Y),454)
+#define get_gdat_bool_pos454(X,Y) get_gdat_bool((X),(Y),454)
+#define get_gdat_int_pos454(X,Y) get_gdat_int((X),(Y),454)
+#define get_gdat_llong_pos454(X,Y) get_gdat_llong((X),(Y),454)
+#define get_gdat_float_pos454(X,Y) get_gdat_float((X),(Y),454)
+#define get_gdat_uint_pos455(X,Y) get_gdat_uint((X),(Y),455)
+#define get_gdat_ullong_pos455(X,Y) get_gdat_ullong((X),(Y),455)
+#define get_gdat_ip_pos455(X,Y) get_gdat_ip((X),(Y),455)
+#define get_gdat_ipv6_pos455(X,Y) get_gdat_ipv6((X),(Y),455)
+#define get_gdat_string_pos455(X,Y) get_gdat_string((X),(Y),455)
+#define get_gdat_v_str_pos455(X,Y) get_gdat_string((X),(Y),455)
+#define get_gdat_bool_pos455(X,Y) get_gdat_bool((X),(Y),455)
+#define get_gdat_int_pos455(X,Y) get_gdat_int((X),(Y),455)
+#define get_gdat_llong_pos455(X,Y) get_gdat_llong((X),(Y),455)
+#define get_gdat_float_pos455(X,Y) get_gdat_float((X),(Y),455)
+#define get_gdat_uint_pos456(X,Y) get_gdat_uint((X),(Y),456)
+#define get_gdat_ullong_pos456(X,Y) get_gdat_ullong((X),(Y),456)
+#define get_gdat_ip_pos456(X,Y) get_gdat_ip((X),(Y),456)
+#define get_gdat_ipv6_pos456(X,Y) get_gdat_ipv6((X),(Y),456)
+#define get_gdat_string_pos456(X,Y) get_gdat_string((X),(Y),456)
+#define get_gdat_v_str_pos456(X,Y) get_gdat_string((X),(Y),456)
+#define get_gdat_bool_pos456(X,Y) get_gdat_bool((X),(Y),456)
+#define get_gdat_int_pos456(X,Y) get_gdat_int((X),(Y),456)
+#define get_gdat_llong_pos456(X,Y) get_gdat_llong((X),(Y),456)
+#define get_gdat_float_pos456(X,Y) get_gdat_float((X),(Y),456)
+#define get_gdat_uint_pos457(X,Y) get_gdat_uint((X),(Y),457)
+#define get_gdat_ullong_pos457(X,Y) get_gdat_ullong((X),(Y),457)
+#define get_gdat_ip_pos457(X,Y) get_gdat_ip((X),(Y),457)
+#define get_gdat_ipv6_pos457(X,Y) get_gdat_ipv6((X),(Y),457)
+#define get_gdat_string_pos457(X,Y) get_gdat_string((X),(Y),457)
+#define get_gdat_v_str_pos457(X,Y) get_gdat_string((X),(Y),457)
+#define get_gdat_bool_pos457(X,Y) get_gdat_bool((X),(Y),457)
+#define get_gdat_int_pos457(X,Y) get_gdat_int((X),(Y),457)
+#define get_gdat_llong_pos457(X,Y) get_gdat_llong((X),(Y),457)
+#define get_gdat_float_pos457(X,Y) get_gdat_float((X),(Y),457)
+#define get_gdat_uint_pos458(X,Y) get_gdat_uint((X),(Y),458)
+#define get_gdat_ullong_pos458(X,Y) get_gdat_ullong((X),(Y),458)
+#define get_gdat_ip_pos458(X,Y) get_gdat_ip((X),(Y),458)
+#define get_gdat_ipv6_pos458(X,Y) get_gdat_ipv6((X),(Y),458)
+#define get_gdat_string_pos458(X,Y) get_gdat_string((X),(Y),458)
+#define get_gdat_v_str_pos458(X,Y) get_gdat_string((X),(Y),458)
+#define get_gdat_bool_pos458(X,Y) get_gdat_bool((X),(Y),458)
+#define get_gdat_int_pos458(X,Y) get_gdat_int((X),(Y),458)
+#define get_gdat_llong_pos458(X,Y) get_gdat_llong((X),(Y),458)
+#define get_gdat_float_pos458(X,Y) get_gdat_float((X),(Y),458)
+#define get_gdat_uint_pos459(X,Y) get_gdat_uint((X),(Y),459)
+#define get_gdat_ullong_pos459(X,Y) get_gdat_ullong((X),(Y),459)
+#define get_gdat_ip_pos459(X,Y) get_gdat_ip((X),(Y),459)
+#define get_gdat_ipv6_pos459(X,Y) get_gdat_ipv6((X),(Y),459)
+#define get_gdat_string_pos459(X,Y) get_gdat_string((X),(Y),459)
+#define get_gdat_v_str_pos459(X,Y) get_gdat_string((X),(Y),459)
+#define get_gdat_bool_pos459(X,Y) get_gdat_bool((X),(Y),459)
+#define get_gdat_int_pos459(X,Y) get_gdat_int((X),(Y),459)
+#define get_gdat_llong_pos459(X,Y) get_gdat_llong((X),(Y),459)
+#define get_gdat_float_pos459(X,Y) get_gdat_float((X),(Y),459)
+#define get_gdat_uint_pos460(X,Y) get_gdat_uint((X),(Y),460)
+#define get_gdat_ullong_pos460(X,Y) get_gdat_ullong((X),(Y),460)
+#define get_gdat_ip_pos460(X,Y) get_gdat_ip((X),(Y),460)
+#define get_gdat_ipv6_pos460(X,Y) get_gdat_ipv6((X),(Y),460)
+#define get_gdat_string_pos460(X,Y) get_gdat_string((X),(Y),460)
+#define get_gdat_v_str_pos460(X,Y) get_gdat_string((X),(Y),460)
+#define get_gdat_bool_pos460(X,Y) get_gdat_bool((X),(Y),460)
+#define get_gdat_int_pos460(X,Y) get_gdat_int((X),(Y),460)
+#define get_gdat_llong_pos460(X,Y) get_gdat_llong((X),(Y),460)
+#define get_gdat_float_pos460(X,Y) get_gdat_float((X),(Y),460)
+#define get_gdat_uint_pos461(X,Y) get_gdat_uint((X),(Y),461)
+#define get_gdat_ullong_pos461(X,Y) get_gdat_ullong((X),(Y),461)
+#define get_gdat_ip_pos461(X,Y) get_gdat_ip((X),(Y),461)
+#define get_gdat_ipv6_pos461(X,Y) get_gdat_ipv6((X),(Y),461)
+#define get_gdat_string_pos461(X,Y) get_gdat_string((X),(Y),461)
+#define get_gdat_v_str_pos461(X,Y) get_gdat_string((X),(Y),461)
+#define get_gdat_bool_pos461(X,Y) get_gdat_bool((X),(Y),461)
+#define get_gdat_int_pos461(X,Y) get_gdat_int((X),(Y),461)
+#define get_gdat_llong_pos461(X,Y) get_gdat_llong((X),(Y),461)
+#define get_gdat_float_pos461(X,Y) get_gdat_float((X),(Y),461)
+#define get_gdat_uint_pos462(X,Y) get_gdat_uint((X),(Y),462)
+#define get_gdat_ullong_pos462(X,Y) get_gdat_ullong((X),(Y),462)
+#define get_gdat_ip_pos462(X,Y) get_gdat_ip((X),(Y),462)
+#define get_gdat_ipv6_pos462(X,Y) get_gdat_ipv6((X),(Y),462)
+#define get_gdat_string_pos462(X,Y) get_gdat_string((X),(Y),462)
+#define get_gdat_v_str_pos462(X,Y) get_gdat_string((X),(Y),462)
+#define get_gdat_bool_pos462(X,Y) get_gdat_bool((X),(Y),462)
+#define get_gdat_int_pos462(X,Y) get_gdat_int((X),(Y),462)
+#define get_gdat_llong_pos462(X,Y) get_gdat_llong((X),(Y),462)
+#define get_gdat_float_pos462(X,Y) get_gdat_float((X),(Y),462)
+#define get_gdat_uint_pos463(X,Y) get_gdat_uint((X),(Y),463)
+#define get_gdat_ullong_pos463(X,Y) get_gdat_ullong((X),(Y),463)
+#define get_gdat_ip_pos463(X,Y) get_gdat_ip((X),(Y),463)
+#define get_gdat_ipv6_pos463(X,Y) get_gdat_ipv6((X),(Y),463)
+#define get_gdat_string_pos463(X,Y) get_gdat_string((X),(Y),463)
+#define get_gdat_v_str_pos463(X,Y) get_gdat_string((X),(Y),463)
+#define get_gdat_bool_pos463(X,Y) get_gdat_bool((X),(Y),463)
+#define get_gdat_int_pos463(X,Y) get_gdat_int((X),(Y),463)
+#define get_gdat_llong_pos463(X,Y) get_gdat_llong((X),(Y),463)
+#define get_gdat_float_pos463(X,Y) get_gdat_float((X),(Y),463)
+#define get_gdat_uint_pos464(X,Y) get_gdat_uint((X),(Y),464)
+#define get_gdat_ullong_pos464(X,Y) get_gdat_ullong((X),(Y),464)
+#define get_gdat_ip_pos464(X,Y) get_gdat_ip((X),(Y),464)
+#define get_gdat_ipv6_pos464(X,Y) get_gdat_ipv6((X),(Y),464)
+#define get_gdat_string_pos464(X,Y) get_gdat_string((X),(Y),464)
+#define get_gdat_v_str_pos464(X,Y) get_gdat_string((X),(Y),464)
+#define get_gdat_bool_pos464(X,Y) get_gdat_bool((X),(Y),464)
+#define get_gdat_int_pos464(X,Y) get_gdat_int((X),(Y),464)
+#define get_gdat_llong_pos464(X,Y) get_gdat_llong((X),(Y),464)
+#define get_gdat_float_pos464(X,Y) get_gdat_float((X),(Y),464)
+#define get_gdat_uint_pos465(X,Y) get_gdat_uint((X),(Y),465)
+#define get_gdat_ullong_pos465(X,Y) get_gdat_ullong((X),(Y),465)
+#define get_gdat_ip_pos465(X,Y) get_gdat_ip((X),(Y),465)
+#define get_gdat_ipv6_pos465(X,Y) get_gdat_ipv6((X),(Y),465)
+#define get_gdat_string_pos465(X,Y) get_gdat_string((X),(Y),465)
+#define get_gdat_v_str_pos465(X,Y) get_gdat_string((X),(Y),465)
+#define get_gdat_bool_pos465(X,Y) get_gdat_bool((X),(Y),465)
+#define get_gdat_int_pos465(X,Y) get_gdat_int((X),(Y),465)
+#define get_gdat_llong_pos465(X,Y) get_gdat_llong((X),(Y),465)
+#define get_gdat_float_pos465(X,Y) get_gdat_float((X),(Y),465)
+#define get_gdat_uint_pos466(X,Y) get_gdat_uint((X),(Y),466)
+#define get_gdat_ullong_pos466(X,Y) get_gdat_ullong((X),(Y),466)
+#define get_gdat_ip_pos466(X,Y) get_gdat_ip((X),(Y),466)
+#define get_gdat_ipv6_pos466(X,Y) get_gdat_ipv6((X),(Y),466)
+#define get_gdat_string_pos466(X,Y) get_gdat_string((X),(Y),466)
+#define get_gdat_v_str_pos466(X,Y) get_gdat_string((X),(Y),466)
+#define get_gdat_bool_pos466(X,Y) get_gdat_bool((X),(Y),466)
+#define get_gdat_int_pos466(X,Y) get_gdat_int((X),(Y),466)
+#define get_gdat_llong_pos466(X,Y) get_gdat_llong((X),(Y),466)
+#define get_gdat_float_pos466(X,Y) get_gdat_float((X),(Y),466)
+#define get_gdat_uint_pos467(X,Y) get_gdat_uint((X),(Y),467)
+#define get_gdat_ullong_pos467(X,Y) get_gdat_ullong((X),(Y),467)
+#define get_gdat_ip_pos467(X,Y) get_gdat_ip((X),(Y),467)
+#define get_gdat_ipv6_pos467(X,Y) get_gdat_ipv6((X),(Y),467)
+#define get_gdat_string_pos467(X,Y) get_gdat_string((X),(Y),467)
+#define get_gdat_v_str_pos467(X,Y) get_gdat_string((X),(Y),467)
+#define get_gdat_bool_pos467(X,Y) get_gdat_bool((X),(Y),467)
+#define get_gdat_int_pos467(X,Y) get_gdat_int((X),(Y),467)
+#define get_gdat_llong_pos467(X,Y) get_gdat_llong((X),(Y),467)
+#define get_gdat_float_pos467(X,Y) get_gdat_float((X),(Y),467)
+#define get_gdat_uint_pos468(X,Y) get_gdat_uint((X),(Y),468)
+#define get_gdat_ullong_pos468(X,Y) get_gdat_ullong((X),(Y),468)
+#define get_gdat_ip_pos468(X,Y) get_gdat_ip((X),(Y),468)
+#define get_gdat_ipv6_pos468(X,Y) get_gdat_ipv6((X),(Y),468)
+#define get_gdat_string_pos468(X,Y) get_gdat_string((X),(Y),468)
+#define get_gdat_v_str_pos468(X,Y) get_gdat_string((X),(Y),468)
+#define get_gdat_bool_pos468(X,Y) get_gdat_bool((X),(Y),468)
+#define get_gdat_int_pos468(X,Y) get_gdat_int((X),(Y),468)
+#define get_gdat_llong_pos468(X,Y) get_gdat_llong((X),(Y),468)
+#define get_gdat_float_pos468(X,Y) get_gdat_float((X),(Y),468)
+#define get_gdat_uint_pos469(X,Y) get_gdat_uint((X),(Y),469)
+#define get_gdat_ullong_pos469(X,Y) get_gdat_ullong((X),(Y),469)
+#define get_gdat_ip_pos469(X,Y) get_gdat_ip((X),(Y),469)
+#define get_gdat_ipv6_pos469(X,Y) get_gdat_ipv6((X),(Y),469)
+#define get_gdat_string_pos469(X,Y) get_gdat_string((X),(Y),469)
+#define get_gdat_v_str_pos469(X,Y) get_gdat_string((X),(Y),469)
+#define get_gdat_bool_pos469(X,Y) get_gdat_bool((X),(Y),469)
+#define get_gdat_int_pos469(X,Y) get_gdat_int((X),(Y),469)
+#define get_gdat_llong_pos469(X,Y) get_gdat_llong((X),(Y),469)
+#define get_gdat_float_pos469(X,Y) get_gdat_float((X),(Y),469)
+#define get_gdat_uint_pos470(X,Y) get_gdat_uint((X),(Y),470)
+#define get_gdat_ullong_pos470(X,Y) get_gdat_ullong((X),(Y),470)
+#define get_gdat_ip_pos470(X,Y) get_gdat_ip((X),(Y),470)
+#define get_gdat_ipv6_pos470(X,Y) get_gdat_ipv6((X),(Y),470)
+#define get_gdat_string_pos470(X,Y) get_gdat_string((X),(Y),470)
+#define get_gdat_v_str_pos470(X,Y) get_gdat_string((X),(Y),470)
+#define get_gdat_bool_pos470(X,Y) get_gdat_bool((X),(Y),470)
+#define get_gdat_int_pos470(X,Y) get_gdat_int((X),(Y),470)
+#define get_gdat_llong_pos470(X,Y) get_gdat_llong((X),(Y),470)
+#define get_gdat_float_pos470(X,Y) get_gdat_float((X),(Y),470)
+#define get_gdat_uint_pos471(X,Y) get_gdat_uint((X),(Y),471)
+#define get_gdat_ullong_pos471(X,Y) get_gdat_ullong((X),(Y),471)
+#define get_gdat_ip_pos471(X,Y) get_gdat_ip((X),(Y),471)
+#define get_gdat_ipv6_pos471(X,Y) get_gdat_ipv6((X),(Y),471)
+#define get_gdat_string_pos471(X,Y) get_gdat_string((X),(Y),471)
+#define get_gdat_v_str_pos471(X,Y) get_gdat_string((X),(Y),471)
+#define get_gdat_bool_pos471(X,Y) get_gdat_bool((X),(Y),471)
+#define get_gdat_int_pos471(X,Y) get_gdat_int((X),(Y),471)
+#define get_gdat_llong_pos471(X,Y) get_gdat_llong((X),(Y),471)
+#define get_gdat_float_pos471(X,Y) get_gdat_float((X),(Y),471)
+#define get_gdat_uint_pos472(X,Y) get_gdat_uint((X),(Y),472)
+#define get_gdat_ullong_pos472(X,Y) get_gdat_ullong((X),(Y),472)
+#define get_gdat_ip_pos472(X,Y) get_gdat_ip((X),(Y),472)
+#define get_gdat_ipv6_pos472(X,Y) get_gdat_ipv6((X),(Y),472)
+#define get_gdat_string_pos472(X,Y) get_gdat_string((X),(Y),472)
+#define get_gdat_v_str_pos472(X,Y) get_gdat_string((X),(Y),472)
+#define get_gdat_bool_pos472(X,Y) get_gdat_bool((X),(Y),472)
+#define get_gdat_int_pos472(X,Y) get_gdat_int((X),(Y),472)
+#define get_gdat_llong_pos472(X,Y) get_gdat_llong((X),(Y),472)
+#define get_gdat_float_pos472(X,Y) get_gdat_float((X),(Y),472)
+#define get_gdat_uint_pos473(X,Y) get_gdat_uint((X),(Y),473)
+#define get_gdat_ullong_pos473(X,Y) get_gdat_ullong((X),(Y),473)
+#define get_gdat_ip_pos473(X,Y) get_gdat_ip((X),(Y),473)
+#define get_gdat_ipv6_pos473(X,Y) get_gdat_ipv6((X),(Y),473)
+#define get_gdat_string_pos473(X,Y) get_gdat_string((X),(Y),473)
+#define get_gdat_v_str_pos473(X,Y) get_gdat_string((X),(Y),473)
+#define get_gdat_bool_pos473(X,Y) get_gdat_bool((X),(Y),473)
+#define get_gdat_int_pos473(X,Y) get_gdat_int((X),(Y),473)
+#define get_gdat_llong_pos473(X,Y) get_gdat_llong((X),(Y),473)
+#define get_gdat_float_pos473(X,Y) get_gdat_float((X),(Y),473)
+#define get_gdat_uint_pos474(X,Y) get_gdat_uint((X),(Y),474)
+#define get_gdat_ullong_pos474(X,Y) get_gdat_ullong((X),(Y),474)
+#define get_gdat_ip_pos474(X,Y) get_gdat_ip((X),(Y),474)
+#define get_gdat_ipv6_pos474(X,Y) get_gdat_ipv6((X),(Y),474)
+#define get_gdat_string_pos474(X,Y) get_gdat_string((X),(Y),474)
+#define get_gdat_v_str_pos474(X,Y) get_gdat_string((X),(Y),474)
+#define get_gdat_bool_pos474(X,Y) get_gdat_bool((X),(Y),474)
+#define get_gdat_int_pos474(X,Y) get_gdat_int((X),(Y),474)
+#define get_gdat_llong_pos474(X,Y) get_gdat_llong((X),(Y),474)
+#define get_gdat_float_pos474(X,Y) get_gdat_float((X),(Y),474)
+#define get_gdat_uint_pos475(X,Y) get_gdat_uint((X),(Y),475)
+#define get_gdat_ullong_pos475(X,Y) get_gdat_ullong((X),(Y),475)
+#define get_gdat_ip_pos475(X,Y) get_gdat_ip((X),(Y),475)
+#define get_gdat_ipv6_pos475(X,Y) get_gdat_ipv6((X),(Y),475)
+#define get_gdat_string_pos475(X,Y) get_gdat_string((X),(Y),475)
+#define get_gdat_v_str_pos475(X,Y) get_gdat_string((X),(Y),475)
+#define get_gdat_bool_pos475(X,Y) get_gdat_bool((X),(Y),475)
+#define get_gdat_int_pos475(X,Y) get_gdat_int((X),(Y),475)
+#define get_gdat_llong_pos475(X,Y) get_gdat_llong((X),(Y),475)
+#define get_gdat_float_pos475(X,Y) get_gdat_float((X),(Y),475)
+#define get_gdat_uint_pos476(X,Y) get_gdat_uint((X),(Y),476)
+#define get_gdat_ullong_pos476(X,Y) get_gdat_ullong((X),(Y),476)
+#define get_gdat_ip_pos476(X,Y) get_gdat_ip((X),(Y),476)
+#define get_gdat_ipv6_pos476(X,Y) get_gdat_ipv6((X),(Y),476)
+#define get_gdat_string_pos476(X,Y) get_gdat_string((X),(Y),476)
+#define get_gdat_v_str_pos476(X,Y) get_gdat_string((X),(Y),476)
+#define get_gdat_bool_pos476(X,Y) get_gdat_bool((X),(Y),476)
+#define get_gdat_int_pos476(X,Y) get_gdat_int((X),(Y),476)
+#define get_gdat_llong_pos476(X,Y) get_gdat_llong((X),(Y),476)
+#define get_gdat_float_pos476(X,Y) get_gdat_float((X),(Y),476)
+#define get_gdat_uint_pos477(X,Y) get_gdat_uint((X),(Y),477)
+#define get_gdat_ullong_pos477(X,Y) get_gdat_ullong((X),(Y),477)
+#define get_gdat_ip_pos477(X,Y) get_gdat_ip((X),(Y),477)
+#define get_gdat_ipv6_pos477(X,Y) get_gdat_ipv6((X),(Y),477)
+#define get_gdat_string_pos477(X,Y) get_gdat_string((X),(Y),477)
+#define get_gdat_v_str_pos477(X,Y) get_gdat_string((X),(Y),477)
+#define get_gdat_bool_pos477(X,Y) get_gdat_bool((X),(Y),477)
+#define get_gdat_int_pos477(X,Y) get_gdat_int((X),(Y),477)
+#define get_gdat_llong_pos477(X,Y) get_gdat_llong((X),(Y),477)
+#define get_gdat_float_pos477(X,Y) get_gdat_float((X),(Y),477)
+#define get_gdat_uint_pos478(X,Y) get_gdat_uint((X),(Y),478)
+#define get_gdat_ullong_pos478(X,Y) get_gdat_ullong((X),(Y),478)
+#define get_gdat_ip_pos478(X,Y) get_gdat_ip((X),(Y),478)
+#define get_gdat_ipv6_pos478(X,Y) get_gdat_ipv6((X),(Y),478)
+#define get_gdat_string_pos478(X,Y) get_gdat_string((X),(Y),478)
+#define get_gdat_v_str_pos478(X,Y) get_gdat_string((X),(Y),478)
+#define get_gdat_bool_pos478(X,Y) get_gdat_bool((X),(Y),478)
+#define get_gdat_int_pos478(X,Y) get_gdat_int((X),(Y),478)
+#define get_gdat_llong_pos478(X,Y) get_gdat_llong((X),(Y),478)
+#define get_gdat_float_pos478(X,Y) get_gdat_float((X),(Y),478)
+#define get_gdat_uint_pos479(X,Y) get_gdat_uint((X),(Y),479)
+#define get_gdat_ullong_pos479(X,Y) get_gdat_ullong((X),(Y),479)
+#define get_gdat_ip_pos479(X,Y) get_gdat_ip((X),(Y),479)
+#define get_gdat_ipv6_pos479(X,Y) get_gdat_ipv6((X),(Y),479)
+#define get_gdat_string_pos479(X,Y) get_gdat_string((X),(Y),479)
+#define get_gdat_v_str_pos479(X,Y) get_gdat_string((X),(Y),479)
+#define get_gdat_bool_pos479(X,Y) get_gdat_bool((X),(Y),479)
+#define get_gdat_int_pos479(X,Y) get_gdat_int((X),(Y),479)
+#define get_gdat_llong_pos479(X,Y) get_gdat_llong((X),(Y),479)
+#define get_gdat_float_pos479(X,Y) get_gdat_float((X),(Y),479)
+#define get_gdat_uint_pos480(X,Y) get_gdat_uint((X),(Y),480)
+#define get_gdat_ullong_pos480(X,Y) get_gdat_ullong((X),(Y),480)
+#define get_gdat_ip_pos480(X,Y) get_gdat_ip((X),(Y),480)
+#define get_gdat_ipv6_pos480(X,Y) get_gdat_ipv6((X),(Y),480)
+#define get_gdat_string_pos480(X,Y) get_gdat_string((X),(Y),480)
+#define get_gdat_v_str_pos480(X,Y) get_gdat_string((X),(Y),480)
+#define get_gdat_bool_pos480(X,Y) get_gdat_bool((X),(Y),480)
+#define get_gdat_int_pos480(X,Y) get_gdat_int((X),(Y),480)
+#define get_gdat_llong_pos480(X,Y) get_gdat_llong((X),(Y),480)
+#define get_gdat_float_pos480(X,Y) get_gdat_float((X),(Y),480)
+#define get_gdat_uint_pos481(X,Y) get_gdat_uint((X),(Y),481)
+#define get_gdat_ullong_pos481(X,Y) get_gdat_ullong((X),(Y),481)
+#define get_gdat_ip_pos481(X,Y) get_gdat_ip((X),(Y),481)
+#define get_gdat_ipv6_pos481(X,Y) get_gdat_ipv6((X),(Y),481)
+#define get_gdat_string_pos481(X,Y) get_gdat_string((X),(Y),481)
+#define get_gdat_v_str_pos481(X,Y) get_gdat_string((X),(Y),481)
+#define get_gdat_bool_pos481(X,Y) get_gdat_bool((X),(Y),481)
+#define get_gdat_int_pos481(X,Y) get_gdat_int((X),(Y),481)
+#define get_gdat_llong_pos481(X,Y) get_gdat_llong((X),(Y),481)
+#define get_gdat_float_pos481(X,Y) get_gdat_float((X),(Y),481)
+#define get_gdat_uint_pos482(X,Y) get_gdat_uint((X),(Y),482)
+#define get_gdat_ullong_pos482(X,Y) get_gdat_ullong((X),(Y),482)
+#define get_gdat_ip_pos482(X,Y) get_gdat_ip((X),(Y),482)
+#define get_gdat_ipv6_pos482(X,Y) get_gdat_ipv6((X),(Y),482)
+#define get_gdat_string_pos482(X,Y) get_gdat_string((X),(Y),482)
+#define get_gdat_v_str_pos482(X,Y) get_gdat_string((X),(Y),482)
+#define get_gdat_bool_pos482(X,Y) get_gdat_bool((X),(Y),482)
+#define get_gdat_int_pos482(X,Y) get_gdat_int((X),(Y),482)
+#define get_gdat_llong_pos482(X,Y) get_gdat_llong((X),(Y),482)
+#define get_gdat_float_pos482(X,Y) get_gdat_float((X),(Y),482)
+#define get_gdat_uint_pos483(X,Y) get_gdat_uint((X),(Y),483)
+#define get_gdat_ullong_pos483(X,Y) get_gdat_ullong((X),(Y),483)
+#define get_gdat_ip_pos483(X,Y) get_gdat_ip((X),(Y),483)
+#define get_gdat_ipv6_pos483(X,Y) get_gdat_ipv6((X),(Y),483)
+#define get_gdat_string_pos483(X,Y) get_gdat_string((X),(Y),483)
+#define get_gdat_v_str_pos483(X,Y) get_gdat_string((X),(Y),483)
+#define get_gdat_bool_pos483(X,Y) get_gdat_bool((X),(Y),483)
+#define get_gdat_int_pos483(X,Y) get_gdat_int((X),(Y),483)
+#define get_gdat_llong_pos483(X,Y) get_gdat_llong((X),(Y),483)
+#define get_gdat_float_pos483(X,Y) get_gdat_float((X),(Y),483)
+#define get_gdat_uint_pos484(X,Y) get_gdat_uint((X),(Y),484)
+#define get_gdat_ullong_pos484(X,Y) get_gdat_ullong((X),(Y),484)
+#define get_gdat_ip_pos484(X,Y) get_gdat_ip((X),(Y),484)
+#define get_gdat_ipv6_pos484(X,Y) get_gdat_ipv6((X),(Y),484)
+#define get_gdat_string_pos484(X,Y) get_gdat_string((X),(Y),484)
+#define get_gdat_v_str_pos484(X,Y) get_gdat_string((X),(Y),484)
+#define get_gdat_bool_pos484(X,Y) get_gdat_bool((X),(Y),484)
+#define get_gdat_int_pos484(X,Y) get_gdat_int((X),(Y),484)
+#define get_gdat_llong_pos484(X,Y) get_gdat_llong((X),(Y),484)
+#define get_gdat_float_pos484(X,Y) get_gdat_float((X),(Y),484)
+#define get_gdat_uint_pos485(X,Y) get_gdat_uint((X),(Y),485)
+#define get_gdat_ullong_pos485(X,Y) get_gdat_ullong((X),(Y),485)
+#define get_gdat_ip_pos485(X,Y) get_gdat_ip((X),(Y),485)
+#define get_gdat_ipv6_pos485(X,Y) get_gdat_ipv6((X),(Y),485)
+#define get_gdat_string_pos485(X,Y) get_gdat_string((X),(Y),485)
+#define get_gdat_v_str_pos485(X,Y) get_gdat_string((X),(Y),485)
+#define get_gdat_bool_pos485(X,Y) get_gdat_bool((X),(Y),485)
+#define get_gdat_int_pos485(X,Y) get_gdat_int((X),(Y),485)
+#define get_gdat_llong_pos485(X,Y) get_gdat_llong((X),(Y),485)
+#define get_gdat_float_pos485(X,Y) get_gdat_float((X),(Y),485)
+#define get_gdat_uint_pos486(X,Y) get_gdat_uint((X),(Y),486)
+#define get_gdat_ullong_pos486(X,Y) get_gdat_ullong((X),(Y),486)
+#define get_gdat_ip_pos486(X,Y) get_gdat_ip((X),(Y),486)
+#define get_gdat_ipv6_pos486(X,Y) get_gdat_ipv6((X),(Y),486)
+#define get_gdat_string_pos486(X,Y) get_gdat_string((X),(Y),486)
+#define get_gdat_v_str_pos486(X,Y) get_gdat_string((X),(Y),486)
+#define get_gdat_bool_pos486(X,Y) get_gdat_bool((X),(Y),486)
+#define get_gdat_int_pos486(X,Y) get_gdat_int((X),(Y),486)
+#define get_gdat_llong_pos486(X,Y) get_gdat_llong((X),(Y),486)
+#define get_gdat_float_pos486(X,Y) get_gdat_float((X),(Y),486)
+#define get_gdat_uint_pos487(X,Y) get_gdat_uint((X),(Y),487)
+#define get_gdat_ullong_pos487(X,Y) get_gdat_ullong((X),(Y),487)
+#define get_gdat_ip_pos487(X,Y) get_gdat_ip((X),(Y),487)
+#define get_gdat_ipv6_pos487(X,Y) get_gdat_ipv6((X),(Y),487)
+#define get_gdat_string_pos487(X,Y) get_gdat_string((X),(Y),487)
+#define get_gdat_v_str_pos487(X,Y) get_gdat_string((X),(Y),487)
+#define get_gdat_bool_pos487(X,Y) get_gdat_bool((X),(Y),487)
+#define get_gdat_int_pos487(X,Y) get_gdat_int((X),(Y),487)
+#define get_gdat_llong_pos487(X,Y) get_gdat_llong((X),(Y),487)
+#define get_gdat_float_pos487(X,Y) get_gdat_float((X),(Y),487)
+#define get_gdat_uint_pos488(X,Y) get_gdat_uint((X),(Y),488)
+#define get_gdat_ullong_pos488(X,Y) get_gdat_ullong((X),(Y),488)
+#define get_gdat_ip_pos488(X,Y) get_gdat_ip((X),(Y),488)
+#define get_gdat_ipv6_pos488(X,Y) get_gdat_ipv6((X),(Y),488)
+#define get_gdat_string_pos488(X,Y) get_gdat_string((X),(Y),488)
+#define get_gdat_v_str_pos488(X,Y) get_gdat_string((X),(Y),488)
+#define get_gdat_bool_pos488(X,Y) get_gdat_bool((X),(Y),488)
+#define get_gdat_int_pos488(X,Y) get_gdat_int((X),(Y),488)
+#define get_gdat_llong_pos488(X,Y) get_gdat_llong((X),(Y),488)
+#define get_gdat_float_pos488(X,Y) get_gdat_float((X),(Y),488)
+#define get_gdat_uint_pos489(X,Y) get_gdat_uint((X),(Y),489)
+#define get_gdat_ullong_pos489(X,Y) get_gdat_ullong((X),(Y),489)
+#define get_gdat_ip_pos489(X,Y) get_gdat_ip((X),(Y),489)
+#define get_gdat_ipv6_pos489(X,Y) get_gdat_ipv6((X),(Y),489)
+#define get_gdat_string_pos489(X,Y) get_gdat_string((X),(Y),489)
+#define get_gdat_v_str_pos489(X,Y) get_gdat_string((X),(Y),489)
+#define get_gdat_bool_pos489(X,Y) get_gdat_bool((X),(Y),489)
+#define get_gdat_int_pos489(X,Y) get_gdat_int((X),(Y),489)
+#define get_gdat_llong_pos489(X,Y) get_gdat_llong((X),(Y),489)
+#define get_gdat_float_pos489(X,Y) get_gdat_float((X),(Y),489)
+#define get_gdat_uint_pos490(X,Y) get_gdat_uint((X),(Y),490)
+#define get_gdat_ullong_pos490(X,Y) get_gdat_ullong((X),(Y),490)
+#define get_gdat_ip_pos490(X,Y) get_gdat_ip((X),(Y),490)
+#define get_gdat_ipv6_pos490(X,Y) get_gdat_ipv6((X),(Y),490)
+#define get_gdat_string_pos490(X,Y) get_gdat_string((X),(Y),490)
+#define get_gdat_v_str_pos490(X,Y) get_gdat_string((X),(Y),490)
+#define get_gdat_bool_pos490(X,Y) get_gdat_bool((X),(Y),490)
+#define get_gdat_int_pos490(X,Y) get_gdat_int((X),(Y),490)
+#define get_gdat_llong_pos490(X,Y) get_gdat_llong((X),(Y),490)
+#define get_gdat_float_pos490(X,Y) get_gdat_float((X),(Y),490)
+#define get_gdat_uint_pos491(X,Y) get_gdat_uint((X),(Y),491)
+#define get_gdat_ullong_pos491(X,Y) get_gdat_ullong((X),(Y),491)
+#define get_gdat_ip_pos491(X,Y) get_gdat_ip((X),(Y),491)
+#define get_gdat_ipv6_pos491(X,Y) get_gdat_ipv6((X),(Y),491)
+#define get_gdat_string_pos491(X,Y) get_gdat_string((X),(Y),491)
+#define get_gdat_v_str_pos491(X,Y) get_gdat_string((X),(Y),491)
+#define get_gdat_bool_pos491(X,Y) get_gdat_bool((X),(Y),491)
+#define get_gdat_int_pos491(X,Y) get_gdat_int((X),(Y),491)
+#define get_gdat_llong_pos491(X,Y) get_gdat_llong((X),(Y),491)
+#define get_gdat_float_pos491(X,Y) get_gdat_float((X),(Y),491)
+#define get_gdat_uint_pos492(X,Y) get_gdat_uint((X),(Y),492)
+#define get_gdat_ullong_pos492(X,Y) get_gdat_ullong((X),(Y),492)
+#define get_gdat_ip_pos492(X,Y) get_gdat_ip((X),(Y),492)
+#define get_gdat_ipv6_pos492(X,Y) get_gdat_ipv6((X),(Y),492)
+#define get_gdat_string_pos492(X,Y) get_gdat_string((X),(Y),492)
+#define get_gdat_v_str_pos492(X,Y) get_gdat_string((X),(Y),492)
+#define get_gdat_bool_pos492(X,Y) get_gdat_bool((X),(Y),492)
+#define get_gdat_int_pos492(X,Y) get_gdat_int((X),(Y),492)
+#define get_gdat_llong_pos492(X,Y) get_gdat_llong((X),(Y),492)
+#define get_gdat_float_pos492(X,Y) get_gdat_float((X),(Y),492)
+#define get_gdat_uint_pos493(X,Y) get_gdat_uint((X),(Y),493)
+#define get_gdat_ullong_pos493(X,Y) get_gdat_ullong((X),(Y),493)
+#define get_gdat_ip_pos493(X,Y) get_gdat_ip((X),(Y),493)
+#define get_gdat_ipv6_pos493(X,Y) get_gdat_ipv6((X),(Y),493)
+#define get_gdat_string_pos493(X,Y) get_gdat_string((X),(Y),493)
+#define get_gdat_v_str_pos493(X,Y) get_gdat_string((X),(Y),493)
+#define get_gdat_bool_pos493(X,Y) get_gdat_bool((X),(Y),493)
+#define get_gdat_int_pos493(X,Y) get_gdat_int((X),(Y),493)
+#define get_gdat_llong_pos493(X,Y) get_gdat_llong((X),(Y),493)
+#define get_gdat_float_pos493(X,Y) get_gdat_float((X),(Y),493)
+#define get_gdat_uint_pos494(X,Y) get_gdat_uint((X),(Y),494)
+#define get_gdat_ullong_pos494(X,Y) get_gdat_ullong((X),(Y),494)
+#define get_gdat_ip_pos494(X,Y) get_gdat_ip((X),(Y),494)
+#define get_gdat_ipv6_pos494(X,Y) get_gdat_ipv6((X),(Y),494)
+#define get_gdat_string_pos494(X,Y) get_gdat_string((X),(Y),494)
+#define get_gdat_v_str_pos494(X,Y) get_gdat_string((X),(Y),494)
+#define get_gdat_bool_pos494(X,Y) get_gdat_bool((X),(Y),494)
+#define get_gdat_int_pos494(X,Y) get_gdat_int((X),(Y),494)
+#define get_gdat_llong_pos494(X,Y) get_gdat_llong((X),(Y),494)
+#define get_gdat_float_pos494(X,Y) get_gdat_float((X),(Y),494)
+#define get_gdat_uint_pos495(X,Y) get_gdat_uint((X),(Y),495)
+#define get_gdat_ullong_pos495(X,Y) get_gdat_ullong((X),(Y),495)
+#define get_gdat_ip_pos495(X,Y) get_gdat_ip((X),(Y),495)
+#define get_gdat_ipv6_pos495(X,Y) get_gdat_ipv6((X),(Y),495)
+#define get_gdat_string_pos495(X,Y) get_gdat_string((X),(Y),495)
+#define get_gdat_v_str_pos495(X,Y) get_gdat_string((X),(Y),495)
+#define get_gdat_bool_pos495(X,Y) get_gdat_bool((X),(Y),495)
+#define get_gdat_int_pos495(X,Y) get_gdat_int((X),(Y),495)
+#define get_gdat_llong_pos495(X,Y) get_gdat_llong((X),(Y),495)
+#define get_gdat_float_pos495(X,Y) get_gdat_float((X),(Y),495)
+#define get_gdat_uint_pos496(X,Y) get_gdat_uint((X),(Y),496)
+#define get_gdat_ullong_pos496(X,Y) get_gdat_ullong((X),(Y),496)
+#define get_gdat_ip_pos496(X,Y) get_gdat_ip((X),(Y),496)
+#define get_gdat_ipv6_pos496(X,Y) get_gdat_ipv6((X),(Y),496)
+#define get_gdat_string_pos496(X,Y) get_gdat_string((X),(Y),496)
+#define get_gdat_v_str_pos496(X,Y) get_gdat_string((X),(Y),496)
+#define get_gdat_bool_pos496(X,Y) get_gdat_bool((X),(Y),496)
+#define get_gdat_int_pos496(X,Y) get_gdat_int((X),(Y),496)
+#define get_gdat_llong_pos496(X,Y) get_gdat_llong((X),(Y),496)
+#define get_gdat_float_pos496(X,Y) get_gdat_float((X),(Y),496)
+#define get_gdat_uint_pos497(X,Y) get_gdat_uint((X),(Y),497)
+#define get_gdat_ullong_pos497(X,Y) get_gdat_ullong((X),(Y),497)
+#define get_gdat_ip_pos497(X,Y) get_gdat_ip((X),(Y),497)
+#define get_gdat_ipv6_pos497(X,Y) get_gdat_ipv6((X),(Y),497)
+#define get_gdat_string_pos497(X,Y) get_gdat_string((X),(Y),497)
+#define get_gdat_v_str_pos497(X,Y) get_gdat_string((X),(Y),497)
+#define get_gdat_bool_pos497(X,Y) get_gdat_bool((X),(Y),497)
+#define get_gdat_int_pos497(X,Y) get_gdat_int((X),(Y),497)
+#define get_gdat_llong_pos497(X,Y) get_gdat_llong((X),(Y),497)
+#define get_gdat_float_pos497(X,Y) get_gdat_float((X),(Y),497)
+#define get_gdat_uint_pos498(X,Y) get_gdat_uint((X),(Y),498)
+#define get_gdat_ullong_pos498(X,Y) get_gdat_ullong((X),(Y),498)
+#define get_gdat_ip_pos498(X,Y) get_gdat_ip((X),(Y),498)
+#define get_gdat_ipv6_pos498(X,Y) get_gdat_ipv6((X),(Y),498)
+#define get_gdat_string_pos498(X,Y) get_gdat_string((X),(Y),498)
+#define get_gdat_v_str_pos498(X,Y) get_gdat_string((X),(Y),498)
+#define get_gdat_bool_pos498(X,Y) get_gdat_bool((X),(Y),498)
+#define get_gdat_int_pos498(X,Y) get_gdat_int((X),(Y),498)
+#define get_gdat_llong_pos498(X,Y) get_gdat_llong((X),(Y),498)
+#define get_gdat_float_pos498(X,Y) get_gdat_float((X),(Y),498)
+#define get_gdat_uint_pos499(X,Y) get_gdat_uint((X),(Y),499)
+#define get_gdat_ullong_pos499(X,Y) get_gdat_ullong((X),(Y),499)
+#define get_gdat_ip_pos499(X,Y) get_gdat_ip((X),(Y),499)
+#define get_gdat_ipv6_pos499(X,Y) get_gdat_ipv6((X),(Y),499)
+#define get_gdat_string_pos499(X,Y) get_gdat_string((X),(Y),499)
+#define get_gdat_v_str_pos499(X,Y) get_gdat_string((X),(Y),499)
+#define get_gdat_bool_pos499(X,Y) get_gdat_bool((X),(Y),499)
+#define get_gdat_int_pos499(X,Y) get_gdat_int((X),(Y),499)
+#define get_gdat_llong_pos499(X,Y) get_gdat_llong((X),(Y),499)
+#define get_gdat_float_pos499(X,Y) get_gdat_float((X),(Y),499)
+#define get_gdat_uint_pos500(X,Y) get_gdat_uint((X),(Y),500)
+#define get_gdat_ullong_pos500(X,Y) get_gdat_ullong((X),(Y),500)
+#define get_gdat_ip_pos500(X,Y) get_gdat_ip((X),(Y),500)
+#define get_gdat_ipv6_pos500(X,Y) get_gdat_ipv6((X),(Y),500)
+#define get_gdat_string_pos500(X,Y) get_gdat_string((X),(Y),500)
+#define get_gdat_v_str_pos500(X,Y) get_gdat_string((X),(Y),500)
+#define get_gdat_bool_pos500(X,Y) get_gdat_bool((X),(Y),500)
+#define get_gdat_int_pos500(X,Y) get_gdat_int((X),(Y),500)
+#define get_gdat_llong_pos500(X,Y) get_gdat_llong((X),(Y),500)
+#define get_gdat_float_pos500(X,Y) get_gdat_float((X),(Y),500)
+#define get_gdat_uint_pos501(X,Y) get_gdat_uint((X),(Y),501)
+#define get_gdat_ullong_pos501(X,Y) get_gdat_ullong((X),(Y),501)
+#define get_gdat_ip_pos501(X,Y) get_gdat_ip((X),(Y),501)
+#define get_gdat_ipv6_pos501(X,Y) get_gdat_ipv6((X),(Y),501)
+#define get_gdat_string_pos501(X,Y) get_gdat_string((X),(Y),501)
+#define get_gdat_v_str_pos501(X,Y) get_gdat_string((X),(Y),501)
+#define get_gdat_bool_pos501(X,Y) get_gdat_bool((X),(Y),501)
+#define get_gdat_int_pos501(X,Y) get_gdat_int((X),(Y),501)
+#define get_gdat_llong_pos501(X,Y) get_gdat_llong((X),(Y),501)
+#define get_gdat_float_pos501(X,Y) get_gdat_float((X),(Y),501)
+#define get_gdat_uint_pos502(X,Y) get_gdat_uint((X),(Y),502)
+#define get_gdat_ullong_pos502(X,Y) get_gdat_ullong((X),(Y),502)
+#define get_gdat_ip_pos502(X,Y) get_gdat_ip((X),(Y),502)
+#define get_gdat_ipv6_pos502(X,Y) get_gdat_ipv6((X),(Y),502)
+#define get_gdat_string_pos502(X,Y) get_gdat_string((X),(Y),502)
+#define get_gdat_v_str_pos502(X,Y) get_gdat_string((X),(Y),502)
+#define get_gdat_bool_pos502(X,Y) get_gdat_bool((X),(Y),502)
+#define get_gdat_int_pos502(X,Y) get_gdat_int((X),(Y),502)
+#define get_gdat_llong_pos502(X,Y) get_gdat_llong((X),(Y),502)
+#define get_gdat_float_pos502(X,Y) get_gdat_float((X),(Y),502)
+#define get_gdat_uint_pos503(X,Y) get_gdat_uint((X),(Y),503)
+#define get_gdat_ullong_pos503(X,Y) get_gdat_ullong((X),(Y),503)
+#define get_gdat_ip_pos503(X,Y) get_gdat_ip((X),(Y),503)
+#define get_gdat_ipv6_pos503(X,Y) get_gdat_ipv6((X),(Y),503)
+#define get_gdat_string_pos503(X,Y) get_gdat_string((X),(Y),503)
+#define get_gdat_v_str_pos503(X,Y) get_gdat_string((X),(Y),503)
+#define get_gdat_bool_pos503(X,Y) get_gdat_bool((X),(Y),503)
+#define get_gdat_int_pos503(X,Y) get_gdat_int((X),(Y),503)
+#define get_gdat_llong_pos503(X,Y) get_gdat_llong((X),(Y),503)
+#define get_gdat_float_pos503(X,Y) get_gdat_float((X),(Y),503)
+#define get_gdat_uint_pos504(X,Y) get_gdat_uint((X),(Y),504)
+#define get_gdat_ullong_pos504(X,Y) get_gdat_ullong((X),(Y),504)
+#define get_gdat_ip_pos504(X,Y) get_gdat_ip((X),(Y),504)
+#define get_gdat_ipv6_pos504(X,Y) get_gdat_ipv6((X),(Y),504)
+#define get_gdat_string_pos504(X,Y) get_gdat_string((X),(Y),504)
+#define get_gdat_v_str_pos504(X,Y) get_gdat_string((X),(Y),504)
+#define get_gdat_bool_pos504(X,Y) get_gdat_bool((X),(Y),504)
+#define get_gdat_int_pos504(X,Y) get_gdat_int((X),(Y),504)
+#define get_gdat_llong_pos504(X,Y) get_gdat_llong((X),(Y),504)
+#define get_gdat_float_pos504(X,Y) get_gdat_float((X),(Y),504)
+#define get_gdat_uint_pos505(X,Y) get_gdat_uint((X),(Y),505)
+#define get_gdat_ullong_pos505(X,Y) get_gdat_ullong((X),(Y),505)
+#define get_gdat_ip_pos505(X,Y) get_gdat_ip((X),(Y),505)
+#define get_gdat_ipv6_pos505(X,Y) get_gdat_ipv6((X),(Y),505)
+#define get_gdat_string_pos505(X,Y) get_gdat_string((X),(Y),505)
+#define get_gdat_v_str_pos505(X,Y) get_gdat_string((X),(Y),505)
+#define get_gdat_bool_pos505(X,Y) get_gdat_bool((X),(Y),505)
+#define get_gdat_int_pos505(X,Y) get_gdat_int((X),(Y),505)
+#define get_gdat_llong_pos505(X,Y) get_gdat_llong((X),(Y),505)
+#define get_gdat_float_pos505(X,Y) get_gdat_float((X),(Y),505)
+#define get_gdat_uint_pos506(X,Y) get_gdat_uint((X),(Y),506)
+#define get_gdat_ullong_pos506(X,Y) get_gdat_ullong((X),(Y),506)
+#define get_gdat_ip_pos506(X,Y) get_gdat_ip((X),(Y),506)
+#define get_gdat_ipv6_pos506(X,Y) get_gdat_ipv6((X),(Y),506)
+#define get_gdat_string_pos506(X,Y) get_gdat_string((X),(Y),506)
+#define get_gdat_v_str_pos506(X,Y) get_gdat_string((X),(Y),506)
+#define get_gdat_bool_pos506(X,Y) get_gdat_bool((X),(Y),506)
+#define get_gdat_int_pos506(X,Y) get_gdat_int((X),(Y),506)
+#define get_gdat_llong_pos506(X,Y) get_gdat_llong((X),(Y),506)
+#define get_gdat_float_pos506(X,Y) get_gdat_float((X),(Y),506)
+#define get_gdat_uint_pos507(X,Y) get_gdat_uint((X),(Y),507)
+#define get_gdat_ullong_pos507(X,Y) get_gdat_ullong((X),(Y),507)
+#define get_gdat_ip_pos507(X,Y) get_gdat_ip((X),(Y),507)
+#define get_gdat_ipv6_pos507(X,Y) get_gdat_ipv6((X),(Y),507)
+#define get_gdat_string_pos507(X,Y) get_gdat_string((X),(Y),507)
+#define get_gdat_v_str_pos507(X,Y) get_gdat_string((X),(Y),507)
+#define get_gdat_bool_pos507(X,Y) get_gdat_bool((X),(Y),507)
+#define get_gdat_int_pos507(X,Y) get_gdat_int((X),(Y),507)
+#define get_gdat_llong_pos507(X,Y) get_gdat_llong((X),(Y),507)
+#define get_gdat_float_pos507(X,Y) get_gdat_float((X),(Y),507)
+#define get_gdat_uint_pos508(X,Y) get_gdat_uint((X),(Y),508)
+#define get_gdat_ullong_pos508(X,Y) get_gdat_ullong((X),(Y),508)
+#define get_gdat_ip_pos508(X,Y) get_gdat_ip((X),(Y),508)
+#define get_gdat_ipv6_pos508(X,Y) get_gdat_ipv6((X),(Y),508)
+#define get_gdat_string_pos508(X,Y) get_gdat_string((X),(Y),508)
+#define get_gdat_v_str_pos508(X,Y) get_gdat_string((X),(Y),508)
+#define get_gdat_bool_pos508(X,Y) get_gdat_bool((X),(Y),508)
+#define get_gdat_int_pos508(X,Y) get_gdat_int((X),(Y),508)
+#define get_gdat_llong_pos508(X,Y) get_gdat_llong((X),(Y),508)
+#define get_gdat_float_pos508(X,Y) get_gdat_float((X),(Y),508)
+#define get_gdat_uint_pos509(X,Y) get_gdat_uint((X),(Y),509)
+#define get_gdat_ullong_pos509(X,Y) get_gdat_ullong((X),(Y),509)
+#define get_gdat_ip_pos509(X,Y) get_gdat_ip((X),(Y),509)
+#define get_gdat_ipv6_pos509(X,Y) get_gdat_ipv6((X),(Y),509)
+#define get_gdat_string_pos509(X,Y) get_gdat_string((X),(Y),509)
+#define get_gdat_v_str_pos509(X,Y) get_gdat_string((X),(Y),509)
+#define get_gdat_bool_pos509(X,Y) get_gdat_bool((X),(Y),509)
+#define get_gdat_int_pos509(X,Y) get_gdat_int((X),(Y),509)
+#define get_gdat_llong_pos509(X,Y) get_gdat_llong((X),(Y),509)
+#define get_gdat_float_pos509(X,Y) get_gdat_float((X),(Y),509)
+#define get_gdat_uint_pos510(X,Y) get_gdat_uint((X),(Y),510)
+#define get_gdat_ullong_pos510(X,Y) get_gdat_ullong((X),(Y),510)
+#define get_gdat_ip_pos510(X,Y) get_gdat_ip((X),(Y),510)
+#define get_gdat_ipv6_pos510(X,Y) get_gdat_ipv6((X),(Y),510)
+#define get_gdat_string_pos510(X,Y) get_gdat_string((X),(Y),510)
+#define get_gdat_v_str_pos510(X,Y) get_gdat_string((X),(Y),510)
+#define get_gdat_bool_pos510(X,Y) get_gdat_bool((X),(Y),510)
+#define get_gdat_int_pos510(X,Y) get_gdat_int((X),(Y),510)
+#define get_gdat_llong_pos510(X,Y) get_gdat_llong((X),(Y),510)
+#define get_gdat_float_pos510(X,Y) get_gdat_float((X),(Y),510)
+#define get_gdat_uint_pos511(X,Y) get_gdat_uint((X),(Y),511)
+#define get_gdat_ullong_pos511(X,Y) get_gdat_ullong((X),(Y),511)
+#define get_gdat_ip_pos511(X,Y) get_gdat_ip((X),(Y),511)
+#define get_gdat_ipv6_pos511(X,Y) get_gdat_ipv6((X),(Y),511)
+#define get_gdat_string_pos511(X,Y) get_gdat_string((X),(Y),511)
+#define get_gdat_v_str_pos511(X,Y) get_gdat_string((X),(Y),511)
+#define get_gdat_bool_pos511(X,Y) get_gdat_bool((X),(Y),511)
+#define get_gdat_int_pos511(X,Y) get_gdat_int((X),(Y),511)
+#define get_gdat_llong_pos511(X,Y) get_gdat_llong((X),(Y),511)
+#define get_gdat_float_pos511(X,Y) get_gdat_float((X),(Y),511)
+#define get_gdat_uint_pos512(X,Y) get_gdat_uint((X),(Y),512)
+#define get_gdat_ullong_pos512(X,Y) get_gdat_ullong((X),(Y),512)
+#define get_gdat_ip_pos512(X,Y) get_gdat_ip((X),(Y),512)
+#define get_gdat_ipv6_pos512(X,Y) get_gdat_ipv6((X),(Y),512)
+#define get_gdat_string_pos512(X,Y) get_gdat_string((X),(Y),512)
+#define get_gdat_v_str_pos512(X,Y) get_gdat_string((X),(Y),512)
+#define get_gdat_bool_pos512(X,Y) get_gdat_bool((X),(Y),512)
+#define get_gdat_int_pos512(X,Y) get_gdat_int((X),(Y),512)
+#define get_gdat_llong_pos512(X,Y) get_gdat_llong((X),(Y),512)
+#define get_gdat_float_pos512(X,Y) get_gdat_float((X),(Y),512)
+#define get_gdat_uint_pos513(X,Y) get_gdat_uint((X),(Y),513)
+#define get_gdat_ullong_pos513(X,Y) get_gdat_ullong((X),(Y),513)
+#define get_gdat_ip_pos513(X,Y) get_gdat_ip((X),(Y),513)
+#define get_gdat_ipv6_pos513(X,Y) get_gdat_ipv6((X),(Y),513)
+#define get_gdat_string_pos513(X,Y) get_gdat_string((X),(Y),513)
+#define get_gdat_v_str_pos513(X,Y) get_gdat_string((X),(Y),513)
+#define get_gdat_bool_pos513(X,Y) get_gdat_bool((X),(Y),513)
+#define get_gdat_int_pos513(X,Y) get_gdat_int((X),(Y),513)
+#define get_gdat_llong_pos513(X,Y) get_gdat_llong((X),(Y),513)
+#define get_gdat_float_pos513(X,Y) get_gdat_float((X),(Y),513)
+#define get_gdat_uint_pos514(X,Y) get_gdat_uint((X),(Y),514)
+#define get_gdat_ullong_pos514(X,Y) get_gdat_ullong((X),(Y),514)
+#define get_gdat_ip_pos514(X,Y) get_gdat_ip((X),(Y),514)
+#define get_gdat_ipv6_pos514(X,Y) get_gdat_ipv6((X),(Y),514)
+#define get_gdat_string_pos514(X,Y) get_gdat_string((X),(Y),514)
+#define get_gdat_v_str_pos514(X,Y) get_gdat_string((X),(Y),514)
+#define get_gdat_bool_pos514(X,Y) get_gdat_bool((X),(Y),514)
+#define get_gdat_int_pos514(X,Y) get_gdat_int((X),(Y),514)
+#define get_gdat_llong_pos514(X,Y) get_gdat_llong((X),(Y),514)
+#define get_gdat_float_pos514(X,Y) get_gdat_float((X),(Y),514)
+#define get_gdat_uint_pos515(X,Y) get_gdat_uint((X),(Y),515)
+#define get_gdat_ullong_pos515(X,Y) get_gdat_ullong((X),(Y),515)
+#define get_gdat_ip_pos515(X,Y) get_gdat_ip((X),(Y),515)
+#define get_gdat_ipv6_pos515(X,Y) get_gdat_ipv6((X),(Y),515)
+#define get_gdat_string_pos515(X,Y) get_gdat_string((X),(Y),515)
+#define get_gdat_v_str_pos515(X,Y) get_gdat_string((X),(Y),515)
+#define get_gdat_bool_pos515(X,Y) get_gdat_bool((X),(Y),515)
+#define get_gdat_int_pos515(X,Y) get_gdat_int((X),(Y),515)
+#define get_gdat_llong_pos515(X,Y) get_gdat_llong((X),(Y),515)
+#define get_gdat_float_pos515(X,Y) get_gdat_float((X),(Y),515)
+#define get_gdat_uint_pos516(X,Y) get_gdat_uint((X),(Y),516)
+#define get_gdat_ullong_pos516(X,Y) get_gdat_ullong((X),(Y),516)
+#define get_gdat_ip_pos516(X,Y) get_gdat_ip((X),(Y),516)
+#define get_gdat_ipv6_pos516(X,Y) get_gdat_ipv6((X),(Y),516)
+#define get_gdat_string_pos516(X,Y) get_gdat_string((X),(Y),516)
+#define get_gdat_v_str_pos516(X,Y) get_gdat_string((X),(Y),516)
+#define get_gdat_bool_pos516(X,Y) get_gdat_bool((X),(Y),516)
+#define get_gdat_int_pos516(X,Y) get_gdat_int((X),(Y),516)
+#define get_gdat_llong_pos516(X,Y) get_gdat_llong((X),(Y),516)
+#define get_gdat_float_pos516(X,Y) get_gdat_float((X),(Y),516)
+#define get_gdat_uint_pos517(X,Y) get_gdat_uint((X),(Y),517)
+#define get_gdat_ullong_pos517(X,Y) get_gdat_ullong((X),(Y),517)
+#define get_gdat_ip_pos517(X,Y) get_gdat_ip((X),(Y),517)
+#define get_gdat_ipv6_pos517(X,Y) get_gdat_ipv6((X),(Y),517)
+#define get_gdat_string_pos517(X,Y) get_gdat_string((X),(Y),517)
+#define get_gdat_v_str_pos517(X,Y) get_gdat_string((X),(Y),517)
+#define get_gdat_bool_pos517(X,Y) get_gdat_bool((X),(Y),517)
+#define get_gdat_int_pos517(X,Y) get_gdat_int((X),(Y),517)
+#define get_gdat_llong_pos517(X,Y) get_gdat_llong((X),(Y),517)
+#define get_gdat_float_pos517(X,Y) get_gdat_float((X),(Y),517)
+#define get_gdat_uint_pos518(X,Y) get_gdat_uint((X),(Y),518)
+#define get_gdat_ullong_pos518(X,Y) get_gdat_ullong((X),(Y),518)
+#define get_gdat_ip_pos518(X,Y) get_gdat_ip((X),(Y),518)
+#define get_gdat_ipv6_pos518(X,Y) get_gdat_ipv6((X),(Y),518)
+#define get_gdat_string_pos518(X,Y) get_gdat_string((X),(Y),518)
+#define get_gdat_v_str_pos518(X,Y) get_gdat_string((X),(Y),518)
+#define get_gdat_bool_pos518(X,Y) get_gdat_bool((X),(Y),518)
+#define get_gdat_int_pos518(X,Y) get_gdat_int((X),(Y),518)
+#define get_gdat_llong_pos518(X,Y) get_gdat_llong((X),(Y),518)
+#define get_gdat_float_pos518(X,Y) get_gdat_float((X),(Y),518)
+#define get_gdat_uint_pos519(X,Y) get_gdat_uint((X),(Y),519)
+#define get_gdat_ullong_pos519(X,Y) get_gdat_ullong((X),(Y),519)
+#define get_gdat_ip_pos519(X,Y) get_gdat_ip((X),(Y),519)
+#define get_gdat_ipv6_pos519(X,Y) get_gdat_ipv6((X),(Y),519)
+#define get_gdat_string_pos519(X,Y) get_gdat_string((X),(Y),519)
+#define get_gdat_v_str_pos519(X,Y) get_gdat_string((X),(Y),519)
+#define get_gdat_bool_pos519(X,Y) get_gdat_bool((X),(Y),519)
+#define get_gdat_int_pos519(X,Y) get_gdat_int((X),(Y),519)
+#define get_gdat_llong_pos519(X,Y) get_gdat_llong((X),(Y),519)
+#define get_gdat_float_pos519(X,Y) get_gdat_float((X),(Y),519)
+#define get_gdat_uint_pos520(X,Y) get_gdat_uint((X),(Y),520)
+#define get_gdat_ullong_pos520(X,Y) get_gdat_ullong((X),(Y),520)
+#define get_gdat_ip_pos520(X,Y) get_gdat_ip((X),(Y),520)
+#define get_gdat_ipv6_pos520(X,Y) get_gdat_ipv6((X),(Y),520)
+#define get_gdat_string_pos520(X,Y) get_gdat_string((X),(Y),520)
+#define get_gdat_v_str_pos520(X,Y) get_gdat_string((X),(Y),520)
+#define get_gdat_bool_pos520(X,Y) get_gdat_bool((X),(Y),520)
+#define get_gdat_int_pos520(X,Y) get_gdat_int((X),(Y),520)
+#define get_gdat_llong_pos520(X,Y) get_gdat_llong((X),(Y),520)
+#define get_gdat_float_pos520(X,Y) get_gdat_float((X),(Y),520)
+#define get_gdat_uint_pos521(X,Y) get_gdat_uint((X),(Y),521)
+#define get_gdat_ullong_pos521(X,Y) get_gdat_ullong((X),(Y),521)
+#define get_gdat_ip_pos521(X,Y) get_gdat_ip((X),(Y),521)
+#define get_gdat_ipv6_pos521(X,Y) get_gdat_ipv6((X),(Y),521)
+#define get_gdat_string_pos521(X,Y) get_gdat_string((X),(Y),521)
+#define get_gdat_v_str_pos521(X,Y) get_gdat_string((X),(Y),521)
+#define get_gdat_bool_pos521(X,Y) get_gdat_bool((X),(Y),521)
+#define get_gdat_int_pos521(X,Y) get_gdat_int((X),(Y),521)
+#define get_gdat_llong_pos521(X,Y) get_gdat_llong((X),(Y),521)
+#define get_gdat_float_pos521(X,Y) get_gdat_float((X),(Y),521)
+#define get_gdat_uint_pos522(X,Y) get_gdat_uint((X),(Y),522)
+#define get_gdat_ullong_pos522(X,Y) get_gdat_ullong((X),(Y),522)
+#define get_gdat_ip_pos522(X,Y) get_gdat_ip((X),(Y),522)
+#define get_gdat_ipv6_pos522(X,Y) get_gdat_ipv6((X),(Y),522)
+#define get_gdat_string_pos522(X,Y) get_gdat_string((X),(Y),522)
+#define get_gdat_v_str_pos522(X,Y) get_gdat_string((X),(Y),522)
+#define get_gdat_bool_pos522(X,Y) get_gdat_bool((X),(Y),522)
+#define get_gdat_int_pos522(X,Y) get_gdat_int((X),(Y),522)
+#define get_gdat_llong_pos522(X,Y) get_gdat_llong((X),(Y),522)
+#define get_gdat_float_pos522(X,Y) get_gdat_float((X),(Y),522)
+#define get_gdat_uint_pos523(X,Y) get_gdat_uint((X),(Y),523)
+#define get_gdat_ullong_pos523(X,Y) get_gdat_ullong((X),(Y),523)
+#define get_gdat_ip_pos523(X,Y) get_gdat_ip((X),(Y),523)
+#define get_gdat_ipv6_pos523(X,Y) get_gdat_ipv6((X),(Y),523)
+#define get_gdat_string_pos523(X,Y) get_gdat_string((X),(Y),523)
+#define get_gdat_v_str_pos523(X,Y) get_gdat_string((X),(Y),523)
+#define get_gdat_bool_pos523(X,Y) get_gdat_bool((X),(Y),523)
+#define get_gdat_int_pos523(X,Y) get_gdat_int((X),(Y),523)
+#define get_gdat_llong_pos523(X,Y) get_gdat_llong((X),(Y),523)
+#define get_gdat_float_pos523(X,Y) get_gdat_float((X),(Y),523)
+#define get_gdat_uint_pos524(X,Y) get_gdat_uint((X),(Y),524)
+#define get_gdat_ullong_pos524(X,Y) get_gdat_ullong((X),(Y),524)
+#define get_gdat_ip_pos524(X,Y) get_gdat_ip((X),(Y),524)
+#define get_gdat_ipv6_pos524(X,Y) get_gdat_ipv6((X),(Y),524)
+#define get_gdat_string_pos524(X,Y) get_gdat_string((X),(Y),524)
+#define get_gdat_v_str_pos524(X,Y) get_gdat_string((X),(Y),524)
+#define get_gdat_bool_pos524(X,Y) get_gdat_bool((X),(Y),524)
+#define get_gdat_int_pos524(X,Y) get_gdat_int((X),(Y),524)
+#define get_gdat_llong_pos524(X,Y) get_gdat_llong((X),(Y),524)
+#define get_gdat_float_pos524(X,Y) get_gdat_float((X),(Y),524)
+#define get_gdat_uint_pos525(X,Y) get_gdat_uint((X),(Y),525)
+#define get_gdat_ullong_pos525(X,Y) get_gdat_ullong((X),(Y),525)
+#define get_gdat_ip_pos525(X,Y) get_gdat_ip((X),(Y),525)
+#define get_gdat_ipv6_pos525(X,Y) get_gdat_ipv6((X),(Y),525)
+#define get_gdat_string_pos525(X,Y) get_gdat_string((X),(Y),525)
+#define get_gdat_v_str_pos525(X,Y) get_gdat_string((X),(Y),525)
+#define get_gdat_bool_pos525(X,Y) get_gdat_bool((X),(Y),525)
+#define get_gdat_int_pos525(X,Y) get_gdat_int((X),(Y),525)
+#define get_gdat_llong_pos525(X,Y) get_gdat_llong((X),(Y),525)
+#define get_gdat_float_pos525(X,Y) get_gdat_float((X),(Y),525)
+#define get_gdat_uint_pos526(X,Y) get_gdat_uint((X),(Y),526)
+#define get_gdat_ullong_pos526(X,Y) get_gdat_ullong((X),(Y),526)
+#define get_gdat_ip_pos526(X,Y) get_gdat_ip((X),(Y),526)
+#define get_gdat_ipv6_pos526(X,Y) get_gdat_ipv6((X),(Y),526)
+#define get_gdat_string_pos526(X,Y) get_gdat_string((X),(Y),526)
+#define get_gdat_v_str_pos526(X,Y) get_gdat_string((X),(Y),526)
+#define get_gdat_bool_pos526(X,Y) get_gdat_bool((X),(Y),526)
+#define get_gdat_int_pos526(X,Y) get_gdat_int((X),(Y),526)
+#define get_gdat_llong_pos526(X,Y) get_gdat_llong((X),(Y),526)
+#define get_gdat_float_pos526(X,Y) get_gdat_float((X),(Y),526)
+#define get_gdat_uint_pos527(X,Y) get_gdat_uint((X),(Y),527)
+#define get_gdat_ullong_pos527(X,Y) get_gdat_ullong((X),(Y),527)
+#define get_gdat_ip_pos527(X,Y) get_gdat_ip((X),(Y),527)
+#define get_gdat_ipv6_pos527(X,Y) get_gdat_ipv6((X),(Y),527)
+#define get_gdat_string_pos527(X,Y) get_gdat_string((X),(Y),527)
+#define get_gdat_v_str_pos527(X,Y) get_gdat_string((X),(Y),527)
+#define get_gdat_bool_pos527(X,Y) get_gdat_bool((X),(Y),527)
+#define get_gdat_int_pos527(X,Y) get_gdat_int((X),(Y),527)
+#define get_gdat_llong_pos527(X,Y) get_gdat_llong((X),(Y),527)
+#define get_gdat_float_pos527(X,Y) get_gdat_float((X),(Y),527)
+#define get_gdat_uint_pos528(X,Y) get_gdat_uint((X),(Y),528)
+#define get_gdat_ullong_pos528(X,Y) get_gdat_ullong((X),(Y),528)
+#define get_gdat_ip_pos528(X,Y) get_gdat_ip((X),(Y),528)
+#define get_gdat_ipv6_pos528(X,Y) get_gdat_ipv6((X),(Y),528)
+#define get_gdat_string_pos528(X,Y) get_gdat_string((X),(Y),528)
+#define get_gdat_v_str_pos528(X,Y) get_gdat_string((X),(Y),528)
+#define get_gdat_bool_pos528(X,Y) get_gdat_bool((X),(Y),528)
+#define get_gdat_int_pos528(X,Y) get_gdat_int((X),(Y),528)
+#define get_gdat_llong_pos528(X,Y) get_gdat_llong((X),(Y),528)
+#define get_gdat_float_pos528(X,Y) get_gdat_float((X),(Y),528)
+#define get_gdat_uint_pos529(X,Y) get_gdat_uint((X),(Y),529)
+#define get_gdat_ullong_pos529(X,Y) get_gdat_ullong((X),(Y),529)
+#define get_gdat_ip_pos529(X,Y) get_gdat_ip((X),(Y),529)
+#define get_gdat_ipv6_pos529(X,Y) get_gdat_ipv6((X),(Y),529)
+#define get_gdat_string_pos529(X,Y) get_gdat_string((X),(Y),529)
+#define get_gdat_v_str_pos529(X,Y) get_gdat_string((X),(Y),529)
+#define get_gdat_bool_pos529(X,Y) get_gdat_bool((X),(Y),529)
+#define get_gdat_int_pos529(X,Y) get_gdat_int((X),(Y),529)
+#define get_gdat_llong_pos529(X,Y) get_gdat_llong((X),(Y),529)
+#define get_gdat_float_pos529(X,Y) get_gdat_float((X),(Y),529)
+#define get_gdat_uint_pos530(X,Y) get_gdat_uint((X),(Y),530)
+#define get_gdat_ullong_pos530(X,Y) get_gdat_ullong((X),(Y),530)
+#define get_gdat_ip_pos530(X,Y) get_gdat_ip((X),(Y),530)
+#define get_gdat_ipv6_pos530(X,Y) get_gdat_ipv6((X),(Y),530)
+#define get_gdat_string_pos530(X,Y) get_gdat_string((X),(Y),530)
+#define get_gdat_v_str_pos530(X,Y) get_gdat_string((X),(Y),530)
+#define get_gdat_bool_pos530(X,Y) get_gdat_bool((X),(Y),530)
+#define get_gdat_int_pos530(X,Y) get_gdat_int((X),(Y),530)
+#define get_gdat_llong_pos530(X,Y) get_gdat_llong((X),(Y),530)
+#define get_gdat_float_pos530(X,Y) get_gdat_float((X),(Y),530)
+#define get_gdat_uint_pos531(X,Y) get_gdat_uint((X),(Y),531)
+#define get_gdat_ullong_pos531(X,Y) get_gdat_ullong((X),(Y),531)
+#define get_gdat_ip_pos531(X,Y) get_gdat_ip((X),(Y),531)
+#define get_gdat_ipv6_pos531(X,Y) get_gdat_ipv6((X),(Y),531)
+#define get_gdat_string_pos531(X,Y) get_gdat_string((X),(Y),531)
+#define get_gdat_v_str_pos531(X,Y) get_gdat_string((X),(Y),531)
+#define get_gdat_bool_pos531(X,Y) get_gdat_bool((X),(Y),531)
+#define get_gdat_int_pos531(X,Y) get_gdat_int((X),(Y),531)
+#define get_gdat_llong_pos531(X,Y) get_gdat_llong((X),(Y),531)
+#define get_gdat_float_pos531(X,Y) get_gdat_float((X),(Y),531)
+#define get_gdat_uint_pos532(X,Y) get_gdat_uint((X),(Y),532)
+#define get_gdat_ullong_pos532(X,Y) get_gdat_ullong((X),(Y),532)
+#define get_gdat_ip_pos532(X,Y) get_gdat_ip((X),(Y),532)
+#define get_gdat_ipv6_pos532(X,Y) get_gdat_ipv6((X),(Y),532)
+#define get_gdat_string_pos532(X,Y) get_gdat_string((X),(Y),532)
+#define get_gdat_v_str_pos532(X,Y) get_gdat_string((X),(Y),532)
+#define get_gdat_bool_pos532(X,Y) get_gdat_bool((X),(Y),532)
+#define get_gdat_int_pos532(X,Y) get_gdat_int((X),(Y),532)
+#define get_gdat_llong_pos532(X,Y) get_gdat_llong((X),(Y),532)
+#define get_gdat_float_pos532(X,Y) get_gdat_float((X),(Y),532)
+#define get_gdat_uint_pos533(X,Y) get_gdat_uint((X),(Y),533)
+#define get_gdat_ullong_pos533(X,Y) get_gdat_ullong((X),(Y),533)
+#define get_gdat_ip_pos533(X,Y) get_gdat_ip((X),(Y),533)
+#define get_gdat_ipv6_pos533(X,Y) get_gdat_ipv6((X),(Y),533)
+#define get_gdat_string_pos533(X,Y) get_gdat_string((X),(Y),533)
+#define get_gdat_v_str_pos533(X,Y) get_gdat_string((X),(Y),533)
+#define get_gdat_bool_pos533(X,Y) get_gdat_bool((X),(Y),533)
+#define get_gdat_int_pos533(X,Y) get_gdat_int((X),(Y),533)
+#define get_gdat_llong_pos533(X,Y) get_gdat_llong((X),(Y),533)
+#define get_gdat_float_pos533(X,Y) get_gdat_float((X),(Y),533)
+#define get_gdat_uint_pos534(X,Y) get_gdat_uint((X),(Y),534)
+#define get_gdat_ullong_pos534(X,Y) get_gdat_ullong((X),(Y),534)
+#define get_gdat_ip_pos534(X,Y) get_gdat_ip((X),(Y),534)
+#define get_gdat_ipv6_pos534(X,Y) get_gdat_ipv6((X),(Y),534)
+#define get_gdat_string_pos534(X,Y) get_gdat_string((X),(Y),534)
+#define get_gdat_v_str_pos534(X,Y) get_gdat_string((X),(Y),534)
+#define get_gdat_bool_pos534(X,Y) get_gdat_bool((X),(Y),534)
+#define get_gdat_int_pos534(X,Y) get_gdat_int((X),(Y),534)
+#define get_gdat_llong_pos534(X,Y) get_gdat_llong((X),(Y),534)
+#define get_gdat_float_pos534(X,Y) get_gdat_float((X),(Y),534)
+#define get_gdat_uint_pos535(X,Y) get_gdat_uint((X),(Y),535)
+#define get_gdat_ullong_pos535(X,Y) get_gdat_ullong((X),(Y),535)
+#define get_gdat_ip_pos535(X,Y) get_gdat_ip((X),(Y),535)
+#define get_gdat_ipv6_pos535(X,Y) get_gdat_ipv6((X),(Y),535)
+#define get_gdat_string_pos535(X,Y) get_gdat_string((X),(Y),535)
+#define get_gdat_v_str_pos535(X,Y) get_gdat_string((X),(Y),535)
+#define get_gdat_bool_pos535(X,Y) get_gdat_bool((X),(Y),535)
+#define get_gdat_int_pos535(X,Y) get_gdat_int((X),(Y),535)
+#define get_gdat_llong_pos535(X,Y) get_gdat_llong((X),(Y),535)
+#define get_gdat_float_pos535(X,Y) get_gdat_float((X),(Y),535)
+#define get_gdat_uint_pos536(X,Y) get_gdat_uint((X),(Y),536)
+#define get_gdat_ullong_pos536(X,Y) get_gdat_ullong((X),(Y),536)
+#define get_gdat_ip_pos536(X,Y) get_gdat_ip((X),(Y),536)
+#define get_gdat_ipv6_pos536(X,Y) get_gdat_ipv6((X),(Y),536)
+#define get_gdat_string_pos536(X,Y) get_gdat_string((X),(Y),536)
+#define get_gdat_v_str_pos536(X,Y) get_gdat_string((X),(Y),536)
+#define get_gdat_bool_pos536(X,Y) get_gdat_bool((X),(Y),536)
+#define get_gdat_int_pos536(X,Y) get_gdat_int((X),(Y),536)
+#define get_gdat_llong_pos536(X,Y) get_gdat_llong((X),(Y),536)
+#define get_gdat_float_pos536(X,Y) get_gdat_float((X),(Y),536)
+#define get_gdat_uint_pos537(X,Y) get_gdat_uint((X),(Y),537)
+#define get_gdat_ullong_pos537(X,Y) get_gdat_ullong((X),(Y),537)
+#define get_gdat_ip_pos537(X,Y) get_gdat_ip((X),(Y),537)
+#define get_gdat_ipv6_pos537(X,Y) get_gdat_ipv6((X),(Y),537)
+#define get_gdat_string_pos537(X,Y) get_gdat_string((X),(Y),537)
+#define get_gdat_v_str_pos537(X,Y) get_gdat_string((X),(Y),537)
+#define get_gdat_bool_pos537(X,Y) get_gdat_bool((X),(Y),537)
+#define get_gdat_int_pos537(X,Y) get_gdat_int((X),(Y),537)
+#define get_gdat_llong_pos537(X,Y) get_gdat_llong((X),(Y),537)
+#define get_gdat_float_pos537(X,Y) get_gdat_float((X),(Y),537)
+#define get_gdat_uint_pos538(X,Y) get_gdat_uint((X),(Y),538)
+#define get_gdat_ullong_pos538(X,Y) get_gdat_ullong((X),(Y),538)
+#define get_gdat_ip_pos538(X,Y) get_gdat_ip((X),(Y),538)
+#define get_gdat_ipv6_pos538(X,Y) get_gdat_ipv6((X),(Y),538)
+#define get_gdat_string_pos538(X,Y) get_gdat_string((X),(Y),538)
+#define get_gdat_v_str_pos538(X,Y) get_gdat_string((X),(Y),538)
+#define get_gdat_bool_pos538(X,Y) get_gdat_bool((X),(Y),538)
+#define get_gdat_int_pos538(X,Y) get_gdat_int((X),(Y),538)
+#define get_gdat_llong_pos538(X,Y) get_gdat_llong((X),(Y),538)
+#define get_gdat_float_pos538(X,Y) get_gdat_float((X),(Y),538)
+#define get_gdat_uint_pos539(X,Y) get_gdat_uint((X),(Y),539)
+#define get_gdat_ullong_pos539(X,Y) get_gdat_ullong((X),(Y),539)
+#define get_gdat_ip_pos539(X,Y) get_gdat_ip((X),(Y),539)
+#define get_gdat_ipv6_pos539(X,Y) get_gdat_ipv6((X),(Y),539)
+#define get_gdat_string_pos539(X,Y) get_gdat_string((X),(Y),539)
+#define get_gdat_v_str_pos539(X,Y) get_gdat_string((X),(Y),539)
+#define get_gdat_bool_pos539(X,Y) get_gdat_bool((X),(Y),539)
+#define get_gdat_int_pos539(X,Y) get_gdat_int((X),(Y),539)
+#define get_gdat_llong_pos539(X,Y) get_gdat_llong((X),(Y),539)
+#define get_gdat_float_pos539(X,Y) get_gdat_float((X),(Y),539)
+#define get_gdat_uint_pos540(X,Y) get_gdat_uint((X),(Y),540)
+#define get_gdat_ullong_pos540(X,Y) get_gdat_ullong((X),(Y),540)
+#define get_gdat_ip_pos540(X,Y) get_gdat_ip((X),(Y),540)
+#define get_gdat_ipv6_pos540(X,Y) get_gdat_ipv6((X),(Y),540)
+#define get_gdat_string_pos540(X,Y) get_gdat_string((X),(Y),540)
+#define get_gdat_v_str_pos540(X,Y) get_gdat_string((X),(Y),540)
+#define get_gdat_bool_pos540(X,Y) get_gdat_bool((X),(Y),540)
+#define get_gdat_int_pos540(X,Y) get_gdat_int((X),(Y),540)
+#define get_gdat_llong_pos540(X,Y) get_gdat_llong((X),(Y),540)
+#define get_gdat_float_pos540(X,Y) get_gdat_float((X),(Y),540)
+#define get_gdat_uint_pos541(X,Y) get_gdat_uint((X),(Y),541)
+#define get_gdat_ullong_pos541(X,Y) get_gdat_ullong((X),(Y),541)
+#define get_gdat_ip_pos541(X,Y) get_gdat_ip((X),(Y),541)
+#define get_gdat_ipv6_pos541(X,Y) get_gdat_ipv6((X),(Y),541)
+#define get_gdat_string_pos541(X,Y) get_gdat_string((X),(Y),541)
+#define get_gdat_v_str_pos541(X,Y) get_gdat_string((X),(Y),541)
+#define get_gdat_bool_pos541(X,Y) get_gdat_bool((X),(Y),541)
+#define get_gdat_int_pos541(X,Y) get_gdat_int((X),(Y),541)
+#define get_gdat_llong_pos541(X,Y) get_gdat_llong((X),(Y),541)
+#define get_gdat_float_pos541(X,Y) get_gdat_float((X),(Y),541)
+#define get_gdat_uint_pos542(X,Y) get_gdat_uint((X),(Y),542)
+#define get_gdat_ullong_pos542(X,Y) get_gdat_ullong((X),(Y),542)
+#define get_gdat_ip_pos542(X,Y) get_gdat_ip((X),(Y),542)
+#define get_gdat_ipv6_pos542(X,Y) get_gdat_ipv6((X),(Y),542)
+#define get_gdat_string_pos542(X,Y) get_gdat_string((X),(Y),542)
+#define get_gdat_v_str_pos542(X,Y) get_gdat_string((X),(Y),542)
+#define get_gdat_bool_pos542(X,Y) get_gdat_bool((X),(Y),542)
+#define get_gdat_int_pos542(X,Y) get_gdat_int((X),(Y),542)
+#define get_gdat_llong_pos542(X,Y) get_gdat_llong((X),(Y),542)
+#define get_gdat_float_pos542(X,Y) get_gdat_float((X),(Y),542)
+#define get_gdat_uint_pos543(X,Y) get_gdat_uint((X),(Y),543)
+#define get_gdat_ullong_pos543(X,Y) get_gdat_ullong((X),(Y),543)
+#define get_gdat_ip_pos543(X,Y) get_gdat_ip((X),(Y),543)
+#define get_gdat_ipv6_pos543(X,Y) get_gdat_ipv6((X),(Y),543)
+#define get_gdat_string_pos543(X,Y) get_gdat_string((X),(Y),543)
+#define get_gdat_v_str_pos543(X,Y) get_gdat_string((X),(Y),543)
+#define get_gdat_bool_pos543(X,Y) get_gdat_bool((X),(Y),543)
+#define get_gdat_int_pos543(X,Y) get_gdat_int((X),(Y),543)
+#define get_gdat_llong_pos543(X,Y) get_gdat_llong((X),(Y),543)
+#define get_gdat_float_pos543(X,Y) get_gdat_float((X),(Y),543)
+#define get_gdat_uint_pos544(X,Y) get_gdat_uint((X),(Y),544)
+#define get_gdat_ullong_pos544(X,Y) get_gdat_ullong((X),(Y),544)
+#define get_gdat_ip_pos544(X,Y) get_gdat_ip((X),(Y),544)
+#define get_gdat_ipv6_pos544(X,Y) get_gdat_ipv6((X),(Y),544)
+#define get_gdat_string_pos544(X,Y) get_gdat_string((X),(Y),544)
+#define get_gdat_v_str_pos544(X,Y) get_gdat_string((X),(Y),544)
+#define get_gdat_bool_pos544(X,Y) get_gdat_bool((X),(Y),544)
+#define get_gdat_int_pos544(X,Y) get_gdat_int((X),(Y),544)
+#define get_gdat_llong_pos544(X,Y) get_gdat_llong((X),(Y),544)
+#define get_gdat_float_pos544(X,Y) get_gdat_float((X),(Y),544)
+#define get_gdat_uint_pos545(X,Y) get_gdat_uint((X),(Y),545)
+#define get_gdat_ullong_pos545(X,Y) get_gdat_ullong((X),(Y),545)
+#define get_gdat_ip_pos545(X,Y) get_gdat_ip((X),(Y),545)
+#define get_gdat_ipv6_pos545(X,Y) get_gdat_ipv6((X),(Y),545)
+#define get_gdat_string_pos545(X,Y) get_gdat_string((X),(Y),545)
+#define get_gdat_v_str_pos545(X,Y) get_gdat_string((X),(Y),545)
+#define get_gdat_bool_pos545(X,Y) get_gdat_bool((X),(Y),545)
+#define get_gdat_int_pos545(X,Y) get_gdat_int((X),(Y),545)
+#define get_gdat_llong_pos545(X,Y) get_gdat_llong((X),(Y),545)
+#define get_gdat_float_pos545(X,Y) get_gdat_float((X),(Y),545)
+#define get_gdat_uint_pos546(X,Y) get_gdat_uint((X),(Y),546)
+#define get_gdat_ullong_pos546(X,Y) get_gdat_ullong((X),(Y),546)
+#define get_gdat_ip_pos546(X,Y) get_gdat_ip((X),(Y),546)
+#define get_gdat_ipv6_pos546(X,Y) get_gdat_ipv6((X),(Y),546)
+#define get_gdat_string_pos546(X,Y) get_gdat_string((X),(Y),546)
+#define get_gdat_v_str_pos546(X,Y) get_gdat_string((X),(Y),546)
+#define get_gdat_bool_pos546(X,Y) get_gdat_bool((X),(Y),546)
+#define get_gdat_int_pos546(X,Y) get_gdat_int((X),(Y),546)
+#define get_gdat_llong_pos546(X,Y) get_gdat_llong((X),(Y),546)
+#define get_gdat_float_pos546(X,Y) get_gdat_float((X),(Y),546)
+#define get_gdat_uint_pos547(X,Y) get_gdat_uint((X),(Y),547)
+#define get_gdat_ullong_pos547(X,Y) get_gdat_ullong((X),(Y),547)
+#define get_gdat_ip_pos547(X,Y) get_gdat_ip((X),(Y),547)
+#define get_gdat_ipv6_pos547(X,Y) get_gdat_ipv6((X),(Y),547)
+#define get_gdat_string_pos547(X,Y) get_gdat_string((X),(Y),547)
+#define get_gdat_v_str_pos547(X,Y) get_gdat_string((X),(Y),547)
+#define get_gdat_bool_pos547(X,Y) get_gdat_bool((X),(Y),547)
+#define get_gdat_int_pos547(X,Y) get_gdat_int((X),(Y),547)
+#define get_gdat_llong_pos547(X,Y) get_gdat_llong((X),(Y),547)
+#define get_gdat_float_pos547(X,Y) get_gdat_float((X),(Y),547)
+#define get_gdat_uint_pos548(X,Y) get_gdat_uint((X),(Y),548)
+#define get_gdat_ullong_pos548(X,Y) get_gdat_ullong((X),(Y),548)
+#define get_gdat_ip_pos548(X,Y) get_gdat_ip((X),(Y),548)
+#define get_gdat_ipv6_pos548(X,Y) get_gdat_ipv6((X),(Y),548)
+#define get_gdat_string_pos548(X,Y) get_gdat_string((X),(Y),548)
+#define get_gdat_v_str_pos548(X,Y) get_gdat_string((X),(Y),548)
+#define get_gdat_bool_pos548(X,Y) get_gdat_bool((X),(Y),548)
+#define get_gdat_int_pos548(X,Y) get_gdat_int((X),(Y),548)
+#define get_gdat_llong_pos548(X,Y) get_gdat_llong((X),(Y),548)
+#define get_gdat_float_pos548(X,Y) get_gdat_float((X),(Y),548)
+#define get_gdat_uint_pos549(X,Y) get_gdat_uint((X),(Y),549)
+#define get_gdat_ullong_pos549(X,Y) get_gdat_ullong((X),(Y),549)
+#define get_gdat_ip_pos549(X,Y) get_gdat_ip((X),(Y),549)
+#define get_gdat_ipv6_pos549(X,Y) get_gdat_ipv6((X),(Y),549)
+#define get_gdat_string_pos549(X,Y) get_gdat_string((X),(Y),549)
+#define get_gdat_v_str_pos549(X,Y) get_gdat_string((X),(Y),549)
+#define get_gdat_bool_pos549(X,Y) get_gdat_bool((X),(Y),549)
+#define get_gdat_int_pos549(X,Y) get_gdat_int((X),(Y),549)
+#define get_gdat_llong_pos549(X,Y) get_gdat_llong((X),(Y),549)
+#define get_gdat_float_pos549(X,Y) get_gdat_float((X),(Y),549)
+#define get_gdat_uint_pos550(X,Y) get_gdat_uint((X),(Y),550)
+#define get_gdat_ullong_pos550(X,Y) get_gdat_ullong((X),(Y),550)
+#define get_gdat_ip_pos550(X,Y) get_gdat_ip((X),(Y),550)
+#define get_gdat_ipv6_pos550(X,Y) get_gdat_ipv6((X),(Y),550)
+#define get_gdat_string_pos550(X,Y) get_gdat_string((X),(Y),550)
+#define get_gdat_v_str_pos550(X,Y) get_gdat_string((X),(Y),550)
+#define get_gdat_bool_pos550(X,Y) get_gdat_bool((X),(Y),550)
+#define get_gdat_int_pos550(X,Y) get_gdat_int((X),(Y),550)
+#define get_gdat_llong_pos550(X,Y) get_gdat_llong((X),(Y),550)
+#define get_gdat_float_pos550(X,Y) get_gdat_float((X),(Y),550)
+#define get_gdat_uint_pos551(X,Y) get_gdat_uint((X),(Y),551)
+#define get_gdat_ullong_pos551(X,Y) get_gdat_ullong((X),(Y),551)
+#define get_gdat_ip_pos551(X,Y) get_gdat_ip((X),(Y),551)
+#define get_gdat_ipv6_pos551(X,Y) get_gdat_ipv6((X),(Y),551)
+#define get_gdat_string_pos551(X,Y) get_gdat_string((X),(Y),551)
+#define get_gdat_v_str_pos551(X,Y) get_gdat_string((X),(Y),551)
+#define get_gdat_bool_pos551(X,Y) get_gdat_bool((X),(Y),551)
+#define get_gdat_int_pos551(X,Y) get_gdat_int((X),(Y),551)
+#define get_gdat_llong_pos551(X,Y) get_gdat_llong((X),(Y),551)
+#define get_gdat_float_pos551(X,Y) get_gdat_float((X),(Y),551)
+#define get_gdat_uint_pos552(X,Y) get_gdat_uint((X),(Y),552)
+#define get_gdat_ullong_pos552(X,Y) get_gdat_ullong((X),(Y),552)
+#define get_gdat_ip_pos552(X,Y) get_gdat_ip((X),(Y),552)
+#define get_gdat_ipv6_pos552(X,Y) get_gdat_ipv6((X),(Y),552)
+#define get_gdat_string_pos552(X,Y) get_gdat_string((X),(Y),552)
+#define get_gdat_v_str_pos552(X,Y) get_gdat_string((X),(Y),552)
+#define get_gdat_bool_pos552(X,Y) get_gdat_bool((X),(Y),552)
+#define get_gdat_int_pos552(X,Y) get_gdat_int((X),(Y),552)
+#define get_gdat_llong_pos552(X,Y) get_gdat_llong((X),(Y),552)
+#define get_gdat_float_pos552(X,Y) get_gdat_float((X),(Y),552)
+#define get_gdat_uint_pos553(X,Y) get_gdat_uint((X),(Y),553)
+#define get_gdat_ullong_pos553(X,Y) get_gdat_ullong((X),(Y),553)
+#define get_gdat_ip_pos553(X,Y) get_gdat_ip((X),(Y),553)
+#define get_gdat_ipv6_pos553(X,Y) get_gdat_ipv6((X),(Y),553)
+#define get_gdat_string_pos553(X,Y) get_gdat_string((X),(Y),553)
+#define get_gdat_v_str_pos553(X,Y) get_gdat_string((X),(Y),553)
+#define get_gdat_bool_pos553(X,Y) get_gdat_bool((X),(Y),553)
+#define get_gdat_int_pos553(X,Y) get_gdat_int((X),(Y),553)
+#define get_gdat_llong_pos553(X,Y) get_gdat_llong((X),(Y),553)
+#define get_gdat_float_pos553(X,Y) get_gdat_float((X),(Y),553)
+#define get_gdat_uint_pos554(X,Y) get_gdat_uint((X),(Y),554)
+#define get_gdat_ullong_pos554(X,Y) get_gdat_ullong((X),(Y),554)
+#define get_gdat_ip_pos554(X,Y) get_gdat_ip((X),(Y),554)
+#define get_gdat_ipv6_pos554(X,Y) get_gdat_ipv6((X),(Y),554)
+#define get_gdat_string_pos554(X,Y) get_gdat_string((X),(Y),554)
+#define get_gdat_v_str_pos554(X,Y) get_gdat_string((X),(Y),554)
+#define get_gdat_bool_pos554(X,Y) get_gdat_bool((X),(Y),554)
+#define get_gdat_int_pos554(X,Y) get_gdat_int((X),(Y),554)
+#define get_gdat_llong_pos554(X,Y) get_gdat_llong((X),(Y),554)
+#define get_gdat_float_pos554(X,Y) get_gdat_float((X),(Y),554)
+#define get_gdat_uint_pos555(X,Y) get_gdat_uint((X),(Y),555)
+#define get_gdat_ullong_pos555(X,Y) get_gdat_ullong((X),(Y),555)
+#define get_gdat_ip_pos555(X,Y) get_gdat_ip((X),(Y),555)
+#define get_gdat_ipv6_pos555(X,Y) get_gdat_ipv6((X),(Y),555)
+#define get_gdat_string_pos555(X,Y) get_gdat_string((X),(Y),555)
+#define get_gdat_v_str_pos555(X,Y) get_gdat_string((X),(Y),555)
+#define get_gdat_bool_pos555(X,Y) get_gdat_bool((X),(Y),555)
+#define get_gdat_int_pos555(X,Y) get_gdat_int((X),(Y),555)
+#define get_gdat_llong_pos555(X,Y) get_gdat_llong((X),(Y),555)
+#define get_gdat_float_pos555(X,Y) get_gdat_float((X),(Y),555)
+#define get_gdat_uint_pos556(X,Y) get_gdat_uint((X),(Y),556)
+#define get_gdat_ullong_pos556(X,Y) get_gdat_ullong((X),(Y),556)
+#define get_gdat_ip_pos556(X,Y) get_gdat_ip((X),(Y),556)
+#define get_gdat_ipv6_pos556(X,Y) get_gdat_ipv6((X),(Y),556)
+#define get_gdat_string_pos556(X,Y) get_gdat_string((X),(Y),556)
+#define get_gdat_v_str_pos556(X,Y) get_gdat_string((X),(Y),556)
+#define get_gdat_bool_pos556(X,Y) get_gdat_bool((X),(Y),556)
+#define get_gdat_int_pos556(X,Y) get_gdat_int((X),(Y),556)
+#define get_gdat_llong_pos556(X,Y) get_gdat_llong((X),(Y),556)
+#define get_gdat_float_pos556(X,Y) get_gdat_float((X),(Y),556)
+#define get_gdat_uint_pos557(X,Y) get_gdat_uint((X),(Y),557)
+#define get_gdat_ullong_pos557(X,Y) get_gdat_ullong((X),(Y),557)
+#define get_gdat_ip_pos557(X,Y) get_gdat_ip((X),(Y),557)
+#define get_gdat_ipv6_pos557(X,Y) get_gdat_ipv6((X),(Y),557)
+#define get_gdat_string_pos557(X,Y) get_gdat_string((X),(Y),557)
+#define get_gdat_v_str_pos557(X,Y) get_gdat_string((X),(Y),557)
+#define get_gdat_bool_pos557(X,Y) get_gdat_bool((X),(Y),557)
+#define get_gdat_int_pos557(X,Y) get_gdat_int((X),(Y),557)
+#define get_gdat_llong_pos557(X,Y) get_gdat_llong((X),(Y),557)
+#define get_gdat_float_pos557(X,Y) get_gdat_float((X),(Y),557)
+#define get_gdat_uint_pos558(X,Y) get_gdat_uint((X),(Y),558)
+#define get_gdat_ullong_pos558(X,Y) get_gdat_ullong((X),(Y),558)
+#define get_gdat_ip_pos558(X,Y) get_gdat_ip((X),(Y),558)
+#define get_gdat_ipv6_pos558(X,Y) get_gdat_ipv6((X),(Y),558)
+#define get_gdat_string_pos558(X,Y) get_gdat_string((X),(Y),558)
+#define get_gdat_v_str_pos558(X,Y) get_gdat_string((X),(Y),558)
+#define get_gdat_bool_pos558(X,Y) get_gdat_bool((X),(Y),558)
+#define get_gdat_int_pos558(X,Y) get_gdat_int((X),(Y),558)
+#define get_gdat_llong_pos558(X,Y) get_gdat_llong((X),(Y),558)
+#define get_gdat_float_pos558(X,Y) get_gdat_float((X),(Y),558)
+#define get_gdat_uint_pos559(X,Y) get_gdat_uint((X),(Y),559)
+#define get_gdat_ullong_pos559(X,Y) get_gdat_ullong((X),(Y),559)
+#define get_gdat_ip_pos559(X,Y) get_gdat_ip((X),(Y),559)
+#define get_gdat_ipv6_pos559(X,Y) get_gdat_ipv6((X),(Y),559)
+#define get_gdat_string_pos559(X,Y) get_gdat_string((X),(Y),559)
+#define get_gdat_v_str_pos559(X,Y) get_gdat_string((X),(Y),559)
+#define get_gdat_bool_pos559(X,Y) get_gdat_bool((X),(Y),559)
+#define get_gdat_int_pos559(X,Y) get_gdat_int((X),(Y),559)
+#define get_gdat_llong_pos559(X,Y) get_gdat_llong((X),(Y),559)
+#define get_gdat_float_pos559(X,Y) get_gdat_float((X),(Y),559)
+#define get_gdat_uint_pos560(X,Y) get_gdat_uint((X),(Y),560)
+#define get_gdat_ullong_pos560(X,Y) get_gdat_ullong((X),(Y),560)
+#define get_gdat_ip_pos560(X,Y) get_gdat_ip((X),(Y),560)
+#define get_gdat_ipv6_pos560(X,Y) get_gdat_ipv6((X),(Y),560)
+#define get_gdat_string_pos560(X,Y) get_gdat_string((X),(Y),560)
+#define get_gdat_v_str_pos560(X,Y) get_gdat_string((X),(Y),560)
+#define get_gdat_bool_pos560(X,Y) get_gdat_bool((X),(Y),560)
+#define get_gdat_int_pos560(X,Y) get_gdat_int((X),(Y),560)
+#define get_gdat_llong_pos560(X,Y) get_gdat_llong((X),(Y),560)
+#define get_gdat_float_pos560(X,Y) get_gdat_float((X),(Y),560)
+#define get_gdat_uint_pos561(X,Y) get_gdat_uint((X),(Y),561)
+#define get_gdat_ullong_pos561(X,Y) get_gdat_ullong((X),(Y),561)
+#define get_gdat_ip_pos561(X,Y) get_gdat_ip((X),(Y),561)
+#define get_gdat_ipv6_pos561(X,Y) get_gdat_ipv6((X),(Y),561)
+#define get_gdat_string_pos561(X,Y) get_gdat_string((X),(Y),561)
+#define get_gdat_v_str_pos561(X,Y) get_gdat_string((X),(Y),561)
+#define get_gdat_bool_pos561(X,Y) get_gdat_bool((X),(Y),561)
+#define get_gdat_int_pos561(X,Y) get_gdat_int((X),(Y),561)
+#define get_gdat_llong_pos561(X,Y) get_gdat_llong((X),(Y),561)
+#define get_gdat_float_pos561(X,Y) get_gdat_float((X),(Y),561)
+#define get_gdat_uint_pos562(X,Y) get_gdat_uint((X),(Y),562)
+#define get_gdat_ullong_pos562(X,Y) get_gdat_ullong((X),(Y),562)
+#define get_gdat_ip_pos562(X,Y) get_gdat_ip((X),(Y),562)
+#define get_gdat_ipv6_pos562(X,Y) get_gdat_ipv6((X),(Y),562)
+#define get_gdat_string_pos562(X,Y) get_gdat_string((X),(Y),562)
+#define get_gdat_v_str_pos562(X,Y) get_gdat_string((X),(Y),562)
+#define get_gdat_bool_pos562(X,Y) get_gdat_bool((X),(Y),562)
+#define get_gdat_int_pos562(X,Y) get_gdat_int((X),(Y),562)
+#define get_gdat_llong_pos562(X,Y) get_gdat_llong((X),(Y),562)
+#define get_gdat_float_pos562(X,Y) get_gdat_float((X),(Y),562)
+#define get_gdat_uint_pos563(X,Y) get_gdat_uint((X),(Y),563)
+#define get_gdat_ullong_pos563(X,Y) get_gdat_ullong((X),(Y),563)
+#define get_gdat_ip_pos563(X,Y) get_gdat_ip((X),(Y),563)
+#define get_gdat_ipv6_pos563(X,Y) get_gdat_ipv6((X),(Y),563)
+#define get_gdat_string_pos563(X,Y) get_gdat_string((X),(Y),563)
+#define get_gdat_v_str_pos563(X,Y) get_gdat_string((X),(Y),563)
+#define get_gdat_bool_pos563(X,Y) get_gdat_bool((X),(Y),563)
+#define get_gdat_int_pos563(X,Y) get_gdat_int((X),(Y),563)
+#define get_gdat_llong_pos563(X,Y) get_gdat_llong((X),(Y),563)
+#define get_gdat_float_pos563(X,Y) get_gdat_float((X),(Y),563)
+#define get_gdat_uint_pos564(X,Y) get_gdat_uint((X),(Y),564)
+#define get_gdat_ullong_pos564(X,Y) get_gdat_ullong((X),(Y),564)
+#define get_gdat_ip_pos564(X,Y) get_gdat_ip((X),(Y),564)
+#define get_gdat_ipv6_pos564(X,Y) get_gdat_ipv6((X),(Y),564)
+#define get_gdat_string_pos564(X,Y) get_gdat_string((X),(Y),564)
+#define get_gdat_v_str_pos564(X,Y) get_gdat_string((X),(Y),564)
+#define get_gdat_bool_pos564(X,Y) get_gdat_bool((X),(Y),564)
+#define get_gdat_int_pos564(X,Y) get_gdat_int((X),(Y),564)
+#define get_gdat_llong_pos564(X,Y) get_gdat_llong((X),(Y),564)
+#define get_gdat_float_pos564(X,Y) get_gdat_float((X),(Y),564)
+#define get_gdat_uint_pos565(X,Y) get_gdat_uint((X),(Y),565)
+#define get_gdat_ullong_pos565(X,Y) get_gdat_ullong((X),(Y),565)
+#define get_gdat_ip_pos565(X,Y) get_gdat_ip((X),(Y),565)
+#define get_gdat_ipv6_pos565(X,Y) get_gdat_ipv6((X),(Y),565)
+#define get_gdat_string_pos565(X,Y) get_gdat_string((X),(Y),565)
+#define get_gdat_v_str_pos565(X,Y) get_gdat_string((X),(Y),565)
+#define get_gdat_bool_pos565(X,Y) get_gdat_bool((X),(Y),565)
+#define get_gdat_int_pos565(X,Y) get_gdat_int((X),(Y),565)
+#define get_gdat_llong_pos565(X,Y) get_gdat_llong((X),(Y),565)
+#define get_gdat_float_pos565(X,Y) get_gdat_float((X),(Y),565)
+#define get_gdat_uint_pos566(X,Y) get_gdat_uint((X),(Y),566)
+#define get_gdat_ullong_pos566(X,Y) get_gdat_ullong((X),(Y),566)
+#define get_gdat_ip_pos566(X,Y) get_gdat_ip((X),(Y),566)
+#define get_gdat_ipv6_pos566(X,Y) get_gdat_ipv6((X),(Y),566)
+#define get_gdat_string_pos566(X,Y) get_gdat_string((X),(Y),566)
+#define get_gdat_v_str_pos566(X,Y) get_gdat_string((X),(Y),566)
+#define get_gdat_bool_pos566(X,Y) get_gdat_bool((X),(Y),566)
+#define get_gdat_int_pos566(X,Y) get_gdat_int((X),(Y),566)
+#define get_gdat_llong_pos566(X,Y) get_gdat_llong((X),(Y),566)
+#define get_gdat_float_pos566(X,Y) get_gdat_float((X),(Y),566)
+#define get_gdat_uint_pos567(X,Y) get_gdat_uint((X),(Y),567)
+#define get_gdat_ullong_pos567(X,Y) get_gdat_ullong((X),(Y),567)
+#define get_gdat_ip_pos567(X,Y) get_gdat_ip((X),(Y),567)
+#define get_gdat_ipv6_pos567(X,Y) get_gdat_ipv6((X),(Y),567)
+#define get_gdat_string_pos567(X,Y) get_gdat_string((X),(Y),567)
+#define get_gdat_v_str_pos567(X,Y) get_gdat_string((X),(Y),567)
+#define get_gdat_bool_pos567(X,Y) get_gdat_bool((X),(Y),567)
+#define get_gdat_int_pos567(X,Y) get_gdat_int((X),(Y),567)
+#define get_gdat_llong_pos567(X,Y) get_gdat_llong((X),(Y),567)
+#define get_gdat_float_pos567(X,Y) get_gdat_float((X),(Y),567)
+#define get_gdat_uint_pos568(X,Y) get_gdat_uint((X),(Y),568)
+#define get_gdat_ullong_pos568(X,Y) get_gdat_ullong((X),(Y),568)
+#define get_gdat_ip_pos568(X,Y) get_gdat_ip((X),(Y),568)
+#define get_gdat_ipv6_pos568(X,Y) get_gdat_ipv6((X),(Y),568)
+#define get_gdat_string_pos568(X,Y) get_gdat_string((X),(Y),568)
+#define get_gdat_v_str_pos568(X,Y) get_gdat_string((X),(Y),568)
+#define get_gdat_bool_pos568(X,Y) get_gdat_bool((X),(Y),568)
+#define get_gdat_int_pos568(X,Y) get_gdat_int((X),(Y),568)
+#define get_gdat_llong_pos568(X,Y) get_gdat_llong((X),(Y),568)
+#define get_gdat_float_pos568(X,Y) get_gdat_float((X),(Y),568)
+#define get_gdat_uint_pos569(X,Y) get_gdat_uint((X),(Y),569)
+#define get_gdat_ullong_pos569(X,Y) get_gdat_ullong((X),(Y),569)
+#define get_gdat_ip_pos569(X,Y) get_gdat_ip((X),(Y),569)
+#define get_gdat_ipv6_pos569(X,Y) get_gdat_ipv6((X),(Y),569)
+#define get_gdat_string_pos569(X,Y) get_gdat_string((X),(Y),569)
+#define get_gdat_v_str_pos569(X,Y) get_gdat_string((X),(Y),569)
+#define get_gdat_bool_pos569(X,Y) get_gdat_bool((X),(Y),569)
+#define get_gdat_int_pos569(X,Y) get_gdat_int((X),(Y),569)
+#define get_gdat_llong_pos569(X,Y) get_gdat_llong((X),(Y),569)
+#define get_gdat_float_pos569(X,Y) get_gdat_float((X),(Y),569)
+#define get_gdat_uint_pos570(X,Y) get_gdat_uint((X),(Y),570)
+#define get_gdat_ullong_pos570(X,Y) get_gdat_ullong((X),(Y),570)
+#define get_gdat_ip_pos570(X,Y) get_gdat_ip((X),(Y),570)
+#define get_gdat_ipv6_pos570(X,Y) get_gdat_ipv6((X),(Y),570)
+#define get_gdat_string_pos570(X,Y) get_gdat_string((X),(Y),570)
+#define get_gdat_v_str_pos570(X,Y) get_gdat_string((X),(Y),570)
+#define get_gdat_bool_pos570(X,Y) get_gdat_bool((X),(Y),570)
+#define get_gdat_int_pos570(X,Y) get_gdat_int((X),(Y),570)
+#define get_gdat_llong_pos570(X,Y) get_gdat_llong((X),(Y),570)
+#define get_gdat_float_pos570(X,Y) get_gdat_float((X),(Y),570)
+#define get_gdat_uint_pos571(X,Y) get_gdat_uint((X),(Y),571)
+#define get_gdat_ullong_pos571(X,Y) get_gdat_ullong((X),(Y),571)
+#define get_gdat_ip_pos571(X,Y) get_gdat_ip((X),(Y),571)
+#define get_gdat_ipv6_pos571(X,Y) get_gdat_ipv6((X),(Y),571)
+#define get_gdat_string_pos571(X,Y) get_gdat_string((X),(Y),571)
+#define get_gdat_v_str_pos571(X,Y) get_gdat_string((X),(Y),571)
+#define get_gdat_bool_pos571(X,Y) get_gdat_bool((X),(Y),571)
+#define get_gdat_int_pos571(X,Y) get_gdat_int((X),(Y),571)
+#define get_gdat_llong_pos571(X,Y) get_gdat_llong((X),(Y),571)
+#define get_gdat_float_pos571(X,Y) get_gdat_float((X),(Y),571)
+#define get_gdat_uint_pos572(X,Y) get_gdat_uint((X),(Y),572)
+#define get_gdat_ullong_pos572(X,Y) get_gdat_ullong((X),(Y),572)
+#define get_gdat_ip_pos572(X,Y) get_gdat_ip((X),(Y),572)
+#define get_gdat_ipv6_pos572(X,Y) get_gdat_ipv6((X),(Y),572)
+#define get_gdat_string_pos572(X,Y) get_gdat_string((X),(Y),572)
+#define get_gdat_v_str_pos572(X,Y) get_gdat_string((X),(Y),572)
+#define get_gdat_bool_pos572(X,Y) get_gdat_bool((X),(Y),572)
+#define get_gdat_int_pos572(X,Y) get_gdat_int((X),(Y),572)
+#define get_gdat_llong_pos572(X,Y) get_gdat_llong((X),(Y),572)
+#define get_gdat_float_pos572(X,Y) get_gdat_float((X),(Y),572)
+#define get_gdat_uint_pos573(X,Y) get_gdat_uint((X),(Y),573)
+#define get_gdat_ullong_pos573(X,Y) get_gdat_ullong((X),(Y),573)
+#define get_gdat_ip_pos573(X,Y) get_gdat_ip((X),(Y),573)
+#define get_gdat_ipv6_pos573(X,Y) get_gdat_ipv6((X),(Y),573)
+#define get_gdat_string_pos573(X,Y) get_gdat_string((X),(Y),573)
+#define get_gdat_v_str_pos573(X,Y) get_gdat_string((X),(Y),573)
+#define get_gdat_bool_pos573(X,Y) get_gdat_bool((X),(Y),573)
+#define get_gdat_int_pos573(X,Y) get_gdat_int((X),(Y),573)
+#define get_gdat_llong_pos573(X,Y) get_gdat_llong((X),(Y),573)
+#define get_gdat_float_pos573(X,Y) get_gdat_float((X),(Y),573)
+#define get_gdat_uint_pos574(X,Y) get_gdat_uint((X),(Y),574)
+#define get_gdat_ullong_pos574(X,Y) get_gdat_ullong((X),(Y),574)
+#define get_gdat_ip_pos574(X,Y) get_gdat_ip((X),(Y),574)
+#define get_gdat_ipv6_pos574(X,Y) get_gdat_ipv6((X),(Y),574)
+#define get_gdat_string_pos574(X,Y) get_gdat_string((X),(Y),574)
+#define get_gdat_v_str_pos574(X,Y) get_gdat_string((X),(Y),574)
+#define get_gdat_bool_pos574(X,Y) get_gdat_bool((X),(Y),574)
+#define get_gdat_int_pos574(X,Y) get_gdat_int((X),(Y),574)
+#define get_gdat_llong_pos574(X,Y) get_gdat_llong((X),(Y),574)
+#define get_gdat_float_pos574(X,Y) get_gdat_float((X),(Y),574)
+#define get_gdat_uint_pos575(X,Y) get_gdat_uint((X),(Y),575)
+#define get_gdat_ullong_pos575(X,Y) get_gdat_ullong((X),(Y),575)
+#define get_gdat_ip_pos575(X,Y) get_gdat_ip((X),(Y),575)
+#define get_gdat_ipv6_pos575(X,Y) get_gdat_ipv6((X),(Y),575)
+#define get_gdat_string_pos575(X,Y) get_gdat_string((X),(Y),575)
+#define get_gdat_v_str_pos575(X,Y) get_gdat_string((X),(Y),575)
+#define get_gdat_bool_pos575(X,Y) get_gdat_bool((X),(Y),575)
+#define get_gdat_int_pos575(X,Y) get_gdat_int((X),(Y),575)
+#define get_gdat_llong_pos575(X,Y) get_gdat_llong((X),(Y),575)
+#define get_gdat_float_pos575(X,Y) get_gdat_float((X),(Y),575)
+#define get_gdat_uint_pos576(X,Y) get_gdat_uint((X),(Y),576)
+#define get_gdat_ullong_pos576(X,Y) get_gdat_ullong((X),(Y),576)
+#define get_gdat_ip_pos576(X,Y) get_gdat_ip((X),(Y),576)
+#define get_gdat_ipv6_pos576(X,Y) get_gdat_ipv6((X),(Y),576)
+#define get_gdat_string_pos576(X,Y) get_gdat_string((X),(Y),576)
+#define get_gdat_v_str_pos576(X,Y) get_gdat_string((X),(Y),576)
+#define get_gdat_bool_pos576(X,Y) get_gdat_bool((X),(Y),576)
+#define get_gdat_int_pos576(X,Y) get_gdat_int((X),(Y),576)
+#define get_gdat_llong_pos576(X,Y) get_gdat_llong((X),(Y),576)
+#define get_gdat_float_pos576(X,Y) get_gdat_float((X),(Y),576)
+#define get_gdat_uint_pos577(X,Y) get_gdat_uint((X),(Y),577)
+#define get_gdat_ullong_pos577(X,Y) get_gdat_ullong((X),(Y),577)
+#define get_gdat_ip_pos577(X,Y) get_gdat_ip((X),(Y),577)
+#define get_gdat_ipv6_pos577(X,Y) get_gdat_ipv6((X),(Y),577)
+#define get_gdat_string_pos577(X,Y) get_gdat_string((X),(Y),577)
+#define get_gdat_v_str_pos577(X,Y) get_gdat_string((X),(Y),577)
+#define get_gdat_bool_pos577(X,Y) get_gdat_bool((X),(Y),577)
+#define get_gdat_int_pos577(X,Y) get_gdat_int((X),(Y),577)
+#define get_gdat_llong_pos577(X,Y) get_gdat_llong((X),(Y),577)
+#define get_gdat_float_pos577(X,Y) get_gdat_float((X),(Y),577)
+#define get_gdat_uint_pos578(X,Y) get_gdat_uint((X),(Y),578)
+#define get_gdat_ullong_pos578(X,Y) get_gdat_ullong((X),(Y),578)
+#define get_gdat_ip_pos578(X,Y) get_gdat_ip((X),(Y),578)
+#define get_gdat_ipv6_pos578(X,Y) get_gdat_ipv6((X),(Y),578)
+#define get_gdat_string_pos578(X,Y) get_gdat_string((X),(Y),578)
+#define get_gdat_v_str_pos578(X,Y) get_gdat_string((X),(Y),578)
+#define get_gdat_bool_pos578(X,Y) get_gdat_bool((X),(Y),578)
+#define get_gdat_int_pos578(X,Y) get_gdat_int((X),(Y),578)
+#define get_gdat_llong_pos578(X,Y) get_gdat_llong((X),(Y),578)
+#define get_gdat_float_pos578(X,Y) get_gdat_float((X),(Y),578)
+#define get_gdat_uint_pos579(X,Y) get_gdat_uint((X),(Y),579)
+#define get_gdat_ullong_pos579(X,Y) get_gdat_ullong((X),(Y),579)
+#define get_gdat_ip_pos579(X,Y) get_gdat_ip((X),(Y),579)
+#define get_gdat_ipv6_pos579(X,Y) get_gdat_ipv6((X),(Y),579)
+#define get_gdat_string_pos579(X,Y) get_gdat_string((X),(Y),579)
+#define get_gdat_v_str_pos579(X,Y) get_gdat_string((X),(Y),579)
+#define get_gdat_bool_pos579(X,Y) get_gdat_bool((X),(Y),579)
+#define get_gdat_int_pos579(X,Y) get_gdat_int((X),(Y),579)
+#define get_gdat_llong_pos579(X,Y) get_gdat_llong((X),(Y),579)
+#define get_gdat_float_pos579(X,Y) get_gdat_float((X),(Y),579)
+#define get_gdat_uint_pos580(X,Y) get_gdat_uint((X),(Y),580)
+#define get_gdat_ullong_pos580(X,Y) get_gdat_ullong((X),(Y),580)
+#define get_gdat_ip_pos580(X,Y) get_gdat_ip((X),(Y),580)
+#define get_gdat_ipv6_pos580(X,Y) get_gdat_ipv6((X),(Y),580)
+#define get_gdat_string_pos580(X,Y) get_gdat_string((X),(Y),580)
+#define get_gdat_v_str_pos580(X,Y) get_gdat_string((X),(Y),580)
+#define get_gdat_bool_pos580(X,Y) get_gdat_bool((X),(Y),580)
+#define get_gdat_int_pos580(X,Y) get_gdat_int((X),(Y),580)
+#define get_gdat_llong_pos580(X,Y) get_gdat_llong((X),(Y),580)
+#define get_gdat_float_pos580(X,Y) get_gdat_float((X),(Y),580)
+#define get_gdat_uint_pos581(X,Y) get_gdat_uint((X),(Y),581)
+#define get_gdat_ullong_pos581(X,Y) get_gdat_ullong((X),(Y),581)
+#define get_gdat_ip_pos581(X,Y) get_gdat_ip((X),(Y),581)
+#define get_gdat_ipv6_pos581(X,Y) get_gdat_ipv6((X),(Y),581)
+#define get_gdat_string_pos581(X,Y) get_gdat_string((X),(Y),581)
+#define get_gdat_v_str_pos581(X,Y) get_gdat_string((X),(Y),581)
+#define get_gdat_bool_pos581(X,Y) get_gdat_bool((X),(Y),581)
+#define get_gdat_int_pos581(X,Y) get_gdat_int((X),(Y),581)
+#define get_gdat_llong_pos581(X,Y) get_gdat_llong((X),(Y),581)
+#define get_gdat_float_pos581(X,Y) get_gdat_float((X),(Y),581)
+#define get_gdat_uint_pos582(X,Y) get_gdat_uint((X),(Y),582)
+#define get_gdat_ullong_pos582(X,Y) get_gdat_ullong((X),(Y),582)
+#define get_gdat_ip_pos582(X,Y) get_gdat_ip((X),(Y),582)
+#define get_gdat_ipv6_pos582(X,Y) get_gdat_ipv6((X),(Y),582)
+#define get_gdat_string_pos582(X,Y) get_gdat_string((X),(Y),582)
+#define get_gdat_v_str_pos582(X,Y) get_gdat_string((X),(Y),582)
+#define get_gdat_bool_pos582(X,Y) get_gdat_bool((X),(Y),582)
+#define get_gdat_int_pos582(X,Y) get_gdat_int((X),(Y),582)
+#define get_gdat_llong_pos582(X,Y) get_gdat_llong((X),(Y),582)
+#define get_gdat_float_pos582(X,Y) get_gdat_float((X),(Y),582)
+#define get_gdat_uint_pos583(X,Y) get_gdat_uint((X),(Y),583)
+#define get_gdat_ullong_pos583(X,Y) get_gdat_ullong((X),(Y),583)
+#define get_gdat_ip_pos583(X,Y) get_gdat_ip((X),(Y),583)
+#define get_gdat_ipv6_pos583(X,Y) get_gdat_ipv6((X),(Y),583)
+#define get_gdat_string_pos583(X,Y) get_gdat_string((X),(Y),583)
+#define get_gdat_v_str_pos583(X,Y) get_gdat_string((X),(Y),583)
+#define get_gdat_bool_pos583(X,Y) get_gdat_bool((X),(Y),583)
+#define get_gdat_int_pos583(X,Y) get_gdat_int((X),(Y),583)
+#define get_gdat_llong_pos583(X,Y) get_gdat_llong((X),(Y),583)
+#define get_gdat_float_pos583(X,Y) get_gdat_float((X),(Y),583)
+#define get_gdat_uint_pos584(X,Y) get_gdat_uint((X),(Y),584)
+#define get_gdat_ullong_pos584(X,Y) get_gdat_ullong((X),(Y),584)
+#define get_gdat_ip_pos584(X,Y) get_gdat_ip((X),(Y),584)
+#define get_gdat_ipv6_pos584(X,Y) get_gdat_ipv6((X),(Y),584)
+#define get_gdat_string_pos584(X,Y) get_gdat_string((X),(Y),584)
+#define get_gdat_v_str_pos584(X,Y) get_gdat_string((X),(Y),584)
+#define get_gdat_bool_pos584(X,Y) get_gdat_bool((X),(Y),584)
+#define get_gdat_int_pos584(X,Y) get_gdat_int((X),(Y),584)
+#define get_gdat_llong_pos584(X,Y) get_gdat_llong((X),(Y),584)
+#define get_gdat_float_pos584(X,Y) get_gdat_float((X),(Y),584)
+#define get_gdat_uint_pos585(X,Y) get_gdat_uint((X),(Y),585)
+#define get_gdat_ullong_pos585(X,Y) get_gdat_ullong((X),(Y),585)
+#define get_gdat_ip_pos585(X,Y) get_gdat_ip((X),(Y),585)
+#define get_gdat_ipv6_pos585(X,Y) get_gdat_ipv6((X),(Y),585)
+#define get_gdat_string_pos585(X,Y) get_gdat_string((X),(Y),585)
+#define get_gdat_v_str_pos585(X,Y) get_gdat_string((X),(Y),585)
+#define get_gdat_bool_pos585(X,Y) get_gdat_bool((X),(Y),585)
+#define get_gdat_int_pos585(X,Y) get_gdat_int((X),(Y),585)
+#define get_gdat_llong_pos585(X,Y) get_gdat_llong((X),(Y),585)
+#define get_gdat_float_pos585(X,Y) get_gdat_float((X),(Y),585)
+#define get_gdat_uint_pos586(X,Y) get_gdat_uint((X),(Y),586)
+#define get_gdat_ullong_pos586(X,Y) get_gdat_ullong((X),(Y),586)
+#define get_gdat_ip_pos586(X,Y) get_gdat_ip((X),(Y),586)
+#define get_gdat_ipv6_pos586(X,Y) get_gdat_ipv6((X),(Y),586)
+#define get_gdat_string_pos586(X,Y) get_gdat_string((X),(Y),586)
+#define get_gdat_v_str_pos586(X,Y) get_gdat_string((X),(Y),586)
+#define get_gdat_bool_pos586(X,Y) get_gdat_bool((X),(Y),586)
+#define get_gdat_int_pos586(X,Y) get_gdat_int((X),(Y),586)
+#define get_gdat_llong_pos586(X,Y) get_gdat_llong((X),(Y),586)
+#define get_gdat_float_pos586(X,Y) get_gdat_float((X),(Y),586)
+#define get_gdat_uint_pos587(X,Y) get_gdat_uint((X),(Y),587)
+#define get_gdat_ullong_pos587(X,Y) get_gdat_ullong((X),(Y),587)
+#define get_gdat_ip_pos587(X,Y) get_gdat_ip((X),(Y),587)
+#define get_gdat_ipv6_pos587(X,Y) get_gdat_ipv6((X),(Y),587)
+#define get_gdat_string_pos587(X,Y) get_gdat_string((X),(Y),587)
+#define get_gdat_v_str_pos587(X,Y) get_gdat_string((X),(Y),587)
+#define get_gdat_bool_pos587(X,Y) get_gdat_bool((X),(Y),587)
+#define get_gdat_int_pos587(X,Y) get_gdat_int((X),(Y),587)
+#define get_gdat_llong_pos587(X,Y) get_gdat_llong((X),(Y),587)
+#define get_gdat_float_pos587(X,Y) get_gdat_float((X),(Y),587)
+#define get_gdat_uint_pos588(X,Y) get_gdat_uint((X),(Y),588)
+#define get_gdat_ullong_pos588(X,Y) get_gdat_ullong((X),(Y),588)
+#define get_gdat_ip_pos588(X,Y) get_gdat_ip((X),(Y),588)
+#define get_gdat_ipv6_pos588(X,Y) get_gdat_ipv6((X),(Y),588)
+#define get_gdat_string_pos588(X,Y) get_gdat_string((X),(Y),588)
+#define get_gdat_v_str_pos588(X,Y) get_gdat_string((X),(Y),588)
+#define get_gdat_bool_pos588(X,Y) get_gdat_bool((X),(Y),588)
+#define get_gdat_int_pos588(X,Y) get_gdat_int((X),(Y),588)
+#define get_gdat_llong_pos588(X,Y) get_gdat_llong((X),(Y),588)
+#define get_gdat_float_pos588(X,Y) get_gdat_float((X),(Y),588)
+#define get_gdat_uint_pos589(X,Y) get_gdat_uint((X),(Y),589)
+#define get_gdat_ullong_pos589(X,Y) get_gdat_ullong((X),(Y),589)
+#define get_gdat_ip_pos589(X,Y) get_gdat_ip((X),(Y),589)
+#define get_gdat_ipv6_pos589(X,Y) get_gdat_ipv6((X),(Y),589)
+#define get_gdat_string_pos589(X,Y) get_gdat_string((X),(Y),589)
+#define get_gdat_v_str_pos589(X,Y) get_gdat_string((X),(Y),589)
+#define get_gdat_bool_pos589(X,Y) get_gdat_bool((X),(Y),589)
+#define get_gdat_int_pos589(X,Y) get_gdat_int((X),(Y),589)
+#define get_gdat_llong_pos589(X,Y) get_gdat_llong((X),(Y),589)
+#define get_gdat_float_pos589(X,Y) get_gdat_float((X),(Y),589)
+#define get_gdat_uint_pos590(X,Y) get_gdat_uint((X),(Y),590)
+#define get_gdat_ullong_pos590(X,Y) get_gdat_ullong((X),(Y),590)
+#define get_gdat_ip_pos590(X,Y) get_gdat_ip((X),(Y),590)
+#define get_gdat_ipv6_pos590(X,Y) get_gdat_ipv6((X),(Y),590)
+#define get_gdat_string_pos590(X,Y) get_gdat_string((X),(Y),590)
+#define get_gdat_v_str_pos590(X,Y) get_gdat_string((X),(Y),590)
+#define get_gdat_bool_pos590(X,Y) get_gdat_bool((X),(Y),590)
+#define get_gdat_int_pos590(X,Y) get_gdat_int((X),(Y),590)
+#define get_gdat_llong_pos590(X,Y) get_gdat_llong((X),(Y),590)
+#define get_gdat_float_pos590(X,Y) get_gdat_float((X),(Y),590)
+#define get_gdat_uint_pos591(X,Y) get_gdat_uint((X),(Y),591)
+#define get_gdat_ullong_pos591(X,Y) get_gdat_ullong((X),(Y),591)
+#define get_gdat_ip_pos591(X,Y) get_gdat_ip((X),(Y),591)
+#define get_gdat_ipv6_pos591(X,Y) get_gdat_ipv6((X),(Y),591)
+#define get_gdat_string_pos591(X,Y) get_gdat_string((X),(Y),591)
+#define get_gdat_v_str_pos591(X,Y) get_gdat_string((X),(Y),591)
+#define get_gdat_bool_pos591(X,Y) get_gdat_bool((X),(Y),591)
+#define get_gdat_int_pos591(X,Y) get_gdat_int((X),(Y),591)
+#define get_gdat_llong_pos591(X,Y) get_gdat_llong((X),(Y),591)
+#define get_gdat_float_pos591(X,Y) get_gdat_float((X),(Y),591)
+#define get_gdat_uint_pos592(X,Y) get_gdat_uint((X),(Y),592)
+#define get_gdat_ullong_pos592(X,Y) get_gdat_ullong((X),(Y),592)
+#define get_gdat_ip_pos592(X,Y) get_gdat_ip((X),(Y),592)
+#define get_gdat_ipv6_pos592(X,Y) get_gdat_ipv6((X),(Y),592)
+#define get_gdat_string_pos592(X,Y) get_gdat_string((X),(Y),592)
+#define get_gdat_v_str_pos592(X,Y) get_gdat_string((X),(Y),592)
+#define get_gdat_bool_pos592(X,Y) get_gdat_bool((X),(Y),592)
+#define get_gdat_int_pos592(X,Y) get_gdat_int((X),(Y),592)
+#define get_gdat_llong_pos592(X,Y) get_gdat_llong((X),(Y),592)
+#define get_gdat_float_pos592(X,Y) get_gdat_float((X),(Y),592)
+#define get_gdat_uint_pos593(X,Y) get_gdat_uint((X),(Y),593)
+#define get_gdat_ullong_pos593(X,Y) get_gdat_ullong((X),(Y),593)
+#define get_gdat_ip_pos593(X,Y) get_gdat_ip((X),(Y),593)
+#define get_gdat_ipv6_pos593(X,Y) get_gdat_ipv6((X),(Y),593)
+#define get_gdat_string_pos593(X,Y) get_gdat_string((X),(Y),593)
+#define get_gdat_v_str_pos593(X,Y) get_gdat_string((X),(Y),593)
+#define get_gdat_bool_pos593(X,Y) get_gdat_bool((X),(Y),593)
+#define get_gdat_int_pos593(X,Y) get_gdat_int((X),(Y),593)
+#define get_gdat_llong_pos593(X,Y) get_gdat_llong((X),(Y),593)
+#define get_gdat_float_pos593(X,Y) get_gdat_float((X),(Y),593)
+#define get_gdat_uint_pos594(X,Y) get_gdat_uint((X),(Y),594)
+#define get_gdat_ullong_pos594(X,Y) get_gdat_ullong((X),(Y),594)
+#define get_gdat_ip_pos594(X,Y) get_gdat_ip((X),(Y),594)
+#define get_gdat_ipv6_pos594(X,Y) get_gdat_ipv6((X),(Y),594)
+#define get_gdat_string_pos594(X,Y) get_gdat_string((X),(Y),594)
+#define get_gdat_v_str_pos594(X,Y) get_gdat_string((X),(Y),594)
+#define get_gdat_bool_pos594(X,Y) get_gdat_bool((X),(Y),594)
+#define get_gdat_int_pos594(X,Y) get_gdat_int((X),(Y),594)
+#define get_gdat_llong_pos594(X,Y) get_gdat_llong((X),(Y),594)
+#define get_gdat_float_pos594(X,Y) get_gdat_float((X),(Y),594)
+#define get_gdat_uint_pos595(X,Y) get_gdat_uint((X),(Y),595)
+#define get_gdat_ullong_pos595(X,Y) get_gdat_ullong((X),(Y),595)
+#define get_gdat_ip_pos595(X,Y) get_gdat_ip((X),(Y),595)
+#define get_gdat_ipv6_pos595(X,Y) get_gdat_ipv6((X),(Y),595)
+#define get_gdat_string_pos595(X,Y) get_gdat_string((X),(Y),595)
+#define get_gdat_v_str_pos595(X,Y) get_gdat_string((X),(Y),595)
+#define get_gdat_bool_pos595(X,Y) get_gdat_bool((X),(Y),595)
+#define get_gdat_int_pos595(X,Y) get_gdat_int((X),(Y),595)
+#define get_gdat_llong_pos595(X,Y) get_gdat_llong((X),(Y),595)
+#define get_gdat_float_pos595(X,Y) get_gdat_float((X),(Y),595)
+#define get_gdat_uint_pos596(X,Y) get_gdat_uint((X),(Y),596)
+#define get_gdat_ullong_pos596(X,Y) get_gdat_ullong((X),(Y),596)
+#define get_gdat_ip_pos596(X,Y) get_gdat_ip((X),(Y),596)
+#define get_gdat_ipv6_pos596(X,Y) get_gdat_ipv6((X),(Y),596)
+#define get_gdat_string_pos596(X,Y) get_gdat_string((X),(Y),596)
+#define get_gdat_v_str_pos596(X,Y) get_gdat_string((X),(Y),596)
+#define get_gdat_bool_pos596(X,Y) get_gdat_bool((X),(Y),596)
+#define get_gdat_int_pos596(X,Y) get_gdat_int((X),(Y),596)
+#define get_gdat_llong_pos596(X,Y) get_gdat_llong((X),(Y),596)
+#define get_gdat_float_pos596(X,Y) get_gdat_float((X),(Y),596)
+#define get_gdat_uint_pos597(X,Y) get_gdat_uint((X),(Y),597)
+#define get_gdat_ullong_pos597(X,Y) get_gdat_ullong((X),(Y),597)
+#define get_gdat_ip_pos597(X,Y) get_gdat_ip((X),(Y),597)
+#define get_gdat_ipv6_pos597(X,Y) get_gdat_ipv6((X),(Y),597)
+#define get_gdat_string_pos597(X,Y) get_gdat_string((X),(Y),597)
+#define get_gdat_v_str_pos597(X,Y) get_gdat_string((X),(Y),597)
+#define get_gdat_bool_pos597(X,Y) get_gdat_bool((X),(Y),597)
+#define get_gdat_int_pos597(X,Y) get_gdat_int((X),(Y),597)
+#define get_gdat_llong_pos597(X,Y) get_gdat_llong((X),(Y),597)
+#define get_gdat_float_pos597(X,Y) get_gdat_float((X),(Y),597)
+#define get_gdat_uint_pos598(X,Y) get_gdat_uint((X),(Y),598)
+#define get_gdat_ullong_pos598(X,Y) get_gdat_ullong((X),(Y),598)
+#define get_gdat_ip_pos598(X,Y) get_gdat_ip((X),(Y),598)
+#define get_gdat_ipv6_pos598(X,Y) get_gdat_ipv6((X),(Y),598)
+#define get_gdat_string_pos598(X,Y) get_gdat_string((X),(Y),598)
+#define get_gdat_v_str_pos598(X,Y) get_gdat_string((X),(Y),598)
+#define get_gdat_bool_pos598(X,Y) get_gdat_bool((X),(Y),598)
+#define get_gdat_int_pos598(X,Y) get_gdat_int((X),(Y),598)
+#define get_gdat_llong_pos598(X,Y) get_gdat_llong((X),(Y),598)
+#define get_gdat_float_pos598(X,Y) get_gdat_float((X),(Y),598)
+#define get_gdat_uint_pos599(X,Y) get_gdat_uint((X),(Y),599)
+#define get_gdat_ullong_pos599(X,Y) get_gdat_ullong((X),(Y),599)
+#define get_gdat_ip_pos599(X,Y) get_gdat_ip((X),(Y),599)
+#define get_gdat_ipv6_pos599(X,Y) get_gdat_ipv6((X),(Y),599)
+#define get_gdat_string_pos599(X,Y) get_gdat_string((X),(Y),599)
+#define get_gdat_v_str_pos599(X,Y) get_gdat_string((X),(Y),599)
+#define get_gdat_bool_pos599(X,Y) get_gdat_bool((X),(Y),599)
+#define get_gdat_int_pos599(X,Y) get_gdat_int((X),(Y),599)
+#define get_gdat_llong_pos599(X,Y) get_gdat_llong((X),(Y),599)
+#define get_gdat_float_pos599(X,Y) get_gdat_float((X),(Y),599)
+#define get_gdat_uint_pos600(X,Y) get_gdat_uint((X),(Y),600)
+#define get_gdat_ullong_pos600(X,Y) get_gdat_ullong((X),(Y),600)
+#define get_gdat_ip_pos600(X,Y) get_gdat_ip((X),(Y),600)
+#define get_gdat_ipv6_pos600(X,Y) get_gdat_ipv6((X),(Y),600)
+#define get_gdat_string_pos600(X,Y) get_gdat_string((X),(Y),600)
+#define get_gdat_v_str_pos600(X,Y) get_gdat_string((X),(Y),600)
+#define get_gdat_bool_pos600(X,Y) get_gdat_bool((X),(Y),600)
+#define get_gdat_int_pos600(X,Y) get_gdat_int((X),(Y),600)
+#define get_gdat_llong_pos600(X,Y) get_gdat_llong((X),(Y),600)
+#define get_gdat_float_pos600(X,Y) get_gdat_float((X),(Y),600)
+#define get_gdat_uint_pos601(X,Y) get_gdat_uint((X),(Y),601)
+#define get_gdat_ullong_pos601(X,Y) get_gdat_ullong((X),(Y),601)
+#define get_gdat_ip_pos601(X,Y) get_gdat_ip((X),(Y),601)
+#define get_gdat_ipv6_pos601(X,Y) get_gdat_ipv6((X),(Y),601)
+#define get_gdat_string_pos601(X,Y) get_gdat_string((X),(Y),601)
+#define get_gdat_v_str_pos601(X,Y) get_gdat_string((X),(Y),601)
+#define get_gdat_bool_pos601(X,Y) get_gdat_bool((X),(Y),601)
+#define get_gdat_int_pos601(X,Y) get_gdat_int((X),(Y),601)
+#define get_gdat_llong_pos601(X,Y) get_gdat_llong((X),(Y),601)
+#define get_gdat_float_pos601(X,Y) get_gdat_float((X),(Y),601)
+#define get_gdat_uint_pos602(X,Y) get_gdat_uint((X),(Y),602)
+#define get_gdat_ullong_pos602(X,Y) get_gdat_ullong((X),(Y),602)
+#define get_gdat_ip_pos602(X,Y) get_gdat_ip((X),(Y),602)
+#define get_gdat_ipv6_pos602(X,Y) get_gdat_ipv6((X),(Y),602)
+#define get_gdat_string_pos602(X,Y) get_gdat_string((X),(Y),602)
+#define get_gdat_v_str_pos602(X,Y) get_gdat_string((X),(Y),602)
+#define get_gdat_bool_pos602(X,Y) get_gdat_bool((X),(Y),602)
+#define get_gdat_int_pos602(X,Y) get_gdat_int((X),(Y),602)
+#define get_gdat_llong_pos602(X,Y) get_gdat_llong((X),(Y),602)
+#define get_gdat_float_pos602(X,Y) get_gdat_float((X),(Y),602)
+#define get_gdat_uint_pos603(X,Y) get_gdat_uint((X),(Y),603)
+#define get_gdat_ullong_pos603(X,Y) get_gdat_ullong((X),(Y),603)
+#define get_gdat_ip_pos603(X,Y) get_gdat_ip((X),(Y),603)
+#define get_gdat_ipv6_pos603(X,Y) get_gdat_ipv6((X),(Y),603)
+#define get_gdat_string_pos603(X,Y) get_gdat_string((X),(Y),603)
+#define get_gdat_v_str_pos603(X,Y) get_gdat_string((X),(Y),603)
+#define get_gdat_bool_pos603(X,Y) get_gdat_bool((X),(Y),603)
+#define get_gdat_int_pos603(X,Y) get_gdat_int((X),(Y),603)
+#define get_gdat_llong_pos603(X,Y) get_gdat_llong((X),(Y),603)
+#define get_gdat_float_pos603(X,Y) get_gdat_float((X),(Y),603)
+#define get_gdat_uint_pos604(X,Y) get_gdat_uint((X),(Y),604)
+#define get_gdat_ullong_pos604(X,Y) get_gdat_ullong((X),(Y),604)
+#define get_gdat_ip_pos604(X,Y) get_gdat_ip((X),(Y),604)
+#define get_gdat_ipv6_pos604(X,Y) get_gdat_ipv6((X),(Y),604)
+#define get_gdat_string_pos604(X,Y) get_gdat_string((X),(Y),604)
+#define get_gdat_v_str_pos604(X,Y) get_gdat_string((X),(Y),604)
+#define get_gdat_bool_pos604(X,Y) get_gdat_bool((X),(Y),604)
+#define get_gdat_int_pos604(X,Y) get_gdat_int((X),(Y),604)
+#define get_gdat_llong_pos604(X,Y) get_gdat_llong((X),(Y),604)
+#define get_gdat_float_pos604(X,Y) get_gdat_float((X),(Y),604)
+#define get_gdat_uint_pos605(X,Y) get_gdat_uint((X),(Y),605)
+#define get_gdat_ullong_pos605(X,Y) get_gdat_ullong((X),(Y),605)
+#define get_gdat_ip_pos605(X,Y) get_gdat_ip((X),(Y),605)
+#define get_gdat_ipv6_pos605(X,Y) get_gdat_ipv6((X),(Y),605)
+#define get_gdat_string_pos605(X,Y) get_gdat_string((X),(Y),605)
+#define get_gdat_v_str_pos605(X,Y) get_gdat_string((X),(Y),605)
+#define get_gdat_bool_pos605(X,Y) get_gdat_bool((X),(Y),605)
+#define get_gdat_int_pos605(X,Y) get_gdat_int((X),(Y),605)
+#define get_gdat_llong_pos605(X,Y) get_gdat_llong((X),(Y),605)
+#define get_gdat_float_pos605(X,Y) get_gdat_float((X),(Y),605)
+#define get_gdat_uint_pos606(X,Y) get_gdat_uint((X),(Y),606)
+#define get_gdat_ullong_pos606(X,Y) get_gdat_ullong((X),(Y),606)
+#define get_gdat_ip_pos606(X,Y) get_gdat_ip((X),(Y),606)
+#define get_gdat_ipv6_pos606(X,Y) get_gdat_ipv6((X),(Y),606)
+#define get_gdat_string_pos606(X,Y) get_gdat_string((X),(Y),606)
+#define get_gdat_v_str_pos606(X,Y) get_gdat_string((X),(Y),606)
+#define get_gdat_bool_pos606(X,Y) get_gdat_bool((X),(Y),606)
+#define get_gdat_int_pos606(X,Y) get_gdat_int((X),(Y),606)
+#define get_gdat_llong_pos606(X,Y) get_gdat_llong((X),(Y),606)
+#define get_gdat_float_pos606(X,Y) get_gdat_float((X),(Y),606)
+#define get_gdat_uint_pos607(X,Y) get_gdat_uint((X),(Y),607)
+#define get_gdat_ullong_pos607(X,Y) get_gdat_ullong((X),(Y),607)
+#define get_gdat_ip_pos607(X,Y) get_gdat_ip((X),(Y),607)
+#define get_gdat_ipv6_pos607(X,Y) get_gdat_ipv6((X),(Y),607)
+#define get_gdat_string_pos607(X,Y) get_gdat_string((X),(Y),607)
+#define get_gdat_v_str_pos607(X,Y) get_gdat_string((X),(Y),607)
+#define get_gdat_bool_pos607(X,Y) get_gdat_bool((X),(Y),607)
+#define get_gdat_int_pos607(X,Y) get_gdat_int((X),(Y),607)
+#define get_gdat_llong_pos607(X,Y) get_gdat_llong((X),(Y),607)
+#define get_gdat_float_pos607(X,Y) get_gdat_float((X),(Y),607)
+#define get_gdat_uint_pos608(X,Y) get_gdat_uint((X),(Y),608)
+#define get_gdat_ullong_pos608(X,Y) get_gdat_ullong((X),(Y),608)
+#define get_gdat_ip_pos608(X,Y) get_gdat_ip((X),(Y),608)
+#define get_gdat_ipv6_pos608(X,Y) get_gdat_ipv6((X),(Y),608)
+#define get_gdat_string_pos608(X,Y) get_gdat_string((X),(Y),608)
+#define get_gdat_v_str_pos608(X,Y) get_gdat_string((X),(Y),608)
+#define get_gdat_bool_pos608(X,Y) get_gdat_bool((X),(Y),608)
+#define get_gdat_int_pos608(X,Y) get_gdat_int((X),(Y),608)
+#define get_gdat_llong_pos608(X,Y) get_gdat_llong((X),(Y),608)
+#define get_gdat_float_pos608(X,Y) get_gdat_float((X),(Y),608)
+#define get_gdat_uint_pos609(X,Y) get_gdat_uint((X),(Y),609)
+#define get_gdat_ullong_pos609(X,Y) get_gdat_ullong((X),(Y),609)
+#define get_gdat_ip_pos609(X,Y) get_gdat_ip((X),(Y),609)
+#define get_gdat_ipv6_pos609(X,Y) get_gdat_ipv6((X),(Y),609)
+#define get_gdat_string_pos609(X,Y) get_gdat_string((X),(Y),609)
+#define get_gdat_v_str_pos609(X,Y) get_gdat_string((X),(Y),609)
+#define get_gdat_bool_pos609(X,Y) get_gdat_bool((X),(Y),609)
+#define get_gdat_int_pos609(X,Y) get_gdat_int((X),(Y),609)
+#define get_gdat_llong_pos609(X,Y) get_gdat_llong((X),(Y),609)
+#define get_gdat_float_pos609(X,Y) get_gdat_float((X),(Y),609)
+#define get_gdat_uint_pos610(X,Y) get_gdat_uint((X),(Y),610)
+#define get_gdat_ullong_pos610(X,Y) get_gdat_ullong((X),(Y),610)
+#define get_gdat_ip_pos610(X,Y) get_gdat_ip((X),(Y),610)
+#define get_gdat_ipv6_pos610(X,Y) get_gdat_ipv6((X),(Y),610)
+#define get_gdat_string_pos610(X,Y) get_gdat_string((X),(Y),610)
+#define get_gdat_v_str_pos610(X,Y) get_gdat_string((X),(Y),610)
+#define get_gdat_bool_pos610(X,Y) get_gdat_bool((X),(Y),610)
+#define get_gdat_int_pos610(X,Y) get_gdat_int((X),(Y),610)
+#define get_gdat_llong_pos610(X,Y) get_gdat_llong((X),(Y),610)
+#define get_gdat_float_pos610(X,Y) get_gdat_float((X),(Y),610)
+#define get_gdat_uint_pos611(X,Y) get_gdat_uint((X),(Y),611)
+#define get_gdat_ullong_pos611(X,Y) get_gdat_ullong((X),(Y),611)
+#define get_gdat_ip_pos611(X,Y) get_gdat_ip((X),(Y),611)
+#define get_gdat_ipv6_pos611(X,Y) get_gdat_ipv6((X),(Y),611)
+#define get_gdat_string_pos611(X,Y) get_gdat_string((X),(Y),611)
+#define get_gdat_v_str_pos611(X,Y) get_gdat_string((X),(Y),611)
+#define get_gdat_bool_pos611(X,Y) get_gdat_bool((X),(Y),611)
+#define get_gdat_int_pos611(X,Y) get_gdat_int((X),(Y),611)
+#define get_gdat_llong_pos611(X,Y) get_gdat_llong((X),(Y),611)
+#define get_gdat_float_pos611(X,Y) get_gdat_float((X),(Y),611)
+#define get_gdat_uint_pos612(X,Y) get_gdat_uint((X),(Y),612)
+#define get_gdat_ullong_pos612(X,Y) get_gdat_ullong((X),(Y),612)
+#define get_gdat_ip_pos612(X,Y) get_gdat_ip((X),(Y),612)
+#define get_gdat_ipv6_pos612(X,Y) get_gdat_ipv6((X),(Y),612)
+#define get_gdat_string_pos612(X,Y) get_gdat_string((X),(Y),612)
+#define get_gdat_v_str_pos612(X,Y) get_gdat_string((X),(Y),612)
+#define get_gdat_bool_pos612(X,Y) get_gdat_bool((X),(Y),612)
+#define get_gdat_int_pos612(X,Y) get_gdat_int((X),(Y),612)
+#define get_gdat_llong_pos612(X,Y) get_gdat_llong((X),(Y),612)
+#define get_gdat_float_pos612(X,Y) get_gdat_float((X),(Y),612)
+#define get_gdat_uint_pos613(X,Y) get_gdat_uint((X),(Y),613)
+#define get_gdat_ullong_pos613(X,Y) get_gdat_ullong((X),(Y),613)
+#define get_gdat_ip_pos613(X,Y) get_gdat_ip((X),(Y),613)
+#define get_gdat_ipv6_pos613(X,Y) get_gdat_ipv6((X),(Y),613)
+#define get_gdat_string_pos613(X,Y) get_gdat_string((X),(Y),613)
+#define get_gdat_v_str_pos613(X,Y) get_gdat_string((X),(Y),613)
+#define get_gdat_bool_pos613(X,Y) get_gdat_bool((X),(Y),613)
+#define get_gdat_int_pos613(X,Y) get_gdat_int((X),(Y),613)
+#define get_gdat_llong_pos613(X,Y) get_gdat_llong((X),(Y),613)
+#define get_gdat_float_pos613(X,Y) get_gdat_float((X),(Y),613)
+#define get_gdat_uint_pos614(X,Y) get_gdat_uint((X),(Y),614)
+#define get_gdat_ullong_pos614(X,Y) get_gdat_ullong((X),(Y),614)
+#define get_gdat_ip_pos614(X,Y) get_gdat_ip((X),(Y),614)
+#define get_gdat_ipv6_pos614(X,Y) get_gdat_ipv6((X),(Y),614)
+#define get_gdat_string_pos614(X,Y) get_gdat_string((X),(Y),614)
+#define get_gdat_v_str_pos614(X,Y) get_gdat_string((X),(Y),614)
+#define get_gdat_bool_pos614(X,Y) get_gdat_bool((X),(Y),614)
+#define get_gdat_int_pos614(X,Y) get_gdat_int((X),(Y),614)
+#define get_gdat_llong_pos614(X,Y) get_gdat_llong((X),(Y),614)
+#define get_gdat_float_pos614(X,Y) get_gdat_float((X),(Y),614)
+#define get_gdat_uint_pos615(X,Y) get_gdat_uint((X),(Y),615)
+#define get_gdat_ullong_pos615(X,Y) get_gdat_ullong((X),(Y),615)
+#define get_gdat_ip_pos615(X,Y) get_gdat_ip((X),(Y),615)
+#define get_gdat_ipv6_pos615(X,Y) get_gdat_ipv6((X),(Y),615)
+#define get_gdat_string_pos615(X,Y) get_gdat_string((X),(Y),615)
+#define get_gdat_v_str_pos615(X,Y) get_gdat_string((X),(Y),615)
+#define get_gdat_bool_pos615(X,Y) get_gdat_bool((X),(Y),615)
+#define get_gdat_int_pos615(X,Y) get_gdat_int((X),(Y),615)
+#define get_gdat_llong_pos615(X,Y) get_gdat_llong((X),(Y),615)
+#define get_gdat_float_pos615(X,Y) get_gdat_float((X),(Y),615)
+#define get_gdat_uint_pos616(X,Y) get_gdat_uint((X),(Y),616)
+#define get_gdat_ullong_pos616(X,Y) get_gdat_ullong((X),(Y),616)
+#define get_gdat_ip_pos616(X,Y) get_gdat_ip((X),(Y),616)
+#define get_gdat_ipv6_pos616(X,Y) get_gdat_ipv6((X),(Y),616)
+#define get_gdat_string_pos616(X,Y) get_gdat_string((X),(Y),616)
+#define get_gdat_v_str_pos616(X,Y) get_gdat_string((X),(Y),616)
+#define get_gdat_bool_pos616(X,Y) get_gdat_bool((X),(Y),616)
+#define get_gdat_int_pos616(X,Y) get_gdat_int((X),(Y),616)
+#define get_gdat_llong_pos616(X,Y) get_gdat_llong((X),(Y),616)
+#define get_gdat_float_pos616(X,Y) get_gdat_float((X),(Y),616)
+#define get_gdat_uint_pos617(X,Y) get_gdat_uint((X),(Y),617)
+#define get_gdat_ullong_pos617(X,Y) get_gdat_ullong((X),(Y),617)
+#define get_gdat_ip_pos617(X,Y) get_gdat_ip((X),(Y),617)
+#define get_gdat_ipv6_pos617(X,Y) get_gdat_ipv6((X),(Y),617)
+#define get_gdat_string_pos617(X,Y) get_gdat_string((X),(Y),617)
+#define get_gdat_v_str_pos617(X,Y) get_gdat_string((X),(Y),617)
+#define get_gdat_bool_pos617(X,Y) get_gdat_bool((X),(Y),617)
+#define get_gdat_int_pos617(X,Y) get_gdat_int((X),(Y),617)
+#define get_gdat_llong_pos617(X,Y) get_gdat_llong((X),(Y),617)
+#define get_gdat_float_pos617(X,Y) get_gdat_float((X),(Y),617)
+#define get_gdat_uint_pos618(X,Y) get_gdat_uint((X),(Y),618)
+#define get_gdat_ullong_pos618(X,Y) get_gdat_ullong((X),(Y),618)
+#define get_gdat_ip_pos618(X,Y) get_gdat_ip((X),(Y),618)
+#define get_gdat_ipv6_pos618(X,Y) get_gdat_ipv6((X),(Y),618)
+#define get_gdat_string_pos618(X,Y) get_gdat_string((X),(Y),618)
+#define get_gdat_v_str_pos618(X,Y) get_gdat_string((X),(Y),618)
+#define get_gdat_bool_pos618(X,Y) get_gdat_bool((X),(Y),618)
+#define get_gdat_int_pos618(X,Y) get_gdat_int((X),(Y),618)
+#define get_gdat_llong_pos618(X,Y) get_gdat_llong((X),(Y),618)
+#define get_gdat_float_pos618(X,Y) get_gdat_float((X),(Y),618)
+#define get_gdat_uint_pos619(X,Y) get_gdat_uint((X),(Y),619)
+#define get_gdat_ullong_pos619(X,Y) get_gdat_ullong((X),(Y),619)
+#define get_gdat_ip_pos619(X,Y) get_gdat_ip((X),(Y),619)
+#define get_gdat_ipv6_pos619(X,Y) get_gdat_ipv6((X),(Y),619)
+#define get_gdat_string_pos619(X,Y) get_gdat_string((X),(Y),619)
+#define get_gdat_v_str_pos619(X,Y) get_gdat_string((X),(Y),619)
+#define get_gdat_bool_pos619(X,Y) get_gdat_bool((X),(Y),619)
+#define get_gdat_int_pos619(X,Y) get_gdat_int((X),(Y),619)
+#define get_gdat_llong_pos619(X,Y) get_gdat_llong((X),(Y),619)
+#define get_gdat_float_pos619(X,Y) get_gdat_float((X),(Y),619)
+#define get_gdat_uint_pos620(X,Y) get_gdat_uint((X),(Y),620)
+#define get_gdat_ullong_pos620(X,Y) get_gdat_ullong((X),(Y),620)
+#define get_gdat_ip_pos620(X,Y) get_gdat_ip((X),(Y),620)
+#define get_gdat_ipv6_pos620(X,Y) get_gdat_ipv6((X),(Y),620)
+#define get_gdat_string_pos620(X,Y) get_gdat_string((X),(Y),620)
+#define get_gdat_v_str_pos620(X,Y) get_gdat_string((X),(Y),620)
+#define get_gdat_bool_pos620(X,Y) get_gdat_bool((X),(Y),620)
+#define get_gdat_int_pos620(X,Y) get_gdat_int((X),(Y),620)
+#define get_gdat_llong_pos620(X,Y) get_gdat_llong((X),(Y),620)
+#define get_gdat_float_pos620(X,Y) get_gdat_float((X),(Y),620)
+#define get_gdat_uint_pos621(X,Y) get_gdat_uint((X),(Y),621)
+#define get_gdat_ullong_pos621(X,Y) get_gdat_ullong((X),(Y),621)
+#define get_gdat_ip_pos621(X,Y) get_gdat_ip((X),(Y),621)
+#define get_gdat_ipv6_pos621(X,Y) get_gdat_ipv6((X),(Y),621)
+#define get_gdat_string_pos621(X,Y) get_gdat_string((X),(Y),621)
+#define get_gdat_v_str_pos621(X,Y) get_gdat_string((X),(Y),621)
+#define get_gdat_bool_pos621(X,Y) get_gdat_bool((X),(Y),621)
+#define get_gdat_int_pos621(X,Y) get_gdat_int((X),(Y),621)
+#define get_gdat_llong_pos621(X,Y) get_gdat_llong((X),(Y),621)
+#define get_gdat_float_pos621(X,Y) get_gdat_float((X),(Y),621)
+#define get_gdat_uint_pos622(X,Y) get_gdat_uint((X),(Y),622)
+#define get_gdat_ullong_pos622(X,Y) get_gdat_ullong((X),(Y),622)
+#define get_gdat_ip_pos622(X,Y) get_gdat_ip((X),(Y),622)
+#define get_gdat_ipv6_pos622(X,Y) get_gdat_ipv6((X),(Y),622)
+#define get_gdat_string_pos622(X,Y) get_gdat_string((X),(Y),622)
+#define get_gdat_v_str_pos622(X,Y) get_gdat_string((X),(Y),622)
+#define get_gdat_bool_pos622(X,Y) get_gdat_bool((X),(Y),622)
+#define get_gdat_int_pos622(X,Y) get_gdat_int((X),(Y),622)
+#define get_gdat_llong_pos622(X,Y) get_gdat_llong((X),(Y),622)
+#define get_gdat_float_pos622(X,Y) get_gdat_float((X),(Y),622)
+#define get_gdat_uint_pos623(X,Y) get_gdat_uint((X),(Y),623)
+#define get_gdat_ullong_pos623(X,Y) get_gdat_ullong((X),(Y),623)
+#define get_gdat_ip_pos623(X,Y) get_gdat_ip((X),(Y),623)
+#define get_gdat_ipv6_pos623(X,Y) get_gdat_ipv6((X),(Y),623)
+#define get_gdat_string_pos623(X,Y) get_gdat_string((X),(Y),623)
+#define get_gdat_v_str_pos623(X,Y) get_gdat_string((X),(Y),623)
+#define get_gdat_bool_pos623(X,Y) get_gdat_bool((X),(Y),623)
+#define get_gdat_int_pos623(X,Y) get_gdat_int((X),(Y),623)
+#define get_gdat_llong_pos623(X,Y) get_gdat_llong((X),(Y),623)
+#define get_gdat_float_pos623(X,Y) get_gdat_float((X),(Y),623)
+#define get_gdat_uint_pos624(X,Y) get_gdat_uint((X),(Y),624)
+#define get_gdat_ullong_pos624(X,Y) get_gdat_ullong((X),(Y),624)
+#define get_gdat_ip_pos624(X,Y) get_gdat_ip((X),(Y),624)
+#define get_gdat_ipv6_pos624(X,Y) get_gdat_ipv6((X),(Y),624)
+#define get_gdat_string_pos624(X,Y) get_gdat_string((X),(Y),624)
+#define get_gdat_v_str_pos624(X,Y) get_gdat_string((X),(Y),624)
+#define get_gdat_bool_pos624(X,Y) get_gdat_bool((X),(Y),624)
+#define get_gdat_int_pos624(X,Y) get_gdat_int((X),(Y),624)
+#define get_gdat_llong_pos624(X,Y) get_gdat_llong((X),(Y),624)
+#define get_gdat_float_pos624(X,Y) get_gdat_float((X),(Y),624)
+#define get_gdat_uint_pos625(X,Y) get_gdat_uint((X),(Y),625)
+#define get_gdat_ullong_pos625(X,Y) get_gdat_ullong((X),(Y),625)
+#define get_gdat_ip_pos625(X,Y) get_gdat_ip((X),(Y),625)
+#define get_gdat_ipv6_pos625(X,Y) get_gdat_ipv6((X),(Y),625)
+#define get_gdat_string_pos625(X,Y) get_gdat_string((X),(Y),625)
+#define get_gdat_v_str_pos625(X,Y) get_gdat_string((X),(Y),625)
+#define get_gdat_bool_pos625(X,Y) get_gdat_bool((X),(Y),625)
+#define get_gdat_int_pos625(X,Y) get_gdat_int((X),(Y),625)
+#define get_gdat_llong_pos625(X,Y) get_gdat_llong((X),(Y),625)
+#define get_gdat_float_pos625(X,Y) get_gdat_float((X),(Y),625)
+#define get_gdat_uint_pos626(X,Y) get_gdat_uint((X),(Y),626)
+#define get_gdat_ullong_pos626(X,Y) get_gdat_ullong((X),(Y),626)
+#define get_gdat_ip_pos626(X,Y) get_gdat_ip((X),(Y),626)
+#define get_gdat_ipv6_pos626(X,Y) get_gdat_ipv6((X),(Y),626)
+#define get_gdat_string_pos626(X,Y) get_gdat_string((X),(Y),626)
+#define get_gdat_v_str_pos626(X,Y) get_gdat_string((X),(Y),626)
+#define get_gdat_bool_pos626(X,Y) get_gdat_bool((X),(Y),626)
+#define get_gdat_int_pos626(X,Y) get_gdat_int((X),(Y),626)
+#define get_gdat_llong_pos626(X,Y) get_gdat_llong((X),(Y),626)
+#define get_gdat_float_pos626(X,Y) get_gdat_float((X),(Y),626)
+#define get_gdat_uint_pos627(X,Y) get_gdat_uint((X),(Y),627)
+#define get_gdat_ullong_pos627(X,Y) get_gdat_ullong((X),(Y),627)
+#define get_gdat_ip_pos627(X,Y) get_gdat_ip((X),(Y),627)
+#define get_gdat_ipv6_pos627(X,Y) get_gdat_ipv6((X),(Y),627)
+#define get_gdat_string_pos627(X,Y) get_gdat_string((X),(Y),627)
+#define get_gdat_v_str_pos627(X,Y) get_gdat_string((X),(Y),627)
+#define get_gdat_bool_pos627(X,Y) get_gdat_bool((X),(Y),627)
+#define get_gdat_int_pos627(X,Y) get_gdat_int((X),(Y),627)
+#define get_gdat_llong_pos627(X,Y) get_gdat_llong((X),(Y),627)
+#define get_gdat_float_pos627(X,Y) get_gdat_float((X),(Y),627)
+#define get_gdat_uint_pos628(X,Y) get_gdat_uint((X),(Y),628)
+#define get_gdat_ullong_pos628(X,Y) get_gdat_ullong((X),(Y),628)
+#define get_gdat_ip_pos628(X,Y) get_gdat_ip((X),(Y),628)
+#define get_gdat_ipv6_pos628(X,Y) get_gdat_ipv6((X),(Y),628)
+#define get_gdat_string_pos628(X,Y) get_gdat_string((X),(Y),628)
+#define get_gdat_v_str_pos628(X,Y) get_gdat_string((X),(Y),628)
+#define get_gdat_bool_pos628(X,Y) get_gdat_bool((X),(Y),628)
+#define get_gdat_int_pos628(X,Y) get_gdat_int((X),(Y),628)
+#define get_gdat_llong_pos628(X,Y) get_gdat_llong((X),(Y),628)
+#define get_gdat_float_pos628(X,Y) get_gdat_float((X),(Y),628)
+#define get_gdat_uint_pos629(X,Y) get_gdat_uint((X),(Y),629)
+#define get_gdat_ullong_pos629(X,Y) get_gdat_ullong((X),(Y),629)
+#define get_gdat_ip_pos629(X,Y) get_gdat_ip((X),(Y),629)
+#define get_gdat_ipv6_pos629(X,Y) get_gdat_ipv6((X),(Y),629)
+#define get_gdat_string_pos629(X,Y) get_gdat_string((X),(Y),629)
+#define get_gdat_v_str_pos629(X,Y) get_gdat_string((X),(Y),629)
+#define get_gdat_bool_pos629(X,Y) get_gdat_bool((X),(Y),629)
+#define get_gdat_int_pos629(X,Y) get_gdat_int((X),(Y),629)
+#define get_gdat_llong_pos629(X,Y) get_gdat_llong((X),(Y),629)
+#define get_gdat_float_pos629(X,Y) get_gdat_float((X),(Y),629)
+#define get_gdat_uint_pos630(X,Y) get_gdat_uint((X),(Y),630)
+#define get_gdat_ullong_pos630(X,Y) get_gdat_ullong((X),(Y),630)
+#define get_gdat_ip_pos630(X,Y) get_gdat_ip((X),(Y),630)
+#define get_gdat_ipv6_pos630(X,Y) get_gdat_ipv6((X),(Y),630)
+#define get_gdat_string_pos630(X,Y) get_gdat_string((X),(Y),630)
+#define get_gdat_v_str_pos630(X,Y) get_gdat_string((X),(Y),630)
+#define get_gdat_bool_pos630(X,Y) get_gdat_bool((X),(Y),630)
+#define get_gdat_int_pos630(X,Y) get_gdat_int((X),(Y),630)
+#define get_gdat_llong_pos630(X,Y) get_gdat_llong((X),(Y),630)
+#define get_gdat_float_pos630(X,Y) get_gdat_float((X),(Y),630)
+#define get_gdat_uint_pos631(X,Y) get_gdat_uint((X),(Y),631)
+#define get_gdat_ullong_pos631(X,Y) get_gdat_ullong((X),(Y),631)
+#define get_gdat_ip_pos631(X,Y) get_gdat_ip((X),(Y),631)
+#define get_gdat_ipv6_pos631(X,Y) get_gdat_ipv6((X),(Y),631)
+#define get_gdat_string_pos631(X,Y) get_gdat_string((X),(Y),631)
+#define get_gdat_v_str_pos631(X,Y) get_gdat_string((X),(Y),631)
+#define get_gdat_bool_pos631(X,Y) get_gdat_bool((X),(Y),631)
+#define get_gdat_int_pos631(X,Y) get_gdat_int((X),(Y),631)
+#define get_gdat_llong_pos631(X,Y) get_gdat_llong((X),(Y),631)
+#define get_gdat_float_pos631(X,Y) get_gdat_float((X),(Y),631)
+#define get_gdat_uint_pos632(X,Y) get_gdat_uint((X),(Y),632)
+#define get_gdat_ullong_pos632(X,Y) get_gdat_ullong((X),(Y),632)
+#define get_gdat_ip_pos632(X,Y) get_gdat_ip((X),(Y),632)
+#define get_gdat_ipv6_pos632(X,Y) get_gdat_ipv6((X),(Y),632)
+#define get_gdat_string_pos632(X,Y) get_gdat_string((X),(Y),632)
+#define get_gdat_v_str_pos632(X,Y) get_gdat_string((X),(Y),632)
+#define get_gdat_bool_pos632(X,Y) get_gdat_bool((X),(Y),632)
+#define get_gdat_int_pos632(X,Y) get_gdat_int((X),(Y),632)
+#define get_gdat_llong_pos632(X,Y) get_gdat_llong((X),(Y),632)
+#define get_gdat_float_pos632(X,Y) get_gdat_float((X),(Y),632)
+#define get_gdat_uint_pos633(X,Y) get_gdat_uint((X),(Y),633)
+#define get_gdat_ullong_pos633(X,Y) get_gdat_ullong((X),(Y),633)
+#define get_gdat_ip_pos633(X,Y) get_gdat_ip((X),(Y),633)
+#define get_gdat_ipv6_pos633(X,Y) get_gdat_ipv6((X),(Y),633)
+#define get_gdat_string_pos633(X,Y) get_gdat_string((X),(Y),633)
+#define get_gdat_v_str_pos633(X,Y) get_gdat_string((X),(Y),633)
+#define get_gdat_bool_pos633(X,Y) get_gdat_bool((X),(Y),633)
+#define get_gdat_int_pos633(X,Y) get_gdat_int((X),(Y),633)
+#define get_gdat_llong_pos633(X,Y) get_gdat_llong((X),(Y),633)
+#define get_gdat_float_pos633(X,Y) get_gdat_float((X),(Y),633)
+#define get_gdat_uint_pos634(X,Y) get_gdat_uint((X),(Y),634)
+#define get_gdat_ullong_pos634(X,Y) get_gdat_ullong((X),(Y),634)
+#define get_gdat_ip_pos634(X,Y) get_gdat_ip((X),(Y),634)
+#define get_gdat_ipv6_pos634(X,Y) get_gdat_ipv6((X),(Y),634)
+#define get_gdat_string_pos634(X,Y) get_gdat_string((X),(Y),634)
+#define get_gdat_v_str_pos634(X,Y) get_gdat_string((X),(Y),634)
+#define get_gdat_bool_pos634(X,Y) get_gdat_bool((X),(Y),634)
+#define get_gdat_int_pos634(X,Y) get_gdat_int((X),(Y),634)
+#define get_gdat_llong_pos634(X,Y) get_gdat_llong((X),(Y),634)
+#define get_gdat_float_pos634(X,Y) get_gdat_float((X),(Y),634)
+#define get_gdat_uint_pos635(X,Y) get_gdat_uint((X),(Y),635)
+#define get_gdat_ullong_pos635(X,Y) get_gdat_ullong((X),(Y),635)
+#define get_gdat_ip_pos635(X,Y) get_gdat_ip((X),(Y),635)
+#define get_gdat_ipv6_pos635(X,Y) get_gdat_ipv6((X),(Y),635)
+#define get_gdat_string_pos635(X,Y) get_gdat_string((X),(Y),635)
+#define get_gdat_v_str_pos635(X,Y) get_gdat_string((X),(Y),635)
+#define get_gdat_bool_pos635(X,Y) get_gdat_bool((X),(Y),635)
+#define get_gdat_int_pos635(X,Y) get_gdat_int((X),(Y),635)
+#define get_gdat_llong_pos635(X,Y) get_gdat_llong((X),(Y),635)
+#define get_gdat_float_pos635(X,Y) get_gdat_float((X),(Y),635)
+#define get_gdat_uint_pos636(X,Y) get_gdat_uint((X),(Y),636)
+#define get_gdat_ullong_pos636(X,Y) get_gdat_ullong((X),(Y),636)
+#define get_gdat_ip_pos636(X,Y) get_gdat_ip((X),(Y),636)
+#define get_gdat_ipv6_pos636(X,Y) get_gdat_ipv6((X),(Y),636)
+#define get_gdat_string_pos636(X,Y) get_gdat_string((X),(Y),636)
+#define get_gdat_v_str_pos636(X,Y) get_gdat_string((X),(Y),636)
+#define get_gdat_bool_pos636(X,Y) get_gdat_bool((X),(Y),636)
+#define get_gdat_int_pos636(X,Y) get_gdat_int((X),(Y),636)
+#define get_gdat_llong_pos636(X,Y) get_gdat_llong((X),(Y),636)
+#define get_gdat_float_pos636(X,Y) get_gdat_float((X),(Y),636)
+#define get_gdat_uint_pos637(X,Y) get_gdat_uint((X),(Y),637)
+#define get_gdat_ullong_pos637(X,Y) get_gdat_ullong((X),(Y),637)
+#define get_gdat_ip_pos637(X,Y) get_gdat_ip((X),(Y),637)
+#define get_gdat_ipv6_pos637(X,Y) get_gdat_ipv6((X),(Y),637)
+#define get_gdat_string_pos637(X,Y) get_gdat_string((X),(Y),637)
+#define get_gdat_v_str_pos637(X,Y) get_gdat_string((X),(Y),637)
+#define get_gdat_bool_pos637(X,Y) get_gdat_bool((X),(Y),637)
+#define get_gdat_int_pos637(X,Y) get_gdat_int((X),(Y),637)
+#define get_gdat_llong_pos637(X,Y) get_gdat_llong((X),(Y),637)
+#define get_gdat_float_pos637(X,Y) get_gdat_float((X),(Y),637)
+#define get_gdat_uint_pos638(X,Y) get_gdat_uint((X),(Y),638)
+#define get_gdat_ullong_pos638(X,Y) get_gdat_ullong((X),(Y),638)
+#define get_gdat_ip_pos638(X,Y) get_gdat_ip((X),(Y),638)
+#define get_gdat_ipv6_pos638(X,Y) get_gdat_ipv6((X),(Y),638)
+#define get_gdat_string_pos638(X,Y) get_gdat_string((X),(Y),638)
+#define get_gdat_v_str_pos638(X,Y) get_gdat_string((X),(Y),638)
+#define get_gdat_bool_pos638(X,Y) get_gdat_bool((X),(Y),638)
+#define get_gdat_int_pos638(X,Y) get_gdat_int((X),(Y),638)
+#define get_gdat_llong_pos638(X,Y) get_gdat_llong((X),(Y),638)
+#define get_gdat_float_pos638(X,Y) get_gdat_float((X),(Y),638)
+#define get_gdat_uint_pos639(X,Y) get_gdat_uint((X),(Y),639)
+#define get_gdat_ullong_pos639(X,Y) get_gdat_ullong((X),(Y),639)
+#define get_gdat_ip_pos639(X,Y) get_gdat_ip((X),(Y),639)
+#define get_gdat_ipv6_pos639(X,Y) get_gdat_ipv6((X),(Y),639)
+#define get_gdat_string_pos639(X,Y) get_gdat_string((X),(Y),639)
+#define get_gdat_v_str_pos639(X,Y) get_gdat_string((X),(Y),639)
+#define get_gdat_bool_pos639(X,Y) get_gdat_bool((X),(Y),639)
+#define get_gdat_int_pos639(X,Y) get_gdat_int((X),(Y),639)
+#define get_gdat_llong_pos639(X,Y) get_gdat_llong((X),(Y),639)
+#define get_gdat_float_pos639(X,Y) get_gdat_float((X),(Y),639)
+#define get_gdat_uint_pos640(X,Y) get_gdat_uint((X),(Y),640)
+#define get_gdat_ullong_pos640(X,Y) get_gdat_ullong((X),(Y),640)
+#define get_gdat_ip_pos640(X,Y) get_gdat_ip((X),(Y),640)
+#define get_gdat_ipv6_pos640(X,Y) get_gdat_ipv6((X),(Y),640)
+#define get_gdat_string_pos640(X,Y) get_gdat_string((X),(Y),640)
+#define get_gdat_v_str_pos640(X,Y) get_gdat_string((X),(Y),640)
+#define get_gdat_bool_pos640(X,Y) get_gdat_bool((X),(Y),640)
+#define get_gdat_int_pos640(X,Y) get_gdat_int((X),(Y),640)
+#define get_gdat_llong_pos640(X,Y) get_gdat_llong((X),(Y),640)
+#define get_gdat_float_pos640(X,Y) get_gdat_float((X),(Y),640)
+#define get_gdat_uint_pos641(X,Y) get_gdat_uint((X),(Y),641)
+#define get_gdat_ullong_pos641(X,Y) get_gdat_ullong((X),(Y),641)
+#define get_gdat_ip_pos641(X,Y) get_gdat_ip((X),(Y),641)
+#define get_gdat_ipv6_pos641(X,Y) get_gdat_ipv6((X),(Y),641)
+#define get_gdat_string_pos641(X,Y) get_gdat_string((X),(Y),641)
+#define get_gdat_v_str_pos641(X,Y) get_gdat_string((X),(Y),641)
+#define get_gdat_bool_pos641(X,Y) get_gdat_bool((X),(Y),641)
+#define get_gdat_int_pos641(X,Y) get_gdat_int((X),(Y),641)
+#define get_gdat_llong_pos641(X,Y) get_gdat_llong((X),(Y),641)
+#define get_gdat_float_pos641(X,Y) get_gdat_float((X),(Y),641)
+#define get_gdat_uint_pos642(X,Y) get_gdat_uint((X),(Y),642)
+#define get_gdat_ullong_pos642(X,Y) get_gdat_ullong((X),(Y),642)
+#define get_gdat_ip_pos642(X,Y) get_gdat_ip((X),(Y),642)
+#define get_gdat_ipv6_pos642(X,Y) get_gdat_ipv6((X),(Y),642)
+#define get_gdat_string_pos642(X,Y) get_gdat_string((X),(Y),642)
+#define get_gdat_v_str_pos642(X,Y) get_gdat_string((X),(Y),642)
+#define get_gdat_bool_pos642(X,Y) get_gdat_bool((X),(Y),642)
+#define get_gdat_int_pos642(X,Y) get_gdat_int((X),(Y),642)
+#define get_gdat_llong_pos642(X,Y) get_gdat_llong((X),(Y),642)
+#define get_gdat_float_pos642(X,Y) get_gdat_float((X),(Y),642)
+#define get_gdat_uint_pos643(X,Y) get_gdat_uint((X),(Y),643)
+#define get_gdat_ullong_pos643(X,Y) get_gdat_ullong((X),(Y),643)
+#define get_gdat_ip_pos643(X,Y) get_gdat_ip((X),(Y),643)
+#define get_gdat_ipv6_pos643(X,Y) get_gdat_ipv6((X),(Y),643)
+#define get_gdat_string_pos643(X,Y) get_gdat_string((X),(Y),643)
+#define get_gdat_v_str_pos643(X,Y) get_gdat_string((X),(Y),643)
+#define get_gdat_bool_pos643(X,Y) get_gdat_bool((X),(Y),643)
+#define get_gdat_int_pos643(X,Y) get_gdat_int((X),(Y),643)
+#define get_gdat_llong_pos643(X,Y) get_gdat_llong((X),(Y),643)
+#define get_gdat_float_pos643(X,Y) get_gdat_float((X),(Y),643)
+#define get_gdat_uint_pos644(X,Y) get_gdat_uint((X),(Y),644)
+#define get_gdat_ullong_pos644(X,Y) get_gdat_ullong((X),(Y),644)
+#define get_gdat_ip_pos644(X,Y) get_gdat_ip((X),(Y),644)
+#define get_gdat_ipv6_pos644(X,Y) get_gdat_ipv6((X),(Y),644)
+#define get_gdat_string_pos644(X,Y) get_gdat_string((X),(Y),644)
+#define get_gdat_v_str_pos644(X,Y) get_gdat_string((X),(Y),644)
+#define get_gdat_bool_pos644(X,Y) get_gdat_bool((X),(Y),644)
+#define get_gdat_int_pos644(X,Y) get_gdat_int((X),(Y),644)
+#define get_gdat_llong_pos644(X,Y) get_gdat_llong((X),(Y),644)
+#define get_gdat_float_pos644(X,Y) get_gdat_float((X),(Y),644)
+#define get_gdat_uint_pos645(X,Y) get_gdat_uint((X),(Y),645)
+#define get_gdat_ullong_pos645(X,Y) get_gdat_ullong((X),(Y),645)
+#define get_gdat_ip_pos645(X,Y) get_gdat_ip((X),(Y),645)
+#define get_gdat_ipv6_pos645(X,Y) get_gdat_ipv6((X),(Y),645)
+#define get_gdat_string_pos645(X,Y) get_gdat_string((X),(Y),645)
+#define get_gdat_v_str_pos645(X,Y) get_gdat_string((X),(Y),645)
+#define get_gdat_bool_pos645(X,Y) get_gdat_bool((X),(Y),645)
+#define get_gdat_int_pos645(X,Y) get_gdat_int((X),(Y),645)
+#define get_gdat_llong_pos645(X,Y) get_gdat_llong((X),(Y),645)
+#define get_gdat_float_pos645(X,Y) get_gdat_float((X),(Y),645)
+#define get_gdat_uint_pos646(X,Y) get_gdat_uint((X),(Y),646)
+#define get_gdat_ullong_pos646(X,Y) get_gdat_ullong((X),(Y),646)
+#define get_gdat_ip_pos646(X,Y) get_gdat_ip((X),(Y),646)
+#define get_gdat_ipv6_pos646(X,Y) get_gdat_ipv6((X),(Y),646)
+#define get_gdat_string_pos646(X,Y) get_gdat_string((X),(Y),646)
+#define get_gdat_v_str_pos646(X,Y) get_gdat_string((X),(Y),646)
+#define get_gdat_bool_pos646(X,Y) get_gdat_bool((X),(Y),646)
+#define get_gdat_int_pos646(X,Y) get_gdat_int((X),(Y),646)
+#define get_gdat_llong_pos646(X,Y) get_gdat_llong((X),(Y),646)
+#define get_gdat_float_pos646(X,Y) get_gdat_float((X),(Y),646)
+#define get_gdat_uint_pos647(X,Y) get_gdat_uint((X),(Y),647)
+#define get_gdat_ullong_pos647(X,Y) get_gdat_ullong((X),(Y),647)
+#define get_gdat_ip_pos647(X,Y) get_gdat_ip((X),(Y),647)
+#define get_gdat_ipv6_pos647(X,Y) get_gdat_ipv6((X),(Y),647)
+#define get_gdat_string_pos647(X,Y) get_gdat_string((X),(Y),647)
+#define get_gdat_v_str_pos647(X,Y) get_gdat_string((X),(Y),647)
+#define get_gdat_bool_pos647(X,Y) get_gdat_bool((X),(Y),647)
+#define get_gdat_int_pos647(X,Y) get_gdat_int((X),(Y),647)
+#define get_gdat_llong_pos647(X,Y) get_gdat_llong((X),(Y),647)
+#define get_gdat_float_pos647(X,Y) get_gdat_float((X),(Y),647)
+#define get_gdat_uint_pos648(X,Y) get_gdat_uint((X),(Y),648)
+#define get_gdat_ullong_pos648(X,Y) get_gdat_ullong((X),(Y),648)
+#define get_gdat_ip_pos648(X,Y) get_gdat_ip((X),(Y),648)
+#define get_gdat_ipv6_pos648(X,Y) get_gdat_ipv6((X),(Y),648)
+#define get_gdat_string_pos648(X,Y) get_gdat_string((X),(Y),648)
+#define get_gdat_v_str_pos648(X,Y) get_gdat_string((X),(Y),648)
+#define get_gdat_bool_pos648(X,Y) get_gdat_bool((X),(Y),648)
+#define get_gdat_int_pos648(X,Y) get_gdat_int((X),(Y),648)
+#define get_gdat_llong_pos648(X,Y) get_gdat_llong((X),(Y),648)
+#define get_gdat_float_pos648(X,Y) get_gdat_float((X),(Y),648)
+#define get_gdat_uint_pos649(X,Y) get_gdat_uint((X),(Y),649)
+#define get_gdat_ullong_pos649(X,Y) get_gdat_ullong((X),(Y),649)
+#define get_gdat_ip_pos649(X,Y) get_gdat_ip((X),(Y),649)
+#define get_gdat_ipv6_pos649(X,Y) get_gdat_ipv6((X),(Y),649)
+#define get_gdat_string_pos649(X,Y) get_gdat_string((X),(Y),649)
+#define get_gdat_v_str_pos649(X,Y) get_gdat_string((X),(Y),649)
+#define get_gdat_bool_pos649(X,Y) get_gdat_bool((X),(Y),649)
+#define get_gdat_int_pos649(X,Y) get_gdat_int((X),(Y),649)
+#define get_gdat_llong_pos649(X,Y) get_gdat_llong((X),(Y),649)
+#define get_gdat_float_pos649(X,Y) get_gdat_float((X),(Y),649)
+#define get_gdat_uint_pos650(X,Y) get_gdat_uint((X),(Y),650)
+#define get_gdat_ullong_pos650(X,Y) get_gdat_ullong((X),(Y),650)
+#define get_gdat_ip_pos650(X,Y) get_gdat_ip((X),(Y),650)
+#define get_gdat_ipv6_pos650(X,Y) get_gdat_ipv6((X),(Y),650)
+#define get_gdat_string_pos650(X,Y) get_gdat_string((X),(Y),650)
+#define get_gdat_v_str_pos650(X,Y) get_gdat_string((X),(Y),650)
+#define get_gdat_bool_pos650(X,Y) get_gdat_bool((X),(Y),650)
+#define get_gdat_int_pos650(X,Y) get_gdat_int((X),(Y),650)
+#define get_gdat_llong_pos650(X,Y) get_gdat_llong((X),(Y),650)
+#define get_gdat_float_pos650(X,Y) get_gdat_float((X),(Y),650)
+#define get_gdat_uint_pos651(X,Y) get_gdat_uint((X),(Y),651)
+#define get_gdat_ullong_pos651(X,Y) get_gdat_ullong((X),(Y),651)
+#define get_gdat_ip_pos651(X,Y) get_gdat_ip((X),(Y),651)
+#define get_gdat_ipv6_pos651(X,Y) get_gdat_ipv6((X),(Y),651)
+#define get_gdat_string_pos651(X,Y) get_gdat_string((X),(Y),651)
+#define get_gdat_v_str_pos651(X,Y) get_gdat_string((X),(Y),651)
+#define get_gdat_bool_pos651(X,Y) get_gdat_bool((X),(Y),651)
+#define get_gdat_int_pos651(X,Y) get_gdat_int((X),(Y),651)
+#define get_gdat_llong_pos651(X,Y) get_gdat_llong((X),(Y),651)
+#define get_gdat_float_pos651(X,Y) get_gdat_float((X),(Y),651)
+#define get_gdat_uint_pos652(X,Y) get_gdat_uint((X),(Y),652)
+#define get_gdat_ullong_pos652(X,Y) get_gdat_ullong((X),(Y),652)
+#define get_gdat_ip_pos652(X,Y) get_gdat_ip((X),(Y),652)
+#define get_gdat_ipv6_pos652(X,Y) get_gdat_ipv6((X),(Y),652)
+#define get_gdat_string_pos652(X,Y) get_gdat_string((X),(Y),652)
+#define get_gdat_v_str_pos652(X,Y) get_gdat_string((X),(Y),652)
+#define get_gdat_bool_pos652(X,Y) get_gdat_bool((X),(Y),652)
+#define get_gdat_int_pos652(X,Y) get_gdat_int((X),(Y),652)
+#define get_gdat_llong_pos652(X,Y) get_gdat_llong((X),(Y),652)
+#define get_gdat_float_pos652(X,Y) get_gdat_float((X),(Y),652)
+#define get_gdat_uint_pos653(X,Y) get_gdat_uint((X),(Y),653)
+#define get_gdat_ullong_pos653(X,Y) get_gdat_ullong((X),(Y),653)
+#define get_gdat_ip_pos653(X,Y) get_gdat_ip((X),(Y),653)
+#define get_gdat_ipv6_pos653(X,Y) get_gdat_ipv6((X),(Y),653)
+#define get_gdat_string_pos653(X,Y) get_gdat_string((X),(Y),653)
+#define get_gdat_v_str_pos653(X,Y) get_gdat_string((X),(Y),653)
+#define get_gdat_bool_pos653(X,Y) get_gdat_bool((X),(Y),653)
+#define get_gdat_int_pos653(X,Y) get_gdat_int((X),(Y),653)
+#define get_gdat_llong_pos653(X,Y) get_gdat_llong((X),(Y),653)
+#define get_gdat_float_pos653(X,Y) get_gdat_float((X),(Y),653)
+#define get_gdat_uint_pos654(X,Y) get_gdat_uint((X),(Y),654)
+#define get_gdat_ullong_pos654(X,Y) get_gdat_ullong((X),(Y),654)
+#define get_gdat_ip_pos654(X,Y) get_gdat_ip((X),(Y),654)
+#define get_gdat_ipv6_pos654(X,Y) get_gdat_ipv6((X),(Y),654)
+#define get_gdat_string_pos654(X,Y) get_gdat_string((X),(Y),654)
+#define get_gdat_v_str_pos654(X,Y) get_gdat_string((X),(Y),654)
+#define get_gdat_bool_pos654(X,Y) get_gdat_bool((X),(Y),654)
+#define get_gdat_int_pos654(X,Y) get_gdat_int((X),(Y),654)
+#define get_gdat_llong_pos654(X,Y) get_gdat_llong((X),(Y),654)
+#define get_gdat_float_pos654(X,Y) get_gdat_float((X),(Y),654)
+#define get_gdat_uint_pos655(X,Y) get_gdat_uint((X),(Y),655)
+#define get_gdat_ullong_pos655(X,Y) get_gdat_ullong((X),(Y),655)
+#define get_gdat_ip_pos655(X,Y) get_gdat_ip((X),(Y),655)
+#define get_gdat_ipv6_pos655(X,Y) get_gdat_ipv6((X),(Y),655)
+#define get_gdat_string_pos655(X,Y) get_gdat_string((X),(Y),655)
+#define get_gdat_v_str_pos655(X,Y) get_gdat_string((X),(Y),655)
+#define get_gdat_bool_pos655(X,Y) get_gdat_bool((X),(Y),655)
+#define get_gdat_int_pos655(X,Y) get_gdat_int((X),(Y),655)
+#define get_gdat_llong_pos655(X,Y) get_gdat_llong((X),(Y),655)
+#define get_gdat_float_pos655(X,Y) get_gdat_float((X),(Y),655)
+#define get_gdat_uint_pos656(X,Y) get_gdat_uint((X),(Y),656)
+#define get_gdat_ullong_pos656(X,Y) get_gdat_ullong((X),(Y),656)
+#define get_gdat_ip_pos656(X,Y) get_gdat_ip((X),(Y),656)
+#define get_gdat_ipv6_pos656(X,Y) get_gdat_ipv6((X),(Y),656)
+#define get_gdat_string_pos656(X,Y) get_gdat_string((X),(Y),656)
+#define get_gdat_v_str_pos656(X,Y) get_gdat_string((X),(Y),656)
+#define get_gdat_bool_pos656(X,Y) get_gdat_bool((X),(Y),656)
+#define get_gdat_int_pos656(X,Y) get_gdat_int((X),(Y),656)
+#define get_gdat_llong_pos656(X,Y) get_gdat_llong((X),(Y),656)
+#define get_gdat_float_pos656(X,Y) get_gdat_float((X),(Y),656)
+#define get_gdat_uint_pos657(X,Y) get_gdat_uint((X),(Y),657)
+#define get_gdat_ullong_pos657(X,Y) get_gdat_ullong((X),(Y),657)
+#define get_gdat_ip_pos657(X,Y) get_gdat_ip((X),(Y),657)
+#define get_gdat_ipv6_pos657(X,Y) get_gdat_ipv6((X),(Y),657)
+#define get_gdat_string_pos657(X,Y) get_gdat_string((X),(Y),657)
+#define get_gdat_v_str_pos657(X,Y) get_gdat_string((X),(Y),657)
+#define get_gdat_bool_pos657(X,Y) get_gdat_bool((X),(Y),657)
+#define get_gdat_int_pos657(X,Y) get_gdat_int((X),(Y),657)
+#define get_gdat_llong_pos657(X,Y) get_gdat_llong((X),(Y),657)
+#define get_gdat_float_pos657(X,Y) get_gdat_float((X),(Y),657)
+#define get_gdat_uint_pos658(X,Y) get_gdat_uint((X),(Y),658)
+#define get_gdat_ullong_pos658(X,Y) get_gdat_ullong((X),(Y),658)
+#define get_gdat_ip_pos658(X,Y) get_gdat_ip((X),(Y),658)
+#define get_gdat_ipv6_pos658(X,Y) get_gdat_ipv6((X),(Y),658)
+#define get_gdat_string_pos658(X,Y) get_gdat_string((X),(Y),658)
+#define get_gdat_v_str_pos658(X,Y) get_gdat_string((X),(Y),658)
+#define get_gdat_bool_pos658(X,Y) get_gdat_bool((X),(Y),658)
+#define get_gdat_int_pos658(X,Y) get_gdat_int((X),(Y),658)
+#define get_gdat_llong_pos658(X,Y) get_gdat_llong((X),(Y),658)
+#define get_gdat_float_pos658(X,Y) get_gdat_float((X),(Y),658)
+#define get_gdat_uint_pos659(X,Y) get_gdat_uint((X),(Y),659)
+#define get_gdat_ullong_pos659(X,Y) get_gdat_ullong((X),(Y),659)
+#define get_gdat_ip_pos659(X,Y) get_gdat_ip((X),(Y),659)
+#define get_gdat_ipv6_pos659(X,Y) get_gdat_ipv6((X),(Y),659)
+#define get_gdat_string_pos659(X,Y) get_gdat_string((X),(Y),659)
+#define get_gdat_v_str_pos659(X,Y) get_gdat_string((X),(Y),659)
+#define get_gdat_bool_pos659(X,Y) get_gdat_bool((X),(Y),659)
+#define get_gdat_int_pos659(X,Y) get_gdat_int((X),(Y),659)
+#define get_gdat_llong_pos659(X,Y) get_gdat_llong((X),(Y),659)
+#define get_gdat_float_pos659(X,Y) get_gdat_float((X),(Y),659)
+#define get_gdat_uint_pos660(X,Y) get_gdat_uint((X),(Y),660)
+#define get_gdat_ullong_pos660(X,Y) get_gdat_ullong((X),(Y),660)
+#define get_gdat_ip_pos660(X,Y) get_gdat_ip((X),(Y),660)
+#define get_gdat_ipv6_pos660(X,Y) get_gdat_ipv6((X),(Y),660)
+#define get_gdat_string_pos660(X,Y) get_gdat_string((X),(Y),660)
+#define get_gdat_v_str_pos660(X,Y) get_gdat_string((X),(Y),660)
+#define get_gdat_bool_pos660(X,Y) get_gdat_bool((X),(Y),660)
+#define get_gdat_int_pos660(X,Y) get_gdat_int((X),(Y),660)
+#define get_gdat_llong_pos660(X,Y) get_gdat_llong((X),(Y),660)
+#define get_gdat_float_pos660(X,Y) get_gdat_float((X),(Y),660)
+#define get_gdat_uint_pos661(X,Y) get_gdat_uint((X),(Y),661)
+#define get_gdat_ullong_pos661(X,Y) get_gdat_ullong((X),(Y),661)
+#define get_gdat_ip_pos661(X,Y) get_gdat_ip((X),(Y),661)
+#define get_gdat_ipv6_pos661(X,Y) get_gdat_ipv6((X),(Y),661)
+#define get_gdat_string_pos661(X,Y) get_gdat_string((X),(Y),661)
+#define get_gdat_v_str_pos661(X,Y) get_gdat_string((X),(Y),661)
+#define get_gdat_bool_pos661(X,Y) get_gdat_bool((X),(Y),661)
+#define get_gdat_int_pos661(X,Y) get_gdat_int((X),(Y),661)
+#define get_gdat_llong_pos661(X,Y) get_gdat_llong((X),(Y),661)
+#define get_gdat_float_pos661(X,Y) get_gdat_float((X),(Y),661)
+#define get_gdat_uint_pos662(X,Y) get_gdat_uint((X),(Y),662)
+#define get_gdat_ullong_pos662(X,Y) get_gdat_ullong((X),(Y),662)
+#define get_gdat_ip_pos662(X,Y) get_gdat_ip((X),(Y),662)
+#define get_gdat_ipv6_pos662(X,Y) get_gdat_ipv6((X),(Y),662)
+#define get_gdat_string_pos662(X,Y) get_gdat_string((X),(Y),662)
+#define get_gdat_v_str_pos662(X,Y) get_gdat_string((X),(Y),662)
+#define get_gdat_bool_pos662(X,Y) get_gdat_bool((X),(Y),662)
+#define get_gdat_int_pos662(X,Y) get_gdat_int((X),(Y),662)
+#define get_gdat_llong_pos662(X,Y) get_gdat_llong((X),(Y),662)
+#define get_gdat_float_pos662(X,Y) get_gdat_float((X),(Y),662)
+#define get_gdat_uint_pos663(X,Y) get_gdat_uint((X),(Y),663)
+#define get_gdat_ullong_pos663(X,Y) get_gdat_ullong((X),(Y),663)
+#define get_gdat_ip_pos663(X,Y) get_gdat_ip((X),(Y),663)
+#define get_gdat_ipv6_pos663(X,Y) get_gdat_ipv6((X),(Y),663)
+#define get_gdat_string_pos663(X,Y) get_gdat_string((X),(Y),663)
+#define get_gdat_v_str_pos663(X,Y) get_gdat_string((X),(Y),663)
+#define get_gdat_bool_pos663(X,Y) get_gdat_bool((X),(Y),663)
+#define get_gdat_int_pos663(X,Y) get_gdat_int((X),(Y),663)
+#define get_gdat_llong_pos663(X,Y) get_gdat_llong((X),(Y),663)
+#define get_gdat_float_pos663(X,Y) get_gdat_float((X),(Y),663)
+#define get_gdat_uint_pos664(X,Y) get_gdat_uint((X),(Y),664)
+#define get_gdat_ullong_pos664(X,Y) get_gdat_ullong((X),(Y),664)
+#define get_gdat_ip_pos664(X,Y) get_gdat_ip((X),(Y),664)
+#define get_gdat_ipv6_pos664(X,Y) get_gdat_ipv6((X),(Y),664)
+#define get_gdat_string_pos664(X,Y) get_gdat_string((X),(Y),664)
+#define get_gdat_v_str_pos664(X,Y) get_gdat_string((X),(Y),664)
+#define get_gdat_bool_pos664(X,Y) get_gdat_bool((X),(Y),664)
+#define get_gdat_int_pos664(X,Y) get_gdat_int((X),(Y),664)
+#define get_gdat_llong_pos664(X,Y) get_gdat_llong((X),(Y),664)
+#define get_gdat_float_pos664(X,Y) get_gdat_float((X),(Y),664)
+#define get_gdat_uint_pos665(X,Y) get_gdat_uint((X),(Y),665)
+#define get_gdat_ullong_pos665(X,Y) get_gdat_ullong((X),(Y),665)
+#define get_gdat_ip_pos665(X,Y) get_gdat_ip((X),(Y),665)
+#define get_gdat_ipv6_pos665(X,Y) get_gdat_ipv6((X),(Y),665)
+#define get_gdat_string_pos665(X,Y) get_gdat_string((X),(Y),665)
+#define get_gdat_v_str_pos665(X,Y) get_gdat_string((X),(Y),665)
+#define get_gdat_bool_pos665(X,Y) get_gdat_bool((X),(Y),665)
+#define get_gdat_int_pos665(X,Y) get_gdat_int((X),(Y),665)
+#define get_gdat_llong_pos665(X,Y) get_gdat_llong((X),(Y),665)
+#define get_gdat_float_pos665(X,Y) get_gdat_float((X),(Y),665)
+#define get_gdat_uint_pos666(X,Y) get_gdat_uint((X),(Y),666)
+#define get_gdat_ullong_pos666(X,Y) get_gdat_ullong((X),(Y),666)
+#define get_gdat_ip_pos666(X,Y) get_gdat_ip((X),(Y),666)
+#define get_gdat_ipv6_pos666(X,Y) get_gdat_ipv6((X),(Y),666)
+#define get_gdat_string_pos666(X,Y) get_gdat_string((X),(Y),666)
+#define get_gdat_v_str_pos666(X,Y) get_gdat_string((X),(Y),666)
+#define get_gdat_bool_pos666(X,Y) get_gdat_bool((X),(Y),666)
+#define get_gdat_int_pos666(X,Y) get_gdat_int((X),(Y),666)
+#define get_gdat_llong_pos666(X,Y) get_gdat_llong((X),(Y),666)
+#define get_gdat_float_pos666(X,Y) get_gdat_float((X),(Y),666)
+#define get_gdat_uint_pos667(X,Y) get_gdat_uint((X),(Y),667)
+#define get_gdat_ullong_pos667(X,Y) get_gdat_ullong((X),(Y),667)
+#define get_gdat_ip_pos667(X,Y) get_gdat_ip((X),(Y),667)
+#define get_gdat_ipv6_pos667(X,Y) get_gdat_ipv6((X),(Y),667)
+#define get_gdat_string_pos667(X,Y) get_gdat_string((X),(Y),667)
+#define get_gdat_v_str_pos667(X,Y) get_gdat_string((X),(Y),667)
+#define get_gdat_bool_pos667(X,Y) get_gdat_bool((X),(Y),667)
+#define get_gdat_int_pos667(X,Y) get_gdat_int((X),(Y),667)
+#define get_gdat_llong_pos667(X,Y) get_gdat_llong((X),(Y),667)
+#define get_gdat_float_pos667(X,Y) get_gdat_float((X),(Y),667)
+#define get_gdat_uint_pos668(X,Y) get_gdat_uint((X),(Y),668)
+#define get_gdat_ullong_pos668(X,Y) get_gdat_ullong((X),(Y),668)
+#define get_gdat_ip_pos668(X,Y) get_gdat_ip((X),(Y),668)
+#define get_gdat_ipv6_pos668(X,Y) get_gdat_ipv6((X),(Y),668)
+#define get_gdat_string_pos668(X,Y) get_gdat_string((X),(Y),668)
+#define get_gdat_v_str_pos668(X,Y) get_gdat_string((X),(Y),668)
+#define get_gdat_bool_pos668(X,Y) get_gdat_bool((X),(Y),668)
+#define get_gdat_int_pos668(X,Y) get_gdat_int((X),(Y),668)
+#define get_gdat_llong_pos668(X,Y) get_gdat_llong((X),(Y),668)
+#define get_gdat_float_pos668(X,Y) get_gdat_float((X),(Y),668)
+#define get_gdat_uint_pos669(X,Y) get_gdat_uint((X),(Y),669)
+#define get_gdat_ullong_pos669(X,Y) get_gdat_ullong((X),(Y),669)
+#define get_gdat_ip_pos669(X,Y) get_gdat_ip((X),(Y),669)
+#define get_gdat_ipv6_pos669(X,Y) get_gdat_ipv6((X),(Y),669)
+#define get_gdat_string_pos669(X,Y) get_gdat_string((X),(Y),669)
+#define get_gdat_v_str_pos669(X,Y) get_gdat_string((X),(Y),669)
+#define get_gdat_bool_pos669(X,Y) get_gdat_bool((X),(Y),669)
+#define get_gdat_int_pos669(X,Y) get_gdat_int((X),(Y),669)
+#define get_gdat_llong_pos669(X,Y) get_gdat_llong((X),(Y),669)
+#define get_gdat_float_pos669(X,Y) get_gdat_float((X),(Y),669)
+#define get_gdat_uint_pos670(X,Y) get_gdat_uint((X),(Y),670)
+#define get_gdat_ullong_pos670(X,Y) get_gdat_ullong((X),(Y),670)
+#define get_gdat_ip_pos670(X,Y) get_gdat_ip((X),(Y),670)
+#define get_gdat_ipv6_pos670(X,Y) get_gdat_ipv6((X),(Y),670)
+#define get_gdat_string_pos670(X,Y) get_gdat_string((X),(Y),670)
+#define get_gdat_v_str_pos670(X,Y) get_gdat_string((X),(Y),670)
+#define get_gdat_bool_pos670(X,Y) get_gdat_bool((X),(Y),670)
+#define get_gdat_int_pos670(X,Y) get_gdat_int((X),(Y),670)
+#define get_gdat_llong_pos670(X,Y) get_gdat_llong((X),(Y),670)
+#define get_gdat_float_pos670(X,Y) get_gdat_float((X),(Y),670)
+#define get_gdat_uint_pos671(X,Y) get_gdat_uint((X),(Y),671)
+#define get_gdat_ullong_pos671(X,Y) get_gdat_ullong((X),(Y),671)
+#define get_gdat_ip_pos671(X,Y) get_gdat_ip((X),(Y),671)
+#define get_gdat_ipv6_pos671(X,Y) get_gdat_ipv6((X),(Y),671)
+#define get_gdat_string_pos671(X,Y) get_gdat_string((X),(Y),671)
+#define get_gdat_v_str_pos671(X,Y) get_gdat_string((X),(Y),671)
+#define get_gdat_bool_pos671(X,Y) get_gdat_bool((X),(Y),671)
+#define get_gdat_int_pos671(X,Y) get_gdat_int((X),(Y),671)
+#define get_gdat_llong_pos671(X,Y) get_gdat_llong((X),(Y),671)
+#define get_gdat_float_pos671(X,Y) get_gdat_float((X),(Y),671)
+#define get_gdat_uint_pos672(X,Y) get_gdat_uint((X),(Y),672)
+#define get_gdat_ullong_pos672(X,Y) get_gdat_ullong((X),(Y),672)
+#define get_gdat_ip_pos672(X,Y) get_gdat_ip((X),(Y),672)
+#define get_gdat_ipv6_pos672(X,Y) get_gdat_ipv6((X),(Y),672)
+#define get_gdat_string_pos672(X,Y) get_gdat_string((X),(Y),672)
+#define get_gdat_v_str_pos672(X,Y) get_gdat_string((X),(Y),672)
+#define get_gdat_bool_pos672(X,Y) get_gdat_bool((X),(Y),672)
+#define get_gdat_int_pos672(X,Y) get_gdat_int((X),(Y),672)
+#define get_gdat_llong_pos672(X,Y) get_gdat_llong((X),(Y),672)
+#define get_gdat_float_pos672(X,Y) get_gdat_float((X),(Y),672)
+#define get_gdat_uint_pos673(X,Y) get_gdat_uint((X),(Y),673)
+#define get_gdat_ullong_pos673(X,Y) get_gdat_ullong((X),(Y),673)
+#define get_gdat_ip_pos673(X,Y) get_gdat_ip((X),(Y),673)
+#define get_gdat_ipv6_pos673(X,Y) get_gdat_ipv6((X),(Y),673)
+#define get_gdat_string_pos673(X,Y) get_gdat_string((X),(Y),673)
+#define get_gdat_v_str_pos673(X,Y) get_gdat_string((X),(Y),673)
+#define get_gdat_bool_pos673(X,Y) get_gdat_bool((X),(Y),673)
+#define get_gdat_int_pos673(X,Y) get_gdat_int((X),(Y),673)
+#define get_gdat_llong_pos673(X,Y) get_gdat_llong((X),(Y),673)
+#define get_gdat_float_pos673(X,Y) get_gdat_float((X),(Y),673)
+#define get_gdat_uint_pos674(X,Y) get_gdat_uint((X),(Y),674)
+#define get_gdat_ullong_pos674(X,Y) get_gdat_ullong((X),(Y),674)
+#define get_gdat_ip_pos674(X,Y) get_gdat_ip((X),(Y),674)
+#define get_gdat_ipv6_pos674(X,Y) get_gdat_ipv6((X),(Y),674)
+#define get_gdat_string_pos674(X,Y) get_gdat_string((X),(Y),674)
+#define get_gdat_v_str_pos674(X,Y) get_gdat_string((X),(Y),674)
+#define get_gdat_bool_pos674(X,Y) get_gdat_bool((X),(Y),674)
+#define get_gdat_int_pos674(X,Y) get_gdat_int((X),(Y),674)
+#define get_gdat_llong_pos674(X,Y) get_gdat_llong((X),(Y),674)
+#define get_gdat_float_pos674(X,Y) get_gdat_float((X),(Y),674)
+#define get_gdat_uint_pos675(X,Y) get_gdat_uint((X),(Y),675)
+#define get_gdat_ullong_pos675(X,Y) get_gdat_ullong((X),(Y),675)
+#define get_gdat_ip_pos675(X,Y) get_gdat_ip((X),(Y),675)
+#define get_gdat_ipv6_pos675(X,Y) get_gdat_ipv6((X),(Y),675)
+#define get_gdat_string_pos675(X,Y) get_gdat_string((X),(Y),675)
+#define get_gdat_v_str_pos675(X,Y) get_gdat_string((X),(Y),675)
+#define get_gdat_bool_pos675(X,Y) get_gdat_bool((X),(Y),675)
+#define get_gdat_int_pos675(X,Y) get_gdat_int((X),(Y),675)
+#define get_gdat_llong_pos675(X,Y) get_gdat_llong((X),(Y),675)
+#define get_gdat_float_pos675(X,Y) get_gdat_float((X),(Y),675)
+#define get_gdat_uint_pos676(X,Y) get_gdat_uint((X),(Y),676)
+#define get_gdat_ullong_pos676(X,Y) get_gdat_ullong((X),(Y),676)
+#define get_gdat_ip_pos676(X,Y) get_gdat_ip((X),(Y),676)
+#define get_gdat_ipv6_pos676(X,Y) get_gdat_ipv6((X),(Y),676)
+#define get_gdat_string_pos676(X,Y) get_gdat_string((X),(Y),676)
+#define get_gdat_v_str_pos676(X,Y) get_gdat_string((X),(Y),676)
+#define get_gdat_bool_pos676(X,Y) get_gdat_bool((X),(Y),676)
+#define get_gdat_int_pos676(X,Y) get_gdat_int((X),(Y),676)
+#define get_gdat_llong_pos676(X,Y) get_gdat_llong((X),(Y),676)
+#define get_gdat_float_pos676(X,Y) get_gdat_float((X),(Y),676)
+#define get_gdat_uint_pos677(X,Y) get_gdat_uint((X),(Y),677)
+#define get_gdat_ullong_pos677(X,Y) get_gdat_ullong((X),(Y),677)
+#define get_gdat_ip_pos677(X,Y) get_gdat_ip((X),(Y),677)
+#define get_gdat_ipv6_pos677(X,Y) get_gdat_ipv6((X),(Y),677)
+#define get_gdat_string_pos677(X,Y) get_gdat_string((X),(Y),677)
+#define get_gdat_v_str_pos677(X,Y) get_gdat_string((X),(Y),677)
+#define get_gdat_bool_pos677(X,Y) get_gdat_bool((X),(Y),677)
+#define get_gdat_int_pos677(X,Y) get_gdat_int((X),(Y),677)
+#define get_gdat_llong_pos677(X,Y) get_gdat_llong((X),(Y),677)
+#define get_gdat_float_pos677(X,Y) get_gdat_float((X),(Y),677)
+#define get_gdat_uint_pos678(X,Y) get_gdat_uint((X),(Y),678)
+#define get_gdat_ullong_pos678(X,Y) get_gdat_ullong((X),(Y),678)
+#define get_gdat_ip_pos678(X,Y) get_gdat_ip((X),(Y),678)
+#define get_gdat_ipv6_pos678(X,Y) get_gdat_ipv6((X),(Y),678)
+#define get_gdat_string_pos678(X,Y) get_gdat_string((X),(Y),678)
+#define get_gdat_v_str_pos678(X,Y) get_gdat_string((X),(Y),678)
+#define get_gdat_bool_pos678(X,Y) get_gdat_bool((X),(Y),678)
+#define get_gdat_int_pos678(X,Y) get_gdat_int((X),(Y),678)
+#define get_gdat_llong_pos678(X,Y) get_gdat_llong((X),(Y),678)
+#define get_gdat_float_pos678(X,Y) get_gdat_float((X),(Y),678)
+#define get_gdat_uint_pos679(X,Y) get_gdat_uint((X),(Y),679)
+#define get_gdat_ullong_pos679(X,Y) get_gdat_ullong((X),(Y),679)
+#define get_gdat_ip_pos679(X,Y) get_gdat_ip((X),(Y),679)
+#define get_gdat_ipv6_pos679(X,Y) get_gdat_ipv6((X),(Y),679)
+#define get_gdat_string_pos679(X,Y) get_gdat_string((X),(Y),679)
+#define get_gdat_v_str_pos679(X,Y) get_gdat_string((X),(Y),679)
+#define get_gdat_bool_pos679(X,Y) get_gdat_bool((X),(Y),679)
+#define get_gdat_int_pos679(X,Y) get_gdat_int((X),(Y),679)
+#define get_gdat_llong_pos679(X,Y) get_gdat_llong((X),(Y),679)
+#define get_gdat_float_pos679(X,Y) get_gdat_float((X),(Y),679)
+#define get_gdat_uint_pos680(X,Y) get_gdat_uint((X),(Y),680)
+#define get_gdat_ullong_pos680(X,Y) get_gdat_ullong((X),(Y),680)
+#define get_gdat_ip_pos680(X,Y) get_gdat_ip((X),(Y),680)
+#define get_gdat_ipv6_pos680(X,Y) get_gdat_ipv6((X),(Y),680)
+#define get_gdat_string_pos680(X,Y) get_gdat_string((X),(Y),680)
+#define get_gdat_v_str_pos680(X,Y) get_gdat_string((X),(Y),680)
+#define get_gdat_bool_pos680(X,Y) get_gdat_bool((X),(Y),680)
+#define get_gdat_int_pos680(X,Y) get_gdat_int((X),(Y),680)
+#define get_gdat_llong_pos680(X,Y) get_gdat_llong((X),(Y),680)
+#define get_gdat_float_pos680(X,Y) get_gdat_float((X),(Y),680)
+#define get_gdat_uint_pos681(X,Y) get_gdat_uint((X),(Y),681)
+#define get_gdat_ullong_pos681(X,Y) get_gdat_ullong((X),(Y),681)
+#define get_gdat_ip_pos681(X,Y) get_gdat_ip((X),(Y),681)
+#define get_gdat_ipv6_pos681(X,Y) get_gdat_ipv6((X),(Y),681)
+#define get_gdat_string_pos681(X,Y) get_gdat_string((X),(Y),681)
+#define get_gdat_v_str_pos681(X,Y) get_gdat_string((X),(Y),681)
+#define get_gdat_bool_pos681(X,Y) get_gdat_bool((X),(Y),681)
+#define get_gdat_int_pos681(X,Y) get_gdat_int((X),(Y),681)
+#define get_gdat_llong_pos681(X,Y) get_gdat_llong((X),(Y),681)
+#define get_gdat_float_pos681(X,Y) get_gdat_float((X),(Y),681)
+#define get_gdat_uint_pos682(X,Y) get_gdat_uint((X),(Y),682)
+#define get_gdat_ullong_pos682(X,Y) get_gdat_ullong((X),(Y),682)
+#define get_gdat_ip_pos682(X,Y) get_gdat_ip((X),(Y),682)
+#define get_gdat_ipv6_pos682(X,Y) get_gdat_ipv6((X),(Y),682)
+#define get_gdat_string_pos682(X,Y) get_gdat_string((X),(Y),682)
+#define get_gdat_v_str_pos682(X,Y) get_gdat_string((X),(Y),682)
+#define get_gdat_bool_pos682(X,Y) get_gdat_bool((X),(Y),682)
+#define get_gdat_int_pos682(X,Y) get_gdat_int((X),(Y),682)
+#define get_gdat_llong_pos682(X,Y) get_gdat_llong((X),(Y),682)
+#define get_gdat_float_pos682(X,Y) get_gdat_float((X),(Y),682)
+#define get_gdat_uint_pos683(X,Y) get_gdat_uint((X),(Y),683)
+#define get_gdat_ullong_pos683(X,Y) get_gdat_ullong((X),(Y),683)
+#define get_gdat_ip_pos683(X,Y) get_gdat_ip((X),(Y),683)
+#define get_gdat_ipv6_pos683(X,Y) get_gdat_ipv6((X),(Y),683)
+#define get_gdat_string_pos683(X,Y) get_gdat_string((X),(Y),683)
+#define get_gdat_v_str_pos683(X,Y) get_gdat_string((X),(Y),683)
+#define get_gdat_bool_pos683(X,Y) get_gdat_bool((X),(Y),683)
+#define get_gdat_int_pos683(X,Y) get_gdat_int((X),(Y),683)
+#define get_gdat_llong_pos683(X,Y) get_gdat_llong((X),(Y),683)
+#define get_gdat_float_pos683(X,Y) get_gdat_float((X),(Y),683)
+#define get_gdat_uint_pos684(X,Y) get_gdat_uint((X),(Y),684)
+#define get_gdat_ullong_pos684(X,Y) get_gdat_ullong((X),(Y),684)
+#define get_gdat_ip_pos684(X,Y) get_gdat_ip((X),(Y),684)
+#define get_gdat_ipv6_pos684(X,Y) get_gdat_ipv6((X),(Y),684)
+#define get_gdat_string_pos684(X,Y) get_gdat_string((X),(Y),684)
+#define get_gdat_v_str_pos684(X,Y) get_gdat_string((X),(Y),684)
+#define get_gdat_bool_pos684(X,Y) get_gdat_bool((X),(Y),684)
+#define get_gdat_int_pos684(X,Y) get_gdat_int((X),(Y),684)
+#define get_gdat_llong_pos684(X,Y) get_gdat_llong((X),(Y),684)
+#define get_gdat_float_pos684(X,Y) get_gdat_float((X),(Y),684)
+#define get_gdat_uint_pos685(X,Y) get_gdat_uint((X),(Y),685)
+#define get_gdat_ullong_pos685(X,Y) get_gdat_ullong((X),(Y),685)
+#define get_gdat_ip_pos685(X,Y) get_gdat_ip((X),(Y),685)
+#define get_gdat_ipv6_pos685(X,Y) get_gdat_ipv6((X),(Y),685)
+#define get_gdat_string_pos685(X,Y) get_gdat_string((X),(Y),685)
+#define get_gdat_v_str_pos685(X,Y) get_gdat_string((X),(Y),685)
+#define get_gdat_bool_pos685(X,Y) get_gdat_bool((X),(Y),685)
+#define get_gdat_int_pos685(X,Y) get_gdat_int((X),(Y),685)
+#define get_gdat_llong_pos685(X,Y) get_gdat_llong((X),(Y),685)
+#define get_gdat_float_pos685(X,Y) get_gdat_float((X),(Y),685)
+#define get_gdat_uint_pos686(X,Y) get_gdat_uint((X),(Y),686)
+#define get_gdat_ullong_pos686(X,Y) get_gdat_ullong((X),(Y),686)
+#define get_gdat_ip_pos686(X,Y) get_gdat_ip((X),(Y),686)
+#define get_gdat_ipv6_pos686(X,Y) get_gdat_ipv6((X),(Y),686)
+#define get_gdat_string_pos686(X,Y) get_gdat_string((X),(Y),686)
+#define get_gdat_v_str_pos686(X,Y) get_gdat_string((X),(Y),686)
+#define get_gdat_bool_pos686(X,Y) get_gdat_bool((X),(Y),686)
+#define get_gdat_int_pos686(X,Y) get_gdat_int((X),(Y),686)
+#define get_gdat_llong_pos686(X,Y) get_gdat_llong((X),(Y),686)
+#define get_gdat_float_pos686(X,Y) get_gdat_float((X),(Y),686)
+#define get_gdat_uint_pos687(X,Y) get_gdat_uint((X),(Y),687)
+#define get_gdat_ullong_pos687(X,Y) get_gdat_ullong((X),(Y),687)
+#define get_gdat_ip_pos687(X,Y) get_gdat_ip((X),(Y),687)
+#define get_gdat_ipv6_pos687(X,Y) get_gdat_ipv6((X),(Y),687)
+#define get_gdat_string_pos687(X,Y) get_gdat_string((X),(Y),687)
+#define get_gdat_v_str_pos687(X,Y) get_gdat_string((X),(Y),687)
+#define get_gdat_bool_pos687(X,Y) get_gdat_bool((X),(Y),687)
+#define get_gdat_int_pos687(X,Y) get_gdat_int((X),(Y),687)
+#define get_gdat_llong_pos687(X,Y) get_gdat_llong((X),(Y),687)
+#define get_gdat_float_pos687(X,Y) get_gdat_float((X),(Y),687)
+#define get_gdat_uint_pos688(X,Y) get_gdat_uint((X),(Y),688)
+#define get_gdat_ullong_pos688(X,Y) get_gdat_ullong((X),(Y),688)
+#define get_gdat_ip_pos688(X,Y) get_gdat_ip((X),(Y),688)
+#define get_gdat_ipv6_pos688(X,Y) get_gdat_ipv6((X),(Y),688)
+#define get_gdat_string_pos688(X,Y) get_gdat_string((X),(Y),688)
+#define get_gdat_v_str_pos688(X,Y) get_gdat_string((X),(Y),688)
+#define get_gdat_bool_pos688(X,Y) get_gdat_bool((X),(Y),688)
+#define get_gdat_int_pos688(X,Y) get_gdat_int((X),(Y),688)
+#define get_gdat_llong_pos688(X,Y) get_gdat_llong((X),(Y),688)
+#define get_gdat_float_pos688(X,Y) get_gdat_float((X),(Y),688)
+#define get_gdat_uint_pos689(X,Y) get_gdat_uint((X),(Y),689)
+#define get_gdat_ullong_pos689(X,Y) get_gdat_ullong((X),(Y),689)
+#define get_gdat_ip_pos689(X,Y) get_gdat_ip((X),(Y),689)
+#define get_gdat_ipv6_pos689(X,Y) get_gdat_ipv6((X),(Y),689)
+#define get_gdat_string_pos689(X,Y) get_gdat_string((X),(Y),689)
+#define get_gdat_v_str_pos689(X,Y) get_gdat_string((X),(Y),689)
+#define get_gdat_bool_pos689(X,Y) get_gdat_bool((X),(Y),689)
+#define get_gdat_int_pos689(X,Y) get_gdat_int((X),(Y),689)
+#define get_gdat_llong_pos689(X,Y) get_gdat_llong((X),(Y),689)
+#define get_gdat_float_pos689(X,Y) get_gdat_float((X),(Y),689)
+#define get_gdat_uint_pos690(X,Y) get_gdat_uint((X),(Y),690)
+#define get_gdat_ullong_pos690(X,Y) get_gdat_ullong((X),(Y),690)
+#define get_gdat_ip_pos690(X,Y) get_gdat_ip((X),(Y),690)
+#define get_gdat_ipv6_pos690(X,Y) get_gdat_ipv6((X),(Y),690)
+#define get_gdat_string_pos690(X,Y) get_gdat_string((X),(Y),690)
+#define get_gdat_v_str_pos690(X,Y) get_gdat_string((X),(Y),690)
+#define get_gdat_bool_pos690(X,Y) get_gdat_bool((X),(Y),690)
+#define get_gdat_int_pos690(X,Y) get_gdat_int((X),(Y),690)
+#define get_gdat_llong_pos690(X,Y) get_gdat_llong((X),(Y),690)
+#define get_gdat_float_pos690(X,Y) get_gdat_float((X),(Y),690)
+#define get_gdat_uint_pos691(X,Y) get_gdat_uint((X),(Y),691)
+#define get_gdat_ullong_pos691(X,Y) get_gdat_ullong((X),(Y),691)
+#define get_gdat_ip_pos691(X,Y) get_gdat_ip((X),(Y),691)
+#define get_gdat_ipv6_pos691(X,Y) get_gdat_ipv6((X),(Y),691)
+#define get_gdat_string_pos691(X,Y) get_gdat_string((X),(Y),691)
+#define get_gdat_v_str_pos691(X,Y) get_gdat_string((X),(Y),691)
+#define get_gdat_bool_pos691(X,Y) get_gdat_bool((X),(Y),691)
+#define get_gdat_int_pos691(X,Y) get_gdat_int((X),(Y),691)
+#define get_gdat_llong_pos691(X,Y) get_gdat_llong((X),(Y),691)
+#define get_gdat_float_pos691(X,Y) get_gdat_float((X),(Y),691)
+#define get_gdat_uint_pos692(X,Y) get_gdat_uint((X),(Y),692)
+#define get_gdat_ullong_pos692(X,Y) get_gdat_ullong((X),(Y),692)
+#define get_gdat_ip_pos692(X,Y) get_gdat_ip((X),(Y),692)
+#define get_gdat_ipv6_pos692(X,Y) get_gdat_ipv6((X),(Y),692)
+#define get_gdat_string_pos692(X,Y) get_gdat_string((X),(Y),692)
+#define get_gdat_v_str_pos692(X,Y) get_gdat_string((X),(Y),692)
+#define get_gdat_bool_pos692(X,Y) get_gdat_bool((X),(Y),692)
+#define get_gdat_int_pos692(X,Y) get_gdat_int((X),(Y),692)
+#define get_gdat_llong_pos692(X,Y) get_gdat_llong((X),(Y),692)
+#define get_gdat_float_pos692(X,Y) get_gdat_float((X),(Y),692)
+#define get_gdat_uint_pos693(X,Y) get_gdat_uint((X),(Y),693)
+#define get_gdat_ullong_pos693(X,Y) get_gdat_ullong((X),(Y),693)
+#define get_gdat_ip_pos693(X,Y) get_gdat_ip((X),(Y),693)
+#define get_gdat_ipv6_pos693(X,Y) get_gdat_ipv6((X),(Y),693)
+#define get_gdat_string_pos693(X,Y) get_gdat_string((X),(Y),693)
+#define get_gdat_v_str_pos693(X,Y) get_gdat_string((X),(Y),693)
+#define get_gdat_bool_pos693(X,Y) get_gdat_bool((X),(Y),693)
+#define get_gdat_int_pos693(X,Y) get_gdat_int((X),(Y),693)
+#define get_gdat_llong_pos693(X,Y) get_gdat_llong((X),(Y),693)
+#define get_gdat_float_pos693(X,Y) get_gdat_float((X),(Y),693)
+#define get_gdat_uint_pos694(X,Y) get_gdat_uint((X),(Y),694)
+#define get_gdat_ullong_pos694(X,Y) get_gdat_ullong((X),(Y),694)
+#define get_gdat_ip_pos694(X,Y) get_gdat_ip((X),(Y),694)
+#define get_gdat_ipv6_pos694(X,Y) get_gdat_ipv6((X),(Y),694)
+#define get_gdat_string_pos694(X,Y) get_gdat_string((X),(Y),694)
+#define get_gdat_v_str_pos694(X,Y) get_gdat_string((X),(Y),694)
+#define get_gdat_bool_pos694(X,Y) get_gdat_bool((X),(Y),694)
+#define get_gdat_int_pos694(X,Y) get_gdat_int((X),(Y),694)
+#define get_gdat_llong_pos694(X,Y) get_gdat_llong((X),(Y),694)
+#define get_gdat_float_pos694(X,Y) get_gdat_float((X),(Y),694)
+#define get_gdat_uint_pos695(X,Y) get_gdat_uint((X),(Y),695)
+#define get_gdat_ullong_pos695(X,Y) get_gdat_ullong((X),(Y),695)
+#define get_gdat_ip_pos695(X,Y) get_gdat_ip((X),(Y),695)
+#define get_gdat_ipv6_pos695(X,Y) get_gdat_ipv6((X),(Y),695)
+#define get_gdat_string_pos695(X,Y) get_gdat_string((X),(Y),695)
+#define get_gdat_v_str_pos695(X,Y) get_gdat_string((X),(Y),695)
+#define get_gdat_bool_pos695(X,Y) get_gdat_bool((X),(Y),695)
+#define get_gdat_int_pos695(X,Y) get_gdat_int((X),(Y),695)
+#define get_gdat_llong_pos695(X,Y) get_gdat_llong((X),(Y),695)
+#define get_gdat_float_pos695(X,Y) get_gdat_float((X),(Y),695)
+#define get_gdat_uint_pos696(X,Y) get_gdat_uint((X),(Y),696)
+#define get_gdat_ullong_pos696(X,Y) get_gdat_ullong((X),(Y),696)
+#define get_gdat_ip_pos696(X,Y) get_gdat_ip((X),(Y),696)
+#define get_gdat_ipv6_pos696(X,Y) get_gdat_ipv6((X),(Y),696)
+#define get_gdat_string_pos696(X,Y) get_gdat_string((X),(Y),696)
+#define get_gdat_v_str_pos696(X,Y) get_gdat_string((X),(Y),696)
+#define get_gdat_bool_pos696(X,Y) get_gdat_bool((X),(Y),696)
+#define get_gdat_int_pos696(X,Y) get_gdat_int((X),(Y),696)
+#define get_gdat_llong_pos696(X,Y) get_gdat_llong((X),(Y),696)
+#define get_gdat_float_pos696(X,Y) get_gdat_float((X),(Y),696)
+#define get_gdat_uint_pos697(X,Y) get_gdat_uint((X),(Y),697)
+#define get_gdat_ullong_pos697(X,Y) get_gdat_ullong((X),(Y),697)
+#define get_gdat_ip_pos697(X,Y) get_gdat_ip((X),(Y),697)
+#define get_gdat_ipv6_pos697(X,Y) get_gdat_ipv6((X),(Y),697)
+#define get_gdat_string_pos697(X,Y) get_gdat_string((X),(Y),697)
+#define get_gdat_v_str_pos697(X,Y) get_gdat_string((X),(Y),697)
+#define get_gdat_bool_pos697(X,Y) get_gdat_bool((X),(Y),697)
+#define get_gdat_int_pos697(X,Y) get_gdat_int((X),(Y),697)
+#define get_gdat_llong_pos697(X,Y) get_gdat_llong((X),(Y),697)
+#define get_gdat_float_pos697(X,Y) get_gdat_float((X),(Y),697)
+#define get_gdat_uint_pos698(X,Y) get_gdat_uint((X),(Y),698)
+#define get_gdat_ullong_pos698(X,Y) get_gdat_ullong((X),(Y),698)
+#define get_gdat_ip_pos698(X,Y) get_gdat_ip((X),(Y),698)
+#define get_gdat_ipv6_pos698(X,Y) get_gdat_ipv6((X),(Y),698)
+#define get_gdat_string_pos698(X,Y) get_gdat_string((X),(Y),698)
+#define get_gdat_v_str_pos698(X,Y) get_gdat_string((X),(Y),698)
+#define get_gdat_bool_pos698(X,Y) get_gdat_bool((X),(Y),698)
+#define get_gdat_int_pos698(X,Y) get_gdat_int((X),(Y),698)
+#define get_gdat_llong_pos698(X,Y) get_gdat_llong((X),(Y),698)
+#define get_gdat_float_pos698(X,Y) get_gdat_float((X),(Y),698)
+#define get_gdat_uint_pos699(X,Y) get_gdat_uint((X),(Y),699)
+#define get_gdat_ullong_pos699(X,Y) get_gdat_ullong((X),(Y),699)
+#define get_gdat_ip_pos699(X,Y) get_gdat_ip((X),(Y),699)
+#define get_gdat_ipv6_pos699(X,Y) get_gdat_ipv6((X),(Y),699)
+#define get_gdat_string_pos699(X,Y) get_gdat_string((X),(Y),699)
+#define get_gdat_v_str_pos699(X,Y) get_gdat_string((X),(Y),699)
+#define get_gdat_bool_pos699(X,Y) get_gdat_bool((X),(Y),699)
+#define get_gdat_int_pos699(X,Y) get_gdat_int((X),(Y),699)
+#define get_gdat_llong_pos699(X,Y) get_gdat_llong((X),(Y),699)
+#define get_gdat_float_pos699(X,Y) get_gdat_float((X),(Y),699)
+#define get_gdat_uint_pos700(X,Y) get_gdat_uint((X),(Y),700)
+#define get_gdat_ullong_pos700(X,Y) get_gdat_ullong((X),(Y),700)
+#define get_gdat_ip_pos700(X,Y) get_gdat_ip((X),(Y),700)
+#define get_gdat_ipv6_pos700(X,Y) get_gdat_ipv6((X),(Y),700)
+#define get_gdat_string_pos700(X,Y) get_gdat_string((X),(Y),700)
+#define get_gdat_v_str_pos700(X,Y) get_gdat_string((X),(Y),700)
+#define get_gdat_bool_pos700(X,Y) get_gdat_bool((X),(Y),700)
+#define get_gdat_int_pos700(X,Y) get_gdat_int((X),(Y),700)
+#define get_gdat_llong_pos700(X,Y) get_gdat_llong((X),(Y),700)
+#define get_gdat_float_pos700(X,Y) get_gdat_float((X),(Y),700)
+#define get_gdat_uint_pos701(X,Y) get_gdat_uint((X),(Y),701)
+#define get_gdat_ullong_pos701(X,Y) get_gdat_ullong((X),(Y),701)
+#define get_gdat_ip_pos701(X,Y) get_gdat_ip((X),(Y),701)
+#define get_gdat_ipv6_pos701(X,Y) get_gdat_ipv6((X),(Y),701)
+#define get_gdat_string_pos701(X,Y) get_gdat_string((X),(Y),701)
+#define get_gdat_v_str_pos701(X,Y) get_gdat_string((X),(Y),701)
+#define get_gdat_bool_pos701(X,Y) get_gdat_bool((X),(Y),701)
+#define get_gdat_int_pos701(X,Y) get_gdat_int((X),(Y),701)
+#define get_gdat_llong_pos701(X,Y) get_gdat_llong((X),(Y),701)
+#define get_gdat_float_pos701(X,Y) get_gdat_float((X),(Y),701)
+#define get_gdat_uint_pos702(X,Y) get_gdat_uint((X),(Y),702)
+#define get_gdat_ullong_pos702(X,Y) get_gdat_ullong((X),(Y),702)
+#define get_gdat_ip_pos702(X,Y) get_gdat_ip((X),(Y),702)
+#define get_gdat_ipv6_pos702(X,Y) get_gdat_ipv6((X),(Y),702)
+#define get_gdat_string_pos702(X,Y) get_gdat_string((X),(Y),702)
+#define get_gdat_v_str_pos702(X,Y) get_gdat_string((X),(Y),702)
+#define get_gdat_bool_pos702(X,Y) get_gdat_bool((X),(Y),702)
+#define get_gdat_int_pos702(X,Y) get_gdat_int((X),(Y),702)
+#define get_gdat_llong_pos702(X,Y) get_gdat_llong((X),(Y),702)
+#define get_gdat_float_pos702(X,Y) get_gdat_float((X),(Y),702)
+#define get_gdat_uint_pos703(X,Y) get_gdat_uint((X),(Y),703)
+#define get_gdat_ullong_pos703(X,Y) get_gdat_ullong((X),(Y),703)
+#define get_gdat_ip_pos703(X,Y) get_gdat_ip((X),(Y),703)
+#define get_gdat_ipv6_pos703(X,Y) get_gdat_ipv6((X),(Y),703)
+#define get_gdat_string_pos703(X,Y) get_gdat_string((X),(Y),703)
+#define get_gdat_v_str_pos703(X,Y) get_gdat_string((X),(Y),703)
+#define get_gdat_bool_pos703(X,Y) get_gdat_bool((X),(Y),703)
+#define get_gdat_int_pos703(X,Y) get_gdat_int((X),(Y),703)
+#define get_gdat_llong_pos703(X,Y) get_gdat_llong((X),(Y),703)
+#define get_gdat_float_pos703(X,Y) get_gdat_float((X),(Y),703)
+#define get_gdat_uint_pos704(X,Y) get_gdat_uint((X),(Y),704)
+#define get_gdat_ullong_pos704(X,Y) get_gdat_ullong((X),(Y),704)
+#define get_gdat_ip_pos704(X,Y) get_gdat_ip((X),(Y),704)
+#define get_gdat_ipv6_pos704(X,Y) get_gdat_ipv6((X),(Y),704)
+#define get_gdat_string_pos704(X,Y) get_gdat_string((X),(Y),704)
+#define get_gdat_v_str_pos704(X,Y) get_gdat_string((X),(Y),704)
+#define get_gdat_bool_pos704(X,Y) get_gdat_bool((X),(Y),704)
+#define get_gdat_int_pos704(X,Y) get_gdat_int((X),(Y),704)
+#define get_gdat_llong_pos704(X,Y) get_gdat_llong((X),(Y),704)
+#define get_gdat_float_pos704(X,Y) get_gdat_float((X),(Y),704)
+#define get_gdat_uint_pos705(X,Y) get_gdat_uint((X),(Y),705)
+#define get_gdat_ullong_pos705(X,Y) get_gdat_ullong((X),(Y),705)
+#define get_gdat_ip_pos705(X,Y) get_gdat_ip((X),(Y),705)
+#define get_gdat_ipv6_pos705(X,Y) get_gdat_ipv6((X),(Y),705)
+#define get_gdat_string_pos705(X,Y) get_gdat_string((X),(Y),705)
+#define get_gdat_v_str_pos705(X,Y) get_gdat_string((X),(Y),705)
+#define get_gdat_bool_pos705(X,Y) get_gdat_bool((X),(Y),705)
+#define get_gdat_int_pos705(X,Y) get_gdat_int((X),(Y),705)
+#define get_gdat_llong_pos705(X,Y) get_gdat_llong((X),(Y),705)
+#define get_gdat_float_pos705(X,Y) get_gdat_float((X),(Y),705)
+#define get_gdat_uint_pos706(X,Y) get_gdat_uint((X),(Y),706)
+#define get_gdat_ullong_pos706(X,Y) get_gdat_ullong((X),(Y),706)
+#define get_gdat_ip_pos706(X,Y) get_gdat_ip((X),(Y),706)
+#define get_gdat_ipv6_pos706(X,Y) get_gdat_ipv6((X),(Y),706)
+#define get_gdat_string_pos706(X,Y) get_gdat_string((X),(Y),706)
+#define get_gdat_v_str_pos706(X,Y) get_gdat_string((X),(Y),706)
+#define get_gdat_bool_pos706(X,Y) get_gdat_bool((X),(Y),706)
+#define get_gdat_int_pos706(X,Y) get_gdat_int((X),(Y),706)
+#define get_gdat_llong_pos706(X,Y) get_gdat_llong((X),(Y),706)
+#define get_gdat_float_pos706(X,Y) get_gdat_float((X),(Y),706)
+#define get_gdat_uint_pos707(X,Y) get_gdat_uint((X),(Y),707)
+#define get_gdat_ullong_pos707(X,Y) get_gdat_ullong((X),(Y),707)
+#define get_gdat_ip_pos707(X,Y) get_gdat_ip((X),(Y),707)
+#define get_gdat_ipv6_pos707(X,Y) get_gdat_ipv6((X),(Y),707)
+#define get_gdat_string_pos707(X,Y) get_gdat_string((X),(Y),707)
+#define get_gdat_v_str_pos707(X,Y) get_gdat_string((X),(Y),707)
+#define get_gdat_bool_pos707(X,Y) get_gdat_bool((X),(Y),707)
+#define get_gdat_int_pos707(X,Y) get_gdat_int((X),(Y),707)
+#define get_gdat_llong_pos707(X,Y) get_gdat_llong((X),(Y),707)
+#define get_gdat_float_pos707(X,Y) get_gdat_float((X),(Y),707)
+#define get_gdat_uint_pos708(X,Y) get_gdat_uint((X),(Y),708)
+#define get_gdat_ullong_pos708(X,Y) get_gdat_ullong((X),(Y),708)
+#define get_gdat_ip_pos708(X,Y) get_gdat_ip((X),(Y),708)
+#define get_gdat_ipv6_pos708(X,Y) get_gdat_ipv6((X),(Y),708)
+#define get_gdat_string_pos708(X,Y) get_gdat_string((X),(Y),708)
+#define get_gdat_v_str_pos708(X,Y) get_gdat_string((X),(Y),708)
+#define get_gdat_bool_pos708(X,Y) get_gdat_bool((X),(Y),708)
+#define get_gdat_int_pos708(X,Y) get_gdat_int((X),(Y),708)
+#define get_gdat_llong_pos708(X,Y) get_gdat_llong((X),(Y),708)
+#define get_gdat_float_pos708(X,Y) get_gdat_float((X),(Y),708)
+#define get_gdat_uint_pos709(X,Y) get_gdat_uint((X),(Y),709)
+#define get_gdat_ullong_pos709(X,Y) get_gdat_ullong((X),(Y),709)
+#define get_gdat_ip_pos709(X,Y) get_gdat_ip((X),(Y),709)
+#define get_gdat_ipv6_pos709(X,Y) get_gdat_ipv6((X),(Y),709)
+#define get_gdat_string_pos709(X,Y) get_gdat_string((X),(Y),709)
+#define get_gdat_v_str_pos709(X,Y) get_gdat_string((X),(Y),709)
+#define get_gdat_bool_pos709(X,Y) get_gdat_bool((X),(Y),709)
+#define get_gdat_int_pos709(X,Y) get_gdat_int((X),(Y),709)
+#define get_gdat_llong_pos709(X,Y) get_gdat_llong((X),(Y),709)
+#define get_gdat_float_pos709(X,Y) get_gdat_float((X),(Y),709)
+#define get_gdat_uint_pos710(X,Y) get_gdat_uint((X),(Y),710)
+#define get_gdat_ullong_pos710(X,Y) get_gdat_ullong((X),(Y),710)
+#define get_gdat_ip_pos710(X,Y) get_gdat_ip((X),(Y),710)
+#define get_gdat_ipv6_pos710(X,Y) get_gdat_ipv6((X),(Y),710)
+#define get_gdat_string_pos710(X,Y) get_gdat_string((X),(Y),710)
+#define get_gdat_v_str_pos710(X,Y) get_gdat_string((X),(Y),710)
+#define get_gdat_bool_pos710(X,Y) get_gdat_bool((X),(Y),710)
+#define get_gdat_int_pos710(X,Y) get_gdat_int((X),(Y),710)
+#define get_gdat_llong_pos710(X,Y) get_gdat_llong((X),(Y),710)
+#define get_gdat_float_pos710(X,Y) get_gdat_float((X),(Y),710)
+#define get_gdat_uint_pos711(X,Y) get_gdat_uint((X),(Y),711)
+#define get_gdat_ullong_pos711(X,Y) get_gdat_ullong((X),(Y),711)
+#define get_gdat_ip_pos711(X,Y) get_gdat_ip((X),(Y),711)
+#define get_gdat_ipv6_pos711(X,Y) get_gdat_ipv6((X),(Y),711)
+#define get_gdat_string_pos711(X,Y) get_gdat_string((X),(Y),711)
+#define get_gdat_v_str_pos711(X,Y) get_gdat_string((X),(Y),711)
+#define get_gdat_bool_pos711(X,Y) get_gdat_bool((X),(Y),711)
+#define get_gdat_int_pos711(X,Y) get_gdat_int((X),(Y),711)
+#define get_gdat_llong_pos711(X,Y) get_gdat_llong((X),(Y),711)
+#define get_gdat_float_pos711(X,Y) get_gdat_float((X),(Y),711)
+#define get_gdat_uint_pos712(X,Y) get_gdat_uint((X),(Y),712)
+#define get_gdat_ullong_pos712(X,Y) get_gdat_ullong((X),(Y),712)
+#define get_gdat_ip_pos712(X,Y) get_gdat_ip((X),(Y),712)
+#define get_gdat_ipv6_pos712(X,Y) get_gdat_ipv6((X),(Y),712)
+#define get_gdat_string_pos712(X,Y) get_gdat_string((X),(Y),712)
+#define get_gdat_v_str_pos712(X,Y) get_gdat_string((X),(Y),712)
+#define get_gdat_bool_pos712(X,Y) get_gdat_bool((X),(Y),712)
+#define get_gdat_int_pos712(X,Y) get_gdat_int((X),(Y),712)
+#define get_gdat_llong_pos712(X,Y) get_gdat_llong((X),(Y),712)
+#define get_gdat_float_pos712(X,Y) get_gdat_float((X),(Y),712)
+#define get_gdat_uint_pos713(X,Y) get_gdat_uint((X),(Y),713)
+#define get_gdat_ullong_pos713(X,Y) get_gdat_ullong((X),(Y),713)
+#define get_gdat_ip_pos713(X,Y) get_gdat_ip((X),(Y),713)
+#define get_gdat_ipv6_pos713(X,Y) get_gdat_ipv6((X),(Y),713)
+#define get_gdat_string_pos713(X,Y) get_gdat_string((X),(Y),713)
+#define get_gdat_v_str_pos713(X,Y) get_gdat_string((X),(Y),713)
+#define get_gdat_bool_pos713(X,Y) get_gdat_bool((X),(Y),713)
+#define get_gdat_int_pos713(X,Y) get_gdat_int((X),(Y),713)
+#define get_gdat_llong_pos713(X,Y) get_gdat_llong((X),(Y),713)
+#define get_gdat_float_pos713(X,Y) get_gdat_float((X),(Y),713)
+#define get_gdat_uint_pos714(X,Y) get_gdat_uint((X),(Y),714)
+#define get_gdat_ullong_pos714(X,Y) get_gdat_ullong((X),(Y),714)
+#define get_gdat_ip_pos714(X,Y) get_gdat_ip((X),(Y),714)
+#define get_gdat_ipv6_pos714(X,Y) get_gdat_ipv6((X),(Y),714)
+#define get_gdat_string_pos714(X,Y) get_gdat_string((X),(Y),714)
+#define get_gdat_v_str_pos714(X,Y) get_gdat_string((X),(Y),714)
+#define get_gdat_bool_pos714(X,Y) get_gdat_bool((X),(Y),714)
+#define get_gdat_int_pos714(X,Y) get_gdat_int((X),(Y),714)
+#define get_gdat_llong_pos714(X,Y) get_gdat_llong((X),(Y),714)
+#define get_gdat_float_pos714(X,Y) get_gdat_float((X),(Y),714)
+#define get_gdat_uint_pos715(X,Y) get_gdat_uint((X),(Y),715)
+#define get_gdat_ullong_pos715(X,Y) get_gdat_ullong((X),(Y),715)
+#define get_gdat_ip_pos715(X,Y) get_gdat_ip((X),(Y),715)
+#define get_gdat_ipv6_pos715(X,Y) get_gdat_ipv6((X),(Y),715)
+#define get_gdat_string_pos715(X,Y) get_gdat_string((X),(Y),715)
+#define get_gdat_v_str_pos715(X,Y) get_gdat_string((X),(Y),715)
+#define get_gdat_bool_pos715(X,Y) get_gdat_bool((X),(Y),715)
+#define get_gdat_int_pos715(X,Y) get_gdat_int((X),(Y),715)
+#define get_gdat_llong_pos715(X,Y) get_gdat_llong((X),(Y),715)
+#define get_gdat_float_pos715(X,Y) get_gdat_float((X),(Y),715)
+#define get_gdat_uint_pos716(X,Y) get_gdat_uint((X),(Y),716)
+#define get_gdat_ullong_pos716(X,Y) get_gdat_ullong((X),(Y),716)
+#define get_gdat_ip_pos716(X,Y) get_gdat_ip((X),(Y),716)
+#define get_gdat_ipv6_pos716(X,Y) get_gdat_ipv6((X),(Y),716)
+#define get_gdat_string_pos716(X,Y) get_gdat_string((X),(Y),716)
+#define get_gdat_v_str_pos716(X,Y) get_gdat_string((X),(Y),716)
+#define get_gdat_bool_pos716(X,Y) get_gdat_bool((X),(Y),716)
+#define get_gdat_int_pos716(X,Y) get_gdat_int((X),(Y),716)
+#define get_gdat_llong_pos716(X,Y) get_gdat_llong((X),(Y),716)
+#define get_gdat_float_pos716(X,Y) get_gdat_float((X),(Y),716)
+#define get_gdat_uint_pos717(X,Y) get_gdat_uint((X),(Y),717)
+#define get_gdat_ullong_pos717(X,Y) get_gdat_ullong((X),(Y),717)
+#define get_gdat_ip_pos717(X,Y) get_gdat_ip((X),(Y),717)
+#define get_gdat_ipv6_pos717(X,Y) get_gdat_ipv6((X),(Y),717)
+#define get_gdat_string_pos717(X,Y) get_gdat_string((X),(Y),717)
+#define get_gdat_v_str_pos717(X,Y) get_gdat_string((X),(Y),717)
+#define get_gdat_bool_pos717(X,Y) get_gdat_bool((X),(Y),717)
+#define get_gdat_int_pos717(X,Y) get_gdat_int((X),(Y),717)
+#define get_gdat_llong_pos717(X,Y) get_gdat_llong((X),(Y),717)
+#define get_gdat_float_pos717(X,Y) get_gdat_float((X),(Y),717)
+#define get_gdat_uint_pos718(X,Y) get_gdat_uint((X),(Y),718)
+#define get_gdat_ullong_pos718(X,Y) get_gdat_ullong((X),(Y),718)
+#define get_gdat_ip_pos718(X,Y) get_gdat_ip((X),(Y),718)
+#define get_gdat_ipv6_pos718(X,Y) get_gdat_ipv6((X),(Y),718)
+#define get_gdat_string_pos718(X,Y) get_gdat_string((X),(Y),718)
+#define get_gdat_v_str_pos718(X,Y) get_gdat_string((X),(Y),718)
+#define get_gdat_bool_pos718(X,Y) get_gdat_bool((X),(Y),718)
+#define get_gdat_int_pos718(X,Y) get_gdat_int((X),(Y),718)
+#define get_gdat_llong_pos718(X,Y) get_gdat_llong((X),(Y),718)
+#define get_gdat_float_pos718(X,Y) get_gdat_float((X),(Y),718)
+#define get_gdat_uint_pos719(X,Y) get_gdat_uint((X),(Y),719)
+#define get_gdat_ullong_pos719(X,Y) get_gdat_ullong((X),(Y),719)
+#define get_gdat_ip_pos719(X,Y) get_gdat_ip((X),(Y),719)
+#define get_gdat_ipv6_pos719(X,Y) get_gdat_ipv6((X),(Y),719)
+#define get_gdat_string_pos719(X,Y) get_gdat_string((X),(Y),719)
+#define get_gdat_v_str_pos719(X,Y) get_gdat_string((X),(Y),719)
+#define get_gdat_bool_pos719(X,Y) get_gdat_bool((X),(Y),719)
+#define get_gdat_int_pos719(X,Y) get_gdat_int((X),(Y),719)
+#define get_gdat_llong_pos719(X,Y) get_gdat_llong((X),(Y),719)
+#define get_gdat_float_pos719(X,Y) get_gdat_float((X),(Y),719)
+#define get_gdat_uint_pos720(X,Y) get_gdat_uint((X),(Y),720)
+#define get_gdat_ullong_pos720(X,Y) get_gdat_ullong((X),(Y),720)
+#define get_gdat_ip_pos720(X,Y) get_gdat_ip((X),(Y),720)
+#define get_gdat_ipv6_pos720(X,Y) get_gdat_ipv6((X),(Y),720)
+#define get_gdat_string_pos720(X,Y) get_gdat_string((X),(Y),720)
+#define get_gdat_v_str_pos720(X,Y) get_gdat_string((X),(Y),720)
+#define get_gdat_bool_pos720(X,Y) get_gdat_bool((X),(Y),720)
+#define get_gdat_int_pos720(X,Y) get_gdat_int((X),(Y),720)
+#define get_gdat_llong_pos720(X,Y) get_gdat_llong((X),(Y),720)
+#define get_gdat_float_pos720(X,Y) get_gdat_float((X),(Y),720)
+#define get_gdat_uint_pos721(X,Y) get_gdat_uint((X),(Y),721)
+#define get_gdat_ullong_pos721(X,Y) get_gdat_ullong((X),(Y),721)
+#define get_gdat_ip_pos721(X,Y) get_gdat_ip((X),(Y),721)
+#define get_gdat_ipv6_pos721(X,Y) get_gdat_ipv6((X),(Y),721)
+#define get_gdat_string_pos721(X,Y) get_gdat_string((X),(Y),721)
+#define get_gdat_v_str_pos721(X,Y) get_gdat_string((X),(Y),721)
+#define get_gdat_bool_pos721(X,Y) get_gdat_bool((X),(Y),721)
+#define get_gdat_int_pos721(X,Y) get_gdat_int((X),(Y),721)
+#define get_gdat_llong_pos721(X,Y) get_gdat_llong((X),(Y),721)
+#define get_gdat_float_pos721(X,Y) get_gdat_float((X),(Y),721)
+#define get_gdat_uint_pos722(X,Y) get_gdat_uint((X),(Y),722)
+#define get_gdat_ullong_pos722(X,Y) get_gdat_ullong((X),(Y),722)
+#define get_gdat_ip_pos722(X,Y) get_gdat_ip((X),(Y),722)
+#define get_gdat_ipv6_pos722(X,Y) get_gdat_ipv6((X),(Y),722)
+#define get_gdat_string_pos722(X,Y) get_gdat_string((X),(Y),722)
+#define get_gdat_v_str_pos722(X,Y) get_gdat_string((X),(Y),722)
+#define get_gdat_bool_pos722(X,Y) get_gdat_bool((X),(Y),722)
+#define get_gdat_int_pos722(X,Y) get_gdat_int((X),(Y),722)
+#define get_gdat_llong_pos722(X,Y) get_gdat_llong((X),(Y),722)
+#define get_gdat_float_pos722(X,Y) get_gdat_float((X),(Y),722)
+#define get_gdat_uint_pos723(X,Y) get_gdat_uint((X),(Y),723)
+#define get_gdat_ullong_pos723(X,Y) get_gdat_ullong((X),(Y),723)
+#define get_gdat_ip_pos723(X,Y) get_gdat_ip((X),(Y),723)
+#define get_gdat_ipv6_pos723(X,Y) get_gdat_ipv6((X),(Y),723)
+#define get_gdat_string_pos723(X,Y) get_gdat_string((X),(Y),723)
+#define get_gdat_v_str_pos723(X,Y) get_gdat_string((X),(Y),723)
+#define get_gdat_bool_pos723(X,Y) get_gdat_bool((X),(Y),723)
+#define get_gdat_int_pos723(X,Y) get_gdat_int((X),(Y),723)
+#define get_gdat_llong_pos723(X,Y) get_gdat_llong((X),(Y),723)
+#define get_gdat_float_pos723(X,Y) get_gdat_float((X),(Y),723)
+#define get_gdat_uint_pos724(X,Y) get_gdat_uint((X),(Y),724)
+#define get_gdat_ullong_pos724(X,Y) get_gdat_ullong((X),(Y),724)
+#define get_gdat_ip_pos724(X,Y) get_gdat_ip((X),(Y),724)
+#define get_gdat_ipv6_pos724(X,Y) get_gdat_ipv6((X),(Y),724)
+#define get_gdat_string_pos724(X,Y) get_gdat_string((X),(Y),724)
+#define get_gdat_v_str_pos724(X,Y) get_gdat_string((X),(Y),724)
+#define get_gdat_bool_pos724(X,Y) get_gdat_bool((X),(Y),724)
+#define get_gdat_int_pos724(X,Y) get_gdat_int((X),(Y),724)
+#define get_gdat_llong_pos724(X,Y) get_gdat_llong((X),(Y),724)
+#define get_gdat_float_pos724(X,Y) get_gdat_float((X),(Y),724)
+#define get_gdat_uint_pos725(X,Y) get_gdat_uint((X),(Y),725)
+#define get_gdat_ullong_pos725(X,Y) get_gdat_ullong((X),(Y),725)
+#define get_gdat_ip_pos725(X,Y) get_gdat_ip((X),(Y),725)
+#define get_gdat_ipv6_pos725(X,Y) get_gdat_ipv6((X),(Y),725)
+#define get_gdat_string_pos725(X,Y) get_gdat_string((X),(Y),725)
+#define get_gdat_v_str_pos725(X,Y) get_gdat_string((X),(Y),725)
+#define get_gdat_bool_pos725(X,Y) get_gdat_bool((X),(Y),725)
+#define get_gdat_int_pos725(X,Y) get_gdat_int((X),(Y),725)
+#define get_gdat_llong_pos725(X,Y) get_gdat_llong((X),(Y),725)
+#define get_gdat_float_pos725(X,Y) get_gdat_float((X),(Y),725)
+#define get_gdat_uint_pos726(X,Y) get_gdat_uint((X),(Y),726)
+#define get_gdat_ullong_pos726(X,Y) get_gdat_ullong((X),(Y),726)
+#define get_gdat_ip_pos726(X,Y) get_gdat_ip((X),(Y),726)
+#define get_gdat_ipv6_pos726(X,Y) get_gdat_ipv6((X),(Y),726)
+#define get_gdat_string_pos726(X,Y) get_gdat_string((X),(Y),726)
+#define get_gdat_v_str_pos726(X,Y) get_gdat_string((X),(Y),726)
+#define get_gdat_bool_pos726(X,Y) get_gdat_bool((X),(Y),726)
+#define get_gdat_int_pos726(X,Y) get_gdat_int((X),(Y),726)
+#define get_gdat_llong_pos726(X,Y) get_gdat_llong((X),(Y),726)
+#define get_gdat_float_pos726(X,Y) get_gdat_float((X),(Y),726)
+#define get_gdat_uint_pos727(X,Y) get_gdat_uint((X),(Y),727)
+#define get_gdat_ullong_pos727(X,Y) get_gdat_ullong((X),(Y),727)
+#define get_gdat_ip_pos727(X,Y) get_gdat_ip((X),(Y),727)
+#define get_gdat_ipv6_pos727(X,Y) get_gdat_ipv6((X),(Y),727)
+#define get_gdat_string_pos727(X,Y) get_gdat_string((X),(Y),727)
+#define get_gdat_v_str_pos727(X,Y) get_gdat_string((X),(Y),727)
+#define get_gdat_bool_pos727(X,Y) get_gdat_bool((X),(Y),727)
+#define get_gdat_int_pos727(X,Y) get_gdat_int((X),(Y),727)
+#define get_gdat_llong_pos727(X,Y) get_gdat_llong((X),(Y),727)
+#define get_gdat_float_pos727(X,Y) get_gdat_float((X),(Y),727)
+#define get_gdat_uint_pos728(X,Y) get_gdat_uint((X),(Y),728)
+#define get_gdat_ullong_pos728(X,Y) get_gdat_ullong((X),(Y),728)
+#define get_gdat_ip_pos728(X,Y) get_gdat_ip((X),(Y),728)
+#define get_gdat_ipv6_pos728(X,Y) get_gdat_ipv6((X),(Y),728)
+#define get_gdat_string_pos728(X,Y) get_gdat_string((X),(Y),728)
+#define get_gdat_v_str_pos728(X,Y) get_gdat_string((X),(Y),728)
+#define get_gdat_bool_pos728(X,Y) get_gdat_bool((X),(Y),728)
+#define get_gdat_int_pos728(X,Y) get_gdat_int((X),(Y),728)
+#define get_gdat_llong_pos728(X,Y) get_gdat_llong((X),(Y),728)
+#define get_gdat_float_pos728(X,Y) get_gdat_float((X),(Y),728)
+#define get_gdat_uint_pos729(X,Y) get_gdat_uint((X),(Y),729)
+#define get_gdat_ullong_pos729(X,Y) get_gdat_ullong((X),(Y),729)
+#define get_gdat_ip_pos729(X,Y) get_gdat_ip((X),(Y),729)
+#define get_gdat_ipv6_pos729(X,Y) get_gdat_ipv6((X),(Y),729)
+#define get_gdat_string_pos729(X,Y) get_gdat_string((X),(Y),729)
+#define get_gdat_v_str_pos729(X,Y) get_gdat_string((X),(Y),729)
+#define get_gdat_bool_pos729(X,Y) get_gdat_bool((X),(Y),729)
+#define get_gdat_int_pos729(X,Y) get_gdat_int((X),(Y),729)
+#define get_gdat_llong_pos729(X,Y) get_gdat_llong((X),(Y),729)
+#define get_gdat_float_pos729(X,Y) get_gdat_float((X),(Y),729)
+#define get_gdat_uint_pos730(X,Y) get_gdat_uint((X),(Y),730)
+#define get_gdat_ullong_pos730(X,Y) get_gdat_ullong((X),(Y),730)
+#define get_gdat_ip_pos730(X,Y) get_gdat_ip((X),(Y),730)
+#define get_gdat_ipv6_pos730(X,Y) get_gdat_ipv6((X),(Y),730)
+#define get_gdat_string_pos730(X,Y) get_gdat_string((X),(Y),730)
+#define get_gdat_v_str_pos730(X,Y) get_gdat_string((X),(Y),730)
+#define get_gdat_bool_pos730(X,Y) get_gdat_bool((X),(Y),730)
+#define get_gdat_int_pos730(X,Y) get_gdat_int((X),(Y),730)
+#define get_gdat_llong_pos730(X,Y) get_gdat_llong((X),(Y),730)
+#define get_gdat_float_pos730(X,Y) get_gdat_float((X),(Y),730)
+#define get_gdat_uint_pos731(X,Y) get_gdat_uint((X),(Y),731)
+#define get_gdat_ullong_pos731(X,Y) get_gdat_ullong((X),(Y),731)
+#define get_gdat_ip_pos731(X,Y) get_gdat_ip((X),(Y),731)
+#define get_gdat_ipv6_pos731(X,Y) get_gdat_ipv6((X),(Y),731)
+#define get_gdat_string_pos731(X,Y) get_gdat_string((X),(Y),731)
+#define get_gdat_v_str_pos731(X,Y) get_gdat_string((X),(Y),731)
+#define get_gdat_bool_pos731(X,Y) get_gdat_bool((X),(Y),731)
+#define get_gdat_int_pos731(X,Y) get_gdat_int((X),(Y),731)
+#define get_gdat_llong_pos731(X,Y) get_gdat_llong((X),(Y),731)
+#define get_gdat_float_pos731(X,Y) get_gdat_float((X),(Y),731)
+#define get_gdat_uint_pos732(X,Y) get_gdat_uint((X),(Y),732)
+#define get_gdat_ullong_pos732(X,Y) get_gdat_ullong((X),(Y),732)
+#define get_gdat_ip_pos732(X,Y) get_gdat_ip((X),(Y),732)
+#define get_gdat_ipv6_pos732(X,Y) get_gdat_ipv6((X),(Y),732)
+#define get_gdat_string_pos732(X,Y) get_gdat_string((X),(Y),732)
+#define get_gdat_v_str_pos732(X,Y) get_gdat_string((X),(Y),732)
+#define get_gdat_bool_pos732(X,Y) get_gdat_bool((X),(Y),732)
+#define get_gdat_int_pos732(X,Y) get_gdat_int((X),(Y),732)
+#define get_gdat_llong_pos732(X,Y) get_gdat_llong((X),(Y),732)
+#define get_gdat_float_pos732(X,Y) get_gdat_float((X),(Y),732)
+#define get_gdat_uint_pos733(X,Y) get_gdat_uint((X),(Y),733)
+#define get_gdat_ullong_pos733(X,Y) get_gdat_ullong((X),(Y),733)
+#define get_gdat_ip_pos733(X,Y) get_gdat_ip((X),(Y),733)
+#define get_gdat_ipv6_pos733(X,Y) get_gdat_ipv6((X),(Y),733)
+#define get_gdat_string_pos733(X,Y) get_gdat_string((X),(Y),733)
+#define get_gdat_v_str_pos733(X,Y) get_gdat_string((X),(Y),733)
+#define get_gdat_bool_pos733(X,Y) get_gdat_bool((X),(Y),733)
+#define get_gdat_int_pos733(X,Y) get_gdat_int((X),(Y),733)
+#define get_gdat_llong_pos733(X,Y) get_gdat_llong((X),(Y),733)
+#define get_gdat_float_pos733(X,Y) get_gdat_float((X),(Y),733)
+#define get_gdat_uint_pos734(X,Y) get_gdat_uint((X),(Y),734)
+#define get_gdat_ullong_pos734(X,Y) get_gdat_ullong((X),(Y),734)
+#define get_gdat_ip_pos734(X,Y) get_gdat_ip((X),(Y),734)
+#define get_gdat_ipv6_pos734(X,Y) get_gdat_ipv6((X),(Y),734)
+#define get_gdat_string_pos734(X,Y) get_gdat_string((X),(Y),734)
+#define get_gdat_v_str_pos734(X,Y) get_gdat_string((X),(Y),734)
+#define get_gdat_bool_pos734(X,Y) get_gdat_bool((X),(Y),734)
+#define get_gdat_int_pos734(X,Y) get_gdat_int((X),(Y),734)
+#define get_gdat_llong_pos734(X,Y) get_gdat_llong((X),(Y),734)
+#define get_gdat_float_pos734(X,Y) get_gdat_float((X),(Y),734)
+#define get_gdat_uint_pos735(X,Y) get_gdat_uint((X),(Y),735)
+#define get_gdat_ullong_pos735(X,Y) get_gdat_ullong((X),(Y),735)
+#define get_gdat_ip_pos735(X,Y) get_gdat_ip((X),(Y),735)
+#define get_gdat_ipv6_pos735(X,Y) get_gdat_ipv6((X),(Y),735)
+#define get_gdat_string_pos735(X,Y) get_gdat_string((X),(Y),735)
+#define get_gdat_v_str_pos735(X,Y) get_gdat_string((X),(Y),735)
+#define get_gdat_bool_pos735(X,Y) get_gdat_bool((X),(Y),735)
+#define get_gdat_int_pos735(X,Y) get_gdat_int((X),(Y),735)
+#define get_gdat_llong_pos735(X,Y) get_gdat_llong((X),(Y),735)
+#define get_gdat_float_pos735(X,Y) get_gdat_float((X),(Y),735)
+#define get_gdat_uint_pos736(X,Y) get_gdat_uint((X),(Y),736)
+#define get_gdat_ullong_pos736(X,Y) get_gdat_ullong((X),(Y),736)
+#define get_gdat_ip_pos736(X,Y) get_gdat_ip((X),(Y),736)
+#define get_gdat_ipv6_pos736(X,Y) get_gdat_ipv6((X),(Y),736)
+#define get_gdat_string_pos736(X,Y) get_gdat_string((X),(Y),736)
+#define get_gdat_v_str_pos736(X,Y) get_gdat_string((X),(Y),736)
+#define get_gdat_bool_pos736(X,Y) get_gdat_bool((X),(Y),736)
+#define get_gdat_int_pos736(X,Y) get_gdat_int((X),(Y),736)
+#define get_gdat_llong_pos736(X,Y) get_gdat_llong((X),(Y),736)
+#define get_gdat_float_pos736(X,Y) get_gdat_float((X),(Y),736)
+#define get_gdat_uint_pos737(X,Y) get_gdat_uint((X),(Y),737)
+#define get_gdat_ullong_pos737(X,Y) get_gdat_ullong((X),(Y),737)
+#define get_gdat_ip_pos737(X,Y) get_gdat_ip((X),(Y),737)
+#define get_gdat_ipv6_pos737(X,Y) get_gdat_ipv6((X),(Y),737)
+#define get_gdat_string_pos737(X,Y) get_gdat_string((X),(Y),737)
+#define get_gdat_v_str_pos737(X,Y) get_gdat_string((X),(Y),737)
+#define get_gdat_bool_pos737(X,Y) get_gdat_bool((X),(Y),737)
+#define get_gdat_int_pos737(X,Y) get_gdat_int((X),(Y),737)
+#define get_gdat_llong_pos737(X,Y) get_gdat_llong((X),(Y),737)
+#define get_gdat_float_pos737(X,Y) get_gdat_float((X),(Y),737)
+#define get_gdat_uint_pos738(X,Y) get_gdat_uint((X),(Y),738)
+#define get_gdat_ullong_pos738(X,Y) get_gdat_ullong((X),(Y),738)
+#define get_gdat_ip_pos738(X,Y) get_gdat_ip((X),(Y),738)
+#define get_gdat_ipv6_pos738(X,Y) get_gdat_ipv6((X),(Y),738)
+#define get_gdat_string_pos738(X,Y) get_gdat_string((X),(Y),738)
+#define get_gdat_v_str_pos738(X,Y) get_gdat_string((X),(Y),738)
+#define get_gdat_bool_pos738(X,Y) get_gdat_bool((X),(Y),738)
+#define get_gdat_int_pos738(X,Y) get_gdat_int((X),(Y),738)
+#define get_gdat_llong_pos738(X,Y) get_gdat_llong((X),(Y),738)
+#define get_gdat_float_pos738(X,Y) get_gdat_float((X),(Y),738)
+#define get_gdat_uint_pos739(X,Y) get_gdat_uint((X),(Y),739)
+#define get_gdat_ullong_pos739(X,Y) get_gdat_ullong((X),(Y),739)
+#define get_gdat_ip_pos739(X,Y) get_gdat_ip((X),(Y),739)
+#define get_gdat_ipv6_pos739(X,Y) get_gdat_ipv6((X),(Y),739)
+#define get_gdat_string_pos739(X,Y) get_gdat_string((X),(Y),739)
+#define get_gdat_v_str_pos739(X,Y) get_gdat_string((X),(Y),739)
+#define get_gdat_bool_pos739(X,Y) get_gdat_bool((X),(Y),739)
+#define get_gdat_int_pos739(X,Y) get_gdat_int((X),(Y),739)
+#define get_gdat_llong_pos739(X,Y) get_gdat_llong((X),(Y),739)
+#define get_gdat_float_pos739(X,Y) get_gdat_float((X),(Y),739)
+#define get_gdat_uint_pos740(X,Y) get_gdat_uint((X),(Y),740)
+#define get_gdat_ullong_pos740(X,Y) get_gdat_ullong((X),(Y),740)
+#define get_gdat_ip_pos740(X,Y) get_gdat_ip((X),(Y),740)
+#define get_gdat_ipv6_pos740(X,Y) get_gdat_ipv6((X),(Y),740)
+#define get_gdat_string_pos740(X,Y) get_gdat_string((X),(Y),740)
+#define get_gdat_v_str_pos740(X,Y) get_gdat_string((X),(Y),740)
+#define get_gdat_bool_pos740(X,Y) get_gdat_bool((X),(Y),740)
+#define get_gdat_int_pos740(X,Y) get_gdat_int((X),(Y),740)
+#define get_gdat_llong_pos740(X,Y) get_gdat_llong((X),(Y),740)
+#define get_gdat_float_pos740(X,Y) get_gdat_float((X),(Y),740)
+#define get_gdat_uint_pos741(X,Y) get_gdat_uint((X),(Y),741)
+#define get_gdat_ullong_pos741(X,Y) get_gdat_ullong((X),(Y),741)
+#define get_gdat_ip_pos741(X,Y) get_gdat_ip((X),(Y),741)
+#define get_gdat_ipv6_pos741(X,Y) get_gdat_ipv6((X),(Y),741)
+#define get_gdat_string_pos741(X,Y) get_gdat_string((X),(Y),741)
+#define get_gdat_v_str_pos741(X,Y) get_gdat_string((X),(Y),741)
+#define get_gdat_bool_pos741(X,Y) get_gdat_bool((X),(Y),741)
+#define get_gdat_int_pos741(X,Y) get_gdat_int((X),(Y),741)
+#define get_gdat_llong_pos741(X,Y) get_gdat_llong((X),(Y),741)
+#define get_gdat_float_pos741(X,Y) get_gdat_float((X),(Y),741)
+#define get_gdat_uint_pos742(X,Y) get_gdat_uint((X),(Y),742)
+#define get_gdat_ullong_pos742(X,Y) get_gdat_ullong((X),(Y),742)
+#define get_gdat_ip_pos742(X,Y) get_gdat_ip((X),(Y),742)
+#define get_gdat_ipv6_pos742(X,Y) get_gdat_ipv6((X),(Y),742)
+#define get_gdat_string_pos742(X,Y) get_gdat_string((X),(Y),742)
+#define get_gdat_v_str_pos742(X,Y) get_gdat_string((X),(Y),742)
+#define get_gdat_bool_pos742(X,Y) get_gdat_bool((X),(Y),742)
+#define get_gdat_int_pos742(X,Y) get_gdat_int((X),(Y),742)
+#define get_gdat_llong_pos742(X,Y) get_gdat_llong((X),(Y),742)
+#define get_gdat_float_pos742(X,Y) get_gdat_float((X),(Y),742)
+#define get_gdat_uint_pos743(X,Y) get_gdat_uint((X),(Y),743)
+#define get_gdat_ullong_pos743(X,Y) get_gdat_ullong((X),(Y),743)
+#define get_gdat_ip_pos743(X,Y) get_gdat_ip((X),(Y),743)
+#define get_gdat_ipv6_pos743(X,Y) get_gdat_ipv6((X),(Y),743)
+#define get_gdat_string_pos743(X,Y) get_gdat_string((X),(Y),743)
+#define get_gdat_v_str_pos743(X,Y) get_gdat_string((X),(Y),743)
+#define get_gdat_bool_pos743(X,Y) get_gdat_bool((X),(Y),743)
+#define get_gdat_int_pos743(X,Y) get_gdat_int((X),(Y),743)
+#define get_gdat_llong_pos743(X,Y) get_gdat_llong((X),(Y),743)
+#define get_gdat_float_pos743(X,Y) get_gdat_float((X),(Y),743)
+#define get_gdat_uint_pos744(X,Y) get_gdat_uint((X),(Y),744)
+#define get_gdat_ullong_pos744(X,Y) get_gdat_ullong((X),(Y),744)
+#define get_gdat_ip_pos744(X,Y) get_gdat_ip((X),(Y),744)
+#define get_gdat_ipv6_pos744(X,Y) get_gdat_ipv6((X),(Y),744)
+#define get_gdat_string_pos744(X,Y) get_gdat_string((X),(Y),744)
+#define get_gdat_v_str_pos744(X,Y) get_gdat_string((X),(Y),744)
+#define get_gdat_bool_pos744(X,Y) get_gdat_bool((X),(Y),744)
+#define get_gdat_int_pos744(X,Y) get_gdat_int((X),(Y),744)
+#define get_gdat_llong_pos744(X,Y) get_gdat_llong((X),(Y),744)
+#define get_gdat_float_pos744(X,Y) get_gdat_float((X),(Y),744)
+#define get_gdat_uint_pos745(X,Y) get_gdat_uint((X),(Y),745)
+#define get_gdat_ullong_pos745(X,Y) get_gdat_ullong((X),(Y),745)
+#define get_gdat_ip_pos745(X,Y) get_gdat_ip((X),(Y),745)
+#define get_gdat_ipv6_pos745(X,Y) get_gdat_ipv6((X),(Y),745)
+#define get_gdat_string_pos745(X,Y) get_gdat_string((X),(Y),745)
+#define get_gdat_v_str_pos745(X,Y) get_gdat_string((X),(Y),745)
+#define get_gdat_bool_pos745(X,Y) get_gdat_bool((X),(Y),745)
+#define get_gdat_int_pos745(X,Y) get_gdat_int((X),(Y),745)
+#define get_gdat_llong_pos745(X,Y) get_gdat_llong((X),(Y),745)
+#define get_gdat_float_pos745(X,Y) get_gdat_float((X),(Y),745)
+#define get_gdat_uint_pos746(X,Y) get_gdat_uint((X),(Y),746)
+#define get_gdat_ullong_pos746(X,Y) get_gdat_ullong((X),(Y),746)
+#define get_gdat_ip_pos746(X,Y) get_gdat_ip((X),(Y),746)
+#define get_gdat_ipv6_pos746(X,Y) get_gdat_ipv6((X),(Y),746)
+#define get_gdat_string_pos746(X,Y) get_gdat_string((X),(Y),746)
+#define get_gdat_v_str_pos746(X,Y) get_gdat_string((X),(Y),746)
+#define get_gdat_bool_pos746(X,Y) get_gdat_bool((X),(Y),746)
+#define get_gdat_int_pos746(X,Y) get_gdat_int((X),(Y),746)
+#define get_gdat_llong_pos746(X,Y) get_gdat_llong((X),(Y),746)
+#define get_gdat_float_pos746(X,Y) get_gdat_float((X),(Y),746)
+#define get_gdat_uint_pos747(X,Y) get_gdat_uint((X),(Y),747)
+#define get_gdat_ullong_pos747(X,Y) get_gdat_ullong((X),(Y),747)
+#define get_gdat_ip_pos747(X,Y) get_gdat_ip((X),(Y),747)
+#define get_gdat_ipv6_pos747(X,Y) get_gdat_ipv6((X),(Y),747)
+#define get_gdat_string_pos747(X,Y) get_gdat_string((X),(Y),747)
+#define get_gdat_v_str_pos747(X,Y) get_gdat_string((X),(Y),747)
+#define get_gdat_bool_pos747(X,Y) get_gdat_bool((X),(Y),747)
+#define get_gdat_int_pos747(X,Y) get_gdat_int((X),(Y),747)
+#define get_gdat_llong_pos747(X,Y) get_gdat_llong((X),(Y),747)
+#define get_gdat_float_pos747(X,Y) get_gdat_float((X),(Y),747)
+#define get_gdat_uint_pos748(X,Y) get_gdat_uint((X),(Y),748)
+#define get_gdat_ullong_pos748(X,Y) get_gdat_ullong((X),(Y),748)
+#define get_gdat_ip_pos748(X,Y) get_gdat_ip((X),(Y),748)
+#define get_gdat_ipv6_pos748(X,Y) get_gdat_ipv6((X),(Y),748)
+#define get_gdat_string_pos748(X,Y) get_gdat_string((X),(Y),748)
+#define get_gdat_v_str_pos748(X,Y) get_gdat_string((X),(Y),748)
+#define get_gdat_bool_pos748(X,Y) get_gdat_bool((X),(Y),748)
+#define get_gdat_int_pos748(X,Y) get_gdat_int((X),(Y),748)
+#define get_gdat_llong_pos748(X,Y) get_gdat_llong((X),(Y),748)
+#define get_gdat_float_pos748(X,Y) get_gdat_float((X),(Y),748)
+#define get_gdat_uint_pos749(X,Y) get_gdat_uint((X),(Y),749)
+#define get_gdat_ullong_pos749(X,Y) get_gdat_ullong((X),(Y),749)
+#define get_gdat_ip_pos749(X,Y) get_gdat_ip((X),(Y),749)
+#define get_gdat_ipv6_pos749(X,Y) get_gdat_ipv6((X),(Y),749)
+#define get_gdat_string_pos749(X,Y) get_gdat_string((X),(Y),749)
+#define get_gdat_v_str_pos749(X,Y) get_gdat_string((X),(Y),749)
+#define get_gdat_bool_pos749(X,Y) get_gdat_bool((X),(Y),749)
+#define get_gdat_int_pos749(X,Y) get_gdat_int((X),(Y),749)
+#define get_gdat_llong_pos749(X,Y) get_gdat_llong((X),(Y),749)
+#define get_gdat_float_pos749(X,Y) get_gdat_float((X),(Y),749)
+#define get_gdat_uint_pos750(X,Y) get_gdat_uint((X),(Y),750)
+#define get_gdat_ullong_pos750(X,Y) get_gdat_ullong((X),(Y),750)
+#define get_gdat_ip_pos750(X,Y) get_gdat_ip((X),(Y),750)
+#define get_gdat_ipv6_pos750(X,Y) get_gdat_ipv6((X),(Y),750)
+#define get_gdat_string_pos750(X,Y) get_gdat_string((X),(Y),750)
+#define get_gdat_v_str_pos750(X,Y) get_gdat_string((X),(Y),750)
+#define get_gdat_bool_pos750(X,Y) get_gdat_bool((X),(Y),750)
+#define get_gdat_int_pos750(X,Y) get_gdat_int((X),(Y),750)
+#define get_gdat_llong_pos750(X,Y) get_gdat_llong((X),(Y),750)
+#define get_gdat_float_pos750(X,Y) get_gdat_float((X),(Y),750)
+#define get_gdat_uint_pos751(X,Y) get_gdat_uint((X),(Y),751)
+#define get_gdat_ullong_pos751(X,Y) get_gdat_ullong((X),(Y),751)
+#define get_gdat_ip_pos751(X,Y) get_gdat_ip((X),(Y),751)
+#define get_gdat_ipv6_pos751(X,Y) get_gdat_ipv6((X),(Y),751)
+#define get_gdat_string_pos751(X,Y) get_gdat_string((X),(Y),751)
+#define get_gdat_v_str_pos751(X,Y) get_gdat_string((X),(Y),751)
+#define get_gdat_bool_pos751(X,Y) get_gdat_bool((X),(Y),751)
+#define get_gdat_int_pos751(X,Y) get_gdat_int((X),(Y),751)
+#define get_gdat_llong_pos751(X,Y) get_gdat_llong((X),(Y),751)
+#define get_gdat_float_pos751(X,Y) get_gdat_float((X),(Y),751)
+#define get_gdat_uint_pos752(X,Y) get_gdat_uint((X),(Y),752)
+#define get_gdat_ullong_pos752(X,Y) get_gdat_ullong((X),(Y),752)
+#define get_gdat_ip_pos752(X,Y) get_gdat_ip((X),(Y),752)
+#define get_gdat_ipv6_pos752(X,Y) get_gdat_ipv6((X),(Y),752)
+#define get_gdat_string_pos752(X,Y) get_gdat_string((X),(Y),752)
+#define get_gdat_v_str_pos752(X,Y) get_gdat_string((X),(Y),752)
+#define get_gdat_bool_pos752(X,Y) get_gdat_bool((X),(Y),752)
+#define get_gdat_int_pos752(X,Y) get_gdat_int((X),(Y),752)
+#define get_gdat_llong_pos752(X,Y) get_gdat_llong((X),(Y),752)
+#define get_gdat_float_pos752(X,Y) get_gdat_float((X),(Y),752)
+#define get_gdat_uint_pos753(X,Y) get_gdat_uint((X),(Y),753)
+#define get_gdat_ullong_pos753(X,Y) get_gdat_ullong((X),(Y),753)
+#define get_gdat_ip_pos753(X,Y) get_gdat_ip((X),(Y),753)
+#define get_gdat_ipv6_pos753(X,Y) get_gdat_ipv6((X),(Y),753)
+#define get_gdat_string_pos753(X,Y) get_gdat_string((X),(Y),753)
+#define get_gdat_v_str_pos753(X,Y) get_gdat_string((X),(Y),753)
+#define get_gdat_bool_pos753(X,Y) get_gdat_bool((X),(Y),753)
+#define get_gdat_int_pos753(X,Y) get_gdat_int((X),(Y),753)
+#define get_gdat_llong_pos753(X,Y) get_gdat_llong((X),(Y),753)
+#define get_gdat_float_pos753(X,Y) get_gdat_float((X),(Y),753)
+#define get_gdat_uint_pos754(X,Y) get_gdat_uint((X),(Y),754)
+#define get_gdat_ullong_pos754(X,Y) get_gdat_ullong((X),(Y),754)
+#define get_gdat_ip_pos754(X,Y) get_gdat_ip((X),(Y),754)
+#define get_gdat_ipv6_pos754(X,Y) get_gdat_ipv6((X),(Y),754)
+#define get_gdat_string_pos754(X,Y) get_gdat_string((X),(Y),754)
+#define get_gdat_v_str_pos754(X,Y) get_gdat_string((X),(Y),754)
+#define get_gdat_bool_pos754(X,Y) get_gdat_bool((X),(Y),754)
+#define get_gdat_int_pos754(X,Y) get_gdat_int((X),(Y),754)
+#define get_gdat_llong_pos754(X,Y) get_gdat_llong((X),(Y),754)
+#define get_gdat_float_pos754(X,Y) get_gdat_float((X),(Y),754)
+#define get_gdat_uint_pos755(X,Y) get_gdat_uint((X),(Y),755)
+#define get_gdat_ullong_pos755(X,Y) get_gdat_ullong((X),(Y),755)
+#define get_gdat_ip_pos755(X,Y) get_gdat_ip((X),(Y),755)
+#define get_gdat_ipv6_pos755(X,Y) get_gdat_ipv6((X),(Y),755)
+#define get_gdat_string_pos755(X,Y) get_gdat_string((X),(Y),755)
+#define get_gdat_v_str_pos755(X,Y) get_gdat_string((X),(Y),755)
+#define get_gdat_bool_pos755(X,Y) get_gdat_bool((X),(Y),755)
+#define get_gdat_int_pos755(X,Y) get_gdat_int((X),(Y),755)
+#define get_gdat_llong_pos755(X,Y) get_gdat_llong((X),(Y),755)
+#define get_gdat_float_pos755(X,Y) get_gdat_float((X),(Y),755)
+#define get_gdat_uint_pos756(X,Y) get_gdat_uint((X),(Y),756)
+#define get_gdat_ullong_pos756(X,Y) get_gdat_ullong((X),(Y),756)
+#define get_gdat_ip_pos756(X,Y) get_gdat_ip((X),(Y),756)
+#define get_gdat_ipv6_pos756(X,Y) get_gdat_ipv6((X),(Y),756)
+#define get_gdat_string_pos756(X,Y) get_gdat_string((X),(Y),756)
+#define get_gdat_v_str_pos756(X,Y) get_gdat_string((X),(Y),756)
+#define get_gdat_bool_pos756(X,Y) get_gdat_bool((X),(Y),756)
+#define get_gdat_int_pos756(X,Y) get_gdat_int((X),(Y),756)
+#define get_gdat_llong_pos756(X,Y) get_gdat_llong((X),(Y),756)
+#define get_gdat_float_pos756(X,Y) get_gdat_float((X),(Y),756)
+#define get_gdat_uint_pos757(X,Y) get_gdat_uint((X),(Y),757)
+#define get_gdat_ullong_pos757(X,Y) get_gdat_ullong((X),(Y),757)
+#define get_gdat_ip_pos757(X,Y) get_gdat_ip((X),(Y),757)
+#define get_gdat_ipv6_pos757(X,Y) get_gdat_ipv6((X),(Y),757)
+#define get_gdat_string_pos757(X,Y) get_gdat_string((X),(Y),757)
+#define get_gdat_v_str_pos757(X,Y) get_gdat_string((X),(Y),757)
+#define get_gdat_bool_pos757(X,Y) get_gdat_bool((X),(Y),757)
+#define get_gdat_int_pos757(X,Y) get_gdat_int((X),(Y),757)
+#define get_gdat_llong_pos757(X,Y) get_gdat_llong((X),(Y),757)
+#define get_gdat_float_pos757(X,Y) get_gdat_float((X),(Y),757)
+#define get_gdat_uint_pos758(X,Y) get_gdat_uint((X),(Y),758)
+#define get_gdat_ullong_pos758(X,Y) get_gdat_ullong((X),(Y),758)
+#define get_gdat_ip_pos758(X,Y) get_gdat_ip((X),(Y),758)
+#define get_gdat_ipv6_pos758(X,Y) get_gdat_ipv6((X),(Y),758)
+#define get_gdat_string_pos758(X,Y) get_gdat_string((X),(Y),758)
+#define get_gdat_v_str_pos758(X,Y) get_gdat_string((X),(Y),758)
+#define get_gdat_bool_pos758(X,Y) get_gdat_bool((X),(Y),758)
+#define get_gdat_int_pos758(X,Y) get_gdat_int((X),(Y),758)
+#define get_gdat_llong_pos758(X,Y) get_gdat_llong((X),(Y),758)
+#define get_gdat_float_pos758(X,Y) get_gdat_float((X),(Y),758)
+#define get_gdat_uint_pos759(X,Y) get_gdat_uint((X),(Y),759)
+#define get_gdat_ullong_pos759(X,Y) get_gdat_ullong((X),(Y),759)
+#define get_gdat_ip_pos759(X,Y) get_gdat_ip((X),(Y),759)
+#define get_gdat_ipv6_pos759(X,Y) get_gdat_ipv6((X),(Y),759)
+#define get_gdat_string_pos759(X,Y) get_gdat_string((X),(Y),759)
+#define get_gdat_v_str_pos759(X,Y) get_gdat_string((X),(Y),759)
+#define get_gdat_bool_pos759(X,Y) get_gdat_bool((X),(Y),759)
+#define get_gdat_int_pos759(X,Y) get_gdat_int((X),(Y),759)
+#define get_gdat_llong_pos759(X,Y) get_gdat_llong((X),(Y),759)
+#define get_gdat_float_pos759(X,Y) get_gdat_float((X),(Y),759)
+#define get_gdat_uint_pos760(X,Y) get_gdat_uint((X),(Y),760)
+#define get_gdat_ullong_pos760(X,Y) get_gdat_ullong((X),(Y),760)
+#define get_gdat_ip_pos760(X,Y) get_gdat_ip((X),(Y),760)
+#define get_gdat_ipv6_pos760(X,Y) get_gdat_ipv6((X),(Y),760)
+#define get_gdat_string_pos760(X,Y) get_gdat_string((X),(Y),760)
+#define get_gdat_v_str_pos760(X,Y) get_gdat_string((X),(Y),760)
+#define get_gdat_bool_pos760(X,Y) get_gdat_bool((X),(Y),760)
+#define get_gdat_int_pos760(X,Y) get_gdat_int((X),(Y),760)
+#define get_gdat_llong_pos760(X,Y) get_gdat_llong((X),(Y),760)
+#define get_gdat_float_pos760(X,Y) get_gdat_float((X),(Y),760)
+#define get_gdat_uint_pos761(X,Y) get_gdat_uint((X),(Y),761)
+#define get_gdat_ullong_pos761(X,Y) get_gdat_ullong((X),(Y),761)
+#define get_gdat_ip_pos761(X,Y) get_gdat_ip((X),(Y),761)
+#define get_gdat_ipv6_pos761(X,Y) get_gdat_ipv6((X),(Y),761)
+#define get_gdat_string_pos761(X,Y) get_gdat_string((X),(Y),761)
+#define get_gdat_v_str_pos761(X,Y) get_gdat_string((X),(Y),761)
+#define get_gdat_bool_pos761(X,Y) get_gdat_bool((X),(Y),761)
+#define get_gdat_int_pos761(X,Y) get_gdat_int((X),(Y),761)
+#define get_gdat_llong_pos761(X,Y) get_gdat_llong((X),(Y),761)
+#define get_gdat_float_pos761(X,Y) get_gdat_float((X),(Y),761)
+#define get_gdat_uint_pos762(X,Y) get_gdat_uint((X),(Y),762)
+#define get_gdat_ullong_pos762(X,Y) get_gdat_ullong((X),(Y),762)
+#define get_gdat_ip_pos762(X,Y) get_gdat_ip((X),(Y),762)
+#define get_gdat_ipv6_pos762(X,Y) get_gdat_ipv6((X),(Y),762)
+#define get_gdat_string_pos762(X,Y) get_gdat_string((X),(Y),762)
+#define get_gdat_v_str_pos762(X,Y) get_gdat_string((X),(Y),762)
+#define get_gdat_bool_pos762(X,Y) get_gdat_bool((X),(Y),762)
+#define get_gdat_int_pos762(X,Y) get_gdat_int((X),(Y),762)
+#define get_gdat_llong_pos762(X,Y) get_gdat_llong((X),(Y),762)
+#define get_gdat_float_pos762(X,Y) get_gdat_float((X),(Y),762)
+#define get_gdat_uint_pos763(X,Y) get_gdat_uint((X),(Y),763)
+#define get_gdat_ullong_pos763(X,Y) get_gdat_ullong((X),(Y),763)
+#define get_gdat_ip_pos763(X,Y) get_gdat_ip((X),(Y),763)
+#define get_gdat_ipv6_pos763(X,Y) get_gdat_ipv6((X),(Y),763)
+#define get_gdat_string_pos763(X,Y) get_gdat_string((X),(Y),763)
+#define get_gdat_v_str_pos763(X,Y) get_gdat_string((X),(Y),763)
+#define get_gdat_bool_pos763(X,Y) get_gdat_bool((X),(Y),763)
+#define get_gdat_int_pos763(X,Y) get_gdat_int((X),(Y),763)
+#define get_gdat_llong_pos763(X,Y) get_gdat_llong((X),(Y),763)
+#define get_gdat_float_pos763(X,Y) get_gdat_float((X),(Y),763)
+#define get_gdat_uint_pos764(X,Y) get_gdat_uint((X),(Y),764)
+#define get_gdat_ullong_pos764(X,Y) get_gdat_ullong((X),(Y),764)
+#define get_gdat_ip_pos764(X,Y) get_gdat_ip((X),(Y),764)
+#define get_gdat_ipv6_pos764(X,Y) get_gdat_ipv6((X),(Y),764)
+#define get_gdat_string_pos764(X,Y) get_gdat_string((X),(Y),764)
+#define get_gdat_v_str_pos764(X,Y) get_gdat_string((X),(Y),764)
+#define get_gdat_bool_pos764(X,Y) get_gdat_bool((X),(Y),764)
+#define get_gdat_int_pos764(X,Y) get_gdat_int((X),(Y),764)
+#define get_gdat_llong_pos764(X,Y) get_gdat_llong((X),(Y),764)
+#define get_gdat_float_pos764(X,Y) get_gdat_float((X),(Y),764)
+#define get_gdat_uint_pos765(X,Y) get_gdat_uint((X),(Y),765)
+#define get_gdat_ullong_pos765(X,Y) get_gdat_ullong((X),(Y),765)
+#define get_gdat_ip_pos765(X,Y) get_gdat_ip((X),(Y),765)
+#define get_gdat_ipv6_pos765(X,Y) get_gdat_ipv6((X),(Y),765)
+#define get_gdat_string_pos765(X,Y) get_gdat_string((X),(Y),765)
+#define get_gdat_v_str_pos765(X,Y) get_gdat_string((X),(Y),765)
+#define get_gdat_bool_pos765(X,Y) get_gdat_bool((X),(Y),765)
+#define get_gdat_int_pos765(X,Y) get_gdat_int((X),(Y),765)
+#define get_gdat_llong_pos765(X,Y) get_gdat_llong((X),(Y),765)
+#define get_gdat_float_pos765(X,Y) get_gdat_float((X),(Y),765)
+#define get_gdat_uint_pos766(X,Y) get_gdat_uint((X),(Y),766)
+#define get_gdat_ullong_pos766(X,Y) get_gdat_ullong((X),(Y),766)
+#define get_gdat_ip_pos766(X,Y) get_gdat_ip((X),(Y),766)
+#define get_gdat_ipv6_pos766(X,Y) get_gdat_ipv6((X),(Y),766)
+#define get_gdat_string_pos766(X,Y) get_gdat_string((X),(Y),766)
+#define get_gdat_v_str_pos766(X,Y) get_gdat_string((X),(Y),766)
+#define get_gdat_bool_pos766(X,Y) get_gdat_bool((X),(Y),766)
+#define get_gdat_int_pos766(X,Y) get_gdat_int((X),(Y),766)
+#define get_gdat_llong_pos766(X,Y) get_gdat_llong((X),(Y),766)
+#define get_gdat_float_pos766(X,Y) get_gdat_float((X),(Y),766)
+#define get_gdat_uint_pos767(X,Y) get_gdat_uint((X),(Y),767)
+#define get_gdat_ullong_pos767(X,Y) get_gdat_ullong((X),(Y),767)
+#define get_gdat_ip_pos767(X,Y) get_gdat_ip((X),(Y),767)
+#define get_gdat_ipv6_pos767(X,Y) get_gdat_ipv6((X),(Y),767)
+#define get_gdat_string_pos767(X,Y) get_gdat_string((X),(Y),767)
+#define get_gdat_v_str_pos767(X,Y) get_gdat_string((X),(Y),767)
+#define get_gdat_bool_pos767(X,Y) get_gdat_bool((X),(Y),767)
+#define get_gdat_int_pos767(X,Y) get_gdat_int((X),(Y),767)
+#define get_gdat_llong_pos767(X,Y) get_gdat_llong((X),(Y),767)
+#define get_gdat_float_pos767(X,Y) get_gdat_float((X),(Y),767)
+#define get_gdat_uint_pos768(X,Y) get_gdat_uint((X),(Y),768)
+#define get_gdat_ullong_pos768(X,Y) get_gdat_ullong((X),(Y),768)
+#define get_gdat_ip_pos768(X,Y) get_gdat_ip((X),(Y),768)
+#define get_gdat_ipv6_pos768(X,Y) get_gdat_ipv6((X),(Y),768)
+#define get_gdat_string_pos768(X,Y) get_gdat_string((X),(Y),768)
+#define get_gdat_v_str_pos768(X,Y) get_gdat_string((X),(Y),768)
+#define get_gdat_bool_pos768(X,Y) get_gdat_bool((X),(Y),768)
+#define get_gdat_int_pos768(X,Y) get_gdat_int((X),(Y),768)
+#define get_gdat_llong_pos768(X,Y) get_gdat_llong((X),(Y),768)
+#define get_gdat_float_pos768(X,Y) get_gdat_float((X),(Y),768)
+#define get_gdat_uint_pos769(X,Y) get_gdat_uint((X),(Y),769)
+#define get_gdat_ullong_pos769(X,Y) get_gdat_ullong((X),(Y),769)
+#define get_gdat_ip_pos769(X,Y) get_gdat_ip((X),(Y),769)
+#define get_gdat_ipv6_pos769(X,Y) get_gdat_ipv6((X),(Y),769)
+#define get_gdat_string_pos769(X,Y) get_gdat_string((X),(Y),769)
+#define get_gdat_v_str_pos769(X,Y) get_gdat_string((X),(Y),769)
+#define get_gdat_bool_pos769(X,Y) get_gdat_bool((X),(Y),769)
+#define get_gdat_int_pos769(X,Y) get_gdat_int((X),(Y),769)
+#define get_gdat_llong_pos769(X,Y) get_gdat_llong((X),(Y),769)
+#define get_gdat_float_pos769(X,Y) get_gdat_float((X),(Y),769)
+#define get_gdat_uint_pos770(X,Y) get_gdat_uint((X),(Y),770)
+#define get_gdat_ullong_pos770(X,Y) get_gdat_ullong((X),(Y),770)
+#define get_gdat_ip_pos770(X,Y) get_gdat_ip((X),(Y),770)
+#define get_gdat_ipv6_pos770(X,Y) get_gdat_ipv6((X),(Y),770)
+#define get_gdat_string_pos770(X,Y) get_gdat_string((X),(Y),770)
+#define get_gdat_v_str_pos770(X,Y) get_gdat_string((X),(Y),770)
+#define get_gdat_bool_pos770(X,Y) get_gdat_bool((X),(Y),770)
+#define get_gdat_int_pos770(X,Y) get_gdat_int((X),(Y),770)
+#define get_gdat_llong_pos770(X,Y) get_gdat_llong((X),(Y),770)
+#define get_gdat_float_pos770(X,Y) get_gdat_float((X),(Y),770)
+#define get_gdat_uint_pos771(X,Y) get_gdat_uint((X),(Y),771)
+#define get_gdat_ullong_pos771(X,Y) get_gdat_ullong((X),(Y),771)
+#define get_gdat_ip_pos771(X,Y) get_gdat_ip((X),(Y),771)
+#define get_gdat_ipv6_pos771(X,Y) get_gdat_ipv6((X),(Y),771)
+#define get_gdat_string_pos771(X,Y) get_gdat_string((X),(Y),771)
+#define get_gdat_v_str_pos771(X,Y) get_gdat_string((X),(Y),771)
+#define get_gdat_bool_pos771(X,Y) get_gdat_bool((X),(Y),771)
+#define get_gdat_int_pos771(X,Y) get_gdat_int((X),(Y),771)
+#define get_gdat_llong_pos771(X,Y) get_gdat_llong((X),(Y),771)
+#define get_gdat_float_pos771(X,Y) get_gdat_float((X),(Y),771)
+#define get_gdat_uint_pos772(X,Y) get_gdat_uint((X),(Y),772)
+#define get_gdat_ullong_pos772(X,Y) get_gdat_ullong((X),(Y),772)
+#define get_gdat_ip_pos772(X,Y) get_gdat_ip((X),(Y),772)
+#define get_gdat_ipv6_pos772(X,Y) get_gdat_ipv6((X),(Y),772)
+#define get_gdat_string_pos772(X,Y) get_gdat_string((X),(Y),772)
+#define get_gdat_v_str_pos772(X,Y) get_gdat_string((X),(Y),772)
+#define get_gdat_bool_pos772(X,Y) get_gdat_bool((X),(Y),772)
+#define get_gdat_int_pos772(X,Y) get_gdat_int((X),(Y),772)
+#define get_gdat_llong_pos772(X,Y) get_gdat_llong((X),(Y),772)
+#define get_gdat_float_pos772(X,Y) get_gdat_float((X),(Y),772)
+#define get_gdat_uint_pos773(X,Y) get_gdat_uint((X),(Y),773)
+#define get_gdat_ullong_pos773(X,Y) get_gdat_ullong((X),(Y),773)
+#define get_gdat_ip_pos773(X,Y) get_gdat_ip((X),(Y),773)
+#define get_gdat_ipv6_pos773(X,Y) get_gdat_ipv6((X),(Y),773)
+#define get_gdat_string_pos773(X,Y) get_gdat_string((X),(Y),773)
+#define get_gdat_v_str_pos773(X,Y) get_gdat_string((X),(Y),773)
+#define get_gdat_bool_pos773(X,Y) get_gdat_bool((X),(Y),773)
+#define get_gdat_int_pos773(X,Y) get_gdat_int((X),(Y),773)
+#define get_gdat_llong_pos773(X,Y) get_gdat_llong((X),(Y),773)
+#define get_gdat_float_pos773(X,Y) get_gdat_float((X),(Y),773)
+#define get_gdat_uint_pos774(X,Y) get_gdat_uint((X),(Y),774)
+#define get_gdat_ullong_pos774(X,Y) get_gdat_ullong((X),(Y),774)
+#define get_gdat_ip_pos774(X,Y) get_gdat_ip((X),(Y),774)
+#define get_gdat_ipv6_pos774(X,Y) get_gdat_ipv6((X),(Y),774)
+#define get_gdat_string_pos774(X,Y) get_gdat_string((X),(Y),774)
+#define get_gdat_v_str_pos774(X,Y) get_gdat_string((X),(Y),774)
+#define get_gdat_bool_pos774(X,Y) get_gdat_bool((X),(Y),774)
+#define get_gdat_int_pos774(X,Y) get_gdat_int((X),(Y),774)
+#define get_gdat_llong_pos774(X,Y) get_gdat_llong((X),(Y),774)
+#define get_gdat_float_pos774(X,Y) get_gdat_float((X),(Y),774)
+#define get_gdat_uint_pos775(X,Y) get_gdat_uint((X),(Y),775)
+#define get_gdat_ullong_pos775(X,Y) get_gdat_ullong((X),(Y),775)
+#define get_gdat_ip_pos775(X,Y) get_gdat_ip((X),(Y),775)
+#define get_gdat_ipv6_pos775(X,Y) get_gdat_ipv6((X),(Y),775)
+#define get_gdat_string_pos775(X,Y) get_gdat_string((X),(Y),775)
+#define get_gdat_v_str_pos775(X,Y) get_gdat_string((X),(Y),775)
+#define get_gdat_bool_pos775(X,Y) get_gdat_bool((X),(Y),775)
+#define get_gdat_int_pos775(X,Y) get_gdat_int((X),(Y),775)
+#define get_gdat_llong_pos775(X,Y) get_gdat_llong((X),(Y),775)
+#define get_gdat_float_pos775(X,Y) get_gdat_float((X),(Y),775)
+#define get_gdat_uint_pos776(X,Y) get_gdat_uint((X),(Y),776)
+#define get_gdat_ullong_pos776(X,Y) get_gdat_ullong((X),(Y),776)
+#define get_gdat_ip_pos776(X,Y) get_gdat_ip((X),(Y),776)
+#define get_gdat_ipv6_pos776(X,Y) get_gdat_ipv6((X),(Y),776)
+#define get_gdat_string_pos776(X,Y) get_gdat_string((X),(Y),776)
+#define get_gdat_v_str_pos776(X,Y) get_gdat_string((X),(Y),776)
+#define get_gdat_bool_pos776(X,Y) get_gdat_bool((X),(Y),776)
+#define get_gdat_int_pos776(X,Y) get_gdat_int((X),(Y),776)
+#define get_gdat_llong_pos776(X,Y) get_gdat_llong((X),(Y),776)
+#define get_gdat_float_pos776(X,Y) get_gdat_float((X),(Y),776)
+#define get_gdat_uint_pos777(X,Y) get_gdat_uint((X),(Y),777)
+#define get_gdat_ullong_pos777(X,Y) get_gdat_ullong((X),(Y),777)
+#define get_gdat_ip_pos777(X,Y) get_gdat_ip((X),(Y),777)
+#define get_gdat_ipv6_pos777(X,Y) get_gdat_ipv6((X),(Y),777)
+#define get_gdat_string_pos777(X,Y) get_gdat_string((X),(Y),777)
+#define get_gdat_v_str_pos777(X,Y) get_gdat_string((X),(Y),777)
+#define get_gdat_bool_pos777(X,Y) get_gdat_bool((X),(Y),777)
+#define get_gdat_int_pos777(X,Y) get_gdat_int((X),(Y),777)
+#define get_gdat_llong_pos777(X,Y) get_gdat_llong((X),(Y),777)
+#define get_gdat_float_pos777(X,Y) get_gdat_float((X),(Y),777)
+#define get_gdat_uint_pos778(X,Y) get_gdat_uint((X),(Y),778)
+#define get_gdat_ullong_pos778(X,Y) get_gdat_ullong((X),(Y),778)
+#define get_gdat_ip_pos778(X,Y) get_gdat_ip((X),(Y),778)
+#define get_gdat_ipv6_pos778(X,Y) get_gdat_ipv6((X),(Y),778)
+#define get_gdat_string_pos778(X,Y) get_gdat_string((X),(Y),778)
+#define get_gdat_v_str_pos778(X,Y) get_gdat_string((X),(Y),778)
+#define get_gdat_bool_pos778(X,Y) get_gdat_bool((X),(Y),778)
+#define get_gdat_int_pos778(X,Y) get_gdat_int((X),(Y),778)
+#define get_gdat_llong_pos778(X,Y) get_gdat_llong((X),(Y),778)
+#define get_gdat_float_pos778(X,Y) get_gdat_float((X),(Y),778)
+#define get_gdat_uint_pos779(X,Y) get_gdat_uint((X),(Y),779)
+#define get_gdat_ullong_pos779(X,Y) get_gdat_ullong((X),(Y),779)
+#define get_gdat_ip_pos779(X,Y) get_gdat_ip((X),(Y),779)
+#define get_gdat_ipv6_pos779(X,Y) get_gdat_ipv6((X),(Y),779)
+#define get_gdat_string_pos779(X,Y) get_gdat_string((X),(Y),779)
+#define get_gdat_v_str_pos779(X,Y) get_gdat_string((X),(Y),779)
+#define get_gdat_bool_pos779(X,Y) get_gdat_bool((X),(Y),779)
+#define get_gdat_int_pos779(X,Y) get_gdat_int((X),(Y),779)
+#define get_gdat_llong_pos779(X,Y) get_gdat_llong((X),(Y),779)
+#define get_gdat_float_pos779(X,Y) get_gdat_float((X),(Y),779)
+#define get_gdat_uint_pos780(X,Y) get_gdat_uint((X),(Y),780)
+#define get_gdat_ullong_pos780(X,Y) get_gdat_ullong((X),(Y),780)
+#define get_gdat_ip_pos780(X,Y) get_gdat_ip((X),(Y),780)
+#define get_gdat_ipv6_pos780(X,Y) get_gdat_ipv6((X),(Y),780)
+#define get_gdat_string_pos780(X,Y) get_gdat_string((X),(Y),780)
+#define get_gdat_v_str_pos780(X,Y) get_gdat_string((X),(Y),780)
+#define get_gdat_bool_pos780(X,Y) get_gdat_bool((X),(Y),780)
+#define get_gdat_int_pos780(X,Y) get_gdat_int((X),(Y),780)
+#define get_gdat_llong_pos780(X,Y) get_gdat_llong((X),(Y),780)
+#define get_gdat_float_pos780(X,Y) get_gdat_float((X),(Y),780)
+#define get_gdat_uint_pos781(X,Y) get_gdat_uint((X),(Y),781)
+#define get_gdat_ullong_pos781(X,Y) get_gdat_ullong((X),(Y),781)
+#define get_gdat_ip_pos781(X,Y) get_gdat_ip((X),(Y),781)
+#define get_gdat_ipv6_pos781(X,Y) get_gdat_ipv6((X),(Y),781)
+#define get_gdat_string_pos781(X,Y) get_gdat_string((X),(Y),781)
+#define get_gdat_v_str_pos781(X,Y) get_gdat_string((X),(Y),781)
+#define get_gdat_bool_pos781(X,Y) get_gdat_bool((X),(Y),781)
+#define get_gdat_int_pos781(X,Y) get_gdat_int((X),(Y),781)
+#define get_gdat_llong_pos781(X,Y) get_gdat_llong((X),(Y),781)
+#define get_gdat_float_pos781(X,Y) get_gdat_float((X),(Y),781)
+#define get_gdat_uint_pos782(X,Y) get_gdat_uint((X),(Y),782)
+#define get_gdat_ullong_pos782(X,Y) get_gdat_ullong((X),(Y),782)
+#define get_gdat_ip_pos782(X,Y) get_gdat_ip((X),(Y),782)
+#define get_gdat_ipv6_pos782(X,Y) get_gdat_ipv6((X),(Y),782)
+#define get_gdat_string_pos782(X,Y) get_gdat_string((X),(Y),782)
+#define get_gdat_v_str_pos782(X,Y) get_gdat_string((X),(Y),782)
+#define get_gdat_bool_pos782(X,Y) get_gdat_bool((X),(Y),782)
+#define get_gdat_int_pos782(X,Y) get_gdat_int((X),(Y),782)
+#define get_gdat_llong_pos782(X,Y) get_gdat_llong((X),(Y),782)
+#define get_gdat_float_pos782(X,Y) get_gdat_float((X),(Y),782)
+#define get_gdat_uint_pos783(X,Y) get_gdat_uint((X),(Y),783)
+#define get_gdat_ullong_pos783(X,Y) get_gdat_ullong((X),(Y),783)
+#define get_gdat_ip_pos783(X,Y) get_gdat_ip((X),(Y),783)
+#define get_gdat_ipv6_pos783(X,Y) get_gdat_ipv6((X),(Y),783)
+#define get_gdat_string_pos783(X,Y) get_gdat_string((X),(Y),783)
+#define get_gdat_v_str_pos783(X,Y) get_gdat_string((X),(Y),783)
+#define get_gdat_bool_pos783(X,Y) get_gdat_bool((X),(Y),783)
+#define get_gdat_int_pos783(X,Y) get_gdat_int((X),(Y),783)
+#define get_gdat_llong_pos783(X,Y) get_gdat_llong((X),(Y),783)
+#define get_gdat_float_pos783(X,Y) get_gdat_float((X),(Y),783)
+#define get_gdat_uint_pos784(X,Y) get_gdat_uint((X),(Y),784)
+#define get_gdat_ullong_pos784(X,Y) get_gdat_ullong((X),(Y),784)
+#define get_gdat_ip_pos784(X,Y) get_gdat_ip((X),(Y),784)
+#define get_gdat_ipv6_pos784(X,Y) get_gdat_ipv6((X),(Y),784)
+#define get_gdat_string_pos784(X,Y) get_gdat_string((X),(Y),784)
+#define get_gdat_v_str_pos784(X,Y) get_gdat_string((X),(Y),784)
+#define get_gdat_bool_pos784(X,Y) get_gdat_bool((X),(Y),784)
+#define get_gdat_int_pos784(X,Y) get_gdat_int((X),(Y),784)
+#define get_gdat_llong_pos784(X,Y) get_gdat_llong((X),(Y),784)
+#define get_gdat_float_pos784(X,Y) get_gdat_float((X),(Y),784)
+#define get_gdat_uint_pos785(X,Y) get_gdat_uint((X),(Y),785)
+#define get_gdat_ullong_pos785(X,Y) get_gdat_ullong((X),(Y),785)
+#define get_gdat_ip_pos785(X,Y) get_gdat_ip((X),(Y),785)
+#define get_gdat_ipv6_pos785(X,Y) get_gdat_ipv6((X),(Y),785)
+#define get_gdat_string_pos785(X,Y) get_gdat_string((X),(Y),785)
+#define get_gdat_v_str_pos785(X,Y) get_gdat_string((X),(Y),785)
+#define get_gdat_bool_pos785(X,Y) get_gdat_bool((X),(Y),785)
+#define get_gdat_int_pos785(X,Y) get_gdat_int((X),(Y),785)
+#define get_gdat_llong_pos785(X,Y) get_gdat_llong((X),(Y),785)
+#define get_gdat_float_pos785(X,Y) get_gdat_float((X),(Y),785)
+#define get_gdat_uint_pos786(X,Y) get_gdat_uint((X),(Y),786)
+#define get_gdat_ullong_pos786(X,Y) get_gdat_ullong((X),(Y),786)
+#define get_gdat_ip_pos786(X,Y) get_gdat_ip((X),(Y),786)
+#define get_gdat_ipv6_pos786(X,Y) get_gdat_ipv6((X),(Y),786)
+#define get_gdat_string_pos786(X,Y) get_gdat_string((X),(Y),786)
+#define get_gdat_v_str_pos786(X,Y) get_gdat_string((X),(Y),786)
+#define get_gdat_bool_pos786(X,Y) get_gdat_bool((X),(Y),786)
+#define get_gdat_int_pos786(X,Y) get_gdat_int((X),(Y),786)
+#define get_gdat_llong_pos786(X,Y) get_gdat_llong((X),(Y),786)
+#define get_gdat_float_pos786(X,Y) get_gdat_float((X),(Y),786)
+#define get_gdat_uint_pos787(X,Y) get_gdat_uint((X),(Y),787)
+#define get_gdat_ullong_pos787(X,Y) get_gdat_ullong((X),(Y),787)
+#define get_gdat_ip_pos787(X,Y) get_gdat_ip((X),(Y),787)
+#define get_gdat_ipv6_pos787(X,Y) get_gdat_ipv6((X),(Y),787)
+#define get_gdat_string_pos787(X,Y) get_gdat_string((X),(Y),787)
+#define get_gdat_v_str_pos787(X,Y) get_gdat_string((X),(Y),787)
+#define get_gdat_bool_pos787(X,Y) get_gdat_bool((X),(Y),787)
+#define get_gdat_int_pos787(X,Y) get_gdat_int((X),(Y),787)
+#define get_gdat_llong_pos787(X,Y) get_gdat_llong((X),(Y),787)
+#define get_gdat_float_pos787(X,Y) get_gdat_float((X),(Y),787)
+#define get_gdat_uint_pos788(X,Y) get_gdat_uint((X),(Y),788)
+#define get_gdat_ullong_pos788(X,Y) get_gdat_ullong((X),(Y),788)
+#define get_gdat_ip_pos788(X,Y) get_gdat_ip((X),(Y),788)
+#define get_gdat_ipv6_pos788(X,Y) get_gdat_ipv6((X),(Y),788)
+#define get_gdat_string_pos788(X,Y) get_gdat_string((X),(Y),788)
+#define get_gdat_v_str_pos788(X,Y) get_gdat_string((X),(Y),788)
+#define get_gdat_bool_pos788(X,Y) get_gdat_bool((X),(Y),788)
+#define get_gdat_int_pos788(X,Y) get_gdat_int((X),(Y),788)
+#define get_gdat_llong_pos788(X,Y) get_gdat_llong((X),(Y),788)
+#define get_gdat_float_pos788(X,Y) get_gdat_float((X),(Y),788)
+#define get_gdat_uint_pos789(X,Y) get_gdat_uint((X),(Y),789)
+#define get_gdat_ullong_pos789(X,Y) get_gdat_ullong((X),(Y),789)
+#define get_gdat_ip_pos789(X,Y) get_gdat_ip((X),(Y),789)
+#define get_gdat_ipv6_pos789(X,Y) get_gdat_ipv6((X),(Y),789)
+#define get_gdat_string_pos789(X,Y) get_gdat_string((X),(Y),789)
+#define get_gdat_v_str_pos789(X,Y) get_gdat_string((X),(Y),789)
+#define get_gdat_bool_pos789(X,Y) get_gdat_bool((X),(Y),789)
+#define get_gdat_int_pos789(X,Y) get_gdat_int((X),(Y),789)
+#define get_gdat_llong_pos789(X,Y) get_gdat_llong((X),(Y),789)
+#define get_gdat_float_pos789(X,Y) get_gdat_float((X),(Y),789)
+#define get_gdat_uint_pos790(X,Y) get_gdat_uint((X),(Y),790)
+#define get_gdat_ullong_pos790(X,Y) get_gdat_ullong((X),(Y),790)
+#define get_gdat_ip_pos790(X,Y) get_gdat_ip((X),(Y),790)
+#define get_gdat_ipv6_pos790(X,Y) get_gdat_ipv6((X),(Y),790)
+#define get_gdat_string_pos790(X,Y) get_gdat_string((X),(Y),790)
+#define get_gdat_v_str_pos790(X,Y) get_gdat_string((X),(Y),790)
+#define get_gdat_bool_pos790(X,Y) get_gdat_bool((X),(Y),790)
+#define get_gdat_int_pos790(X,Y) get_gdat_int((X),(Y),790)
+#define get_gdat_llong_pos790(X,Y) get_gdat_llong((X),(Y),790)
+#define get_gdat_float_pos790(X,Y) get_gdat_float((X),(Y),790)
+#define get_gdat_uint_pos791(X,Y) get_gdat_uint((X),(Y),791)
+#define get_gdat_ullong_pos791(X,Y) get_gdat_ullong((X),(Y),791)
+#define get_gdat_ip_pos791(X,Y) get_gdat_ip((X),(Y),791)
+#define get_gdat_ipv6_pos791(X,Y) get_gdat_ipv6((X),(Y),791)
+#define get_gdat_string_pos791(X,Y) get_gdat_string((X),(Y),791)
+#define get_gdat_v_str_pos791(X,Y) get_gdat_string((X),(Y),791)
+#define get_gdat_bool_pos791(X,Y) get_gdat_bool((X),(Y),791)
+#define get_gdat_int_pos791(X,Y) get_gdat_int((X),(Y),791)
+#define get_gdat_llong_pos791(X,Y) get_gdat_llong((X),(Y),791)
+#define get_gdat_float_pos791(X,Y) get_gdat_float((X),(Y),791)
+#define get_gdat_uint_pos792(X,Y) get_gdat_uint((X),(Y),792)
+#define get_gdat_ullong_pos792(X,Y) get_gdat_ullong((X),(Y),792)
+#define get_gdat_ip_pos792(X,Y) get_gdat_ip((X),(Y),792)
+#define get_gdat_ipv6_pos792(X,Y) get_gdat_ipv6((X),(Y),792)
+#define get_gdat_string_pos792(X,Y) get_gdat_string((X),(Y),792)
+#define get_gdat_v_str_pos792(X,Y) get_gdat_string((X),(Y),792)
+#define get_gdat_bool_pos792(X,Y) get_gdat_bool((X),(Y),792)
+#define get_gdat_int_pos792(X,Y) get_gdat_int((X),(Y),792)
+#define get_gdat_llong_pos792(X,Y) get_gdat_llong((X),(Y),792)
+#define get_gdat_float_pos792(X,Y) get_gdat_float((X),(Y),792)
+#define get_gdat_uint_pos793(X,Y) get_gdat_uint((X),(Y),793)
+#define get_gdat_ullong_pos793(X,Y) get_gdat_ullong((X),(Y),793)
+#define get_gdat_ip_pos793(X,Y) get_gdat_ip((X),(Y),793)
+#define get_gdat_ipv6_pos793(X,Y) get_gdat_ipv6((X),(Y),793)
+#define get_gdat_string_pos793(X,Y) get_gdat_string((X),(Y),793)
+#define get_gdat_v_str_pos793(X,Y) get_gdat_string((X),(Y),793)
+#define get_gdat_bool_pos793(X,Y) get_gdat_bool((X),(Y),793)
+#define get_gdat_int_pos793(X,Y) get_gdat_int((X),(Y),793)
+#define get_gdat_llong_pos793(X,Y) get_gdat_llong((X),(Y),793)
+#define get_gdat_float_pos793(X,Y) get_gdat_float((X),(Y),793)
+#define get_gdat_uint_pos794(X,Y) get_gdat_uint((X),(Y),794)
+#define get_gdat_ullong_pos794(X,Y) get_gdat_ullong((X),(Y),794)
+#define get_gdat_ip_pos794(X,Y) get_gdat_ip((X),(Y),794)
+#define get_gdat_ipv6_pos794(X,Y) get_gdat_ipv6((X),(Y),794)
+#define get_gdat_string_pos794(X,Y) get_gdat_string((X),(Y),794)
+#define get_gdat_v_str_pos794(X,Y) get_gdat_string((X),(Y),794)
+#define get_gdat_bool_pos794(X,Y) get_gdat_bool((X),(Y),794)
+#define get_gdat_int_pos794(X,Y) get_gdat_int((X),(Y),794)
+#define get_gdat_llong_pos794(X,Y) get_gdat_llong((X),(Y),794)
+#define get_gdat_float_pos794(X,Y) get_gdat_float((X),(Y),794)
+#define get_gdat_uint_pos795(X,Y) get_gdat_uint((X),(Y),795)
+#define get_gdat_ullong_pos795(X,Y) get_gdat_ullong((X),(Y),795)
+#define get_gdat_ip_pos795(X,Y) get_gdat_ip((X),(Y),795)
+#define get_gdat_ipv6_pos795(X,Y) get_gdat_ipv6((X),(Y),795)
+#define get_gdat_string_pos795(X,Y) get_gdat_string((X),(Y),795)
+#define get_gdat_v_str_pos795(X,Y) get_gdat_string((X),(Y),795)
+#define get_gdat_bool_pos795(X,Y) get_gdat_bool((X),(Y),795)
+#define get_gdat_int_pos795(X,Y) get_gdat_int((X),(Y),795)
+#define get_gdat_llong_pos795(X,Y) get_gdat_llong((X),(Y),795)
+#define get_gdat_float_pos795(X,Y) get_gdat_float((X),(Y),795)
+#define get_gdat_uint_pos796(X,Y) get_gdat_uint((X),(Y),796)
+#define get_gdat_ullong_pos796(X,Y) get_gdat_ullong((X),(Y),796)
+#define get_gdat_ip_pos796(X,Y) get_gdat_ip((X),(Y),796)
+#define get_gdat_ipv6_pos796(X,Y) get_gdat_ipv6((X),(Y),796)
+#define get_gdat_string_pos796(X,Y) get_gdat_string((X),(Y),796)
+#define get_gdat_v_str_pos796(X,Y) get_gdat_string((X),(Y),796)
+#define get_gdat_bool_pos796(X,Y) get_gdat_bool((X),(Y),796)
+#define get_gdat_int_pos796(X,Y) get_gdat_int((X),(Y),796)
+#define get_gdat_llong_pos796(X,Y) get_gdat_llong((X),(Y),796)
+#define get_gdat_float_pos796(X,Y) get_gdat_float((X),(Y),796)
+#define get_gdat_uint_pos797(X,Y) get_gdat_uint((X),(Y),797)
+#define get_gdat_ullong_pos797(X,Y) get_gdat_ullong((X),(Y),797)
+#define get_gdat_ip_pos797(X,Y) get_gdat_ip((X),(Y),797)
+#define get_gdat_ipv6_pos797(X,Y) get_gdat_ipv6((X),(Y),797)
+#define get_gdat_string_pos797(X,Y) get_gdat_string((X),(Y),797)
+#define get_gdat_v_str_pos797(X,Y) get_gdat_string((X),(Y),797)
+#define get_gdat_bool_pos797(X,Y) get_gdat_bool((X),(Y),797)
+#define get_gdat_int_pos797(X,Y) get_gdat_int((X),(Y),797)
+#define get_gdat_llong_pos797(X,Y) get_gdat_llong((X),(Y),797)
+#define get_gdat_float_pos797(X,Y) get_gdat_float((X),(Y),797)
+#define get_gdat_uint_pos798(X,Y) get_gdat_uint((X),(Y),798)
+#define get_gdat_ullong_pos798(X,Y) get_gdat_ullong((X),(Y),798)
+#define get_gdat_ip_pos798(X,Y) get_gdat_ip((X),(Y),798)
+#define get_gdat_ipv6_pos798(X,Y) get_gdat_ipv6((X),(Y),798)
+#define get_gdat_string_pos798(X,Y) get_gdat_string((X),(Y),798)
+#define get_gdat_v_str_pos798(X,Y) get_gdat_string((X),(Y),798)
+#define get_gdat_bool_pos798(X,Y) get_gdat_bool((X),(Y),798)
+#define get_gdat_int_pos798(X,Y) get_gdat_int((X),(Y),798)
+#define get_gdat_llong_pos798(X,Y) get_gdat_llong((X),(Y),798)
+#define get_gdat_float_pos798(X,Y) get_gdat_float((X),(Y),798)
+#define get_gdat_uint_pos799(X,Y) get_gdat_uint((X),(Y),799)
+#define get_gdat_ullong_pos799(X,Y) get_gdat_ullong((X),(Y),799)
+#define get_gdat_ip_pos799(X,Y) get_gdat_ip((X),(Y),799)
+#define get_gdat_ipv6_pos799(X,Y) get_gdat_ipv6((X),(Y),799)
+#define get_gdat_string_pos799(X,Y) get_gdat_string((X),(Y),799)
+#define get_gdat_v_str_pos799(X,Y) get_gdat_string((X),(Y),799)
+#define get_gdat_bool_pos799(X,Y) get_gdat_bool((X),(Y),799)
+#define get_gdat_int_pos799(X,Y) get_gdat_int((X),(Y),799)
+#define get_gdat_llong_pos799(X,Y) get_gdat_llong((X),(Y),799)
+#define get_gdat_float_pos799(X,Y) get_gdat_float((X),(Y),799)
+#define get_gdat_uint_pos800(X,Y) get_gdat_uint((X),(Y),800)
+#define get_gdat_ullong_pos800(X,Y) get_gdat_ullong((X),(Y),800)
+#define get_gdat_ip_pos800(X,Y) get_gdat_ip((X),(Y),800)
+#define get_gdat_ipv6_pos800(X,Y) get_gdat_ipv6((X),(Y),800)
+#define get_gdat_string_pos800(X,Y) get_gdat_string((X),(Y),800)
+#define get_gdat_v_str_pos800(X,Y) get_gdat_string((X),(Y),800)
+#define get_gdat_bool_pos800(X,Y) get_gdat_bool((X),(Y),800)
+#define get_gdat_int_pos800(X,Y) get_gdat_int((X),(Y),800)
+#define get_gdat_llong_pos800(X,Y) get_gdat_llong((X),(Y),800)
+#define get_gdat_float_pos800(X,Y) get_gdat_float((X),(Y),800)
+#define get_gdat_uint_pos801(X,Y) get_gdat_uint((X),(Y),801)
+#define get_gdat_ullong_pos801(X,Y) get_gdat_ullong((X),(Y),801)
+#define get_gdat_ip_pos801(X,Y) get_gdat_ip((X),(Y),801)
+#define get_gdat_ipv6_pos801(X,Y) get_gdat_ipv6((X),(Y),801)
+#define get_gdat_string_pos801(X,Y) get_gdat_string((X),(Y),801)
+#define get_gdat_v_str_pos801(X,Y) get_gdat_string((X),(Y),801)
+#define get_gdat_bool_pos801(X,Y) get_gdat_bool((X),(Y),801)
+#define get_gdat_int_pos801(X,Y) get_gdat_int((X),(Y),801)
+#define get_gdat_llong_pos801(X,Y) get_gdat_llong((X),(Y),801)
+#define get_gdat_float_pos801(X,Y) get_gdat_float((X),(Y),801)
+#define get_gdat_uint_pos802(X,Y) get_gdat_uint((X),(Y),802)
+#define get_gdat_ullong_pos802(X,Y) get_gdat_ullong((X),(Y),802)
+#define get_gdat_ip_pos802(X,Y) get_gdat_ip((X),(Y),802)
+#define get_gdat_ipv6_pos802(X,Y) get_gdat_ipv6((X),(Y),802)
+#define get_gdat_string_pos802(X,Y) get_gdat_string((X),(Y),802)
+#define get_gdat_v_str_pos802(X,Y) get_gdat_string((X),(Y),802)
+#define get_gdat_bool_pos802(X,Y) get_gdat_bool((X),(Y),802)
+#define get_gdat_int_pos802(X,Y) get_gdat_int((X),(Y),802)
+#define get_gdat_llong_pos802(X,Y) get_gdat_llong((X),(Y),802)
+#define get_gdat_float_pos802(X,Y) get_gdat_float((X),(Y),802)
+#define get_gdat_uint_pos803(X,Y) get_gdat_uint((X),(Y),803)
+#define get_gdat_ullong_pos803(X,Y) get_gdat_ullong((X),(Y),803)
+#define get_gdat_ip_pos803(X,Y) get_gdat_ip((X),(Y),803)
+#define get_gdat_ipv6_pos803(X,Y) get_gdat_ipv6((X),(Y),803)
+#define get_gdat_string_pos803(X,Y) get_gdat_string((X),(Y),803)
+#define get_gdat_v_str_pos803(X,Y) get_gdat_string((X),(Y),803)
+#define get_gdat_bool_pos803(X,Y) get_gdat_bool((X),(Y),803)
+#define get_gdat_int_pos803(X,Y) get_gdat_int((X),(Y),803)
+#define get_gdat_llong_pos803(X,Y) get_gdat_llong((X),(Y),803)
+#define get_gdat_float_pos803(X,Y) get_gdat_float((X),(Y),803)
+#define get_gdat_uint_pos804(X,Y) get_gdat_uint((X),(Y),804)
+#define get_gdat_ullong_pos804(X,Y) get_gdat_ullong((X),(Y),804)
+#define get_gdat_ip_pos804(X,Y) get_gdat_ip((X),(Y),804)
+#define get_gdat_ipv6_pos804(X,Y) get_gdat_ipv6((X),(Y),804)
+#define get_gdat_string_pos804(X,Y) get_gdat_string((X),(Y),804)
+#define get_gdat_v_str_pos804(X,Y) get_gdat_string((X),(Y),804)
+#define get_gdat_bool_pos804(X,Y) get_gdat_bool((X),(Y),804)
+#define get_gdat_int_pos804(X,Y) get_gdat_int((X),(Y),804)
+#define get_gdat_llong_pos804(X,Y) get_gdat_llong((X),(Y),804)
+#define get_gdat_float_pos804(X,Y) get_gdat_float((X),(Y),804)
+#define get_gdat_uint_pos805(X,Y) get_gdat_uint((X),(Y),805)
+#define get_gdat_ullong_pos805(X,Y) get_gdat_ullong((X),(Y),805)
+#define get_gdat_ip_pos805(X,Y) get_gdat_ip((X),(Y),805)
+#define get_gdat_ipv6_pos805(X,Y) get_gdat_ipv6((X),(Y),805)
+#define get_gdat_string_pos805(X,Y) get_gdat_string((X),(Y),805)
+#define get_gdat_v_str_pos805(X,Y) get_gdat_string((X),(Y),805)
+#define get_gdat_bool_pos805(X,Y) get_gdat_bool((X),(Y),805)
+#define get_gdat_int_pos805(X,Y) get_gdat_int((X),(Y),805)
+#define get_gdat_llong_pos805(X,Y) get_gdat_llong((X),(Y),805)
+#define get_gdat_float_pos805(X,Y) get_gdat_float((X),(Y),805)
+#define get_gdat_uint_pos806(X,Y) get_gdat_uint((X),(Y),806)
+#define get_gdat_ullong_pos806(X,Y) get_gdat_ullong((X),(Y),806)
+#define get_gdat_ip_pos806(X,Y) get_gdat_ip((X),(Y),806)
+#define get_gdat_ipv6_pos806(X,Y) get_gdat_ipv6((X),(Y),806)
+#define get_gdat_string_pos806(X,Y) get_gdat_string((X),(Y),806)
+#define get_gdat_v_str_pos806(X,Y) get_gdat_string((X),(Y),806)
+#define get_gdat_bool_pos806(X,Y) get_gdat_bool((X),(Y),806)
+#define get_gdat_int_pos806(X,Y) get_gdat_int((X),(Y),806)
+#define get_gdat_llong_pos806(X,Y) get_gdat_llong((X),(Y),806)
+#define get_gdat_float_pos806(X,Y) get_gdat_float((X),(Y),806)
+#define get_gdat_uint_pos807(X,Y) get_gdat_uint((X),(Y),807)
+#define get_gdat_ullong_pos807(X,Y) get_gdat_ullong((X),(Y),807)
+#define get_gdat_ip_pos807(X,Y) get_gdat_ip((X),(Y),807)
+#define get_gdat_ipv6_pos807(X,Y) get_gdat_ipv6((X),(Y),807)
+#define get_gdat_string_pos807(X,Y) get_gdat_string((X),(Y),807)
+#define get_gdat_v_str_pos807(X,Y) get_gdat_string((X),(Y),807)
+#define get_gdat_bool_pos807(X,Y) get_gdat_bool((X),(Y),807)
+#define get_gdat_int_pos807(X,Y) get_gdat_int((X),(Y),807)
+#define get_gdat_llong_pos807(X,Y) get_gdat_llong((X),(Y),807)
+#define get_gdat_float_pos807(X,Y) get_gdat_float((X),(Y),807)
+#define get_gdat_uint_pos808(X,Y) get_gdat_uint((X),(Y),808)
+#define get_gdat_ullong_pos808(X,Y) get_gdat_ullong((X),(Y),808)
+#define get_gdat_ip_pos808(X,Y) get_gdat_ip((X),(Y),808)
+#define get_gdat_ipv6_pos808(X,Y) get_gdat_ipv6((X),(Y),808)
+#define get_gdat_string_pos808(X,Y) get_gdat_string((X),(Y),808)
+#define get_gdat_v_str_pos808(X,Y) get_gdat_string((X),(Y),808)
+#define get_gdat_bool_pos808(X,Y) get_gdat_bool((X),(Y),808)
+#define get_gdat_int_pos808(X,Y) get_gdat_int((X),(Y),808)
+#define get_gdat_llong_pos808(X,Y) get_gdat_llong((X),(Y),808)
+#define get_gdat_float_pos808(X,Y) get_gdat_float((X),(Y),808)
+#define get_gdat_uint_pos809(X,Y) get_gdat_uint((X),(Y),809)
+#define get_gdat_ullong_pos809(X,Y) get_gdat_ullong((X),(Y),809)
+#define get_gdat_ip_pos809(X,Y) get_gdat_ip((X),(Y),809)
+#define get_gdat_ipv6_pos809(X,Y) get_gdat_ipv6((X),(Y),809)
+#define get_gdat_string_pos809(X,Y) get_gdat_string((X),(Y),809)
+#define get_gdat_v_str_pos809(X,Y) get_gdat_string((X),(Y),809)
+#define get_gdat_bool_pos809(X,Y) get_gdat_bool((X),(Y),809)
+#define get_gdat_int_pos809(X,Y) get_gdat_int((X),(Y),809)
+#define get_gdat_llong_pos809(X,Y) get_gdat_llong((X),(Y),809)
+#define get_gdat_float_pos809(X,Y) get_gdat_float((X),(Y),809)
+#define get_gdat_uint_pos810(X,Y) get_gdat_uint((X),(Y),810)
+#define get_gdat_ullong_pos810(X,Y) get_gdat_ullong((X),(Y),810)
+#define get_gdat_ip_pos810(X,Y) get_gdat_ip((X),(Y),810)
+#define get_gdat_ipv6_pos810(X,Y) get_gdat_ipv6((X),(Y),810)
+#define get_gdat_string_pos810(X,Y) get_gdat_string((X),(Y),810)
+#define get_gdat_v_str_pos810(X,Y) get_gdat_string((X),(Y),810)
+#define get_gdat_bool_pos810(X,Y) get_gdat_bool((X),(Y),810)
+#define get_gdat_int_pos810(X,Y) get_gdat_int((X),(Y),810)
+#define get_gdat_llong_pos810(X,Y) get_gdat_llong((X),(Y),810)
+#define get_gdat_float_pos810(X,Y) get_gdat_float((X),(Y),810)
+#define get_gdat_uint_pos811(X,Y) get_gdat_uint((X),(Y),811)
+#define get_gdat_ullong_pos811(X,Y) get_gdat_ullong((X),(Y),811)
+#define get_gdat_ip_pos811(X,Y) get_gdat_ip((X),(Y),811)
+#define get_gdat_ipv6_pos811(X,Y) get_gdat_ipv6((X),(Y),811)
+#define get_gdat_string_pos811(X,Y) get_gdat_string((X),(Y),811)
+#define get_gdat_v_str_pos811(X,Y) get_gdat_string((X),(Y),811)
+#define get_gdat_bool_pos811(X,Y) get_gdat_bool((X),(Y),811)
+#define get_gdat_int_pos811(X,Y) get_gdat_int((X),(Y),811)
+#define get_gdat_llong_pos811(X,Y) get_gdat_llong((X),(Y),811)
+#define get_gdat_float_pos811(X,Y) get_gdat_float((X),(Y),811)
+#define get_gdat_uint_pos812(X,Y) get_gdat_uint((X),(Y),812)
+#define get_gdat_ullong_pos812(X,Y) get_gdat_ullong((X),(Y),812)
+#define get_gdat_ip_pos812(X,Y) get_gdat_ip((X),(Y),812)
+#define get_gdat_ipv6_pos812(X,Y) get_gdat_ipv6((X),(Y),812)
+#define get_gdat_string_pos812(X,Y) get_gdat_string((X),(Y),812)
+#define get_gdat_v_str_pos812(X,Y) get_gdat_string((X),(Y),812)
+#define get_gdat_bool_pos812(X,Y) get_gdat_bool((X),(Y),812)
+#define get_gdat_int_pos812(X,Y) get_gdat_int((X),(Y),812)
+#define get_gdat_llong_pos812(X,Y) get_gdat_llong((X),(Y),812)
+#define get_gdat_float_pos812(X,Y) get_gdat_float((X),(Y),812)
+#define get_gdat_uint_pos813(X,Y) get_gdat_uint((X),(Y),813)
+#define get_gdat_ullong_pos813(X,Y) get_gdat_ullong((X),(Y),813)
+#define get_gdat_ip_pos813(X,Y) get_gdat_ip((X),(Y),813)
+#define get_gdat_ipv6_pos813(X,Y) get_gdat_ipv6((X),(Y),813)
+#define get_gdat_string_pos813(X,Y) get_gdat_string((X),(Y),813)
+#define get_gdat_v_str_pos813(X,Y) get_gdat_string((X),(Y),813)
+#define get_gdat_bool_pos813(X,Y) get_gdat_bool((X),(Y),813)
+#define get_gdat_int_pos813(X,Y) get_gdat_int((X),(Y),813)
+#define get_gdat_llong_pos813(X,Y) get_gdat_llong((X),(Y),813)
+#define get_gdat_float_pos813(X,Y) get_gdat_float((X),(Y),813)
+#define get_gdat_uint_pos814(X,Y) get_gdat_uint((X),(Y),814)
+#define get_gdat_ullong_pos814(X,Y) get_gdat_ullong((X),(Y),814)
+#define get_gdat_ip_pos814(X,Y) get_gdat_ip((X),(Y),814)
+#define get_gdat_ipv6_pos814(X,Y) get_gdat_ipv6((X),(Y),814)
+#define get_gdat_string_pos814(X,Y) get_gdat_string((X),(Y),814)
+#define get_gdat_v_str_pos814(X,Y) get_gdat_string((X),(Y),814)
+#define get_gdat_bool_pos814(X,Y) get_gdat_bool((X),(Y),814)
+#define get_gdat_int_pos814(X,Y) get_gdat_int((X),(Y),814)
+#define get_gdat_llong_pos814(X,Y) get_gdat_llong((X),(Y),814)
+#define get_gdat_float_pos814(X,Y) get_gdat_float((X),(Y),814)
+#define get_gdat_uint_pos815(X,Y) get_gdat_uint((X),(Y),815)
+#define get_gdat_ullong_pos815(X,Y) get_gdat_ullong((X),(Y),815)
+#define get_gdat_ip_pos815(X,Y) get_gdat_ip((X),(Y),815)
+#define get_gdat_ipv6_pos815(X,Y) get_gdat_ipv6((X),(Y),815)
+#define get_gdat_string_pos815(X,Y) get_gdat_string((X),(Y),815)
+#define get_gdat_v_str_pos815(X,Y) get_gdat_string((X),(Y),815)
+#define get_gdat_bool_pos815(X,Y) get_gdat_bool((X),(Y),815)
+#define get_gdat_int_pos815(X,Y) get_gdat_int((X),(Y),815)
+#define get_gdat_llong_pos815(X,Y) get_gdat_llong((X),(Y),815)
+#define get_gdat_float_pos815(X,Y) get_gdat_float((X),(Y),815)
+#define get_gdat_uint_pos816(X,Y) get_gdat_uint((X),(Y),816)
+#define get_gdat_ullong_pos816(X,Y) get_gdat_ullong((X),(Y),816)
+#define get_gdat_ip_pos816(X,Y) get_gdat_ip((X),(Y),816)
+#define get_gdat_ipv6_pos816(X,Y) get_gdat_ipv6((X),(Y),816)
+#define get_gdat_string_pos816(X,Y) get_gdat_string((X),(Y),816)
+#define get_gdat_v_str_pos816(X,Y) get_gdat_string((X),(Y),816)
+#define get_gdat_bool_pos816(X,Y) get_gdat_bool((X),(Y),816)
+#define get_gdat_int_pos816(X,Y) get_gdat_int((X),(Y),816)
+#define get_gdat_llong_pos816(X,Y) get_gdat_llong((X),(Y),816)
+#define get_gdat_float_pos816(X,Y) get_gdat_float((X),(Y),816)
+#define get_gdat_uint_pos817(X,Y) get_gdat_uint((X),(Y),817)
+#define get_gdat_ullong_pos817(X,Y) get_gdat_ullong((X),(Y),817)
+#define get_gdat_ip_pos817(X,Y) get_gdat_ip((X),(Y),817)
+#define get_gdat_ipv6_pos817(X,Y) get_gdat_ipv6((X),(Y),817)
+#define get_gdat_string_pos817(X,Y) get_gdat_string((X),(Y),817)
+#define get_gdat_v_str_pos817(X,Y) get_gdat_string((X),(Y),817)
+#define get_gdat_bool_pos817(X,Y) get_gdat_bool((X),(Y),817)
+#define get_gdat_int_pos817(X,Y) get_gdat_int((X),(Y),817)
+#define get_gdat_llong_pos817(X,Y) get_gdat_llong((X),(Y),817)
+#define get_gdat_float_pos817(X,Y) get_gdat_float((X),(Y),817)
+#define get_gdat_uint_pos818(X,Y) get_gdat_uint((X),(Y),818)
+#define get_gdat_ullong_pos818(X,Y) get_gdat_ullong((X),(Y),818)
+#define get_gdat_ip_pos818(X,Y) get_gdat_ip((X),(Y),818)
+#define get_gdat_ipv6_pos818(X,Y) get_gdat_ipv6((X),(Y),818)
+#define get_gdat_string_pos818(X,Y) get_gdat_string((X),(Y),818)
+#define get_gdat_v_str_pos818(X,Y) get_gdat_string((X),(Y),818)
+#define get_gdat_bool_pos818(X,Y) get_gdat_bool((X),(Y),818)
+#define get_gdat_int_pos818(X,Y) get_gdat_int((X),(Y),818)
+#define get_gdat_llong_pos818(X,Y) get_gdat_llong((X),(Y),818)
+#define get_gdat_float_pos818(X,Y) get_gdat_float((X),(Y),818)
+#define get_gdat_uint_pos819(X,Y) get_gdat_uint((X),(Y),819)
+#define get_gdat_ullong_pos819(X,Y) get_gdat_ullong((X),(Y),819)
+#define get_gdat_ip_pos819(X,Y) get_gdat_ip((X),(Y),819)
+#define get_gdat_ipv6_pos819(X,Y) get_gdat_ipv6((X),(Y),819)
+#define get_gdat_string_pos819(X,Y) get_gdat_string((X),(Y),819)
+#define get_gdat_v_str_pos819(X,Y) get_gdat_string((X),(Y),819)
+#define get_gdat_bool_pos819(X,Y) get_gdat_bool((X),(Y),819)
+#define get_gdat_int_pos819(X,Y) get_gdat_int((X),(Y),819)
+#define get_gdat_llong_pos819(X,Y) get_gdat_llong((X),(Y),819)
+#define get_gdat_float_pos819(X,Y) get_gdat_float((X),(Y),819)
+#define get_gdat_uint_pos820(X,Y) get_gdat_uint((X),(Y),820)
+#define get_gdat_ullong_pos820(X,Y) get_gdat_ullong((X),(Y),820)
+#define get_gdat_ip_pos820(X,Y) get_gdat_ip((X),(Y),820)
+#define get_gdat_ipv6_pos820(X,Y) get_gdat_ipv6((X),(Y),820)
+#define get_gdat_string_pos820(X,Y) get_gdat_string((X),(Y),820)
+#define get_gdat_v_str_pos820(X,Y) get_gdat_string((X),(Y),820)
+#define get_gdat_bool_pos820(X,Y) get_gdat_bool((X),(Y),820)
+#define get_gdat_int_pos820(X,Y) get_gdat_int((X),(Y),820)
+#define get_gdat_llong_pos820(X,Y) get_gdat_llong((X),(Y),820)
+#define get_gdat_float_pos820(X,Y) get_gdat_float((X),(Y),820)
+#define get_gdat_uint_pos821(X,Y) get_gdat_uint((X),(Y),821)
+#define get_gdat_ullong_pos821(X,Y) get_gdat_ullong((X),(Y),821)
+#define get_gdat_ip_pos821(X,Y) get_gdat_ip((X),(Y),821)
+#define get_gdat_ipv6_pos821(X,Y) get_gdat_ipv6((X),(Y),821)
+#define get_gdat_string_pos821(X,Y) get_gdat_string((X),(Y),821)
+#define get_gdat_v_str_pos821(X,Y) get_gdat_string((X),(Y),821)
+#define get_gdat_bool_pos821(X,Y) get_gdat_bool((X),(Y),821)
+#define get_gdat_int_pos821(X,Y) get_gdat_int((X),(Y),821)
+#define get_gdat_llong_pos821(X,Y) get_gdat_llong((X),(Y),821)
+#define get_gdat_float_pos821(X,Y) get_gdat_float((X),(Y),821)
+#define get_gdat_uint_pos822(X,Y) get_gdat_uint((X),(Y),822)
+#define get_gdat_ullong_pos822(X,Y) get_gdat_ullong((X),(Y),822)
+#define get_gdat_ip_pos822(X,Y) get_gdat_ip((X),(Y),822)
+#define get_gdat_ipv6_pos822(X,Y) get_gdat_ipv6((X),(Y),822)
+#define get_gdat_string_pos822(X,Y) get_gdat_string((X),(Y),822)
+#define get_gdat_v_str_pos822(X,Y) get_gdat_string((X),(Y),822)
+#define get_gdat_bool_pos822(X,Y) get_gdat_bool((X),(Y),822)
+#define get_gdat_int_pos822(X,Y) get_gdat_int((X),(Y),822)
+#define get_gdat_llong_pos822(X,Y) get_gdat_llong((X),(Y),822)
+#define get_gdat_float_pos822(X,Y) get_gdat_float((X),(Y),822)
+#define get_gdat_uint_pos823(X,Y) get_gdat_uint((X),(Y),823)
+#define get_gdat_ullong_pos823(X,Y) get_gdat_ullong((X),(Y),823)
+#define get_gdat_ip_pos823(X,Y) get_gdat_ip((X),(Y),823)
+#define get_gdat_ipv6_pos823(X,Y) get_gdat_ipv6((X),(Y),823)
+#define get_gdat_string_pos823(X,Y) get_gdat_string((X),(Y),823)
+#define get_gdat_v_str_pos823(X,Y) get_gdat_string((X),(Y),823)
+#define get_gdat_bool_pos823(X,Y) get_gdat_bool((X),(Y),823)
+#define get_gdat_int_pos823(X,Y) get_gdat_int((X),(Y),823)
+#define get_gdat_llong_pos823(X,Y) get_gdat_llong((X),(Y),823)
+#define get_gdat_float_pos823(X,Y) get_gdat_float((X),(Y),823)
+#define get_gdat_uint_pos824(X,Y) get_gdat_uint((X),(Y),824)
+#define get_gdat_ullong_pos824(X,Y) get_gdat_ullong((X),(Y),824)
+#define get_gdat_ip_pos824(X,Y) get_gdat_ip((X),(Y),824)
+#define get_gdat_ipv6_pos824(X,Y) get_gdat_ipv6((X),(Y),824)
+#define get_gdat_string_pos824(X,Y) get_gdat_string((X),(Y),824)
+#define get_gdat_v_str_pos824(X,Y) get_gdat_string((X),(Y),824)
+#define get_gdat_bool_pos824(X,Y) get_gdat_bool((X),(Y),824)
+#define get_gdat_int_pos824(X,Y) get_gdat_int((X),(Y),824)
+#define get_gdat_llong_pos824(X,Y) get_gdat_llong((X),(Y),824)
+#define get_gdat_float_pos824(X,Y) get_gdat_float((X),(Y),824)
+#define get_gdat_uint_pos825(X,Y) get_gdat_uint((X),(Y),825)
+#define get_gdat_ullong_pos825(X,Y) get_gdat_ullong((X),(Y),825)
+#define get_gdat_ip_pos825(X,Y) get_gdat_ip((X),(Y),825)
+#define get_gdat_ipv6_pos825(X,Y) get_gdat_ipv6((X),(Y),825)
+#define get_gdat_string_pos825(X,Y) get_gdat_string((X),(Y),825)
+#define get_gdat_v_str_pos825(X,Y) get_gdat_string((X),(Y),825)
+#define get_gdat_bool_pos825(X,Y) get_gdat_bool((X),(Y),825)
+#define get_gdat_int_pos825(X,Y) get_gdat_int((X),(Y),825)
+#define get_gdat_llong_pos825(X,Y) get_gdat_llong((X),(Y),825)
+#define get_gdat_float_pos825(X,Y) get_gdat_float((X),(Y),825)
+#define get_gdat_uint_pos826(X,Y) get_gdat_uint((X),(Y),826)
+#define get_gdat_ullong_pos826(X,Y) get_gdat_ullong((X),(Y),826)
+#define get_gdat_ip_pos826(X,Y) get_gdat_ip((X),(Y),826)
+#define get_gdat_ipv6_pos826(X,Y) get_gdat_ipv6((X),(Y),826)
+#define get_gdat_string_pos826(X,Y) get_gdat_string((X),(Y),826)
+#define get_gdat_v_str_pos826(X,Y) get_gdat_string((X),(Y),826)
+#define get_gdat_bool_pos826(X,Y) get_gdat_bool((X),(Y),826)
+#define get_gdat_int_pos826(X,Y) get_gdat_int((X),(Y),826)
+#define get_gdat_llong_pos826(X,Y) get_gdat_llong((X),(Y),826)
+#define get_gdat_float_pos826(X,Y) get_gdat_float((X),(Y),826)
+#define get_gdat_uint_pos827(X,Y) get_gdat_uint((X),(Y),827)
+#define get_gdat_ullong_pos827(X,Y) get_gdat_ullong((X),(Y),827)
+#define get_gdat_ip_pos827(X,Y) get_gdat_ip((X),(Y),827)
+#define get_gdat_ipv6_pos827(X,Y) get_gdat_ipv6((X),(Y),827)
+#define get_gdat_string_pos827(X,Y) get_gdat_string((X),(Y),827)
+#define get_gdat_v_str_pos827(X,Y) get_gdat_string((X),(Y),827)
+#define get_gdat_bool_pos827(X,Y) get_gdat_bool((X),(Y),827)
+#define get_gdat_int_pos827(X,Y) get_gdat_int((X),(Y),827)
+#define get_gdat_llong_pos827(X,Y) get_gdat_llong((X),(Y),827)
+#define get_gdat_float_pos827(X,Y) get_gdat_float((X),(Y),827)
+#define get_gdat_uint_pos828(X,Y) get_gdat_uint((X),(Y),828)
+#define get_gdat_ullong_pos828(X,Y) get_gdat_ullong((X),(Y),828)
+#define get_gdat_ip_pos828(X,Y) get_gdat_ip((X),(Y),828)
+#define get_gdat_ipv6_pos828(X,Y) get_gdat_ipv6((X),(Y),828)
+#define get_gdat_string_pos828(X,Y) get_gdat_string((X),(Y),828)
+#define get_gdat_v_str_pos828(X,Y) get_gdat_string((X),(Y),828)
+#define get_gdat_bool_pos828(X,Y) get_gdat_bool((X),(Y),828)
+#define get_gdat_int_pos828(X,Y) get_gdat_int((X),(Y),828)
+#define get_gdat_llong_pos828(X,Y) get_gdat_llong((X),(Y),828)
+#define get_gdat_float_pos828(X,Y) get_gdat_float((X),(Y),828)
+#define get_gdat_uint_pos829(X,Y) get_gdat_uint((X),(Y),829)
+#define get_gdat_ullong_pos829(X,Y) get_gdat_ullong((X),(Y),829)
+#define get_gdat_ip_pos829(X,Y) get_gdat_ip((X),(Y),829)
+#define get_gdat_ipv6_pos829(X,Y) get_gdat_ipv6((X),(Y),829)
+#define get_gdat_string_pos829(X,Y) get_gdat_string((X),(Y),829)
+#define get_gdat_v_str_pos829(X,Y) get_gdat_string((X),(Y),829)
+#define get_gdat_bool_pos829(X,Y) get_gdat_bool((X),(Y),829)
+#define get_gdat_int_pos829(X,Y) get_gdat_int((X),(Y),829)
+#define get_gdat_llong_pos829(X,Y) get_gdat_llong((X),(Y),829)
+#define get_gdat_float_pos829(X,Y) get_gdat_float((X),(Y),829)
+#define get_gdat_uint_pos830(X,Y) get_gdat_uint((X),(Y),830)
+#define get_gdat_ullong_pos830(X,Y) get_gdat_ullong((X),(Y),830)
+#define get_gdat_ip_pos830(X,Y) get_gdat_ip((X),(Y),830)
+#define get_gdat_ipv6_pos830(X,Y) get_gdat_ipv6((X),(Y),830)
+#define get_gdat_string_pos830(X,Y) get_gdat_string((X),(Y),830)
+#define get_gdat_v_str_pos830(X,Y) get_gdat_string((X),(Y),830)
+#define get_gdat_bool_pos830(X,Y) get_gdat_bool((X),(Y),830)
+#define get_gdat_int_pos830(X,Y) get_gdat_int((X),(Y),830)
+#define get_gdat_llong_pos830(X,Y) get_gdat_llong((X),(Y),830)
+#define get_gdat_float_pos830(X,Y) get_gdat_float((X),(Y),830)
+#define get_gdat_uint_pos831(X,Y) get_gdat_uint((X),(Y),831)
+#define get_gdat_ullong_pos831(X,Y) get_gdat_ullong((X),(Y),831)
+#define get_gdat_ip_pos831(X,Y) get_gdat_ip((X),(Y),831)
+#define get_gdat_ipv6_pos831(X,Y) get_gdat_ipv6((X),(Y),831)
+#define get_gdat_string_pos831(X,Y) get_gdat_string((X),(Y),831)
+#define get_gdat_v_str_pos831(X,Y) get_gdat_string((X),(Y),831)
+#define get_gdat_bool_pos831(X,Y) get_gdat_bool((X),(Y),831)
+#define get_gdat_int_pos831(X,Y) get_gdat_int((X),(Y),831)
+#define get_gdat_llong_pos831(X,Y) get_gdat_llong((X),(Y),831)
+#define get_gdat_float_pos831(X,Y) get_gdat_float((X),(Y),831)
+#define get_gdat_uint_pos832(X,Y) get_gdat_uint((X),(Y),832)
+#define get_gdat_ullong_pos832(X,Y) get_gdat_ullong((X),(Y),832)
+#define get_gdat_ip_pos832(X,Y) get_gdat_ip((X),(Y),832)
+#define get_gdat_ipv6_pos832(X,Y) get_gdat_ipv6((X),(Y),832)
+#define get_gdat_string_pos832(X,Y) get_gdat_string((X),(Y),832)
+#define get_gdat_v_str_pos832(X,Y) get_gdat_string((X),(Y),832)
+#define get_gdat_bool_pos832(X,Y) get_gdat_bool((X),(Y),832)
+#define get_gdat_int_pos832(X,Y) get_gdat_int((X),(Y),832)
+#define get_gdat_llong_pos832(X,Y) get_gdat_llong((X),(Y),832)
+#define get_gdat_float_pos832(X,Y) get_gdat_float((X),(Y),832)
+#define get_gdat_uint_pos833(X,Y) get_gdat_uint((X),(Y),833)
+#define get_gdat_ullong_pos833(X,Y) get_gdat_ullong((X),(Y),833)
+#define get_gdat_ip_pos833(X,Y) get_gdat_ip((X),(Y),833)
+#define get_gdat_ipv6_pos833(X,Y) get_gdat_ipv6((X),(Y),833)
+#define get_gdat_string_pos833(X,Y) get_gdat_string((X),(Y),833)
+#define get_gdat_v_str_pos833(X,Y) get_gdat_string((X),(Y),833)
+#define get_gdat_bool_pos833(X,Y) get_gdat_bool((X),(Y),833)
+#define get_gdat_int_pos833(X,Y) get_gdat_int((X),(Y),833)
+#define get_gdat_llong_pos833(X,Y) get_gdat_llong((X),(Y),833)
+#define get_gdat_float_pos833(X,Y) get_gdat_float((X),(Y),833)
+#define get_gdat_uint_pos834(X,Y) get_gdat_uint((X),(Y),834)
+#define get_gdat_ullong_pos834(X,Y) get_gdat_ullong((X),(Y),834)
+#define get_gdat_ip_pos834(X,Y) get_gdat_ip((X),(Y),834)
+#define get_gdat_ipv6_pos834(X,Y) get_gdat_ipv6((X),(Y),834)
+#define get_gdat_string_pos834(X,Y) get_gdat_string((X),(Y),834)
+#define get_gdat_v_str_pos834(X,Y) get_gdat_string((X),(Y),834)
+#define get_gdat_bool_pos834(X,Y) get_gdat_bool((X),(Y),834)
+#define get_gdat_int_pos834(X,Y) get_gdat_int((X),(Y),834)
+#define get_gdat_llong_pos834(X,Y) get_gdat_llong((X),(Y),834)
+#define get_gdat_float_pos834(X,Y) get_gdat_float((X),(Y),834)
+#define get_gdat_uint_pos835(X,Y) get_gdat_uint((X),(Y),835)
+#define get_gdat_ullong_pos835(X,Y) get_gdat_ullong((X),(Y),835)
+#define get_gdat_ip_pos835(X,Y) get_gdat_ip((X),(Y),835)
+#define get_gdat_ipv6_pos835(X,Y) get_gdat_ipv6((X),(Y),835)
+#define get_gdat_string_pos835(X,Y) get_gdat_string((X),(Y),835)
+#define get_gdat_v_str_pos835(X,Y) get_gdat_string((X),(Y),835)
+#define get_gdat_bool_pos835(X,Y) get_gdat_bool((X),(Y),835)
+#define get_gdat_int_pos835(X,Y) get_gdat_int((X),(Y),835)
+#define get_gdat_llong_pos835(X,Y) get_gdat_llong((X),(Y),835)
+#define get_gdat_float_pos835(X,Y) get_gdat_float((X),(Y),835)
+#define get_gdat_uint_pos836(X,Y) get_gdat_uint((X),(Y),836)
+#define get_gdat_ullong_pos836(X,Y) get_gdat_ullong((X),(Y),836)
+#define get_gdat_ip_pos836(X,Y) get_gdat_ip((X),(Y),836)
+#define get_gdat_ipv6_pos836(X,Y) get_gdat_ipv6((X),(Y),836)
+#define get_gdat_string_pos836(X,Y) get_gdat_string((X),(Y),836)
+#define get_gdat_v_str_pos836(X,Y) get_gdat_string((X),(Y),836)
+#define get_gdat_bool_pos836(X,Y) get_gdat_bool((X),(Y),836)
+#define get_gdat_int_pos836(X,Y) get_gdat_int((X),(Y),836)
+#define get_gdat_llong_pos836(X,Y) get_gdat_llong((X),(Y),836)
+#define get_gdat_float_pos836(X,Y) get_gdat_float((X),(Y),836)
+#define get_gdat_uint_pos837(X,Y) get_gdat_uint((X),(Y),837)
+#define get_gdat_ullong_pos837(X,Y) get_gdat_ullong((X),(Y),837)
+#define get_gdat_ip_pos837(X,Y) get_gdat_ip((X),(Y),837)
+#define get_gdat_ipv6_pos837(X,Y) get_gdat_ipv6((X),(Y),837)
+#define get_gdat_string_pos837(X,Y) get_gdat_string((X),(Y),837)
+#define get_gdat_v_str_pos837(X,Y) get_gdat_string((X),(Y),837)
+#define get_gdat_bool_pos837(X,Y) get_gdat_bool((X),(Y),837)
+#define get_gdat_int_pos837(X,Y) get_gdat_int((X),(Y),837)
+#define get_gdat_llong_pos837(X,Y) get_gdat_llong((X),(Y),837)
+#define get_gdat_float_pos837(X,Y) get_gdat_float((X),(Y),837)
+#define get_gdat_uint_pos838(X,Y) get_gdat_uint((X),(Y),838)
+#define get_gdat_ullong_pos838(X,Y) get_gdat_ullong((X),(Y),838)
+#define get_gdat_ip_pos838(X,Y) get_gdat_ip((X),(Y),838)
+#define get_gdat_ipv6_pos838(X,Y) get_gdat_ipv6((X),(Y),838)
+#define get_gdat_string_pos838(X,Y) get_gdat_string((X),(Y),838)
+#define get_gdat_v_str_pos838(X,Y) get_gdat_string((X),(Y),838)
+#define get_gdat_bool_pos838(X,Y) get_gdat_bool((X),(Y),838)
+#define get_gdat_int_pos838(X,Y) get_gdat_int((X),(Y),838)
+#define get_gdat_llong_pos838(X,Y) get_gdat_llong((X),(Y),838)
+#define get_gdat_float_pos838(X,Y) get_gdat_float((X),(Y),838)
+#define get_gdat_uint_pos839(X,Y) get_gdat_uint((X),(Y),839)
+#define get_gdat_ullong_pos839(X,Y) get_gdat_ullong((X),(Y),839)
+#define get_gdat_ip_pos839(X,Y) get_gdat_ip((X),(Y),839)
+#define get_gdat_ipv6_pos839(X,Y) get_gdat_ipv6((X),(Y),839)
+#define get_gdat_string_pos839(X,Y) get_gdat_string((X),(Y),839)
+#define get_gdat_v_str_pos839(X,Y) get_gdat_string((X),(Y),839)
+#define get_gdat_bool_pos839(X,Y) get_gdat_bool((X),(Y),839)
+#define get_gdat_int_pos839(X,Y) get_gdat_int((X),(Y),839)
+#define get_gdat_llong_pos839(X,Y) get_gdat_llong((X),(Y),839)
+#define get_gdat_float_pos839(X,Y) get_gdat_float((X),(Y),839)
+#define get_gdat_uint_pos840(X,Y) get_gdat_uint((X),(Y),840)
+#define get_gdat_ullong_pos840(X,Y) get_gdat_ullong((X),(Y),840)
+#define get_gdat_ip_pos840(X,Y) get_gdat_ip((X),(Y),840)
+#define get_gdat_ipv6_pos840(X,Y) get_gdat_ipv6((X),(Y),840)
+#define get_gdat_string_pos840(X,Y) get_gdat_string((X),(Y),840)
+#define get_gdat_v_str_pos840(X,Y) get_gdat_string((X),(Y),840)
+#define get_gdat_bool_pos840(X,Y) get_gdat_bool((X),(Y),840)
+#define get_gdat_int_pos840(X,Y) get_gdat_int((X),(Y),840)
+#define get_gdat_llong_pos840(X,Y) get_gdat_llong((X),(Y),840)
+#define get_gdat_float_pos840(X,Y) get_gdat_float((X),(Y),840)
+#define get_gdat_uint_pos841(X,Y) get_gdat_uint((X),(Y),841)
+#define get_gdat_ullong_pos841(X,Y) get_gdat_ullong((X),(Y),841)
+#define get_gdat_ip_pos841(X,Y) get_gdat_ip((X),(Y),841)
+#define get_gdat_ipv6_pos841(X,Y) get_gdat_ipv6((X),(Y),841)
+#define get_gdat_string_pos841(X,Y) get_gdat_string((X),(Y),841)
+#define get_gdat_v_str_pos841(X,Y) get_gdat_string((X),(Y),841)
+#define get_gdat_bool_pos841(X,Y) get_gdat_bool((X),(Y),841)
+#define get_gdat_int_pos841(X,Y) get_gdat_int((X),(Y),841)
+#define get_gdat_llong_pos841(X,Y) get_gdat_llong((X),(Y),841)
+#define get_gdat_float_pos841(X,Y) get_gdat_float((X),(Y),841)
+#define get_gdat_uint_pos842(X,Y) get_gdat_uint((X),(Y),842)
+#define get_gdat_ullong_pos842(X,Y) get_gdat_ullong((X),(Y),842)
+#define get_gdat_ip_pos842(X,Y) get_gdat_ip((X),(Y),842)
+#define get_gdat_ipv6_pos842(X,Y) get_gdat_ipv6((X),(Y),842)
+#define get_gdat_string_pos842(X,Y) get_gdat_string((X),(Y),842)
+#define get_gdat_v_str_pos842(X,Y) get_gdat_string((X),(Y),842)
+#define get_gdat_bool_pos842(X,Y) get_gdat_bool((X),(Y),842)
+#define get_gdat_int_pos842(X,Y) get_gdat_int((X),(Y),842)
+#define get_gdat_llong_pos842(X,Y) get_gdat_llong((X),(Y),842)
+#define get_gdat_float_pos842(X,Y) get_gdat_float((X),(Y),842)
+#define get_gdat_uint_pos843(X,Y) get_gdat_uint((X),(Y),843)
+#define get_gdat_ullong_pos843(X,Y) get_gdat_ullong((X),(Y),843)
+#define get_gdat_ip_pos843(X,Y) get_gdat_ip((X),(Y),843)
+#define get_gdat_ipv6_pos843(X,Y) get_gdat_ipv6((X),(Y),843)
+#define get_gdat_string_pos843(X,Y) get_gdat_string((X),(Y),843)
+#define get_gdat_v_str_pos843(X,Y) get_gdat_string((X),(Y),843)
+#define get_gdat_bool_pos843(X,Y) get_gdat_bool((X),(Y),843)
+#define get_gdat_int_pos843(X,Y) get_gdat_int((X),(Y),843)
+#define get_gdat_llong_pos843(X,Y) get_gdat_llong((X),(Y),843)
+#define get_gdat_float_pos843(X,Y) get_gdat_float((X),(Y),843)
+#define get_gdat_uint_pos844(X,Y) get_gdat_uint((X),(Y),844)
+#define get_gdat_ullong_pos844(X,Y) get_gdat_ullong((X),(Y),844)
+#define get_gdat_ip_pos844(X,Y) get_gdat_ip((X),(Y),844)
+#define get_gdat_ipv6_pos844(X,Y) get_gdat_ipv6((X),(Y),844)
+#define get_gdat_string_pos844(X,Y) get_gdat_string((X),(Y),844)
+#define get_gdat_v_str_pos844(X,Y) get_gdat_string((X),(Y),844)
+#define get_gdat_bool_pos844(X,Y) get_gdat_bool((X),(Y),844)
+#define get_gdat_int_pos844(X,Y) get_gdat_int((X),(Y),844)
+#define get_gdat_llong_pos844(X,Y) get_gdat_llong((X),(Y),844)
+#define get_gdat_float_pos844(X,Y) get_gdat_float((X),(Y),844)
+#define get_gdat_uint_pos845(X,Y) get_gdat_uint((X),(Y),845)
+#define get_gdat_ullong_pos845(X,Y) get_gdat_ullong((X),(Y),845)
+#define get_gdat_ip_pos845(X,Y) get_gdat_ip((X),(Y),845)
+#define get_gdat_ipv6_pos845(X,Y) get_gdat_ipv6((X),(Y),845)
+#define get_gdat_string_pos845(X,Y) get_gdat_string((X),(Y),845)
+#define get_gdat_v_str_pos845(X,Y) get_gdat_string((X),(Y),845)
+#define get_gdat_bool_pos845(X,Y) get_gdat_bool((X),(Y),845)
+#define get_gdat_int_pos845(X,Y) get_gdat_int((X),(Y),845)
+#define get_gdat_llong_pos845(X,Y) get_gdat_llong((X),(Y),845)
+#define get_gdat_float_pos845(X,Y) get_gdat_float((X),(Y),845)
+#define get_gdat_uint_pos846(X,Y) get_gdat_uint((X),(Y),846)
+#define get_gdat_ullong_pos846(X,Y) get_gdat_ullong((X),(Y),846)
+#define get_gdat_ip_pos846(X,Y) get_gdat_ip((X),(Y),846)
+#define get_gdat_ipv6_pos846(X,Y) get_gdat_ipv6((X),(Y),846)
+#define get_gdat_string_pos846(X,Y) get_gdat_string((X),(Y),846)
+#define get_gdat_v_str_pos846(X,Y) get_gdat_string((X),(Y),846)
+#define get_gdat_bool_pos846(X,Y) get_gdat_bool((X),(Y),846)
+#define get_gdat_int_pos846(X,Y) get_gdat_int((X),(Y),846)
+#define get_gdat_llong_pos846(X,Y) get_gdat_llong((X),(Y),846)
+#define get_gdat_float_pos846(X,Y) get_gdat_float((X),(Y),846)
+#define get_gdat_uint_pos847(X,Y) get_gdat_uint((X),(Y),847)
+#define get_gdat_ullong_pos847(X,Y) get_gdat_ullong((X),(Y),847)
+#define get_gdat_ip_pos847(X,Y) get_gdat_ip((X),(Y),847)
+#define get_gdat_ipv6_pos847(X,Y) get_gdat_ipv6((X),(Y),847)
+#define get_gdat_string_pos847(X,Y) get_gdat_string((X),(Y),847)
+#define get_gdat_v_str_pos847(X,Y) get_gdat_string((X),(Y),847)
+#define get_gdat_bool_pos847(X,Y) get_gdat_bool((X),(Y),847)
+#define get_gdat_int_pos847(X,Y) get_gdat_int((X),(Y),847)
+#define get_gdat_llong_pos847(X,Y) get_gdat_llong((X),(Y),847)
+#define get_gdat_float_pos847(X,Y) get_gdat_float((X),(Y),847)
+#define get_gdat_uint_pos848(X,Y) get_gdat_uint((X),(Y),848)
+#define get_gdat_ullong_pos848(X,Y) get_gdat_ullong((X),(Y),848)
+#define get_gdat_ip_pos848(X,Y) get_gdat_ip((X),(Y),848)
+#define get_gdat_ipv6_pos848(X,Y) get_gdat_ipv6((X),(Y),848)
+#define get_gdat_string_pos848(X,Y) get_gdat_string((X),(Y),848)
+#define get_gdat_v_str_pos848(X,Y) get_gdat_string((X),(Y),848)
+#define get_gdat_bool_pos848(X,Y) get_gdat_bool((X),(Y),848)
+#define get_gdat_int_pos848(X,Y) get_gdat_int((X),(Y),848)
+#define get_gdat_llong_pos848(X,Y) get_gdat_llong((X),(Y),848)
+#define get_gdat_float_pos848(X,Y) get_gdat_float((X),(Y),848)
+#define get_gdat_uint_pos849(X,Y) get_gdat_uint((X),(Y),849)
+#define get_gdat_ullong_pos849(X,Y) get_gdat_ullong((X),(Y),849)
+#define get_gdat_ip_pos849(X,Y) get_gdat_ip((X),(Y),849)
+#define get_gdat_ipv6_pos849(X,Y) get_gdat_ipv6((X),(Y),849)
+#define get_gdat_string_pos849(X,Y) get_gdat_string((X),(Y),849)
+#define get_gdat_v_str_pos849(X,Y) get_gdat_string((X),(Y),849)
+#define get_gdat_bool_pos849(X,Y) get_gdat_bool((X),(Y),849)
+#define get_gdat_int_pos849(X,Y) get_gdat_int((X),(Y),849)
+#define get_gdat_llong_pos849(X,Y) get_gdat_llong((X),(Y),849)
+#define get_gdat_float_pos849(X,Y) get_gdat_float((X),(Y),849)
+#define get_gdat_uint_pos850(X,Y) get_gdat_uint((X),(Y),850)
+#define get_gdat_ullong_pos850(X,Y) get_gdat_ullong((X),(Y),850)
+#define get_gdat_ip_pos850(X,Y) get_gdat_ip((X),(Y),850)
+#define get_gdat_ipv6_pos850(X,Y) get_gdat_ipv6((X),(Y),850)
+#define get_gdat_string_pos850(X,Y) get_gdat_string((X),(Y),850)
+#define get_gdat_v_str_pos850(X,Y) get_gdat_string((X),(Y),850)
+#define get_gdat_bool_pos850(X,Y) get_gdat_bool((X),(Y),850)
+#define get_gdat_int_pos850(X,Y) get_gdat_int((X),(Y),850)
+#define get_gdat_llong_pos850(X,Y) get_gdat_llong((X),(Y),850)
+#define get_gdat_float_pos850(X,Y) get_gdat_float((X),(Y),850)
+#define get_gdat_uint_pos851(X,Y) get_gdat_uint((X),(Y),851)
+#define get_gdat_ullong_pos851(X,Y) get_gdat_ullong((X),(Y),851)
+#define get_gdat_ip_pos851(X,Y) get_gdat_ip((X),(Y),851)
+#define get_gdat_ipv6_pos851(X,Y) get_gdat_ipv6((X),(Y),851)
+#define get_gdat_string_pos851(X,Y) get_gdat_string((X),(Y),851)
+#define get_gdat_v_str_pos851(X,Y) get_gdat_string((X),(Y),851)
+#define get_gdat_bool_pos851(X,Y) get_gdat_bool((X),(Y),851)
+#define get_gdat_int_pos851(X,Y) get_gdat_int((X),(Y),851)
+#define get_gdat_llong_pos851(X,Y) get_gdat_llong((X),(Y),851)
+#define get_gdat_float_pos851(X,Y) get_gdat_float((X),(Y),851)
+#define get_gdat_uint_pos852(X,Y) get_gdat_uint((X),(Y),852)
+#define get_gdat_ullong_pos852(X,Y) get_gdat_ullong((X),(Y),852)
+#define get_gdat_ip_pos852(X,Y) get_gdat_ip((X),(Y),852)
+#define get_gdat_ipv6_pos852(X,Y) get_gdat_ipv6((X),(Y),852)
+#define get_gdat_string_pos852(X,Y) get_gdat_string((X),(Y),852)
+#define get_gdat_v_str_pos852(X,Y) get_gdat_string((X),(Y),852)
+#define get_gdat_bool_pos852(X,Y) get_gdat_bool((X),(Y),852)
+#define get_gdat_int_pos852(X,Y) get_gdat_int((X),(Y),852)
+#define get_gdat_llong_pos852(X,Y) get_gdat_llong((X),(Y),852)
+#define get_gdat_float_pos852(X,Y) get_gdat_float((X),(Y),852)
+#define get_gdat_uint_pos853(X,Y) get_gdat_uint((X),(Y),853)
+#define get_gdat_ullong_pos853(X,Y) get_gdat_ullong((X),(Y),853)
+#define get_gdat_ip_pos853(X,Y) get_gdat_ip((X),(Y),853)
+#define get_gdat_ipv6_pos853(X,Y) get_gdat_ipv6((X),(Y),853)
+#define get_gdat_string_pos853(X,Y) get_gdat_string((X),(Y),853)
+#define get_gdat_v_str_pos853(X,Y) get_gdat_string((X),(Y),853)
+#define get_gdat_bool_pos853(X,Y) get_gdat_bool((X),(Y),853)
+#define get_gdat_int_pos853(X,Y) get_gdat_int((X),(Y),853)
+#define get_gdat_llong_pos853(X,Y) get_gdat_llong((X),(Y),853)
+#define get_gdat_float_pos853(X,Y) get_gdat_float((X),(Y),853)
+#define get_gdat_uint_pos854(X,Y) get_gdat_uint((X),(Y),854)
+#define get_gdat_ullong_pos854(X,Y) get_gdat_ullong((X),(Y),854)
+#define get_gdat_ip_pos854(X,Y) get_gdat_ip((X),(Y),854)
+#define get_gdat_ipv6_pos854(X,Y) get_gdat_ipv6((X),(Y),854)
+#define get_gdat_string_pos854(X,Y) get_gdat_string((X),(Y),854)
+#define get_gdat_v_str_pos854(X,Y) get_gdat_string((X),(Y),854)
+#define get_gdat_bool_pos854(X,Y) get_gdat_bool((X),(Y),854)
+#define get_gdat_int_pos854(X,Y) get_gdat_int((X),(Y),854)
+#define get_gdat_llong_pos854(X,Y) get_gdat_llong((X),(Y),854)
+#define get_gdat_float_pos854(X,Y) get_gdat_float((X),(Y),854)
+#define get_gdat_uint_pos855(X,Y) get_gdat_uint((X),(Y),855)
+#define get_gdat_ullong_pos855(X,Y) get_gdat_ullong((X),(Y),855)
+#define get_gdat_ip_pos855(X,Y) get_gdat_ip((X),(Y),855)
+#define get_gdat_ipv6_pos855(X,Y) get_gdat_ipv6((X),(Y),855)
+#define get_gdat_string_pos855(X,Y) get_gdat_string((X),(Y),855)
+#define get_gdat_v_str_pos855(X,Y) get_gdat_string((X),(Y),855)
+#define get_gdat_bool_pos855(X,Y) get_gdat_bool((X),(Y),855)
+#define get_gdat_int_pos855(X,Y) get_gdat_int((X),(Y),855)
+#define get_gdat_llong_pos855(X,Y) get_gdat_llong((X),(Y),855)
+#define get_gdat_float_pos855(X,Y) get_gdat_float((X),(Y),855)
+#define get_gdat_uint_pos856(X,Y) get_gdat_uint((X),(Y),856)
+#define get_gdat_ullong_pos856(X,Y) get_gdat_ullong((X),(Y),856)
+#define get_gdat_ip_pos856(X,Y) get_gdat_ip((X),(Y),856)
+#define get_gdat_ipv6_pos856(X,Y) get_gdat_ipv6((X),(Y),856)
+#define get_gdat_string_pos856(X,Y) get_gdat_string((X),(Y),856)
+#define get_gdat_v_str_pos856(X,Y) get_gdat_string((X),(Y),856)
+#define get_gdat_bool_pos856(X,Y) get_gdat_bool((X),(Y),856)
+#define get_gdat_int_pos856(X,Y) get_gdat_int((X),(Y),856)
+#define get_gdat_llong_pos856(X,Y) get_gdat_llong((X),(Y),856)
+#define get_gdat_float_pos856(X,Y) get_gdat_float((X),(Y),856)
+#define get_gdat_uint_pos857(X,Y) get_gdat_uint((X),(Y),857)
+#define get_gdat_ullong_pos857(X,Y) get_gdat_ullong((X),(Y),857)
+#define get_gdat_ip_pos857(X,Y) get_gdat_ip((X),(Y),857)
+#define get_gdat_ipv6_pos857(X,Y) get_gdat_ipv6((X),(Y),857)
+#define get_gdat_string_pos857(X,Y) get_gdat_string((X),(Y),857)
+#define get_gdat_v_str_pos857(X,Y) get_gdat_string((X),(Y),857)
+#define get_gdat_bool_pos857(X,Y) get_gdat_bool((X),(Y),857)
+#define get_gdat_int_pos857(X,Y) get_gdat_int((X),(Y),857)
+#define get_gdat_llong_pos857(X,Y) get_gdat_llong((X),(Y),857)
+#define get_gdat_float_pos857(X,Y) get_gdat_float((X),(Y),857)
+#define get_gdat_uint_pos858(X,Y) get_gdat_uint((X),(Y),858)
+#define get_gdat_ullong_pos858(X,Y) get_gdat_ullong((X),(Y),858)
+#define get_gdat_ip_pos858(X,Y) get_gdat_ip((X),(Y),858)
+#define get_gdat_ipv6_pos858(X,Y) get_gdat_ipv6((X),(Y),858)
+#define get_gdat_string_pos858(X,Y) get_gdat_string((X),(Y),858)
+#define get_gdat_v_str_pos858(X,Y) get_gdat_string((X),(Y),858)
+#define get_gdat_bool_pos858(X,Y) get_gdat_bool((X),(Y),858)
+#define get_gdat_int_pos858(X,Y) get_gdat_int((X),(Y),858)
+#define get_gdat_llong_pos858(X,Y) get_gdat_llong((X),(Y),858)
+#define get_gdat_float_pos858(X,Y) get_gdat_float((X),(Y),858)
+#define get_gdat_uint_pos859(X,Y) get_gdat_uint((X),(Y),859)
+#define get_gdat_ullong_pos859(X,Y) get_gdat_ullong((X),(Y),859)
+#define get_gdat_ip_pos859(X,Y) get_gdat_ip((X),(Y),859)
+#define get_gdat_ipv6_pos859(X,Y) get_gdat_ipv6((X),(Y),859)
+#define get_gdat_string_pos859(X,Y) get_gdat_string((X),(Y),859)
+#define get_gdat_v_str_pos859(X,Y) get_gdat_string((X),(Y),859)
+#define get_gdat_bool_pos859(X,Y) get_gdat_bool((X),(Y),859)
+#define get_gdat_int_pos859(X,Y) get_gdat_int((X),(Y),859)
+#define get_gdat_llong_pos859(X,Y) get_gdat_llong((X),(Y),859)
+#define get_gdat_float_pos859(X,Y) get_gdat_float((X),(Y),859)
+#define get_gdat_uint_pos860(X,Y) get_gdat_uint((X),(Y),860)
+#define get_gdat_ullong_pos860(X,Y) get_gdat_ullong((X),(Y),860)
+#define get_gdat_ip_pos860(X,Y) get_gdat_ip((X),(Y),860)
+#define get_gdat_ipv6_pos860(X,Y) get_gdat_ipv6((X),(Y),860)
+#define get_gdat_string_pos860(X,Y) get_gdat_string((X),(Y),860)
+#define get_gdat_v_str_pos860(X,Y) get_gdat_string((X),(Y),860)
+#define get_gdat_bool_pos860(X,Y) get_gdat_bool((X),(Y),860)
+#define get_gdat_int_pos860(X,Y) get_gdat_int((X),(Y),860)
+#define get_gdat_llong_pos860(X,Y) get_gdat_llong((X),(Y),860)
+#define get_gdat_float_pos860(X,Y) get_gdat_float((X),(Y),860)
+#define get_gdat_uint_pos861(X,Y) get_gdat_uint((X),(Y),861)
+#define get_gdat_ullong_pos861(X,Y) get_gdat_ullong((X),(Y),861)
+#define get_gdat_ip_pos861(X,Y) get_gdat_ip((X),(Y),861)
+#define get_gdat_ipv6_pos861(X,Y) get_gdat_ipv6((X),(Y),861)
+#define get_gdat_string_pos861(X,Y) get_gdat_string((X),(Y),861)
+#define get_gdat_v_str_pos861(X,Y) get_gdat_string((X),(Y),861)
+#define get_gdat_bool_pos861(X,Y) get_gdat_bool((X),(Y),861)
+#define get_gdat_int_pos861(X,Y) get_gdat_int((X),(Y),861)
+#define get_gdat_llong_pos861(X,Y) get_gdat_llong((X),(Y),861)
+#define get_gdat_float_pos861(X,Y) get_gdat_float((X),(Y),861)
+#define get_gdat_uint_pos862(X,Y) get_gdat_uint((X),(Y),862)
+#define get_gdat_ullong_pos862(X,Y) get_gdat_ullong((X),(Y),862)
+#define get_gdat_ip_pos862(X,Y) get_gdat_ip((X),(Y),862)
+#define get_gdat_ipv6_pos862(X,Y) get_gdat_ipv6((X),(Y),862)
+#define get_gdat_string_pos862(X,Y) get_gdat_string((X),(Y),862)
+#define get_gdat_v_str_pos862(X,Y) get_gdat_string((X),(Y),862)
+#define get_gdat_bool_pos862(X,Y) get_gdat_bool((X),(Y),862)
+#define get_gdat_int_pos862(X,Y) get_gdat_int((X),(Y),862)
+#define get_gdat_llong_pos862(X,Y) get_gdat_llong((X),(Y),862)
+#define get_gdat_float_pos862(X,Y) get_gdat_float((X),(Y),862)
+#define get_gdat_uint_pos863(X,Y) get_gdat_uint((X),(Y),863)
+#define get_gdat_ullong_pos863(X,Y) get_gdat_ullong((X),(Y),863)
+#define get_gdat_ip_pos863(X,Y) get_gdat_ip((X),(Y),863)
+#define get_gdat_ipv6_pos863(X,Y) get_gdat_ipv6((X),(Y),863)
+#define get_gdat_string_pos863(X,Y) get_gdat_string((X),(Y),863)
+#define get_gdat_v_str_pos863(X,Y) get_gdat_string((X),(Y),863)
+#define get_gdat_bool_pos863(X,Y) get_gdat_bool((X),(Y),863)
+#define get_gdat_int_pos863(X,Y) get_gdat_int((X),(Y),863)
+#define get_gdat_llong_pos863(X,Y) get_gdat_llong((X),(Y),863)
+#define get_gdat_float_pos863(X,Y) get_gdat_float((X),(Y),863)
+#define get_gdat_uint_pos864(X,Y) get_gdat_uint((X),(Y),864)
+#define get_gdat_ullong_pos864(X,Y) get_gdat_ullong((X),(Y),864)
+#define get_gdat_ip_pos864(X,Y) get_gdat_ip((X),(Y),864)
+#define get_gdat_ipv6_pos864(X,Y) get_gdat_ipv6((X),(Y),864)
+#define get_gdat_string_pos864(X,Y) get_gdat_string((X),(Y),864)
+#define get_gdat_v_str_pos864(X,Y) get_gdat_string((X),(Y),864)
+#define get_gdat_bool_pos864(X,Y) get_gdat_bool((X),(Y),864)
+#define get_gdat_int_pos864(X,Y) get_gdat_int((X),(Y),864)
+#define get_gdat_llong_pos864(X,Y) get_gdat_llong((X),(Y),864)
+#define get_gdat_float_pos864(X,Y) get_gdat_float((X),(Y),864)
+#define get_gdat_uint_pos865(X,Y) get_gdat_uint((X),(Y),865)
+#define get_gdat_ullong_pos865(X,Y) get_gdat_ullong((X),(Y),865)
+#define get_gdat_ip_pos865(X,Y) get_gdat_ip((X),(Y),865)
+#define get_gdat_ipv6_pos865(X,Y) get_gdat_ipv6((X),(Y),865)
+#define get_gdat_string_pos865(X,Y) get_gdat_string((X),(Y),865)
+#define get_gdat_v_str_pos865(X,Y) get_gdat_string((X),(Y),865)
+#define get_gdat_bool_pos865(X,Y) get_gdat_bool((X),(Y),865)
+#define get_gdat_int_pos865(X,Y) get_gdat_int((X),(Y),865)
+#define get_gdat_llong_pos865(X,Y) get_gdat_llong((X),(Y),865)
+#define get_gdat_float_pos865(X,Y) get_gdat_float((X),(Y),865)
+#define get_gdat_uint_pos866(X,Y) get_gdat_uint((X),(Y),866)
+#define get_gdat_ullong_pos866(X,Y) get_gdat_ullong((X),(Y),866)
+#define get_gdat_ip_pos866(X,Y) get_gdat_ip((X),(Y),866)
+#define get_gdat_ipv6_pos866(X,Y) get_gdat_ipv6((X),(Y),866)
+#define get_gdat_string_pos866(X,Y) get_gdat_string((X),(Y),866)
+#define get_gdat_v_str_pos866(X,Y) get_gdat_string((X),(Y),866)
+#define get_gdat_bool_pos866(X,Y) get_gdat_bool((X),(Y),866)
+#define get_gdat_int_pos866(X,Y) get_gdat_int((X),(Y),866)
+#define get_gdat_llong_pos866(X,Y) get_gdat_llong((X),(Y),866)
+#define get_gdat_float_pos866(X,Y) get_gdat_float((X),(Y),866)
+#define get_gdat_uint_pos867(X,Y) get_gdat_uint((X),(Y),867)
+#define get_gdat_ullong_pos867(X,Y) get_gdat_ullong((X),(Y),867)
+#define get_gdat_ip_pos867(X,Y) get_gdat_ip((X),(Y),867)
+#define get_gdat_ipv6_pos867(X,Y) get_gdat_ipv6((X),(Y),867)
+#define get_gdat_string_pos867(X,Y) get_gdat_string((X),(Y),867)
+#define get_gdat_v_str_pos867(X,Y) get_gdat_string((X),(Y),867)
+#define get_gdat_bool_pos867(X,Y) get_gdat_bool((X),(Y),867)
+#define get_gdat_int_pos867(X,Y) get_gdat_int((X),(Y),867)
+#define get_gdat_llong_pos867(X,Y) get_gdat_llong((X),(Y),867)
+#define get_gdat_float_pos867(X,Y) get_gdat_float((X),(Y),867)
+#define get_gdat_uint_pos868(X,Y) get_gdat_uint((X),(Y),868)
+#define get_gdat_ullong_pos868(X,Y) get_gdat_ullong((X),(Y),868)
+#define get_gdat_ip_pos868(X,Y) get_gdat_ip((X),(Y),868)
+#define get_gdat_ipv6_pos868(X,Y) get_gdat_ipv6((X),(Y),868)
+#define get_gdat_string_pos868(X,Y) get_gdat_string((X),(Y),868)
+#define get_gdat_v_str_pos868(X,Y) get_gdat_string((X),(Y),868)
+#define get_gdat_bool_pos868(X,Y) get_gdat_bool((X),(Y),868)
+#define get_gdat_int_pos868(X,Y) get_gdat_int((X),(Y),868)
+#define get_gdat_llong_pos868(X,Y) get_gdat_llong((X),(Y),868)
+#define get_gdat_float_pos868(X,Y) get_gdat_float((X),(Y),868)
+#define get_gdat_uint_pos869(X,Y) get_gdat_uint((X),(Y),869)
+#define get_gdat_ullong_pos869(X,Y) get_gdat_ullong((X),(Y),869)
+#define get_gdat_ip_pos869(X,Y) get_gdat_ip((X),(Y),869)
+#define get_gdat_ipv6_pos869(X,Y) get_gdat_ipv6((X),(Y),869)
+#define get_gdat_string_pos869(X,Y) get_gdat_string((X),(Y),869)
+#define get_gdat_v_str_pos869(X,Y) get_gdat_string((X),(Y),869)
+#define get_gdat_bool_pos869(X,Y) get_gdat_bool((X),(Y),869)
+#define get_gdat_int_pos869(X,Y) get_gdat_int((X),(Y),869)
+#define get_gdat_llong_pos869(X,Y) get_gdat_llong((X),(Y),869)
+#define get_gdat_float_pos869(X,Y) get_gdat_float((X),(Y),869)
+#define get_gdat_uint_pos870(X,Y) get_gdat_uint((X),(Y),870)
+#define get_gdat_ullong_pos870(X,Y) get_gdat_ullong((X),(Y),870)
+#define get_gdat_ip_pos870(X,Y) get_gdat_ip((X),(Y),870)
+#define get_gdat_ipv6_pos870(X,Y) get_gdat_ipv6((X),(Y),870)
+#define get_gdat_string_pos870(X,Y) get_gdat_string((X),(Y),870)
+#define get_gdat_v_str_pos870(X,Y) get_gdat_string((X),(Y),870)
+#define get_gdat_bool_pos870(X,Y) get_gdat_bool((X),(Y),870)
+#define get_gdat_int_pos870(X,Y) get_gdat_int((X),(Y),870)
+#define get_gdat_llong_pos870(X,Y) get_gdat_llong((X),(Y),870)
+#define get_gdat_float_pos870(X,Y) get_gdat_float((X),(Y),870)
+#define get_gdat_uint_pos871(X,Y) get_gdat_uint((X),(Y),871)
+#define get_gdat_ullong_pos871(X,Y) get_gdat_ullong((X),(Y),871)
+#define get_gdat_ip_pos871(X,Y) get_gdat_ip((X),(Y),871)
+#define get_gdat_ipv6_pos871(X,Y) get_gdat_ipv6((X),(Y),871)
+#define get_gdat_string_pos871(X,Y) get_gdat_string((X),(Y),871)
+#define get_gdat_v_str_pos871(X,Y) get_gdat_string((X),(Y),871)
+#define get_gdat_bool_pos871(X,Y) get_gdat_bool((X),(Y),871)
+#define get_gdat_int_pos871(X,Y) get_gdat_int((X),(Y),871)
+#define get_gdat_llong_pos871(X,Y) get_gdat_llong((X),(Y),871)
+#define get_gdat_float_pos871(X,Y) get_gdat_float((X),(Y),871)
+#define get_gdat_uint_pos872(X,Y) get_gdat_uint((X),(Y),872)
+#define get_gdat_ullong_pos872(X,Y) get_gdat_ullong((X),(Y),872)
+#define get_gdat_ip_pos872(X,Y) get_gdat_ip((X),(Y),872)
+#define get_gdat_ipv6_pos872(X,Y) get_gdat_ipv6((X),(Y),872)
+#define get_gdat_string_pos872(X,Y) get_gdat_string((X),(Y),872)
+#define get_gdat_v_str_pos872(X,Y) get_gdat_string((X),(Y),872)
+#define get_gdat_bool_pos872(X,Y) get_gdat_bool((X),(Y),872)
+#define get_gdat_int_pos872(X,Y) get_gdat_int((X),(Y),872)
+#define get_gdat_llong_pos872(X,Y) get_gdat_llong((X),(Y),872)
+#define get_gdat_float_pos872(X,Y) get_gdat_float((X),(Y),872)
+#define get_gdat_uint_pos873(X,Y) get_gdat_uint((X),(Y),873)
+#define get_gdat_ullong_pos873(X,Y) get_gdat_ullong((X),(Y),873)
+#define get_gdat_ip_pos873(X,Y) get_gdat_ip((X),(Y),873)
+#define get_gdat_ipv6_pos873(X,Y) get_gdat_ipv6((X),(Y),873)
+#define get_gdat_string_pos873(X,Y) get_gdat_string((X),(Y),873)
+#define get_gdat_v_str_pos873(X,Y) get_gdat_string((X),(Y),873)
+#define get_gdat_bool_pos873(X,Y) get_gdat_bool((X),(Y),873)
+#define get_gdat_int_pos873(X,Y) get_gdat_int((X),(Y),873)
+#define get_gdat_llong_pos873(X,Y) get_gdat_llong((X),(Y),873)
+#define get_gdat_float_pos873(X,Y) get_gdat_float((X),(Y),873)
+#define get_gdat_uint_pos874(X,Y) get_gdat_uint((X),(Y),874)
+#define get_gdat_ullong_pos874(X,Y) get_gdat_ullong((X),(Y),874)
+#define get_gdat_ip_pos874(X,Y) get_gdat_ip((X),(Y),874)
+#define get_gdat_ipv6_pos874(X,Y) get_gdat_ipv6((X),(Y),874)
+#define get_gdat_string_pos874(X,Y) get_gdat_string((X),(Y),874)
+#define get_gdat_v_str_pos874(X,Y) get_gdat_string((X),(Y),874)
+#define get_gdat_bool_pos874(X,Y) get_gdat_bool((X),(Y),874)
+#define get_gdat_int_pos874(X,Y) get_gdat_int((X),(Y),874)
+#define get_gdat_llong_pos874(X,Y) get_gdat_llong((X),(Y),874)
+#define get_gdat_float_pos874(X,Y) get_gdat_float((X),(Y),874)
+#define get_gdat_uint_pos875(X,Y) get_gdat_uint((X),(Y),875)
+#define get_gdat_ullong_pos875(X,Y) get_gdat_ullong((X),(Y),875)
+#define get_gdat_ip_pos875(X,Y) get_gdat_ip((X),(Y),875)
+#define get_gdat_ipv6_pos875(X,Y) get_gdat_ipv6((X),(Y),875)
+#define get_gdat_string_pos875(X,Y) get_gdat_string((X),(Y),875)
+#define get_gdat_v_str_pos875(X,Y) get_gdat_string((X),(Y),875)
+#define get_gdat_bool_pos875(X,Y) get_gdat_bool((X),(Y),875)
+#define get_gdat_int_pos875(X,Y) get_gdat_int((X),(Y),875)
+#define get_gdat_llong_pos875(X,Y) get_gdat_llong((X),(Y),875)
+#define get_gdat_float_pos875(X,Y) get_gdat_float((X),(Y),875)
+#define get_gdat_uint_pos876(X,Y) get_gdat_uint((X),(Y),876)
+#define get_gdat_ullong_pos876(X,Y) get_gdat_ullong((X),(Y),876)
+#define get_gdat_ip_pos876(X,Y) get_gdat_ip((X),(Y),876)
+#define get_gdat_ipv6_pos876(X,Y) get_gdat_ipv6((X),(Y),876)
+#define get_gdat_string_pos876(X,Y) get_gdat_string((X),(Y),876)
+#define get_gdat_v_str_pos876(X,Y) get_gdat_string((X),(Y),876)
+#define get_gdat_bool_pos876(X,Y) get_gdat_bool((X),(Y),876)
+#define get_gdat_int_pos876(X,Y) get_gdat_int((X),(Y),876)
+#define get_gdat_llong_pos876(X,Y) get_gdat_llong((X),(Y),876)
+#define get_gdat_float_pos876(X,Y) get_gdat_float((X),(Y),876)
+#define get_gdat_uint_pos877(X,Y) get_gdat_uint((X),(Y),877)
+#define get_gdat_ullong_pos877(X,Y) get_gdat_ullong((X),(Y),877)
+#define get_gdat_ip_pos877(X,Y) get_gdat_ip((X),(Y),877)
+#define get_gdat_ipv6_pos877(X,Y) get_gdat_ipv6((X),(Y),877)
+#define get_gdat_string_pos877(X,Y) get_gdat_string((X),(Y),877)
+#define get_gdat_v_str_pos877(X,Y) get_gdat_string((X),(Y),877)
+#define get_gdat_bool_pos877(X,Y) get_gdat_bool((X),(Y),877)
+#define get_gdat_int_pos877(X,Y) get_gdat_int((X),(Y),877)
+#define get_gdat_llong_pos877(X,Y) get_gdat_llong((X),(Y),877)
+#define get_gdat_float_pos877(X,Y) get_gdat_float((X),(Y),877)
+#define get_gdat_uint_pos878(X,Y) get_gdat_uint((X),(Y),878)
+#define get_gdat_ullong_pos878(X,Y) get_gdat_ullong((X),(Y),878)
+#define get_gdat_ip_pos878(X,Y) get_gdat_ip((X),(Y),878)
+#define get_gdat_ipv6_pos878(X,Y) get_gdat_ipv6((X),(Y),878)
+#define get_gdat_string_pos878(X,Y) get_gdat_string((X),(Y),878)
+#define get_gdat_v_str_pos878(X,Y) get_gdat_string((X),(Y),878)
+#define get_gdat_bool_pos878(X,Y) get_gdat_bool((X),(Y),878)
+#define get_gdat_int_pos878(X,Y) get_gdat_int((X),(Y),878)
+#define get_gdat_llong_pos878(X,Y) get_gdat_llong((X),(Y),878)
+#define get_gdat_float_pos878(X,Y) get_gdat_float((X),(Y),878)
+#define get_gdat_uint_pos879(X,Y) get_gdat_uint((X),(Y),879)
+#define get_gdat_ullong_pos879(X,Y) get_gdat_ullong((X),(Y),879)
+#define get_gdat_ip_pos879(X,Y) get_gdat_ip((X),(Y),879)
+#define get_gdat_ipv6_pos879(X,Y) get_gdat_ipv6((X),(Y),879)
+#define get_gdat_string_pos879(X,Y) get_gdat_string((X),(Y),879)
+#define get_gdat_v_str_pos879(X,Y) get_gdat_string((X),(Y),879)
+#define get_gdat_bool_pos879(X,Y) get_gdat_bool((X),(Y),879)
+#define get_gdat_int_pos879(X,Y) get_gdat_int((X),(Y),879)
+#define get_gdat_llong_pos879(X,Y) get_gdat_llong((X),(Y),879)
+#define get_gdat_float_pos879(X,Y) get_gdat_float((X),(Y),879)
+#define get_gdat_uint_pos880(X,Y) get_gdat_uint((X),(Y),880)
+#define get_gdat_ullong_pos880(X,Y) get_gdat_ullong((X),(Y),880)
+#define get_gdat_ip_pos880(X,Y) get_gdat_ip((X),(Y),880)
+#define get_gdat_ipv6_pos880(X,Y) get_gdat_ipv6((X),(Y),880)
+#define get_gdat_string_pos880(X,Y) get_gdat_string((X),(Y),880)
+#define get_gdat_v_str_pos880(X,Y) get_gdat_string((X),(Y),880)
+#define get_gdat_bool_pos880(X,Y) get_gdat_bool((X),(Y),880)
+#define get_gdat_int_pos880(X,Y) get_gdat_int((X),(Y),880)
+#define get_gdat_llong_pos880(X,Y) get_gdat_llong((X),(Y),880)
+#define get_gdat_float_pos880(X,Y) get_gdat_float((X),(Y),880)
+#define get_gdat_uint_pos881(X,Y) get_gdat_uint((X),(Y),881)
+#define get_gdat_ullong_pos881(X,Y) get_gdat_ullong((X),(Y),881)
+#define get_gdat_ip_pos881(X,Y) get_gdat_ip((X),(Y),881)
+#define get_gdat_ipv6_pos881(X,Y) get_gdat_ipv6((X),(Y),881)
+#define get_gdat_string_pos881(X,Y) get_gdat_string((X),(Y),881)
+#define get_gdat_v_str_pos881(X,Y) get_gdat_string((X),(Y),881)
+#define get_gdat_bool_pos881(X,Y) get_gdat_bool((X),(Y),881)
+#define get_gdat_int_pos881(X,Y) get_gdat_int((X),(Y),881)
+#define get_gdat_llong_pos881(X,Y) get_gdat_llong((X),(Y),881)
+#define get_gdat_float_pos881(X,Y) get_gdat_float((X),(Y),881)
+#define get_gdat_uint_pos882(X,Y) get_gdat_uint((X),(Y),882)
+#define get_gdat_ullong_pos882(X,Y) get_gdat_ullong((X),(Y),882)
+#define get_gdat_ip_pos882(X,Y) get_gdat_ip((X),(Y),882)
+#define get_gdat_ipv6_pos882(X,Y) get_gdat_ipv6((X),(Y),882)
+#define get_gdat_string_pos882(X,Y) get_gdat_string((X),(Y),882)
+#define get_gdat_v_str_pos882(X,Y) get_gdat_string((X),(Y),882)
+#define get_gdat_bool_pos882(X,Y) get_gdat_bool((X),(Y),882)
+#define get_gdat_int_pos882(X,Y) get_gdat_int((X),(Y),882)
+#define get_gdat_llong_pos882(X,Y) get_gdat_llong((X),(Y),882)
+#define get_gdat_float_pos882(X,Y) get_gdat_float((X),(Y),882)
+#define get_gdat_uint_pos883(X,Y) get_gdat_uint((X),(Y),883)
+#define get_gdat_ullong_pos883(X,Y) get_gdat_ullong((X),(Y),883)
+#define get_gdat_ip_pos883(X,Y) get_gdat_ip((X),(Y),883)
+#define get_gdat_ipv6_pos883(X,Y) get_gdat_ipv6((X),(Y),883)
+#define get_gdat_string_pos883(X,Y) get_gdat_string((X),(Y),883)
+#define get_gdat_v_str_pos883(X,Y) get_gdat_string((X),(Y),883)
+#define get_gdat_bool_pos883(X,Y) get_gdat_bool((X),(Y),883)
+#define get_gdat_int_pos883(X,Y) get_gdat_int((X),(Y),883)
+#define get_gdat_llong_pos883(X,Y) get_gdat_llong((X),(Y),883)
+#define get_gdat_float_pos883(X,Y) get_gdat_float((X),(Y),883)
+#define get_gdat_uint_pos884(X,Y) get_gdat_uint((X),(Y),884)
+#define get_gdat_ullong_pos884(X,Y) get_gdat_ullong((X),(Y),884)
+#define get_gdat_ip_pos884(X,Y) get_gdat_ip((X),(Y),884)
+#define get_gdat_ipv6_pos884(X,Y) get_gdat_ipv6((X),(Y),884)
+#define get_gdat_string_pos884(X,Y) get_gdat_string((X),(Y),884)
+#define get_gdat_v_str_pos884(X,Y) get_gdat_string((X),(Y),884)
+#define get_gdat_bool_pos884(X,Y) get_gdat_bool((X),(Y),884)
+#define get_gdat_int_pos884(X,Y) get_gdat_int((X),(Y),884)
+#define get_gdat_llong_pos884(X,Y) get_gdat_llong((X),(Y),884)
+#define get_gdat_float_pos884(X,Y) get_gdat_float((X),(Y),884)
+#define get_gdat_uint_pos885(X,Y) get_gdat_uint((X),(Y),885)
+#define get_gdat_ullong_pos885(X,Y) get_gdat_ullong((X),(Y),885)
+#define get_gdat_ip_pos885(X,Y) get_gdat_ip((X),(Y),885)
+#define get_gdat_ipv6_pos885(X,Y) get_gdat_ipv6((X),(Y),885)
+#define get_gdat_string_pos885(X,Y) get_gdat_string((X),(Y),885)
+#define get_gdat_v_str_pos885(X,Y) get_gdat_string((X),(Y),885)
+#define get_gdat_bool_pos885(X,Y) get_gdat_bool((X),(Y),885)
+#define get_gdat_int_pos885(X,Y) get_gdat_int((X),(Y),885)
+#define get_gdat_llong_pos885(X,Y) get_gdat_llong((X),(Y),885)
+#define get_gdat_float_pos885(X,Y) get_gdat_float((X),(Y),885)
+#define get_gdat_uint_pos886(X,Y) get_gdat_uint((X),(Y),886)
+#define get_gdat_ullong_pos886(X,Y) get_gdat_ullong((X),(Y),886)
+#define get_gdat_ip_pos886(X,Y) get_gdat_ip((X),(Y),886)
+#define get_gdat_ipv6_pos886(X,Y) get_gdat_ipv6((X),(Y),886)
+#define get_gdat_string_pos886(X,Y) get_gdat_string((X),(Y),886)
+#define get_gdat_v_str_pos886(X,Y) get_gdat_string((X),(Y),886)
+#define get_gdat_bool_pos886(X,Y) get_gdat_bool((X),(Y),886)
+#define get_gdat_int_pos886(X,Y) get_gdat_int((X),(Y),886)
+#define get_gdat_llong_pos886(X,Y) get_gdat_llong((X),(Y),886)
+#define get_gdat_float_pos886(X,Y) get_gdat_float((X),(Y),886)
+#define get_gdat_uint_pos887(X,Y) get_gdat_uint((X),(Y),887)
+#define get_gdat_ullong_pos887(X,Y) get_gdat_ullong((X),(Y),887)
+#define get_gdat_ip_pos887(X,Y) get_gdat_ip((X),(Y),887)
+#define get_gdat_ipv6_pos887(X,Y) get_gdat_ipv6((X),(Y),887)
+#define get_gdat_string_pos887(X,Y) get_gdat_string((X),(Y),887)
+#define get_gdat_v_str_pos887(X,Y) get_gdat_string((X),(Y),887)
+#define get_gdat_bool_pos887(X,Y) get_gdat_bool((X),(Y),887)
+#define get_gdat_int_pos887(X,Y) get_gdat_int((X),(Y),887)
+#define get_gdat_llong_pos887(X,Y) get_gdat_llong((X),(Y),887)
+#define get_gdat_float_pos887(X,Y) get_gdat_float((X),(Y),887)
+#define get_gdat_uint_pos888(X,Y) get_gdat_uint((X),(Y),888)
+#define get_gdat_ullong_pos888(X,Y) get_gdat_ullong((X),(Y),888)
+#define get_gdat_ip_pos888(X,Y) get_gdat_ip((X),(Y),888)
+#define get_gdat_ipv6_pos888(X,Y) get_gdat_ipv6((X),(Y),888)
+#define get_gdat_string_pos888(X,Y) get_gdat_string((X),(Y),888)
+#define get_gdat_v_str_pos888(X,Y) get_gdat_string((X),(Y),888)
+#define get_gdat_bool_pos888(X,Y) get_gdat_bool((X),(Y),888)
+#define get_gdat_int_pos888(X,Y) get_gdat_int((X),(Y),888)
+#define get_gdat_llong_pos888(X,Y) get_gdat_llong((X),(Y),888)
+#define get_gdat_float_pos888(X,Y) get_gdat_float((X),(Y),888)
+#define get_gdat_uint_pos889(X,Y) get_gdat_uint((X),(Y),889)
+#define get_gdat_ullong_pos889(X,Y) get_gdat_ullong((X),(Y),889)
+#define get_gdat_ip_pos889(X,Y) get_gdat_ip((X),(Y),889)
+#define get_gdat_ipv6_pos889(X,Y) get_gdat_ipv6((X),(Y),889)
+#define get_gdat_string_pos889(X,Y) get_gdat_string((X),(Y),889)
+#define get_gdat_v_str_pos889(X,Y) get_gdat_string((X),(Y),889)
+#define get_gdat_bool_pos889(X,Y) get_gdat_bool((X),(Y),889)
+#define get_gdat_int_pos889(X,Y) get_gdat_int((X),(Y),889)
+#define get_gdat_llong_pos889(X,Y) get_gdat_llong((X),(Y),889)
+#define get_gdat_float_pos889(X,Y) get_gdat_float((X),(Y),889)
+#define get_gdat_uint_pos890(X,Y) get_gdat_uint((X),(Y),890)
+#define get_gdat_ullong_pos890(X,Y) get_gdat_ullong((X),(Y),890)
+#define get_gdat_ip_pos890(X,Y) get_gdat_ip((X),(Y),890)
+#define get_gdat_ipv6_pos890(X,Y) get_gdat_ipv6((X),(Y),890)
+#define get_gdat_string_pos890(X,Y) get_gdat_string((X),(Y),890)
+#define get_gdat_v_str_pos890(X,Y) get_gdat_string((X),(Y),890)
+#define get_gdat_bool_pos890(X,Y) get_gdat_bool((X),(Y),890)
+#define get_gdat_int_pos890(X,Y) get_gdat_int((X),(Y),890)
+#define get_gdat_llong_pos890(X,Y) get_gdat_llong((X),(Y),890)
+#define get_gdat_float_pos890(X,Y) get_gdat_float((X),(Y),890)
+#define get_gdat_uint_pos891(X,Y) get_gdat_uint((X),(Y),891)
+#define get_gdat_ullong_pos891(X,Y) get_gdat_ullong((X),(Y),891)
+#define get_gdat_ip_pos891(X,Y) get_gdat_ip((X),(Y),891)
+#define get_gdat_ipv6_pos891(X,Y) get_gdat_ipv6((X),(Y),891)
+#define get_gdat_string_pos891(X,Y) get_gdat_string((X),(Y),891)
+#define get_gdat_v_str_pos891(X,Y) get_gdat_string((X),(Y),891)
+#define get_gdat_bool_pos891(X,Y) get_gdat_bool((X),(Y),891)
+#define get_gdat_int_pos891(X,Y) get_gdat_int((X),(Y),891)
+#define get_gdat_llong_pos891(X,Y) get_gdat_llong((X),(Y),891)
+#define get_gdat_float_pos891(X,Y) get_gdat_float((X),(Y),891)
+#define get_gdat_uint_pos892(X,Y) get_gdat_uint((X),(Y),892)
+#define get_gdat_ullong_pos892(X,Y) get_gdat_ullong((X),(Y),892)
+#define get_gdat_ip_pos892(X,Y) get_gdat_ip((X),(Y),892)
+#define get_gdat_ipv6_pos892(X,Y) get_gdat_ipv6((X),(Y),892)
+#define get_gdat_string_pos892(X,Y) get_gdat_string((X),(Y),892)
+#define get_gdat_v_str_pos892(X,Y) get_gdat_string((X),(Y),892)
+#define get_gdat_bool_pos892(X,Y) get_gdat_bool((X),(Y),892)
+#define get_gdat_int_pos892(X,Y) get_gdat_int((X),(Y),892)
+#define get_gdat_llong_pos892(X,Y) get_gdat_llong((X),(Y),892)
+#define get_gdat_float_pos892(X,Y) get_gdat_float((X),(Y),892)
+#define get_gdat_uint_pos893(X,Y) get_gdat_uint((X),(Y),893)
+#define get_gdat_ullong_pos893(X,Y) get_gdat_ullong((X),(Y),893)
+#define get_gdat_ip_pos893(X,Y) get_gdat_ip((X),(Y),893)
+#define get_gdat_ipv6_pos893(X,Y) get_gdat_ipv6((X),(Y),893)
+#define get_gdat_string_pos893(X,Y) get_gdat_string((X),(Y),893)
+#define get_gdat_v_str_pos893(X,Y) get_gdat_string((X),(Y),893)
+#define get_gdat_bool_pos893(X,Y) get_gdat_bool((X),(Y),893)
+#define get_gdat_int_pos893(X,Y) get_gdat_int((X),(Y),893)
+#define get_gdat_llong_pos893(X,Y) get_gdat_llong((X),(Y),893)
+#define get_gdat_float_pos893(X,Y) get_gdat_float((X),(Y),893)
+#define get_gdat_uint_pos894(X,Y) get_gdat_uint((X),(Y),894)
+#define get_gdat_ullong_pos894(X,Y) get_gdat_ullong((X),(Y),894)
+#define get_gdat_ip_pos894(X,Y) get_gdat_ip((X),(Y),894)
+#define get_gdat_ipv6_pos894(X,Y) get_gdat_ipv6((X),(Y),894)
+#define get_gdat_string_pos894(X,Y) get_gdat_string((X),(Y),894)
+#define get_gdat_v_str_pos894(X,Y) get_gdat_string((X),(Y),894)
+#define get_gdat_bool_pos894(X,Y) get_gdat_bool((X),(Y),894)
+#define get_gdat_int_pos894(X,Y) get_gdat_int((X),(Y),894)
+#define get_gdat_llong_pos894(X,Y) get_gdat_llong((X),(Y),894)
+#define get_gdat_float_pos894(X,Y) get_gdat_float((X),(Y),894)
+#define get_gdat_uint_pos895(X,Y) get_gdat_uint((X),(Y),895)
+#define get_gdat_ullong_pos895(X,Y) get_gdat_ullong((X),(Y),895)
+#define get_gdat_ip_pos895(X,Y) get_gdat_ip((X),(Y),895)
+#define get_gdat_ipv6_pos895(X,Y) get_gdat_ipv6((X),(Y),895)
+#define get_gdat_string_pos895(X,Y) get_gdat_string((X),(Y),895)
+#define get_gdat_v_str_pos895(X,Y) get_gdat_string((X),(Y),895)
+#define get_gdat_bool_pos895(X,Y) get_gdat_bool((X),(Y),895)
+#define get_gdat_int_pos895(X,Y) get_gdat_int((X),(Y),895)
+#define get_gdat_llong_pos895(X,Y) get_gdat_llong((X),(Y),895)
+#define get_gdat_float_pos895(X,Y) get_gdat_float((X),(Y),895)
+#define get_gdat_uint_pos896(X,Y) get_gdat_uint((X),(Y),896)
+#define get_gdat_ullong_pos896(X,Y) get_gdat_ullong((X),(Y),896)
+#define get_gdat_ip_pos896(X,Y) get_gdat_ip((X),(Y),896)
+#define get_gdat_ipv6_pos896(X,Y) get_gdat_ipv6((X),(Y),896)
+#define get_gdat_string_pos896(X,Y) get_gdat_string((X),(Y),896)
+#define get_gdat_v_str_pos896(X,Y) get_gdat_string((X),(Y),896)
+#define get_gdat_bool_pos896(X,Y) get_gdat_bool((X),(Y),896)
+#define get_gdat_int_pos896(X,Y) get_gdat_int((X),(Y),896)
+#define get_gdat_llong_pos896(X,Y) get_gdat_llong((X),(Y),896)
+#define get_gdat_float_pos896(X,Y) get_gdat_float((X),(Y),896)
+#define get_gdat_uint_pos897(X,Y) get_gdat_uint((X),(Y),897)
+#define get_gdat_ullong_pos897(X,Y) get_gdat_ullong((X),(Y),897)
+#define get_gdat_ip_pos897(X,Y) get_gdat_ip((X),(Y),897)
+#define get_gdat_ipv6_pos897(X,Y) get_gdat_ipv6((X),(Y),897)
+#define get_gdat_string_pos897(X,Y) get_gdat_string((X),(Y),897)
+#define get_gdat_v_str_pos897(X,Y) get_gdat_string((X),(Y),897)
+#define get_gdat_bool_pos897(X,Y) get_gdat_bool((X),(Y),897)
+#define get_gdat_int_pos897(X,Y) get_gdat_int((X),(Y),897)
+#define get_gdat_llong_pos897(X,Y) get_gdat_llong((X),(Y),897)
+#define get_gdat_float_pos897(X,Y) get_gdat_float((X),(Y),897)
+#define get_gdat_uint_pos898(X,Y) get_gdat_uint((X),(Y),898)
+#define get_gdat_ullong_pos898(X,Y) get_gdat_ullong((X),(Y),898)
+#define get_gdat_ip_pos898(X,Y) get_gdat_ip((X),(Y),898)
+#define get_gdat_ipv6_pos898(X,Y) get_gdat_ipv6((X),(Y),898)
+#define get_gdat_string_pos898(X,Y) get_gdat_string((X),(Y),898)
+#define get_gdat_v_str_pos898(X,Y) get_gdat_string((X),(Y),898)
+#define get_gdat_bool_pos898(X,Y) get_gdat_bool((X),(Y),898)
+#define get_gdat_int_pos898(X,Y) get_gdat_int((X),(Y),898)
+#define get_gdat_llong_pos898(X,Y) get_gdat_llong((X),(Y),898)
+#define get_gdat_float_pos898(X,Y) get_gdat_float((X),(Y),898)
+#define get_gdat_uint_pos899(X,Y) get_gdat_uint((X),(Y),899)
+#define get_gdat_ullong_pos899(X,Y) get_gdat_ullong((X),(Y),899)
+#define get_gdat_ip_pos899(X,Y) get_gdat_ip((X),(Y),899)
+#define get_gdat_ipv6_pos899(X,Y) get_gdat_ipv6((X),(Y),899)
+#define get_gdat_string_pos899(X,Y) get_gdat_string((X),(Y),899)
+#define get_gdat_v_str_pos899(X,Y) get_gdat_string((X),(Y),899)
+#define get_gdat_bool_pos899(X,Y) get_gdat_bool((X),(Y),899)
+#define get_gdat_int_pos899(X,Y) get_gdat_int((X),(Y),899)
+#define get_gdat_llong_pos899(X,Y) get_gdat_llong((X),(Y),899)
+#define get_gdat_float_pos899(X,Y) get_gdat_float((X),(Y),899)
+#define get_gdat_uint_pos900(X,Y) get_gdat_uint((X),(Y),900)
+#define get_gdat_ullong_pos900(X,Y) get_gdat_ullong((X),(Y),900)
+#define get_gdat_ip_pos900(X,Y) get_gdat_ip((X),(Y),900)
+#define get_gdat_ipv6_pos900(X,Y) get_gdat_ipv6((X),(Y),900)
+#define get_gdat_string_pos900(X,Y) get_gdat_string((X),(Y),900)
+#define get_gdat_v_str_pos900(X,Y) get_gdat_string((X),(Y),900)
+#define get_gdat_bool_pos900(X,Y) get_gdat_bool((X),(Y),900)
+#define get_gdat_int_pos900(X,Y) get_gdat_int((X),(Y),900)
+#define get_gdat_llong_pos900(X,Y) get_gdat_llong((X),(Y),900)
+#define get_gdat_float_pos900(X,Y) get_gdat_float((X),(Y),900)
+#define get_gdat_uint_pos901(X,Y) get_gdat_uint((X),(Y),901)
+#define get_gdat_ullong_pos901(X,Y) get_gdat_ullong((X),(Y),901)
+#define get_gdat_ip_pos901(X,Y) get_gdat_ip((X),(Y),901)
+#define get_gdat_ipv6_pos901(X,Y) get_gdat_ipv6((X),(Y),901)
+#define get_gdat_string_pos901(X,Y) get_gdat_string((X),(Y),901)
+#define get_gdat_v_str_pos901(X,Y) get_gdat_string((X),(Y),901)
+#define get_gdat_bool_pos901(X,Y) get_gdat_bool((X),(Y),901)
+#define get_gdat_int_pos901(X,Y) get_gdat_int((X),(Y),901)
+#define get_gdat_llong_pos901(X,Y) get_gdat_llong((X),(Y),901)
+#define get_gdat_float_pos901(X,Y) get_gdat_float((X),(Y),901)
+#define get_gdat_uint_pos902(X,Y) get_gdat_uint((X),(Y),902)
+#define get_gdat_ullong_pos902(X,Y) get_gdat_ullong((X),(Y),902)
+#define get_gdat_ip_pos902(X,Y) get_gdat_ip((X),(Y),902)
+#define get_gdat_ipv6_pos902(X,Y) get_gdat_ipv6((X),(Y),902)
+#define get_gdat_string_pos902(X,Y) get_gdat_string((X),(Y),902)
+#define get_gdat_v_str_pos902(X,Y) get_gdat_string((X),(Y),902)
+#define get_gdat_bool_pos902(X,Y) get_gdat_bool((X),(Y),902)
+#define get_gdat_int_pos902(X,Y) get_gdat_int((X),(Y),902)
+#define get_gdat_llong_pos902(X,Y) get_gdat_llong((X),(Y),902)
+#define get_gdat_float_pos902(X,Y) get_gdat_float((X),(Y),902)
+#define get_gdat_uint_pos903(X,Y) get_gdat_uint((X),(Y),903)
+#define get_gdat_ullong_pos903(X,Y) get_gdat_ullong((X),(Y),903)
+#define get_gdat_ip_pos903(X,Y) get_gdat_ip((X),(Y),903)
+#define get_gdat_ipv6_pos903(X,Y) get_gdat_ipv6((X),(Y),903)
+#define get_gdat_string_pos903(X,Y) get_gdat_string((X),(Y),903)
+#define get_gdat_v_str_pos903(X,Y) get_gdat_string((X),(Y),903)
+#define get_gdat_bool_pos903(X,Y) get_gdat_bool((X),(Y),903)
+#define get_gdat_int_pos903(X,Y) get_gdat_int((X),(Y),903)
+#define get_gdat_llong_pos903(X,Y) get_gdat_llong((X),(Y),903)
+#define get_gdat_float_pos903(X,Y) get_gdat_float((X),(Y),903)
+#define get_gdat_uint_pos904(X,Y) get_gdat_uint((X),(Y),904)
+#define get_gdat_ullong_pos904(X,Y) get_gdat_ullong((X),(Y),904)
+#define get_gdat_ip_pos904(X,Y) get_gdat_ip((X),(Y),904)
+#define get_gdat_ipv6_pos904(X,Y) get_gdat_ipv6((X),(Y),904)
+#define get_gdat_string_pos904(X,Y) get_gdat_string((X),(Y),904)
+#define get_gdat_v_str_pos904(X,Y) get_gdat_string((X),(Y),904)
+#define get_gdat_bool_pos904(X,Y) get_gdat_bool((X),(Y),904)
+#define get_gdat_int_pos904(X,Y) get_gdat_int((X),(Y),904)
+#define get_gdat_llong_pos904(X,Y) get_gdat_llong((X),(Y),904)
+#define get_gdat_float_pos904(X,Y) get_gdat_float((X),(Y),904)
+#define get_gdat_uint_pos905(X,Y) get_gdat_uint((X),(Y),905)
+#define get_gdat_ullong_pos905(X,Y) get_gdat_ullong((X),(Y),905)
+#define get_gdat_ip_pos905(X,Y) get_gdat_ip((X),(Y),905)
+#define get_gdat_ipv6_pos905(X,Y) get_gdat_ipv6((X),(Y),905)
+#define get_gdat_string_pos905(X,Y) get_gdat_string((X),(Y),905)
+#define get_gdat_v_str_pos905(X,Y) get_gdat_string((X),(Y),905)
+#define get_gdat_bool_pos905(X,Y) get_gdat_bool((X),(Y),905)
+#define get_gdat_int_pos905(X,Y) get_gdat_int((X),(Y),905)
+#define get_gdat_llong_pos905(X,Y) get_gdat_llong((X),(Y),905)
+#define get_gdat_float_pos905(X,Y) get_gdat_float((X),(Y),905)
+#define get_gdat_uint_pos906(X,Y) get_gdat_uint((X),(Y),906)
+#define get_gdat_ullong_pos906(X,Y) get_gdat_ullong((X),(Y),906)
+#define get_gdat_ip_pos906(X,Y) get_gdat_ip((X),(Y),906)
+#define get_gdat_ipv6_pos906(X,Y) get_gdat_ipv6((X),(Y),906)
+#define get_gdat_string_pos906(X,Y) get_gdat_string((X),(Y),906)
+#define get_gdat_v_str_pos906(X,Y) get_gdat_string((X),(Y),906)
+#define get_gdat_bool_pos906(X,Y) get_gdat_bool((X),(Y),906)
+#define get_gdat_int_pos906(X,Y) get_gdat_int((X),(Y),906)
+#define get_gdat_llong_pos906(X,Y) get_gdat_llong((X),(Y),906)
+#define get_gdat_float_pos906(X,Y) get_gdat_float((X),(Y),906)
+#define get_gdat_uint_pos907(X,Y) get_gdat_uint((X),(Y),907)
+#define get_gdat_ullong_pos907(X,Y) get_gdat_ullong((X),(Y),907)
+#define get_gdat_ip_pos907(X,Y) get_gdat_ip((X),(Y),907)
+#define get_gdat_ipv6_pos907(X,Y) get_gdat_ipv6((X),(Y),907)
+#define get_gdat_string_pos907(X,Y) get_gdat_string((X),(Y),907)
+#define get_gdat_v_str_pos907(X,Y) get_gdat_string((X),(Y),907)
+#define get_gdat_bool_pos907(X,Y) get_gdat_bool((X),(Y),907)
+#define get_gdat_int_pos907(X,Y) get_gdat_int((X),(Y),907)
+#define get_gdat_llong_pos907(X,Y) get_gdat_llong((X),(Y),907)
+#define get_gdat_float_pos907(X,Y) get_gdat_float((X),(Y),907)
+#define get_gdat_uint_pos908(X,Y) get_gdat_uint((X),(Y),908)
+#define get_gdat_ullong_pos908(X,Y) get_gdat_ullong((X),(Y),908)
+#define get_gdat_ip_pos908(X,Y) get_gdat_ip((X),(Y),908)
+#define get_gdat_ipv6_pos908(X,Y) get_gdat_ipv6((X),(Y),908)
+#define get_gdat_string_pos908(X,Y) get_gdat_string((X),(Y),908)
+#define get_gdat_v_str_pos908(X,Y) get_gdat_string((X),(Y),908)
+#define get_gdat_bool_pos908(X,Y) get_gdat_bool((X),(Y),908)
+#define get_gdat_int_pos908(X,Y) get_gdat_int((X),(Y),908)
+#define get_gdat_llong_pos908(X,Y) get_gdat_llong((X),(Y),908)
+#define get_gdat_float_pos908(X,Y) get_gdat_float((X),(Y),908)
+#define get_gdat_uint_pos909(X,Y) get_gdat_uint((X),(Y),909)
+#define get_gdat_ullong_pos909(X,Y) get_gdat_ullong((X),(Y),909)
+#define get_gdat_ip_pos909(X,Y) get_gdat_ip((X),(Y),909)
+#define get_gdat_ipv6_pos909(X,Y) get_gdat_ipv6((X),(Y),909)
+#define get_gdat_string_pos909(X,Y) get_gdat_string((X),(Y),909)
+#define get_gdat_v_str_pos909(X,Y) get_gdat_string((X),(Y),909)
+#define get_gdat_bool_pos909(X,Y) get_gdat_bool((X),(Y),909)
+#define get_gdat_int_pos909(X,Y) get_gdat_int((X),(Y),909)
+#define get_gdat_llong_pos909(X,Y) get_gdat_llong((X),(Y),909)
+#define get_gdat_float_pos909(X,Y) get_gdat_float((X),(Y),909)
+#define get_gdat_uint_pos910(X,Y) get_gdat_uint((X),(Y),910)
+#define get_gdat_ullong_pos910(X,Y) get_gdat_ullong((X),(Y),910)
+#define get_gdat_ip_pos910(X,Y) get_gdat_ip((X),(Y),910)
+#define get_gdat_ipv6_pos910(X,Y) get_gdat_ipv6((X),(Y),910)
+#define get_gdat_string_pos910(X,Y) get_gdat_string((X),(Y),910)
+#define get_gdat_v_str_pos910(X,Y) get_gdat_string((X),(Y),910)
+#define get_gdat_bool_pos910(X,Y) get_gdat_bool((X),(Y),910)
+#define get_gdat_int_pos910(X,Y) get_gdat_int((X),(Y),910)
+#define get_gdat_llong_pos910(X,Y) get_gdat_llong((X),(Y),910)
+#define get_gdat_float_pos910(X,Y) get_gdat_float((X),(Y),910)
+#define get_gdat_uint_pos911(X,Y) get_gdat_uint((X),(Y),911)
+#define get_gdat_ullong_pos911(X,Y) get_gdat_ullong((X),(Y),911)
+#define get_gdat_ip_pos911(X,Y) get_gdat_ip((X),(Y),911)
+#define get_gdat_ipv6_pos911(X,Y) get_gdat_ipv6((X),(Y),911)
+#define get_gdat_string_pos911(X,Y) get_gdat_string((X),(Y),911)
+#define get_gdat_v_str_pos911(X,Y) get_gdat_string((X),(Y),911)
+#define get_gdat_bool_pos911(X,Y) get_gdat_bool((X),(Y),911)
+#define get_gdat_int_pos911(X,Y) get_gdat_int((X),(Y),911)
+#define get_gdat_llong_pos911(X,Y) get_gdat_llong((X),(Y),911)
+#define get_gdat_float_pos911(X,Y) get_gdat_float((X),(Y),911)
+#define get_gdat_uint_pos912(X,Y) get_gdat_uint((X),(Y),912)
+#define get_gdat_ullong_pos912(X,Y) get_gdat_ullong((X),(Y),912)
+#define get_gdat_ip_pos912(X,Y) get_gdat_ip((X),(Y),912)
+#define get_gdat_ipv6_pos912(X,Y) get_gdat_ipv6((X),(Y),912)
+#define get_gdat_string_pos912(X,Y) get_gdat_string((X),(Y),912)
+#define get_gdat_v_str_pos912(X,Y) get_gdat_string((X),(Y),912)
+#define get_gdat_bool_pos912(X,Y) get_gdat_bool((X),(Y),912)
+#define get_gdat_int_pos912(X,Y) get_gdat_int((X),(Y),912)
+#define get_gdat_llong_pos912(X,Y) get_gdat_llong((X),(Y),912)
+#define get_gdat_float_pos912(X,Y) get_gdat_float((X),(Y),912)
+#define get_gdat_uint_pos913(X,Y) get_gdat_uint((X),(Y),913)
+#define get_gdat_ullong_pos913(X,Y) get_gdat_ullong((X),(Y),913)
+#define get_gdat_ip_pos913(X,Y) get_gdat_ip((X),(Y),913)
+#define get_gdat_ipv6_pos913(X,Y) get_gdat_ipv6((X),(Y),913)
+#define get_gdat_string_pos913(X,Y) get_gdat_string((X),(Y),913)
+#define get_gdat_v_str_pos913(X,Y) get_gdat_string((X),(Y),913)
+#define get_gdat_bool_pos913(X,Y) get_gdat_bool((X),(Y),913)
+#define get_gdat_int_pos913(X,Y) get_gdat_int((X),(Y),913)
+#define get_gdat_llong_pos913(X,Y) get_gdat_llong((X),(Y),913)
+#define get_gdat_float_pos913(X,Y) get_gdat_float((X),(Y),913)
+#define get_gdat_uint_pos914(X,Y) get_gdat_uint((X),(Y),914)
+#define get_gdat_ullong_pos914(X,Y) get_gdat_ullong((X),(Y),914)
+#define get_gdat_ip_pos914(X,Y) get_gdat_ip((X),(Y),914)
+#define get_gdat_ipv6_pos914(X,Y) get_gdat_ipv6((X),(Y),914)
+#define get_gdat_string_pos914(X,Y) get_gdat_string((X),(Y),914)
+#define get_gdat_v_str_pos914(X,Y) get_gdat_string((X),(Y),914)
+#define get_gdat_bool_pos914(X,Y) get_gdat_bool((X),(Y),914)
+#define get_gdat_int_pos914(X,Y) get_gdat_int((X),(Y),914)
+#define get_gdat_llong_pos914(X,Y) get_gdat_llong((X),(Y),914)
+#define get_gdat_float_pos914(X,Y) get_gdat_float((X),(Y),914)
+#define get_gdat_uint_pos915(X,Y) get_gdat_uint((X),(Y),915)
+#define get_gdat_ullong_pos915(X,Y) get_gdat_ullong((X),(Y),915)
+#define get_gdat_ip_pos915(X,Y) get_gdat_ip((X),(Y),915)
+#define get_gdat_ipv6_pos915(X,Y) get_gdat_ipv6((X),(Y),915)
+#define get_gdat_string_pos915(X,Y) get_gdat_string((X),(Y),915)
+#define get_gdat_v_str_pos915(X,Y) get_gdat_string((X),(Y),915)
+#define get_gdat_bool_pos915(X,Y) get_gdat_bool((X),(Y),915)
+#define get_gdat_int_pos915(X,Y) get_gdat_int((X),(Y),915)
+#define get_gdat_llong_pos915(X,Y) get_gdat_llong((X),(Y),915)
+#define get_gdat_float_pos915(X,Y) get_gdat_float((X),(Y),915)
+#define get_gdat_uint_pos916(X,Y) get_gdat_uint((X),(Y),916)
+#define get_gdat_ullong_pos916(X,Y) get_gdat_ullong((X),(Y),916)
+#define get_gdat_ip_pos916(X,Y) get_gdat_ip((X),(Y),916)
+#define get_gdat_ipv6_pos916(X,Y) get_gdat_ipv6((X),(Y),916)
+#define get_gdat_string_pos916(X,Y) get_gdat_string((X),(Y),916)
+#define get_gdat_v_str_pos916(X,Y) get_gdat_string((X),(Y),916)
+#define get_gdat_bool_pos916(X,Y) get_gdat_bool((X),(Y),916)
+#define get_gdat_int_pos916(X,Y) get_gdat_int((X),(Y),916)
+#define get_gdat_llong_pos916(X,Y) get_gdat_llong((X),(Y),916)
+#define get_gdat_float_pos916(X,Y) get_gdat_float((X),(Y),916)
+#define get_gdat_uint_pos917(X,Y) get_gdat_uint((X),(Y),917)
+#define get_gdat_ullong_pos917(X,Y) get_gdat_ullong((X),(Y),917)
+#define get_gdat_ip_pos917(X,Y) get_gdat_ip((X),(Y),917)
+#define get_gdat_ipv6_pos917(X,Y) get_gdat_ipv6((X),(Y),917)
+#define get_gdat_string_pos917(X,Y) get_gdat_string((X),(Y),917)
+#define get_gdat_v_str_pos917(X,Y) get_gdat_string((X),(Y),917)
+#define get_gdat_bool_pos917(X,Y) get_gdat_bool((X),(Y),917)
+#define get_gdat_int_pos917(X,Y) get_gdat_int((X),(Y),917)
+#define get_gdat_llong_pos917(X,Y) get_gdat_llong((X),(Y),917)
+#define get_gdat_float_pos917(X,Y) get_gdat_float((X),(Y),917)
+#define get_gdat_uint_pos918(X,Y) get_gdat_uint((X),(Y),918)
+#define get_gdat_ullong_pos918(X,Y) get_gdat_ullong((X),(Y),918)
+#define get_gdat_ip_pos918(X,Y) get_gdat_ip((X),(Y),918)
+#define get_gdat_ipv6_pos918(X,Y) get_gdat_ipv6((X),(Y),918)
+#define get_gdat_string_pos918(X,Y) get_gdat_string((X),(Y),918)
+#define get_gdat_v_str_pos918(X,Y) get_gdat_string((X),(Y),918)
+#define get_gdat_bool_pos918(X,Y) get_gdat_bool((X),(Y),918)
+#define get_gdat_int_pos918(X,Y) get_gdat_int((X),(Y),918)
+#define get_gdat_llong_pos918(X,Y) get_gdat_llong((X),(Y),918)
+#define get_gdat_float_pos918(X,Y) get_gdat_float((X),(Y),918)
+#define get_gdat_uint_pos919(X,Y) get_gdat_uint((X),(Y),919)
+#define get_gdat_ullong_pos919(X,Y) get_gdat_ullong((X),(Y),919)
+#define get_gdat_ip_pos919(X,Y) get_gdat_ip((X),(Y),919)
+#define get_gdat_ipv6_pos919(X,Y) get_gdat_ipv6((X),(Y),919)
+#define get_gdat_string_pos919(X,Y) get_gdat_string((X),(Y),919)
+#define get_gdat_v_str_pos919(X,Y) get_gdat_string((X),(Y),919)
+#define get_gdat_bool_pos919(X,Y) get_gdat_bool((X),(Y),919)
+#define get_gdat_int_pos919(X,Y) get_gdat_int((X),(Y),919)
+#define get_gdat_llong_pos919(X,Y) get_gdat_llong((X),(Y),919)
+#define get_gdat_float_pos919(X,Y) get_gdat_float((X),(Y),919)
+#define get_gdat_uint_pos920(X,Y) get_gdat_uint((X),(Y),920)
+#define get_gdat_ullong_pos920(X,Y) get_gdat_ullong((X),(Y),920)
+#define get_gdat_ip_pos920(X,Y) get_gdat_ip((X),(Y),920)
+#define get_gdat_ipv6_pos920(X,Y) get_gdat_ipv6((X),(Y),920)
+#define get_gdat_string_pos920(X,Y) get_gdat_string((X),(Y),920)
+#define get_gdat_v_str_pos920(X,Y) get_gdat_string((X),(Y),920)
+#define get_gdat_bool_pos920(X,Y) get_gdat_bool((X),(Y),920)
+#define get_gdat_int_pos920(X,Y) get_gdat_int((X),(Y),920)
+#define get_gdat_llong_pos920(X,Y) get_gdat_llong((X),(Y),920)
+#define get_gdat_float_pos920(X,Y) get_gdat_float((X),(Y),920)
+#define get_gdat_uint_pos921(X,Y) get_gdat_uint((X),(Y),921)
+#define get_gdat_ullong_pos921(X,Y) get_gdat_ullong((X),(Y),921)
+#define get_gdat_ip_pos921(X,Y) get_gdat_ip((X),(Y),921)
+#define get_gdat_ipv6_pos921(X,Y) get_gdat_ipv6((X),(Y),921)
+#define get_gdat_string_pos921(X,Y) get_gdat_string((X),(Y),921)
+#define get_gdat_v_str_pos921(X,Y) get_gdat_string((X),(Y),921)
+#define get_gdat_bool_pos921(X,Y) get_gdat_bool((X),(Y),921)
+#define get_gdat_int_pos921(X,Y) get_gdat_int((X),(Y),921)
+#define get_gdat_llong_pos921(X,Y) get_gdat_llong((X),(Y),921)
+#define get_gdat_float_pos921(X,Y) get_gdat_float((X),(Y),921)
+#define get_gdat_uint_pos922(X,Y) get_gdat_uint((X),(Y),922)
+#define get_gdat_ullong_pos922(X,Y) get_gdat_ullong((X),(Y),922)
+#define get_gdat_ip_pos922(X,Y) get_gdat_ip((X),(Y),922)
+#define get_gdat_ipv6_pos922(X,Y) get_gdat_ipv6((X),(Y),922)
+#define get_gdat_string_pos922(X,Y) get_gdat_string((X),(Y),922)
+#define get_gdat_v_str_pos922(X,Y) get_gdat_string((X),(Y),922)
+#define get_gdat_bool_pos922(X,Y) get_gdat_bool((X),(Y),922)
+#define get_gdat_int_pos922(X,Y) get_gdat_int((X),(Y),922)
+#define get_gdat_llong_pos922(X,Y) get_gdat_llong((X),(Y),922)
+#define get_gdat_float_pos922(X,Y) get_gdat_float((X),(Y),922)
+#define get_gdat_uint_pos923(X,Y) get_gdat_uint((X),(Y),923)
+#define get_gdat_ullong_pos923(X,Y) get_gdat_ullong((X),(Y),923)
+#define get_gdat_ip_pos923(X,Y) get_gdat_ip((X),(Y),923)
+#define get_gdat_ipv6_pos923(X,Y) get_gdat_ipv6((X),(Y),923)
+#define get_gdat_string_pos923(X,Y) get_gdat_string((X),(Y),923)
+#define get_gdat_v_str_pos923(X,Y) get_gdat_string((X),(Y),923)
+#define get_gdat_bool_pos923(X,Y) get_gdat_bool((X),(Y),923)
+#define get_gdat_int_pos923(X,Y) get_gdat_int((X),(Y),923)
+#define get_gdat_llong_pos923(X,Y) get_gdat_llong((X),(Y),923)
+#define get_gdat_float_pos923(X,Y) get_gdat_float((X),(Y),923)
+#define get_gdat_uint_pos924(X,Y) get_gdat_uint((X),(Y),924)
+#define get_gdat_ullong_pos924(X,Y) get_gdat_ullong((X),(Y),924)
+#define get_gdat_ip_pos924(X,Y) get_gdat_ip((X),(Y),924)
+#define get_gdat_ipv6_pos924(X,Y) get_gdat_ipv6((X),(Y),924)
+#define get_gdat_string_pos924(X,Y) get_gdat_string((X),(Y),924)
+#define get_gdat_v_str_pos924(X,Y) get_gdat_string((X),(Y),924)
+#define get_gdat_bool_pos924(X,Y) get_gdat_bool((X),(Y),924)
+#define get_gdat_int_pos924(X,Y) get_gdat_int((X),(Y),924)
+#define get_gdat_llong_pos924(X,Y) get_gdat_llong((X),(Y),924)
+#define get_gdat_float_pos924(X,Y) get_gdat_float((X),(Y),924)
+#define get_gdat_uint_pos925(X,Y) get_gdat_uint((X),(Y),925)
+#define get_gdat_ullong_pos925(X,Y) get_gdat_ullong((X),(Y),925)
+#define get_gdat_ip_pos925(X,Y) get_gdat_ip((X),(Y),925)
+#define get_gdat_ipv6_pos925(X,Y) get_gdat_ipv6((X),(Y),925)
+#define get_gdat_string_pos925(X,Y) get_gdat_string((X),(Y),925)
+#define get_gdat_v_str_pos925(X,Y) get_gdat_string((X),(Y),925)
+#define get_gdat_bool_pos925(X,Y) get_gdat_bool((X),(Y),925)
+#define get_gdat_int_pos925(X,Y) get_gdat_int((X),(Y),925)
+#define get_gdat_llong_pos925(X,Y) get_gdat_llong((X),(Y),925)
+#define get_gdat_float_pos925(X,Y) get_gdat_float((X),(Y),925)
+#define get_gdat_uint_pos926(X,Y) get_gdat_uint((X),(Y),926)
+#define get_gdat_ullong_pos926(X,Y) get_gdat_ullong((X),(Y),926)
+#define get_gdat_ip_pos926(X,Y) get_gdat_ip((X),(Y),926)
+#define get_gdat_ipv6_pos926(X,Y) get_gdat_ipv6((X),(Y),926)
+#define get_gdat_string_pos926(X,Y) get_gdat_string((X),(Y),926)
+#define get_gdat_v_str_pos926(X,Y) get_gdat_string((X),(Y),926)
+#define get_gdat_bool_pos926(X,Y) get_gdat_bool((X),(Y),926)
+#define get_gdat_int_pos926(X,Y) get_gdat_int((X),(Y),926)
+#define get_gdat_llong_pos926(X,Y) get_gdat_llong((X),(Y),926)
+#define get_gdat_float_pos926(X,Y) get_gdat_float((X),(Y),926)
+#define get_gdat_uint_pos927(X,Y) get_gdat_uint((X),(Y),927)
+#define get_gdat_ullong_pos927(X,Y) get_gdat_ullong((X),(Y),927)
+#define get_gdat_ip_pos927(X,Y) get_gdat_ip((X),(Y),927)
+#define get_gdat_ipv6_pos927(X,Y) get_gdat_ipv6((X),(Y),927)
+#define get_gdat_string_pos927(X,Y) get_gdat_string((X),(Y),927)
+#define get_gdat_v_str_pos927(X,Y) get_gdat_string((X),(Y),927)
+#define get_gdat_bool_pos927(X,Y) get_gdat_bool((X),(Y),927)
+#define get_gdat_int_pos927(X,Y) get_gdat_int((X),(Y),927)
+#define get_gdat_llong_pos927(X,Y) get_gdat_llong((X),(Y),927)
+#define get_gdat_float_pos927(X,Y) get_gdat_float((X),(Y),927)
+#define get_gdat_uint_pos928(X,Y) get_gdat_uint((X),(Y),928)
+#define get_gdat_ullong_pos928(X,Y) get_gdat_ullong((X),(Y),928)
+#define get_gdat_ip_pos928(X,Y) get_gdat_ip((X),(Y),928)
+#define get_gdat_ipv6_pos928(X,Y) get_gdat_ipv6((X),(Y),928)
+#define get_gdat_string_pos928(X,Y) get_gdat_string((X),(Y),928)
+#define get_gdat_v_str_pos928(X,Y) get_gdat_string((X),(Y),928)
+#define get_gdat_bool_pos928(X,Y) get_gdat_bool((X),(Y),928)
+#define get_gdat_int_pos928(X,Y) get_gdat_int((X),(Y),928)
+#define get_gdat_llong_pos928(X,Y) get_gdat_llong((X),(Y),928)
+#define get_gdat_float_pos928(X,Y) get_gdat_float((X),(Y),928)
+#define get_gdat_uint_pos929(X,Y) get_gdat_uint((X),(Y),929)
+#define get_gdat_ullong_pos929(X,Y) get_gdat_ullong((X),(Y),929)
+#define get_gdat_ip_pos929(X,Y) get_gdat_ip((X),(Y),929)
+#define get_gdat_ipv6_pos929(X,Y) get_gdat_ipv6((X),(Y),929)
+#define get_gdat_string_pos929(X,Y) get_gdat_string((X),(Y),929)
+#define get_gdat_v_str_pos929(X,Y) get_gdat_string((X),(Y),929)
+#define get_gdat_bool_pos929(X,Y) get_gdat_bool((X),(Y),929)
+#define get_gdat_int_pos929(X,Y) get_gdat_int((X),(Y),929)
+#define get_gdat_llong_pos929(X,Y) get_gdat_llong((X),(Y),929)
+#define get_gdat_float_pos929(X,Y) get_gdat_float((X),(Y),929)
+#define get_gdat_uint_pos930(X,Y) get_gdat_uint((X),(Y),930)
+#define get_gdat_ullong_pos930(X,Y) get_gdat_ullong((X),(Y),930)
+#define get_gdat_ip_pos930(X,Y) get_gdat_ip((X),(Y),930)
+#define get_gdat_ipv6_pos930(X,Y) get_gdat_ipv6((X),(Y),930)
+#define get_gdat_string_pos930(X,Y) get_gdat_string((X),(Y),930)
+#define get_gdat_v_str_pos930(X,Y) get_gdat_string((X),(Y),930)
+#define get_gdat_bool_pos930(X,Y) get_gdat_bool((X),(Y),930)
+#define get_gdat_int_pos930(X,Y) get_gdat_int((X),(Y),930)
+#define get_gdat_llong_pos930(X,Y) get_gdat_llong((X),(Y),930)
+#define get_gdat_float_pos930(X,Y) get_gdat_float((X),(Y),930)
+#define get_gdat_uint_pos931(X,Y) get_gdat_uint((X),(Y),931)
+#define get_gdat_ullong_pos931(X,Y) get_gdat_ullong((X),(Y),931)
+#define get_gdat_ip_pos931(X,Y) get_gdat_ip((X),(Y),931)
+#define get_gdat_ipv6_pos931(X,Y) get_gdat_ipv6((X),(Y),931)
+#define get_gdat_string_pos931(X,Y) get_gdat_string((X),(Y),931)
+#define get_gdat_v_str_pos931(X,Y) get_gdat_string((X),(Y),931)
+#define get_gdat_bool_pos931(X,Y) get_gdat_bool((X),(Y),931)
+#define get_gdat_int_pos931(X,Y) get_gdat_int((X),(Y),931)
+#define get_gdat_llong_pos931(X,Y) get_gdat_llong((X),(Y),931)
+#define get_gdat_float_pos931(X,Y) get_gdat_float((X),(Y),931)
+#define get_gdat_uint_pos932(X,Y) get_gdat_uint((X),(Y),932)
+#define get_gdat_ullong_pos932(X,Y) get_gdat_ullong((X),(Y),932)
+#define get_gdat_ip_pos932(X,Y) get_gdat_ip((X),(Y),932)
+#define get_gdat_ipv6_pos932(X,Y) get_gdat_ipv6((X),(Y),932)
+#define get_gdat_string_pos932(X,Y) get_gdat_string((X),(Y),932)
+#define get_gdat_v_str_pos932(X,Y) get_gdat_string((X),(Y),932)
+#define get_gdat_bool_pos932(X,Y) get_gdat_bool((X),(Y),932)
+#define get_gdat_int_pos932(X,Y) get_gdat_int((X),(Y),932)
+#define get_gdat_llong_pos932(X,Y) get_gdat_llong((X),(Y),932)
+#define get_gdat_float_pos932(X,Y) get_gdat_float((X),(Y),932)
+#define get_gdat_uint_pos933(X,Y) get_gdat_uint((X),(Y),933)
+#define get_gdat_ullong_pos933(X,Y) get_gdat_ullong((X),(Y),933)
+#define get_gdat_ip_pos933(X,Y) get_gdat_ip((X),(Y),933)
+#define get_gdat_ipv6_pos933(X,Y) get_gdat_ipv6((X),(Y),933)
+#define get_gdat_string_pos933(X,Y) get_gdat_string((X),(Y),933)
+#define get_gdat_v_str_pos933(X,Y) get_gdat_string((X),(Y),933)
+#define get_gdat_bool_pos933(X,Y) get_gdat_bool((X),(Y),933)
+#define get_gdat_int_pos933(X,Y) get_gdat_int((X),(Y),933)
+#define get_gdat_llong_pos933(X,Y) get_gdat_llong((X),(Y),933)
+#define get_gdat_float_pos933(X,Y) get_gdat_float((X),(Y),933)
+#define get_gdat_uint_pos934(X,Y) get_gdat_uint((X),(Y),934)
+#define get_gdat_ullong_pos934(X,Y) get_gdat_ullong((X),(Y),934)
+#define get_gdat_ip_pos934(X,Y) get_gdat_ip((X),(Y),934)
+#define get_gdat_ipv6_pos934(X,Y) get_gdat_ipv6((X),(Y),934)
+#define get_gdat_string_pos934(X,Y) get_gdat_string((X),(Y),934)
+#define get_gdat_v_str_pos934(X,Y) get_gdat_string((X),(Y),934)
+#define get_gdat_bool_pos934(X,Y) get_gdat_bool((X),(Y),934)
+#define get_gdat_int_pos934(X,Y) get_gdat_int((X),(Y),934)
+#define get_gdat_llong_pos934(X,Y) get_gdat_llong((X),(Y),934)
+#define get_gdat_float_pos934(X,Y) get_gdat_float((X),(Y),934)
+#define get_gdat_uint_pos935(X,Y) get_gdat_uint((X),(Y),935)
+#define get_gdat_ullong_pos935(X,Y) get_gdat_ullong((X),(Y),935)
+#define get_gdat_ip_pos935(X,Y) get_gdat_ip((X),(Y),935)
+#define get_gdat_ipv6_pos935(X,Y) get_gdat_ipv6((X),(Y),935)
+#define get_gdat_string_pos935(X,Y) get_gdat_string((X),(Y),935)
+#define get_gdat_v_str_pos935(X,Y) get_gdat_string((X),(Y),935)
+#define get_gdat_bool_pos935(X,Y) get_gdat_bool((X),(Y),935)
+#define get_gdat_int_pos935(X,Y) get_gdat_int((X),(Y),935)
+#define get_gdat_llong_pos935(X,Y) get_gdat_llong((X),(Y),935)
+#define get_gdat_float_pos935(X,Y) get_gdat_float((X),(Y),935)
+#define get_gdat_uint_pos936(X,Y) get_gdat_uint((X),(Y),936)
+#define get_gdat_ullong_pos936(X,Y) get_gdat_ullong((X),(Y),936)
+#define get_gdat_ip_pos936(X,Y) get_gdat_ip((X),(Y),936)
+#define get_gdat_ipv6_pos936(X,Y) get_gdat_ipv6((X),(Y),936)
+#define get_gdat_string_pos936(X,Y) get_gdat_string((X),(Y),936)
+#define get_gdat_v_str_pos936(X,Y) get_gdat_string((X),(Y),936)
+#define get_gdat_bool_pos936(X,Y) get_gdat_bool((X),(Y),936)
+#define get_gdat_int_pos936(X,Y) get_gdat_int((X),(Y),936)
+#define get_gdat_llong_pos936(X,Y) get_gdat_llong((X),(Y),936)
+#define get_gdat_float_pos936(X,Y) get_gdat_float((X),(Y),936)
+#define get_gdat_uint_pos937(X,Y) get_gdat_uint((X),(Y),937)
+#define get_gdat_ullong_pos937(X,Y) get_gdat_ullong((X),(Y),937)
+#define get_gdat_ip_pos937(X,Y) get_gdat_ip((X),(Y),937)
+#define get_gdat_ipv6_pos937(X,Y) get_gdat_ipv6((X),(Y),937)
+#define get_gdat_string_pos937(X,Y) get_gdat_string((X),(Y),937)
+#define get_gdat_v_str_pos937(X,Y) get_gdat_string((X),(Y),937)
+#define get_gdat_bool_pos937(X,Y) get_gdat_bool((X),(Y),937)
+#define get_gdat_int_pos937(X,Y) get_gdat_int((X),(Y),937)
+#define get_gdat_llong_pos937(X,Y) get_gdat_llong((X),(Y),937)
+#define get_gdat_float_pos937(X,Y) get_gdat_float((X),(Y),937)
+#define get_gdat_uint_pos938(X,Y) get_gdat_uint((X),(Y),938)
+#define get_gdat_ullong_pos938(X,Y) get_gdat_ullong((X),(Y),938)
+#define get_gdat_ip_pos938(X,Y) get_gdat_ip((X),(Y),938)
+#define get_gdat_ipv6_pos938(X,Y) get_gdat_ipv6((X),(Y),938)
+#define get_gdat_string_pos938(X,Y) get_gdat_string((X),(Y),938)
+#define get_gdat_v_str_pos938(X,Y) get_gdat_string((X),(Y),938)
+#define get_gdat_bool_pos938(X,Y) get_gdat_bool((X),(Y),938)
+#define get_gdat_int_pos938(X,Y) get_gdat_int((X),(Y),938)
+#define get_gdat_llong_pos938(X,Y) get_gdat_llong((X),(Y),938)
+#define get_gdat_float_pos938(X,Y) get_gdat_float((X),(Y),938)
+#define get_gdat_uint_pos939(X,Y) get_gdat_uint((X),(Y),939)
+#define get_gdat_ullong_pos939(X,Y) get_gdat_ullong((X),(Y),939)
+#define get_gdat_ip_pos939(X,Y) get_gdat_ip((X),(Y),939)
+#define get_gdat_ipv6_pos939(X,Y) get_gdat_ipv6((X),(Y),939)
+#define get_gdat_string_pos939(X,Y) get_gdat_string((X),(Y),939)
+#define get_gdat_v_str_pos939(X,Y) get_gdat_string((X),(Y),939)
+#define get_gdat_bool_pos939(X,Y) get_gdat_bool((X),(Y),939)
+#define get_gdat_int_pos939(X,Y) get_gdat_int((X),(Y),939)
+#define get_gdat_llong_pos939(X,Y) get_gdat_llong((X),(Y),939)
+#define get_gdat_float_pos939(X,Y) get_gdat_float((X),(Y),939)
+#define get_gdat_uint_pos940(X,Y) get_gdat_uint((X),(Y),940)
+#define get_gdat_ullong_pos940(X,Y) get_gdat_ullong((X),(Y),940)
+#define get_gdat_ip_pos940(X,Y) get_gdat_ip((X),(Y),940)
+#define get_gdat_ipv6_pos940(X,Y) get_gdat_ipv6((X),(Y),940)
+#define get_gdat_string_pos940(X,Y) get_gdat_string((X),(Y),940)
+#define get_gdat_v_str_pos940(X,Y) get_gdat_string((X),(Y),940)
+#define get_gdat_bool_pos940(X,Y) get_gdat_bool((X),(Y),940)
+#define get_gdat_int_pos940(X,Y) get_gdat_int((X),(Y),940)
+#define get_gdat_llong_pos940(X,Y) get_gdat_llong((X),(Y),940)
+#define get_gdat_float_pos940(X,Y) get_gdat_float((X),(Y),940)
+#define get_gdat_uint_pos941(X,Y) get_gdat_uint((X),(Y),941)
+#define get_gdat_ullong_pos941(X,Y) get_gdat_ullong((X),(Y),941)
+#define get_gdat_ip_pos941(X,Y) get_gdat_ip((X),(Y),941)
+#define get_gdat_ipv6_pos941(X,Y) get_gdat_ipv6((X),(Y),941)
+#define get_gdat_string_pos941(X,Y) get_gdat_string((X),(Y),941)
+#define get_gdat_v_str_pos941(X,Y) get_gdat_string((X),(Y),941)
+#define get_gdat_bool_pos941(X,Y) get_gdat_bool((X),(Y),941)
+#define get_gdat_int_pos941(X,Y) get_gdat_int((X),(Y),941)
+#define get_gdat_llong_pos941(X,Y) get_gdat_llong((X),(Y),941)
+#define get_gdat_float_pos941(X,Y) get_gdat_float((X),(Y),941)
+#define get_gdat_uint_pos942(X,Y) get_gdat_uint((X),(Y),942)
+#define get_gdat_ullong_pos942(X,Y) get_gdat_ullong((X),(Y),942)
+#define get_gdat_ip_pos942(X,Y) get_gdat_ip((X),(Y),942)
+#define get_gdat_ipv6_pos942(X,Y) get_gdat_ipv6((X),(Y),942)
+#define get_gdat_string_pos942(X,Y) get_gdat_string((X),(Y),942)
+#define get_gdat_v_str_pos942(X,Y) get_gdat_string((X),(Y),942)
+#define get_gdat_bool_pos942(X,Y) get_gdat_bool((X),(Y),942)
+#define get_gdat_int_pos942(X,Y) get_gdat_int((X),(Y),942)
+#define get_gdat_llong_pos942(X,Y) get_gdat_llong((X),(Y),942)
+#define get_gdat_float_pos942(X,Y) get_gdat_float((X),(Y),942)
+#define get_gdat_uint_pos943(X,Y) get_gdat_uint((X),(Y),943)
+#define get_gdat_ullong_pos943(X,Y) get_gdat_ullong((X),(Y),943)
+#define get_gdat_ip_pos943(X,Y) get_gdat_ip((X),(Y),943)
+#define get_gdat_ipv6_pos943(X,Y) get_gdat_ipv6((X),(Y),943)
+#define get_gdat_string_pos943(X,Y) get_gdat_string((X),(Y),943)
+#define get_gdat_v_str_pos943(X,Y) get_gdat_string((X),(Y),943)
+#define get_gdat_bool_pos943(X,Y) get_gdat_bool((X),(Y),943)
+#define get_gdat_int_pos943(X,Y) get_gdat_int((X),(Y),943)
+#define get_gdat_llong_pos943(X,Y) get_gdat_llong((X),(Y),943)
+#define get_gdat_float_pos943(X,Y) get_gdat_float((X),(Y),943)
+#define get_gdat_uint_pos944(X,Y) get_gdat_uint((X),(Y),944)
+#define get_gdat_ullong_pos944(X,Y) get_gdat_ullong((X),(Y),944)
+#define get_gdat_ip_pos944(X,Y) get_gdat_ip((X),(Y),944)
+#define get_gdat_ipv6_pos944(X,Y) get_gdat_ipv6((X),(Y),944)
+#define get_gdat_string_pos944(X,Y) get_gdat_string((X),(Y),944)
+#define get_gdat_v_str_pos944(X,Y) get_gdat_string((X),(Y),944)
+#define get_gdat_bool_pos944(X,Y) get_gdat_bool((X),(Y),944)
+#define get_gdat_int_pos944(X,Y) get_gdat_int((X),(Y),944)
+#define get_gdat_llong_pos944(X,Y) get_gdat_llong((X),(Y),944)
+#define get_gdat_float_pos944(X,Y) get_gdat_float((X),(Y),944)
+#define get_gdat_uint_pos945(X,Y) get_gdat_uint((X),(Y),945)
+#define get_gdat_ullong_pos945(X,Y) get_gdat_ullong((X),(Y),945)
+#define get_gdat_ip_pos945(X,Y) get_gdat_ip((X),(Y),945)
+#define get_gdat_ipv6_pos945(X,Y) get_gdat_ipv6((X),(Y),945)
+#define get_gdat_string_pos945(X,Y) get_gdat_string((X),(Y),945)
+#define get_gdat_v_str_pos945(X,Y) get_gdat_string((X),(Y),945)
+#define get_gdat_bool_pos945(X,Y) get_gdat_bool((X),(Y),945)
+#define get_gdat_int_pos945(X,Y) get_gdat_int((X),(Y),945)
+#define get_gdat_llong_pos945(X,Y) get_gdat_llong((X),(Y),945)
+#define get_gdat_float_pos945(X,Y) get_gdat_float((X),(Y),945)
+#define get_gdat_uint_pos946(X,Y) get_gdat_uint((X),(Y),946)
+#define get_gdat_ullong_pos946(X,Y) get_gdat_ullong((X),(Y),946)
+#define get_gdat_ip_pos946(X,Y) get_gdat_ip((X),(Y),946)
+#define get_gdat_ipv6_pos946(X,Y) get_gdat_ipv6((X),(Y),946)
+#define get_gdat_string_pos946(X,Y) get_gdat_string((X),(Y),946)
+#define get_gdat_v_str_pos946(X,Y) get_gdat_string((X),(Y),946)
+#define get_gdat_bool_pos946(X,Y) get_gdat_bool((X),(Y),946)
+#define get_gdat_int_pos946(X,Y) get_gdat_int((X),(Y),946)
+#define get_gdat_llong_pos946(X,Y) get_gdat_llong((X),(Y),946)
+#define get_gdat_float_pos946(X,Y) get_gdat_float((X),(Y),946)
+#define get_gdat_uint_pos947(X,Y) get_gdat_uint((X),(Y),947)
+#define get_gdat_ullong_pos947(X,Y) get_gdat_ullong((X),(Y),947)
+#define get_gdat_ip_pos947(X,Y) get_gdat_ip((X),(Y),947)
+#define get_gdat_ipv6_pos947(X,Y) get_gdat_ipv6((X),(Y),947)
+#define get_gdat_string_pos947(X,Y) get_gdat_string((X),(Y),947)
+#define get_gdat_v_str_pos947(X,Y) get_gdat_string((X),(Y),947)
+#define get_gdat_bool_pos947(X,Y) get_gdat_bool((X),(Y),947)
+#define get_gdat_int_pos947(X,Y) get_gdat_int((X),(Y),947)
+#define get_gdat_llong_pos947(X,Y) get_gdat_llong((X),(Y),947)
+#define get_gdat_float_pos947(X,Y) get_gdat_float((X),(Y),947)
+#define get_gdat_uint_pos948(X,Y) get_gdat_uint((X),(Y),948)
+#define get_gdat_ullong_pos948(X,Y) get_gdat_ullong((X),(Y),948)
+#define get_gdat_ip_pos948(X,Y) get_gdat_ip((X),(Y),948)
+#define get_gdat_ipv6_pos948(X,Y) get_gdat_ipv6((X),(Y),948)
+#define get_gdat_string_pos948(X,Y) get_gdat_string((X),(Y),948)
+#define get_gdat_v_str_pos948(X,Y) get_gdat_string((X),(Y),948)
+#define get_gdat_bool_pos948(X,Y) get_gdat_bool((X),(Y),948)
+#define get_gdat_int_pos948(X,Y) get_gdat_int((X),(Y),948)
+#define get_gdat_llong_pos948(X,Y) get_gdat_llong((X),(Y),948)
+#define get_gdat_float_pos948(X,Y) get_gdat_float((X),(Y),948)
+#define get_gdat_uint_pos949(X,Y) get_gdat_uint((X),(Y),949)
+#define get_gdat_ullong_pos949(X,Y) get_gdat_ullong((X),(Y),949)
+#define get_gdat_ip_pos949(X,Y) get_gdat_ip((X),(Y),949)
+#define get_gdat_ipv6_pos949(X,Y) get_gdat_ipv6((X),(Y),949)
+#define get_gdat_string_pos949(X,Y) get_gdat_string((X),(Y),949)
+#define get_gdat_v_str_pos949(X,Y) get_gdat_string((X),(Y),949)
+#define get_gdat_bool_pos949(X,Y) get_gdat_bool((X),(Y),949)
+#define get_gdat_int_pos949(X,Y) get_gdat_int((X),(Y),949)
+#define get_gdat_llong_pos949(X,Y) get_gdat_llong((X),(Y),949)
+#define get_gdat_float_pos949(X,Y) get_gdat_float((X),(Y),949)
+#define get_gdat_uint_pos950(X,Y) get_gdat_uint((X),(Y),950)
+#define get_gdat_ullong_pos950(X,Y) get_gdat_ullong((X),(Y),950)
+#define get_gdat_ip_pos950(X,Y) get_gdat_ip((X),(Y),950)
+#define get_gdat_ipv6_pos950(X,Y) get_gdat_ipv6((X),(Y),950)
+#define get_gdat_string_pos950(X,Y) get_gdat_string((X),(Y),950)
+#define get_gdat_v_str_pos950(X,Y) get_gdat_string((X),(Y),950)
+#define get_gdat_bool_pos950(X,Y) get_gdat_bool((X),(Y),950)
+#define get_gdat_int_pos950(X,Y) get_gdat_int((X),(Y),950)
+#define get_gdat_llong_pos950(X,Y) get_gdat_llong((X),(Y),950)
+#define get_gdat_float_pos950(X,Y) get_gdat_float((X),(Y),950)
+#define get_gdat_uint_pos951(X,Y) get_gdat_uint((X),(Y),951)
+#define get_gdat_ullong_pos951(X,Y) get_gdat_ullong((X),(Y),951)
+#define get_gdat_ip_pos951(X,Y) get_gdat_ip((X),(Y),951)
+#define get_gdat_ipv6_pos951(X,Y) get_gdat_ipv6((X),(Y),951)
+#define get_gdat_string_pos951(X,Y) get_gdat_string((X),(Y),951)
+#define get_gdat_v_str_pos951(X,Y) get_gdat_string((X),(Y),951)
+#define get_gdat_bool_pos951(X,Y) get_gdat_bool((X),(Y),951)
+#define get_gdat_int_pos951(X,Y) get_gdat_int((X),(Y),951)
+#define get_gdat_llong_pos951(X,Y) get_gdat_llong((X),(Y),951)
+#define get_gdat_float_pos951(X,Y) get_gdat_float((X),(Y),951)
+#define get_gdat_uint_pos952(X,Y) get_gdat_uint((X),(Y),952)
+#define get_gdat_ullong_pos952(X,Y) get_gdat_ullong((X),(Y),952)
+#define get_gdat_ip_pos952(X,Y) get_gdat_ip((X),(Y),952)
+#define get_gdat_ipv6_pos952(X,Y) get_gdat_ipv6((X),(Y),952)
+#define get_gdat_string_pos952(X,Y) get_gdat_string((X),(Y),952)
+#define get_gdat_v_str_pos952(X,Y) get_gdat_string((X),(Y),952)
+#define get_gdat_bool_pos952(X,Y) get_gdat_bool((X),(Y),952)
+#define get_gdat_int_pos952(X,Y) get_gdat_int((X),(Y),952)
+#define get_gdat_llong_pos952(X,Y) get_gdat_llong((X),(Y),952)
+#define get_gdat_float_pos952(X,Y) get_gdat_float((X),(Y),952)
+#define get_gdat_uint_pos953(X,Y) get_gdat_uint((X),(Y),953)
+#define get_gdat_ullong_pos953(X,Y) get_gdat_ullong((X),(Y),953)
+#define get_gdat_ip_pos953(X,Y) get_gdat_ip((X),(Y),953)
+#define get_gdat_ipv6_pos953(X,Y) get_gdat_ipv6((X),(Y),953)
+#define get_gdat_string_pos953(X,Y) get_gdat_string((X),(Y),953)
+#define get_gdat_v_str_pos953(X,Y) get_gdat_string((X),(Y),953)
+#define get_gdat_bool_pos953(X,Y) get_gdat_bool((X),(Y),953)
+#define get_gdat_int_pos953(X,Y) get_gdat_int((X),(Y),953)
+#define get_gdat_llong_pos953(X,Y) get_gdat_llong((X),(Y),953)
+#define get_gdat_float_pos953(X,Y) get_gdat_float((X),(Y),953)
+#define get_gdat_uint_pos954(X,Y) get_gdat_uint((X),(Y),954)
+#define get_gdat_ullong_pos954(X,Y) get_gdat_ullong((X),(Y),954)
+#define get_gdat_ip_pos954(X,Y) get_gdat_ip((X),(Y),954)
+#define get_gdat_ipv6_pos954(X,Y) get_gdat_ipv6((X),(Y),954)
+#define get_gdat_string_pos954(X,Y) get_gdat_string((X),(Y),954)
+#define get_gdat_v_str_pos954(X,Y) get_gdat_string((X),(Y),954)
+#define get_gdat_bool_pos954(X,Y) get_gdat_bool((X),(Y),954)
+#define get_gdat_int_pos954(X,Y) get_gdat_int((X),(Y),954)
+#define get_gdat_llong_pos954(X,Y) get_gdat_llong((X),(Y),954)
+#define get_gdat_float_pos954(X,Y) get_gdat_float((X),(Y),954)
+#define get_gdat_uint_pos955(X,Y) get_gdat_uint((X),(Y),955)
+#define get_gdat_ullong_pos955(X,Y) get_gdat_ullong((X),(Y),955)
+#define get_gdat_ip_pos955(X,Y) get_gdat_ip((X),(Y),955)
+#define get_gdat_ipv6_pos955(X,Y) get_gdat_ipv6((X),(Y),955)
+#define get_gdat_string_pos955(X,Y) get_gdat_string((X),(Y),955)
+#define get_gdat_v_str_pos955(X,Y) get_gdat_string((X),(Y),955)
+#define get_gdat_bool_pos955(X,Y) get_gdat_bool((X),(Y),955)
+#define get_gdat_int_pos955(X,Y) get_gdat_int((X),(Y),955)
+#define get_gdat_llong_pos955(X,Y) get_gdat_llong((X),(Y),955)
+#define get_gdat_float_pos955(X,Y) get_gdat_float((X),(Y),955)
+#define get_gdat_uint_pos956(X,Y) get_gdat_uint((X),(Y),956)
+#define get_gdat_ullong_pos956(X,Y) get_gdat_ullong((X),(Y),956)
+#define get_gdat_ip_pos956(X,Y) get_gdat_ip((X),(Y),956)
+#define get_gdat_ipv6_pos956(X,Y) get_gdat_ipv6((X),(Y),956)
+#define get_gdat_string_pos956(X,Y) get_gdat_string((X),(Y),956)
+#define get_gdat_v_str_pos956(X,Y) get_gdat_string((X),(Y),956)
+#define get_gdat_bool_pos956(X,Y) get_gdat_bool((X),(Y),956)
+#define get_gdat_int_pos956(X,Y) get_gdat_int((X),(Y),956)
+#define get_gdat_llong_pos956(X,Y) get_gdat_llong((X),(Y),956)
+#define get_gdat_float_pos956(X,Y) get_gdat_float((X),(Y),956)
+#define get_gdat_uint_pos957(X,Y) get_gdat_uint((X),(Y),957)
+#define get_gdat_ullong_pos957(X,Y) get_gdat_ullong((X),(Y),957)
+#define get_gdat_ip_pos957(X,Y) get_gdat_ip((X),(Y),957)
+#define get_gdat_ipv6_pos957(X,Y) get_gdat_ipv6((X),(Y),957)
+#define get_gdat_string_pos957(X,Y) get_gdat_string((X),(Y),957)
+#define get_gdat_v_str_pos957(X,Y) get_gdat_string((X),(Y),957)
+#define get_gdat_bool_pos957(X,Y) get_gdat_bool((X),(Y),957)
+#define get_gdat_int_pos957(X,Y) get_gdat_int((X),(Y),957)
+#define get_gdat_llong_pos957(X,Y) get_gdat_llong((X),(Y),957)
+#define get_gdat_float_pos957(X,Y) get_gdat_float((X),(Y),957)
+#define get_gdat_uint_pos958(X,Y) get_gdat_uint((X),(Y),958)
+#define get_gdat_ullong_pos958(X,Y) get_gdat_ullong((X),(Y),958)
+#define get_gdat_ip_pos958(X,Y) get_gdat_ip((X),(Y),958)
+#define get_gdat_ipv6_pos958(X,Y) get_gdat_ipv6((X),(Y),958)
+#define get_gdat_string_pos958(X,Y) get_gdat_string((X),(Y),958)
+#define get_gdat_v_str_pos958(X,Y) get_gdat_string((X),(Y),958)
+#define get_gdat_bool_pos958(X,Y) get_gdat_bool((X),(Y),958)
+#define get_gdat_int_pos958(X,Y) get_gdat_int((X),(Y),958)
+#define get_gdat_llong_pos958(X,Y) get_gdat_llong((X),(Y),958)
+#define get_gdat_float_pos958(X,Y) get_gdat_float((X),(Y),958)
+#define get_gdat_uint_pos959(X,Y) get_gdat_uint((X),(Y),959)
+#define get_gdat_ullong_pos959(X,Y) get_gdat_ullong((X),(Y),959)
+#define get_gdat_ip_pos959(X,Y) get_gdat_ip((X),(Y),959)
+#define get_gdat_ipv6_pos959(X,Y) get_gdat_ipv6((X),(Y),959)
+#define get_gdat_string_pos959(X,Y) get_gdat_string((X),(Y),959)
+#define get_gdat_v_str_pos959(X,Y) get_gdat_string((X),(Y),959)
+#define get_gdat_bool_pos959(X,Y) get_gdat_bool((X),(Y),959)
+#define get_gdat_int_pos959(X,Y) get_gdat_int((X),(Y),959)
+#define get_gdat_llong_pos959(X,Y) get_gdat_llong((X),(Y),959)
+#define get_gdat_float_pos959(X,Y) get_gdat_float((X),(Y),959)
+#define get_gdat_uint_pos960(X,Y) get_gdat_uint((X),(Y),960)
+#define get_gdat_ullong_pos960(X,Y) get_gdat_ullong((X),(Y),960)
+#define get_gdat_ip_pos960(X,Y) get_gdat_ip((X),(Y),960)
+#define get_gdat_ipv6_pos960(X,Y) get_gdat_ipv6((X),(Y),960)
+#define get_gdat_string_pos960(X,Y) get_gdat_string((X),(Y),960)
+#define get_gdat_v_str_pos960(X,Y) get_gdat_string((X),(Y),960)
+#define get_gdat_bool_pos960(X,Y) get_gdat_bool((X),(Y),960)
+#define get_gdat_int_pos960(X,Y) get_gdat_int((X),(Y),960)
+#define get_gdat_llong_pos960(X,Y) get_gdat_llong((X),(Y),960)
+#define get_gdat_float_pos960(X,Y) get_gdat_float((X),(Y),960)
+#define get_gdat_uint_pos961(X,Y) get_gdat_uint((X),(Y),961)
+#define get_gdat_ullong_pos961(X,Y) get_gdat_ullong((X),(Y),961)
+#define get_gdat_ip_pos961(X,Y) get_gdat_ip((X),(Y),961)
+#define get_gdat_ipv6_pos961(X,Y) get_gdat_ipv6((X),(Y),961)
+#define get_gdat_string_pos961(X,Y) get_gdat_string((X),(Y),961)
+#define get_gdat_v_str_pos961(X,Y) get_gdat_string((X),(Y),961)
+#define get_gdat_bool_pos961(X,Y) get_gdat_bool((X),(Y),961)
+#define get_gdat_int_pos961(X,Y) get_gdat_int((X),(Y),961)
+#define get_gdat_llong_pos961(X,Y) get_gdat_llong((X),(Y),961)
+#define get_gdat_float_pos961(X,Y) get_gdat_float((X),(Y),961)
+#define get_gdat_uint_pos962(X,Y) get_gdat_uint((X),(Y),962)
+#define get_gdat_ullong_pos962(X,Y) get_gdat_ullong((X),(Y),962)
+#define get_gdat_ip_pos962(X,Y) get_gdat_ip((X),(Y),962)
+#define get_gdat_ipv6_pos962(X,Y) get_gdat_ipv6((X),(Y),962)
+#define get_gdat_string_pos962(X,Y) get_gdat_string((X),(Y),962)
+#define get_gdat_v_str_pos962(X,Y) get_gdat_string((X),(Y),962)
+#define get_gdat_bool_pos962(X,Y) get_gdat_bool((X),(Y),962)
+#define get_gdat_int_pos962(X,Y) get_gdat_int((X),(Y),962)
+#define get_gdat_llong_pos962(X,Y) get_gdat_llong((X),(Y),962)
+#define get_gdat_float_pos962(X,Y) get_gdat_float((X),(Y),962)
+#define get_gdat_uint_pos963(X,Y) get_gdat_uint((X),(Y),963)
+#define get_gdat_ullong_pos963(X,Y) get_gdat_ullong((X),(Y),963)
+#define get_gdat_ip_pos963(X,Y) get_gdat_ip((X),(Y),963)
+#define get_gdat_ipv6_pos963(X,Y) get_gdat_ipv6((X),(Y),963)
+#define get_gdat_string_pos963(X,Y) get_gdat_string((X),(Y),963)
+#define get_gdat_v_str_pos963(X,Y) get_gdat_string((X),(Y),963)
+#define get_gdat_bool_pos963(X,Y) get_gdat_bool((X),(Y),963)
+#define get_gdat_int_pos963(X,Y) get_gdat_int((X),(Y),963)
+#define get_gdat_llong_pos963(X,Y) get_gdat_llong((X),(Y),963)
+#define get_gdat_float_pos963(X,Y) get_gdat_float((X),(Y),963)
+#define get_gdat_uint_pos964(X,Y) get_gdat_uint((X),(Y),964)
+#define get_gdat_ullong_pos964(X,Y) get_gdat_ullong((X),(Y),964)
+#define get_gdat_ip_pos964(X,Y) get_gdat_ip((X),(Y),964)
+#define get_gdat_ipv6_pos964(X,Y) get_gdat_ipv6((X),(Y),964)
+#define get_gdat_string_pos964(X,Y) get_gdat_string((X),(Y),964)
+#define get_gdat_v_str_pos964(X,Y) get_gdat_string((X),(Y),964)
+#define get_gdat_bool_pos964(X,Y) get_gdat_bool((X),(Y),964)
+#define get_gdat_int_pos964(X,Y) get_gdat_int((X),(Y),964)
+#define get_gdat_llong_pos964(X,Y) get_gdat_llong((X),(Y),964)
+#define get_gdat_float_pos964(X,Y) get_gdat_float((X),(Y),964)
+#define get_gdat_uint_pos965(X,Y) get_gdat_uint((X),(Y),965)
+#define get_gdat_ullong_pos965(X,Y) get_gdat_ullong((X),(Y),965)
+#define get_gdat_ip_pos965(X,Y) get_gdat_ip((X),(Y),965)
+#define get_gdat_ipv6_pos965(X,Y) get_gdat_ipv6((X),(Y),965)
+#define get_gdat_string_pos965(X,Y) get_gdat_string((X),(Y),965)
+#define get_gdat_v_str_pos965(X,Y) get_gdat_string((X),(Y),965)
+#define get_gdat_bool_pos965(X,Y) get_gdat_bool((X),(Y),965)
+#define get_gdat_int_pos965(X,Y) get_gdat_int((X),(Y),965)
+#define get_gdat_llong_pos965(X,Y) get_gdat_llong((X),(Y),965)
+#define get_gdat_float_pos965(X,Y) get_gdat_float((X),(Y),965)
+#define get_gdat_uint_pos966(X,Y) get_gdat_uint((X),(Y),966)
+#define get_gdat_ullong_pos966(X,Y) get_gdat_ullong((X),(Y),966)
+#define get_gdat_ip_pos966(X,Y) get_gdat_ip((X),(Y),966)
+#define get_gdat_ipv6_pos966(X,Y) get_gdat_ipv6((X),(Y),966)
+#define get_gdat_string_pos966(X,Y) get_gdat_string((X),(Y),966)
+#define get_gdat_v_str_pos966(X,Y) get_gdat_string((X),(Y),966)
+#define get_gdat_bool_pos966(X,Y) get_gdat_bool((X),(Y),966)
+#define get_gdat_int_pos966(X,Y) get_gdat_int((X),(Y),966)
+#define get_gdat_llong_pos966(X,Y) get_gdat_llong((X),(Y),966)
+#define get_gdat_float_pos966(X,Y) get_gdat_float((X),(Y),966)
+#define get_gdat_uint_pos967(X,Y) get_gdat_uint((X),(Y),967)
+#define get_gdat_ullong_pos967(X,Y) get_gdat_ullong((X),(Y),967)
+#define get_gdat_ip_pos967(X,Y) get_gdat_ip((X),(Y),967)
+#define get_gdat_ipv6_pos967(X,Y) get_gdat_ipv6((X),(Y),967)
+#define get_gdat_string_pos967(X,Y) get_gdat_string((X),(Y),967)
+#define get_gdat_v_str_pos967(X,Y) get_gdat_string((X),(Y),967)
+#define get_gdat_bool_pos967(X,Y) get_gdat_bool((X),(Y),967)
+#define get_gdat_int_pos967(X,Y) get_gdat_int((X),(Y),967)
+#define get_gdat_llong_pos967(X,Y) get_gdat_llong((X),(Y),967)
+#define get_gdat_float_pos967(X,Y) get_gdat_float((X),(Y),967)
+#define get_gdat_uint_pos968(X,Y) get_gdat_uint((X),(Y),968)
+#define get_gdat_ullong_pos968(X,Y) get_gdat_ullong((X),(Y),968)
+#define get_gdat_ip_pos968(X,Y) get_gdat_ip((X),(Y),968)
+#define get_gdat_ipv6_pos968(X,Y) get_gdat_ipv6((X),(Y),968)
+#define get_gdat_string_pos968(X,Y) get_gdat_string((X),(Y),968)
+#define get_gdat_v_str_pos968(X,Y) get_gdat_string((X),(Y),968)
+#define get_gdat_bool_pos968(X,Y) get_gdat_bool((X),(Y),968)
+#define get_gdat_int_pos968(X,Y) get_gdat_int((X),(Y),968)
+#define get_gdat_llong_pos968(X,Y) get_gdat_llong((X),(Y),968)
+#define get_gdat_float_pos968(X,Y) get_gdat_float((X),(Y),968)
+#define get_gdat_uint_pos969(X,Y) get_gdat_uint((X),(Y),969)
+#define get_gdat_ullong_pos969(X,Y) get_gdat_ullong((X),(Y),969)
+#define get_gdat_ip_pos969(X,Y) get_gdat_ip((X),(Y),969)
+#define get_gdat_ipv6_pos969(X,Y) get_gdat_ipv6((X),(Y),969)
+#define get_gdat_string_pos969(X,Y) get_gdat_string((X),(Y),969)
+#define get_gdat_v_str_pos969(X,Y) get_gdat_string((X),(Y),969)
+#define get_gdat_bool_pos969(X,Y) get_gdat_bool((X),(Y),969)
+#define get_gdat_int_pos969(X,Y) get_gdat_int((X),(Y),969)
+#define get_gdat_llong_pos969(X,Y) get_gdat_llong((X),(Y),969)
+#define get_gdat_float_pos969(X,Y) get_gdat_float((X),(Y),969)
+#define get_gdat_uint_pos970(X,Y) get_gdat_uint((X),(Y),970)
+#define get_gdat_ullong_pos970(X,Y) get_gdat_ullong((X),(Y),970)
+#define get_gdat_ip_pos970(X,Y) get_gdat_ip((X),(Y),970)
+#define get_gdat_ipv6_pos970(X,Y) get_gdat_ipv6((X),(Y),970)
+#define get_gdat_string_pos970(X,Y) get_gdat_string((X),(Y),970)
+#define get_gdat_v_str_pos970(X,Y) get_gdat_string((X),(Y),970)
+#define get_gdat_bool_pos970(X,Y) get_gdat_bool((X),(Y),970)
+#define get_gdat_int_pos970(X,Y) get_gdat_int((X),(Y),970)
+#define get_gdat_llong_pos970(X,Y) get_gdat_llong((X),(Y),970)
+#define get_gdat_float_pos970(X,Y) get_gdat_float((X),(Y),970)
+#define get_gdat_uint_pos971(X,Y) get_gdat_uint((X),(Y),971)
+#define get_gdat_ullong_pos971(X,Y) get_gdat_ullong((X),(Y),971)
+#define get_gdat_ip_pos971(X,Y) get_gdat_ip((X),(Y),971)
+#define get_gdat_ipv6_pos971(X,Y) get_gdat_ipv6((X),(Y),971)
+#define get_gdat_string_pos971(X,Y) get_gdat_string((X),(Y),971)
+#define get_gdat_v_str_pos971(X,Y) get_gdat_string((X),(Y),971)
+#define get_gdat_bool_pos971(X,Y) get_gdat_bool((X),(Y),971)
+#define get_gdat_int_pos971(X,Y) get_gdat_int((X),(Y),971)
+#define get_gdat_llong_pos971(X,Y) get_gdat_llong((X),(Y),971)
+#define get_gdat_float_pos971(X,Y) get_gdat_float((X),(Y),971)
+#define get_gdat_uint_pos972(X,Y) get_gdat_uint((X),(Y),972)
+#define get_gdat_ullong_pos972(X,Y) get_gdat_ullong((X),(Y),972)
+#define get_gdat_ip_pos972(X,Y) get_gdat_ip((X),(Y),972)
+#define get_gdat_ipv6_pos972(X,Y) get_gdat_ipv6((X),(Y),972)
+#define get_gdat_string_pos972(X,Y) get_gdat_string((X),(Y),972)
+#define get_gdat_v_str_pos972(X,Y) get_gdat_string((X),(Y),972)
+#define get_gdat_bool_pos972(X,Y) get_gdat_bool((X),(Y),972)
+#define get_gdat_int_pos972(X,Y) get_gdat_int((X),(Y),972)
+#define get_gdat_llong_pos972(X,Y) get_gdat_llong((X),(Y),972)
+#define get_gdat_float_pos972(X,Y) get_gdat_float((X),(Y),972)
+#define get_gdat_uint_pos973(X,Y) get_gdat_uint((X),(Y),973)
+#define get_gdat_ullong_pos973(X,Y) get_gdat_ullong((X),(Y),973)
+#define get_gdat_ip_pos973(X,Y) get_gdat_ip((X),(Y),973)
+#define get_gdat_ipv6_pos973(X,Y) get_gdat_ipv6((X),(Y),973)
+#define get_gdat_string_pos973(X,Y) get_gdat_string((X),(Y),973)
+#define get_gdat_v_str_pos973(X,Y) get_gdat_string((X),(Y),973)
+#define get_gdat_bool_pos973(X,Y) get_gdat_bool((X),(Y),973)
+#define get_gdat_int_pos973(X,Y) get_gdat_int((X),(Y),973)
+#define get_gdat_llong_pos973(X,Y) get_gdat_llong((X),(Y),973)
+#define get_gdat_float_pos973(X,Y) get_gdat_float((X),(Y),973)
+#define get_gdat_uint_pos974(X,Y) get_gdat_uint((X),(Y),974)
+#define get_gdat_ullong_pos974(X,Y) get_gdat_ullong((X),(Y),974)
+#define get_gdat_ip_pos974(X,Y) get_gdat_ip((X),(Y),974)
+#define get_gdat_ipv6_pos974(X,Y) get_gdat_ipv6((X),(Y),974)
+#define get_gdat_string_pos974(X,Y) get_gdat_string((X),(Y),974)
+#define get_gdat_v_str_pos974(X,Y) get_gdat_string((X),(Y),974)
+#define get_gdat_bool_pos974(X,Y) get_gdat_bool((X),(Y),974)
+#define get_gdat_int_pos974(X,Y) get_gdat_int((X),(Y),974)
+#define get_gdat_llong_pos974(X,Y) get_gdat_llong((X),(Y),974)
+#define get_gdat_float_pos974(X,Y) get_gdat_float((X),(Y),974)
+#define get_gdat_uint_pos975(X,Y) get_gdat_uint((X),(Y),975)
+#define get_gdat_ullong_pos975(X,Y) get_gdat_ullong((X),(Y),975)
+#define get_gdat_ip_pos975(X,Y) get_gdat_ip((X),(Y),975)
+#define get_gdat_ipv6_pos975(X,Y) get_gdat_ipv6((X),(Y),975)
+#define get_gdat_string_pos975(X,Y) get_gdat_string((X),(Y),975)
+#define get_gdat_v_str_pos975(X,Y) get_gdat_string((X),(Y),975)
+#define get_gdat_bool_pos975(X,Y) get_gdat_bool((X),(Y),975)
+#define get_gdat_int_pos975(X,Y) get_gdat_int((X),(Y),975)
+#define get_gdat_llong_pos975(X,Y) get_gdat_llong((X),(Y),975)
+#define get_gdat_float_pos975(X,Y) get_gdat_float((X),(Y),975)
+#define get_gdat_uint_pos976(X,Y) get_gdat_uint((X),(Y),976)
+#define get_gdat_ullong_pos976(X,Y) get_gdat_ullong((X),(Y),976)
+#define get_gdat_ip_pos976(X,Y) get_gdat_ip((X),(Y),976)
+#define get_gdat_ipv6_pos976(X,Y) get_gdat_ipv6((X),(Y),976)
+#define get_gdat_string_pos976(X,Y) get_gdat_string((X),(Y),976)
+#define get_gdat_v_str_pos976(X,Y) get_gdat_string((X),(Y),976)
+#define get_gdat_bool_pos976(X,Y) get_gdat_bool((X),(Y),976)
+#define get_gdat_int_pos976(X,Y) get_gdat_int((X),(Y),976)
+#define get_gdat_llong_pos976(X,Y) get_gdat_llong((X),(Y),976)
+#define get_gdat_float_pos976(X,Y) get_gdat_float((X),(Y),976)
+#define get_gdat_uint_pos977(X,Y) get_gdat_uint((X),(Y),977)
+#define get_gdat_ullong_pos977(X,Y) get_gdat_ullong((X),(Y),977)
+#define get_gdat_ip_pos977(X,Y) get_gdat_ip((X),(Y),977)
+#define get_gdat_ipv6_pos977(X,Y) get_gdat_ipv6((X),(Y),977)
+#define get_gdat_string_pos977(X,Y) get_gdat_string((X),(Y),977)
+#define get_gdat_v_str_pos977(X,Y) get_gdat_string((X),(Y),977)
+#define get_gdat_bool_pos977(X,Y) get_gdat_bool((X),(Y),977)
+#define get_gdat_int_pos977(X,Y) get_gdat_int((X),(Y),977)
+#define get_gdat_llong_pos977(X,Y) get_gdat_llong((X),(Y),977)
+#define get_gdat_float_pos977(X,Y) get_gdat_float((X),(Y),977)
+#define get_gdat_uint_pos978(X,Y) get_gdat_uint((X),(Y),978)
+#define get_gdat_ullong_pos978(X,Y) get_gdat_ullong((X),(Y),978)
+#define get_gdat_ip_pos978(X,Y) get_gdat_ip((X),(Y),978)
+#define get_gdat_ipv6_pos978(X,Y) get_gdat_ipv6((X),(Y),978)
+#define get_gdat_string_pos978(X,Y) get_gdat_string((X),(Y),978)
+#define get_gdat_v_str_pos978(X,Y) get_gdat_string((X),(Y),978)
+#define get_gdat_bool_pos978(X,Y) get_gdat_bool((X),(Y),978)
+#define get_gdat_int_pos978(X,Y) get_gdat_int((X),(Y),978)
+#define get_gdat_llong_pos978(X,Y) get_gdat_llong((X),(Y),978)
+#define get_gdat_float_pos978(X,Y) get_gdat_float((X),(Y),978)
+#define get_gdat_uint_pos979(X,Y) get_gdat_uint((X),(Y),979)
+#define get_gdat_ullong_pos979(X,Y) get_gdat_ullong((X),(Y),979)
+#define get_gdat_ip_pos979(X,Y) get_gdat_ip((X),(Y),979)
+#define get_gdat_ipv6_pos979(X,Y) get_gdat_ipv6((X),(Y),979)
+#define get_gdat_string_pos979(X,Y) get_gdat_string((X),(Y),979)
+#define get_gdat_v_str_pos979(X,Y) get_gdat_string((X),(Y),979)
+#define get_gdat_bool_pos979(X,Y) get_gdat_bool((X),(Y),979)
+#define get_gdat_int_pos979(X,Y) get_gdat_int((X),(Y),979)
+#define get_gdat_llong_pos979(X,Y) get_gdat_llong((X),(Y),979)
+#define get_gdat_float_pos979(X,Y) get_gdat_float((X),(Y),979)
+#define get_gdat_uint_pos980(X,Y) get_gdat_uint((X),(Y),980)
+#define get_gdat_ullong_pos980(X,Y) get_gdat_ullong((X),(Y),980)
+#define get_gdat_ip_pos980(X,Y) get_gdat_ip((X),(Y),980)
+#define get_gdat_ipv6_pos980(X,Y) get_gdat_ipv6((X),(Y),980)
+#define get_gdat_string_pos980(X,Y) get_gdat_string((X),(Y),980)
+#define get_gdat_v_str_pos980(X,Y) get_gdat_string((X),(Y),980)
+#define get_gdat_bool_pos980(X,Y) get_gdat_bool((X),(Y),980)
+#define get_gdat_int_pos980(X,Y) get_gdat_int((X),(Y),980)
+#define get_gdat_llong_pos980(X,Y) get_gdat_llong((X),(Y),980)
+#define get_gdat_float_pos980(X,Y) get_gdat_float((X),(Y),980)
+#define get_gdat_uint_pos981(X,Y) get_gdat_uint((X),(Y),981)
+#define get_gdat_ullong_pos981(X,Y) get_gdat_ullong((X),(Y),981)
+#define get_gdat_ip_pos981(X,Y) get_gdat_ip((X),(Y),981)
+#define get_gdat_ipv6_pos981(X,Y) get_gdat_ipv6((X),(Y),981)
+#define get_gdat_string_pos981(X,Y) get_gdat_string((X),(Y),981)
+#define get_gdat_v_str_pos981(X,Y) get_gdat_string((X),(Y),981)
+#define get_gdat_bool_pos981(X,Y) get_gdat_bool((X),(Y),981)
+#define get_gdat_int_pos981(X,Y) get_gdat_int((X),(Y),981)
+#define get_gdat_llong_pos981(X,Y) get_gdat_llong((X),(Y),981)
+#define get_gdat_float_pos981(X,Y) get_gdat_float((X),(Y),981)
+#define get_gdat_uint_pos982(X,Y) get_gdat_uint((X),(Y),982)
+#define get_gdat_ullong_pos982(X,Y) get_gdat_ullong((X),(Y),982)
+#define get_gdat_ip_pos982(X,Y) get_gdat_ip((X),(Y),982)
+#define get_gdat_ipv6_pos982(X,Y) get_gdat_ipv6((X),(Y),982)
+#define get_gdat_string_pos982(X,Y) get_gdat_string((X),(Y),982)
+#define get_gdat_v_str_pos982(X,Y) get_gdat_string((X),(Y),982)
+#define get_gdat_bool_pos982(X,Y) get_gdat_bool((X),(Y),982)
+#define get_gdat_int_pos982(X,Y) get_gdat_int((X),(Y),982)
+#define get_gdat_llong_pos982(X,Y) get_gdat_llong((X),(Y),982)
+#define get_gdat_float_pos982(X,Y) get_gdat_float((X),(Y),982)
+#define get_gdat_uint_pos983(X,Y) get_gdat_uint((X),(Y),983)
+#define get_gdat_ullong_pos983(X,Y) get_gdat_ullong((X),(Y),983)
+#define get_gdat_ip_pos983(X,Y) get_gdat_ip((X),(Y),983)
+#define get_gdat_ipv6_pos983(X,Y) get_gdat_ipv6((X),(Y),983)
+#define get_gdat_string_pos983(X,Y) get_gdat_string((X),(Y),983)
+#define get_gdat_v_str_pos983(X,Y) get_gdat_string((X),(Y),983)
+#define get_gdat_bool_pos983(X,Y) get_gdat_bool((X),(Y),983)
+#define get_gdat_int_pos983(X,Y) get_gdat_int((X),(Y),983)
+#define get_gdat_llong_pos983(X,Y) get_gdat_llong((X),(Y),983)
+#define get_gdat_float_pos983(X,Y) get_gdat_float((X),(Y),983)
+#define get_gdat_uint_pos984(X,Y) get_gdat_uint((X),(Y),984)
+#define get_gdat_ullong_pos984(X,Y) get_gdat_ullong((X),(Y),984)
+#define get_gdat_ip_pos984(X,Y) get_gdat_ip((X),(Y),984)
+#define get_gdat_ipv6_pos984(X,Y) get_gdat_ipv6((X),(Y),984)
+#define get_gdat_string_pos984(X,Y) get_gdat_string((X),(Y),984)
+#define get_gdat_v_str_pos984(X,Y) get_gdat_string((X),(Y),984)
+#define get_gdat_bool_pos984(X,Y) get_gdat_bool((X),(Y),984)
+#define get_gdat_int_pos984(X,Y) get_gdat_int((X),(Y),984)
+#define get_gdat_llong_pos984(X,Y) get_gdat_llong((X),(Y),984)
+#define get_gdat_float_pos984(X,Y) get_gdat_float((X),(Y),984)
+#define get_gdat_uint_pos985(X,Y) get_gdat_uint((X),(Y),985)
+#define get_gdat_ullong_pos985(X,Y) get_gdat_ullong((X),(Y),985)
+#define get_gdat_ip_pos985(X,Y) get_gdat_ip((X),(Y),985)
+#define get_gdat_ipv6_pos985(X,Y) get_gdat_ipv6((X),(Y),985)
+#define get_gdat_string_pos985(X,Y) get_gdat_string((X),(Y),985)
+#define get_gdat_v_str_pos985(X,Y) get_gdat_string((X),(Y),985)
+#define get_gdat_bool_pos985(X,Y) get_gdat_bool((X),(Y),985)
+#define get_gdat_int_pos985(X,Y) get_gdat_int((X),(Y),985)
+#define get_gdat_llong_pos985(X,Y) get_gdat_llong((X),(Y),985)
+#define get_gdat_float_pos985(X,Y) get_gdat_float((X),(Y),985)
+#define get_gdat_uint_pos986(X,Y) get_gdat_uint((X),(Y),986)
+#define get_gdat_ullong_pos986(X,Y) get_gdat_ullong((X),(Y),986)
+#define get_gdat_ip_pos986(X,Y) get_gdat_ip((X),(Y),986)
+#define get_gdat_ipv6_pos986(X,Y) get_gdat_ipv6((X),(Y),986)
+#define get_gdat_string_pos986(X,Y) get_gdat_string((X),(Y),986)
+#define get_gdat_v_str_pos986(X,Y) get_gdat_string((X),(Y),986)
+#define get_gdat_bool_pos986(X,Y) get_gdat_bool((X),(Y),986)
+#define get_gdat_int_pos986(X,Y) get_gdat_int((X),(Y),986)
+#define get_gdat_llong_pos986(X,Y) get_gdat_llong((X),(Y),986)
+#define get_gdat_float_pos986(X,Y) get_gdat_float((X),(Y),986)
+#define get_gdat_uint_pos987(X,Y) get_gdat_uint((X),(Y),987)
+#define get_gdat_ullong_pos987(X,Y) get_gdat_ullong((X),(Y),987)
+#define get_gdat_ip_pos987(X,Y) get_gdat_ip((X),(Y),987)
+#define get_gdat_ipv6_pos987(X,Y) get_gdat_ipv6((X),(Y),987)
+#define get_gdat_string_pos987(X,Y) get_gdat_string((X),(Y),987)
+#define get_gdat_v_str_pos987(X,Y) get_gdat_string((X),(Y),987)
+#define get_gdat_bool_pos987(X,Y) get_gdat_bool((X),(Y),987)
+#define get_gdat_int_pos987(X,Y) get_gdat_int((X),(Y),987)
+#define get_gdat_llong_pos987(X,Y) get_gdat_llong((X),(Y),987)
+#define get_gdat_float_pos987(X,Y) get_gdat_float((X),(Y),987)
+#define get_gdat_uint_pos988(X,Y) get_gdat_uint((X),(Y),988)
+#define get_gdat_ullong_pos988(X,Y) get_gdat_ullong((X),(Y),988)
+#define get_gdat_ip_pos988(X,Y) get_gdat_ip((X),(Y),988)
+#define get_gdat_ipv6_pos988(X,Y) get_gdat_ipv6((X),(Y),988)
+#define get_gdat_string_pos988(X,Y) get_gdat_string((X),(Y),988)
+#define get_gdat_v_str_pos988(X,Y) get_gdat_string((X),(Y),988)
+#define get_gdat_bool_pos988(X,Y) get_gdat_bool((X),(Y),988)
+#define get_gdat_int_pos988(X,Y) get_gdat_int((X),(Y),988)
+#define get_gdat_llong_pos988(X,Y) get_gdat_llong((X),(Y),988)
+#define get_gdat_float_pos988(X,Y) get_gdat_float((X),(Y),988)
+#define get_gdat_uint_pos989(X,Y) get_gdat_uint((X),(Y),989)
+#define get_gdat_ullong_pos989(X,Y) get_gdat_ullong((X),(Y),989)
+#define get_gdat_ip_pos989(X,Y) get_gdat_ip((X),(Y),989)
+#define get_gdat_ipv6_pos989(X,Y) get_gdat_ipv6((X),(Y),989)
+#define get_gdat_string_pos989(X,Y) get_gdat_string((X),(Y),989)
+#define get_gdat_v_str_pos989(X,Y) get_gdat_string((X),(Y),989)
+#define get_gdat_bool_pos989(X,Y) get_gdat_bool((X),(Y),989)
+#define get_gdat_int_pos989(X,Y) get_gdat_int((X),(Y),989)
+#define get_gdat_llong_pos989(X,Y) get_gdat_llong((X),(Y),989)
+#define get_gdat_float_pos989(X,Y) get_gdat_float((X),(Y),989)
+#define get_gdat_uint_pos990(X,Y) get_gdat_uint((X),(Y),990)
+#define get_gdat_ullong_pos990(X,Y) get_gdat_ullong((X),(Y),990)
+#define get_gdat_ip_pos990(X,Y) get_gdat_ip((X),(Y),990)
+#define get_gdat_ipv6_pos990(X,Y) get_gdat_ipv6((X),(Y),990)
+#define get_gdat_string_pos990(X,Y) get_gdat_string((X),(Y),990)
+#define get_gdat_v_str_pos990(X,Y) get_gdat_string((X),(Y),990)
+#define get_gdat_bool_pos990(X,Y) get_gdat_bool((X),(Y),990)
+#define get_gdat_int_pos990(X,Y) get_gdat_int((X),(Y),990)
+#define get_gdat_llong_pos990(X,Y) get_gdat_llong((X),(Y),990)
+#define get_gdat_float_pos990(X,Y) get_gdat_float((X),(Y),990)
+#define get_gdat_uint_pos991(X,Y) get_gdat_uint((X),(Y),991)
+#define get_gdat_ullong_pos991(X,Y) get_gdat_ullong((X),(Y),991)
+#define get_gdat_ip_pos991(X,Y) get_gdat_ip((X),(Y),991)
+#define get_gdat_ipv6_pos991(X,Y) get_gdat_ipv6((X),(Y),991)
+#define get_gdat_string_pos991(X,Y) get_gdat_string((X),(Y),991)
+#define get_gdat_v_str_pos991(X,Y) get_gdat_string((X),(Y),991)
+#define get_gdat_bool_pos991(X,Y) get_gdat_bool((X),(Y),991)
+#define get_gdat_int_pos991(X,Y) get_gdat_int((X),(Y),991)
+#define get_gdat_llong_pos991(X,Y) get_gdat_llong((X),(Y),991)
+#define get_gdat_float_pos991(X,Y) get_gdat_float((X),(Y),991)
+#define get_gdat_uint_pos992(X,Y) get_gdat_uint((X),(Y),992)
+#define get_gdat_ullong_pos992(X,Y) get_gdat_ullong((X),(Y),992)
+#define get_gdat_ip_pos992(X,Y) get_gdat_ip((X),(Y),992)
+#define get_gdat_ipv6_pos992(X,Y) get_gdat_ipv6((X),(Y),992)
+#define get_gdat_string_pos992(X,Y) get_gdat_string((X),(Y),992)
+#define get_gdat_v_str_pos992(X,Y) get_gdat_string((X),(Y),992)
+#define get_gdat_bool_pos992(X,Y) get_gdat_bool((X),(Y),992)
+#define get_gdat_int_pos992(X,Y) get_gdat_int((X),(Y),992)
+#define get_gdat_llong_pos992(X,Y) get_gdat_llong((X),(Y),992)
+#define get_gdat_float_pos992(X,Y) get_gdat_float((X),(Y),992)
+#define get_gdat_uint_pos993(X,Y) get_gdat_uint((X),(Y),993)
+#define get_gdat_ullong_pos993(X,Y) get_gdat_ullong((X),(Y),993)
+#define get_gdat_ip_pos993(X,Y) get_gdat_ip((X),(Y),993)
+#define get_gdat_ipv6_pos993(X,Y) get_gdat_ipv6((X),(Y),993)
+#define get_gdat_string_pos993(X,Y) get_gdat_string((X),(Y),993)
+#define get_gdat_v_str_pos993(X,Y) get_gdat_string((X),(Y),993)
+#define get_gdat_bool_pos993(X,Y) get_gdat_bool((X),(Y),993)
+#define get_gdat_int_pos993(X,Y) get_gdat_int((X),(Y),993)
+#define get_gdat_llong_pos993(X,Y) get_gdat_llong((X),(Y),993)
+#define get_gdat_float_pos993(X,Y) get_gdat_float((X),(Y),993)
+#define get_gdat_uint_pos994(X,Y) get_gdat_uint((X),(Y),994)
+#define get_gdat_ullong_pos994(X,Y) get_gdat_ullong((X),(Y),994)
+#define get_gdat_ip_pos994(X,Y) get_gdat_ip((X),(Y),994)
+#define get_gdat_ipv6_pos994(X,Y) get_gdat_ipv6((X),(Y),994)
+#define get_gdat_string_pos994(X,Y) get_gdat_string((X),(Y),994)
+#define get_gdat_v_str_pos994(X,Y) get_gdat_string((X),(Y),994)
+#define get_gdat_bool_pos994(X,Y) get_gdat_bool((X),(Y),994)
+#define get_gdat_int_pos994(X,Y) get_gdat_int((X),(Y),994)
+#define get_gdat_llong_pos994(X,Y) get_gdat_llong((X),(Y),994)
+#define get_gdat_float_pos994(X,Y) get_gdat_float((X),(Y),994)
+#define get_gdat_uint_pos995(X,Y) get_gdat_uint((X),(Y),995)
+#define get_gdat_ullong_pos995(X,Y) get_gdat_ullong((X),(Y),995)
+#define get_gdat_ip_pos995(X,Y) get_gdat_ip((X),(Y),995)
+#define get_gdat_ipv6_pos995(X,Y) get_gdat_ipv6((X),(Y),995)
+#define get_gdat_string_pos995(X,Y) get_gdat_string((X),(Y),995)
+#define get_gdat_v_str_pos995(X,Y) get_gdat_string((X),(Y),995)
+#define get_gdat_bool_pos995(X,Y) get_gdat_bool((X),(Y),995)
+#define get_gdat_int_pos995(X,Y) get_gdat_int((X),(Y),995)
+#define get_gdat_llong_pos995(X,Y) get_gdat_llong((X),(Y),995)
+#define get_gdat_float_pos995(X,Y) get_gdat_float((X),(Y),995)
+#define get_gdat_uint_pos996(X,Y) get_gdat_uint((X),(Y),996)
+#define get_gdat_ullong_pos996(X,Y) get_gdat_ullong((X),(Y),996)
+#define get_gdat_ip_pos996(X,Y) get_gdat_ip((X),(Y),996)
+#define get_gdat_ipv6_pos996(X,Y) get_gdat_ipv6((X),(Y),996)
+#define get_gdat_string_pos996(X,Y) get_gdat_string((X),(Y),996)
+#define get_gdat_v_str_pos996(X,Y) get_gdat_string((X),(Y),996)
+#define get_gdat_bool_pos996(X,Y) get_gdat_bool((X),(Y),996)
+#define get_gdat_int_pos996(X,Y) get_gdat_int((X),(Y),996)
+#define get_gdat_llong_pos996(X,Y) get_gdat_llong((X),(Y),996)
+#define get_gdat_float_pos996(X,Y) get_gdat_float((X),(Y),996)
+#define get_gdat_uint_pos997(X,Y) get_gdat_uint((X),(Y),997)
+#define get_gdat_ullong_pos997(X,Y) get_gdat_ullong((X),(Y),997)
+#define get_gdat_ip_pos997(X,Y) get_gdat_ip((X),(Y),997)
+#define get_gdat_ipv6_pos997(X,Y) get_gdat_ipv6((X),(Y),997)
+#define get_gdat_string_pos997(X,Y) get_gdat_string((X),(Y),997)
+#define get_gdat_v_str_pos997(X,Y) get_gdat_string((X),(Y),997)
+#define get_gdat_bool_pos997(X,Y) get_gdat_bool((X),(Y),997)
+#define get_gdat_int_pos997(X,Y) get_gdat_int((X),(Y),997)
+#define get_gdat_llong_pos997(X,Y) get_gdat_llong((X),(Y),997)
+#define get_gdat_float_pos997(X,Y) get_gdat_float((X),(Y),997)
+#define get_gdat_uint_pos998(X,Y) get_gdat_uint((X),(Y),998)
+#define get_gdat_ullong_pos998(X,Y) get_gdat_ullong((X),(Y),998)
+#define get_gdat_ip_pos998(X,Y) get_gdat_ip((X),(Y),998)
+#define get_gdat_ipv6_pos998(X,Y) get_gdat_ipv6((X),(Y),998)
+#define get_gdat_string_pos998(X,Y) get_gdat_string((X),(Y),998)
+#define get_gdat_v_str_pos998(X,Y) get_gdat_string((X),(Y),998)
+#define get_gdat_bool_pos998(X,Y) get_gdat_bool((X),(Y),998)
+#define get_gdat_int_pos998(X,Y) get_gdat_int((X),(Y),998)
+#define get_gdat_llong_pos998(X,Y) get_gdat_llong((X),(Y),998)
+#define get_gdat_float_pos998(X,Y) get_gdat_float((X),(Y),998)
+#define get_gdat_uint_pos999(X,Y) get_gdat_uint((X),(Y),999)
+#define get_gdat_ullong_pos999(X,Y) get_gdat_ullong((X),(Y),999)
+#define get_gdat_ip_pos999(X,Y) get_gdat_ip((X),(Y),999)
+#define get_gdat_ipv6_pos999(X,Y) get_gdat_ipv6((X),(Y),999)
+#define get_gdat_string_pos999(X,Y) get_gdat_string((X),(Y),999)
+#define get_gdat_v_str_pos999(X,Y) get_gdat_string((X),(Y),999)
+#define get_gdat_bool_pos999(X,Y) get_gdat_bool((X),(Y),999)
+#define get_gdat_int_pos999(X,Y) get_gdat_int((X),(Y),999)
+#define get_gdat_llong_pos999(X,Y) get_gdat_llong((X),(Y),999)
+#define get_gdat_float_pos999(X,Y) get_gdat_float((X),(Y),999)
+#define get_gdat_uint_pos1000(X,Y) get_gdat_uint((X),(Y),1000)
+#define get_gdat_ullong_pos1000(X,Y) get_gdat_ullong((X),(Y),1000)
+#define get_gdat_ip_pos1000(X,Y) get_gdat_ip((X),(Y),1000)
+#define get_gdat_ipv6_pos1000(X,Y) get_gdat_ipv6((X),(Y),1000)
+#define get_gdat_string_pos1000(X,Y) get_gdat_string((X),(Y),1000)
+#define get_gdat_v_str_pos1000(X,Y) get_gdat_string((X),(Y),1000)
+#define get_gdat_bool_pos1000(X,Y) get_gdat_bool((X),(Y),1000)
+#define get_gdat_int_pos1000(X,Y) get_gdat_int((X),(Y),1000)
+#define get_gdat_llong_pos1000(X,Y) get_gdat_llong((X),(Y),1000)
+#define get_gdat_float_pos1000(X,Y) get_gdat_float((X),(Y),1000)
+#endif
diff --git a/include/lfta/gencsvinclude.pl b/include/lfta/gencsvinclude.pl
new file mode 100644 (file)
index 0000000..9b5421b
--- /dev/null
@@ -0,0 +1,35 @@
+#! /usr/bin/perl
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+open(I,"cat ../packet.h | grep '#define CSVELEMENTS' | cut -f 3 -d ' ' |");
+$num=<I>;
+close(I);
+chomp $num;
+printf("#ifndef CSV_MACRO_H\n#define CSV_MACRO_H\n");
+for($x=1;$x<=$num;$x++) {
+       printf "#define get_csv_uint_pos$x(X,Y) get_csv_uint((X),(Y),$x)\n";
+    printf "#define get_csv_ullong_pos$x(X,Y) get_csv_ullong((X),(Y),$x)\n";
+    printf "#define get_csv_ip_pos$x(X,Y) get_csv_ip((X),(Y),$x)\n";
+    printf "#define get_csv_ipv6_pos$x(X,Y) get_csv_ipv6((X),(Y),$x)\n";
+    printf "#define get_csv_string_pos$x(X,Y) get_csv_string((X),(Y),$x)\n";
+    printf "#define get_csv_v_str_pos$x(X,Y) get_csv_string((X),(Y),$x)\n";
+    printf "#define get_csv_bool_pos$x(X,Y) get_csv_bool((X),(Y),$x)\n";
+    printf "#define get_csv_int_pos$x(X,Y) get_csv_int((X),(Y),$x)\n";
+    printf "#define get_csv_llong_pos$x(X,Y) get_csv_llong((X),(Y),$x)\n";
+    printf "#define get_csv_float_pos$x(X,Y) get_csv_float((X),(Y),$x)\n";
+}
+print("#endif\n");
diff --git a/include/lfta/gengdatinclude.pl b/include/lfta/gengdatinclude.pl
new file mode 100644 (file)
index 0000000..6678a1e
--- /dev/null
@@ -0,0 +1,35 @@
+#! /usr/bin/perl
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+open(I,"cat ../packet.h | grep '#define GDATELEMENTS' | cut -f 3 -d ' ' |");
+$num=<I>;
+close(I);
+chomp $num;
+printf("#ifndef GDAT_MACRO_H\n#define GDAT_MACRO_H\n");
+for($x=1;$x<=$num;$x++) {
+       printf "#define get_gdat_uint_pos$x(X,Y) get_gdat_uint((X),(Y),$x)\n";
+    printf "#define get_gdat_ullong_pos$x(X,Y) get_gdat_ullong((X),(Y),$x)\n";
+    printf "#define get_gdat_ip_pos$x(X,Y) get_gdat_ip((X),(Y),$x)\n";
+    printf "#define get_gdat_ipv6_pos$x(X,Y) get_gdat_ipv6((X),(Y),$x)\n";
+    printf "#define get_gdat_string_pos$x(X,Y) get_gdat_string((X),(Y),$x)\n";
+    printf "#define get_gdat_v_str_pos$x(X,Y) get_gdat_string((X),(Y),$x)\n";
+    printf "#define get_gdat_bool_pos$x(X,Y) get_gdat_bool((X),(Y),$x)\n";
+    printf "#define get_gdat_int_pos$x(X,Y) get_gdat_int((X),(Y),$x)\n";
+    printf "#define get_gdat_llong_pos$x(X,Y) get_gdat_llong((X),(Y),$x)\n";
+    printf "#define get_gdat_float_pos$x(X,Y) get_gdat_float((X),(Y),$x)\n";
+}
+print("#endif\n");
diff --git a/include/lfta/md_stdlib.h b/include/lfta/md_stdlib.h
new file mode 100644 (file)
index 0000000..1735c46
--- /dev/null
@@ -0,0 +1,23 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+#include <stdlib.h>
+#include <string.h>
+
+/*
+ * macro adaptor
+ */
+#define mod(a,b) ((a) % (b))
+
diff --git a/include/lfta/rts.h b/include/lfta/rts.h
new file mode 100644 (file)
index 0000000..f0bf616
--- /dev/null
@@ -0,0 +1,123 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+/*
+ * rts.h: ethernet card run-time system dfns
+ */
+#ifndef RTS_H
+#define RTS_H
+#include "gstypes.h"
+#include "gsconfig.h"
+#include "byteswap.h"
+#include "rts_external.h"
+
+struct gs_string;      /* forward decl. */
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#include "fta.h"
+
+
+/*
+ * dynamic memory allocation for FTAs (so they can store state, etc.).
+ * note that the allocator keeps track of which FTA owns what blocks and
+ * can free all allocated blocks for a given FTA in one go.
+ */
+
+void *fta_alloc(struct FTA *, gs_int32_t size);
+void fta_free(struct FTA *, void *mem);
+void fta_free_all(struct FTA *);
+
+/* memory allocation for scratchpad */
+
+#define sp_fta_alloc fta_alloc
+#define sp_fta_free fta_free
+#define sp_fta_free_all fta_free_all
+
+
+/* functions used to parse packet  (list is not complete)*/
+#include "schema_prototypes.h"
+
+/*
+ * FTA output: FTAs output tuples to the host using the post_tuple RTS function.
+ * Before the tuple can be output a tuple memory block has to be allocated
+ * in the tuple memory space. The allocate_tuple function is used for this.
+ * If an FTA is removed before post_tuple is called all allocated memory
+ * in the FTA's tuple space is reclaimed. If the FTA is removed after
+ * post_tuple is called the tuple will be deliverd to the host.
+ * If 0 is returned at no none suspended ringbuffer has not enough memory to
+ * allocate the tuple
+ */
+
+void * allocate_tuple(struct FTA *,  gs_int32_t size);
+
+/* post tuple posts the tuple if the atomic reingbuffer set can not suceed -1 is returned and the tuple is not
+ posted otherwise 0 is returned*/
+
+gs_retval_t post_tuple(void *tuple);
+
+
+/* the following function fills in the FTAID array r with the FTAIDs of processes receiving
+ * tuplese from the FTA specified in f. The space array indicates how many tuples of tuplesz
+ * can still fit in the ringbuffer corresponding to the FTAID of the process with the same index
+ * in r. The return values indicates how many ring buffers are valid in r. szr indicates the memory
+ * length (in elements) of  r and space. The function will fill at most szr elements into these array.
+ * If the return value is larger then szr it is an indication that not enough memory in r and space
+ * were provided to hold all results. A return value of -1 indicates an error.
+ */
+
+gs_retval_t get_ringbuf_space(struct FTA * f, FTAID * r, gs_int32_t * space,  gs_int32_t szr, gs_int32_t tuplesz);
+
+
+/* the following function can be used to put a ringbuffer to a process identified by the FTAID
+ * process into one of the following 3 modes. ATOMIC makes the ringbuffer part of the atomic set.
+ * A post to the atomic set either succeed or fails entirely. BESTEFORT is the besteffort set
+ * posts to BESTEFORT ringbuffers might fail quitely. SUSPEND will prevent any tuples of being
+ * posted to that proccess from the specified FTA. NOTE: Calling set_ringbuf_space between
+ * allocate_tuple and post_tuple might have unpredictable results for the tuple already
+ * allocated.
+ */
+
+#define LFTA_RINGBUF_ATOMIC 1
+#define LFTA_RINGBUF_BESTEFFORT 2
+#define LFTA_RINGBUF_SUSPEND 3
+
+gs_retval_t set_ringbuf_type(struct FTA * f, FTAID process, gs_int32_t state);
+
+/* The following function returns TRUE if there is enough room in the post tuple
+ * queue for a speedy posting of the tuple. It should be used by FTAs which could
+ * possibly delay the posting of a tuple if FALSE is returned.
+ */
+
+gs_retval_t post_ready(void);
+
+/*
+ * the following function gives hints to the heap for binning
+ */
+
+void fta_add_alloc_bin_size(struct FTA *, gs_int32_t sz, gs_int32_t maxcnt);
+void fta_remove_alloc_bin_size(struct FTA *, gs_int32_t sz, gs_int32_t maxcnt);
+
+
+gs_retval_t print_error(char *string); /* XXXCDC: right place? */
+
+/* Function to get the attributes of interfaces in an lfta */
+
+gs_sp_t get_iface_properties (const gs_sp_t iface_name, const gs_sp_t property_name);
+
+
+#endif
diff --git a/include/lfta/rts_external.h b/include/lfta/rts_external.h
new file mode 100644 (file)
index 0000000..0f0127c
--- /dev/null
@@ -0,0 +1,153 @@
+#ifndef RTS_STRING_H
+#define RTS_STRING_H
+
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+#include <stdint.h>
+
+#include "gsconfig.h"
+#include "gstypes.h"
+
+#define IS_BIG_ENDIAN (*(uint16_t *)"\0\xff" < 0x100)
+
+//     struct string32 matches vstring32, its the packed record format.
+//     struct gs_string is the in-memory format.
+
+struct string32{
+       gs_int32_t length;
+       gs_int32_t offset;
+       gs_int32_t reserved;
+};
+
+
+/* struct gs_string has to match definition in host.h however, the data
+ types differ */
+
+struct gs_string {
+    gs_int32_t length;
+    gs_sp_t data;
+    struct FTA * owner;    
+};
+
+#include "fta.h"
+#include "rts.h"
+
+
+/* Basic string operation */
+
+gs_retval_t str_assign_with_copy(struct FTA *, struct gs_string * dest, struct gs_string * src);
+
+gs_retval_t str_assign_with_copy_in_tuple(struct string32 * dest, struct gs_string * src,
+                                          gs_sp_t start, gs_sp_t buf);
+
+#define str_destroy(s) {if ((s)->owner!=0) fta_free((s)->owner,(s)->data);}
+
+gs_retval_t str_replace(struct FTA *,  struct gs_string * dest, struct gs_string * src );
+
+#define str_length(s) (s)->length
+
+/* Searching within a string */
+
+gs_retval_t str_exists_substr( struct gs_string * str1, struct gs_string * str2);
+
+/* String comparison */
+
+gs_retval_t str_compare( struct gs_string * str1, struct gs_string * str2);
+
+
+/*     Construct a string constant */
+
+gs_retval_t str_constructor(struct gs_string *s, gs_sp_t l);
+
+
+/* External Function definitions */
+
+#define LLMIN(x,y) ((x)<(y)?(x):(y))
+#define LLMAX(x,y) ((x)<(y)?(y):(x))
+#define UMIN(x,y) ((x)<(y)?(x):(y))
+#define UMAX(x,y) ((x)<(y)?(y):(x))
+// type conversion
+#define INT(c) ((int)(c))
+#define UINT(c) ((unsigned int)(c))
+#define ULLONG(c) ((unsigned long long)(c))
+#define FLOAT(c) ((double)(c))
+
+//     Cast away temporality
+#define non_temporal(x)(x)
+
+
+
+gs_uint32_t str_match_offset( gs_uint32_t offset, struct gs_string * s1, struct gs_string * s2);
+gs_uint32_t byte_match_offset( gs_uint32_t offset, gs_uint32_t val, struct gs_string * s2);
+gs_param_handle_t register_handle_for_str_regex_match_slot_1(struct FTA * f,
+                                                             struct gs_string* pattern);
+gs_uint32_t str_regex_match(struct gs_string* str, gs_param_handle_t pattern_handle);
+gs_retval_t deregister_handle_for_str_regex_match_slot_1(gs_param_handle_t handle);
+
+gs_param_handle_t register_handle_for_str_partial_regex_match_slot_1(struct FTA * f,
+                                                                     struct gs_string* pattern);
+gs_uint32_t str_partial_regex_match(struct gs_string* str,
+                                    gs_param_handle_t pattern_handle,
+                                    gs_uint32_t maxlen);
+gs_retval_t deregister_handle_for_str_partial_regex_match_slot_1(
+                                                                 gs_param_handle_t
+                                                                 handle);
+
+inline static gs_retval_t str_truncate(struct gs_string * result, struct gs_string *str, gs_uint32_t length) {
+       result->data=str->data;
+       result->length=(str->length<length)?str->length:length;
+       return 0;
+}
+
+//     constant string conversions
+gs_param_handle_t register_handle_for_strtoi_c_slot_0(struct FTA * f, struct gs_string* istr) ;
+gs_retval_t deregister_handle_for_strtoi_c_slot_0(gs_param_handle_t h) ;
+#define strtoi_c(h) ((unsigned int)(h))
+
+gs_param_handle_t register_handle_for_strtoip_c_slot_0(struct FTA * f, struct gs_string* istr) ;
+gs_retval_t deregister_handle_for_strtoip_c_slot_0(gs_param_handle_t h) ;
+#define strtoip_c(h) ((unsigned int)(h))
+
+
+
+////////////////////////////////////////////////
+///            IPV6
+
+#ifndef IPV6_STR
+#define IPV6_STR
+struct ipv6_str{
+       gs_uint32_t v[4];
+};
+#endif
+
+gs_int32_t ipv6_compare( struct ipv6_str  i1, struct ipv6_str  i2);
+gs_int32_t Ipv6_Constructor(struct ipv6_str *s, char *l);
+struct ipv6_str And_Ipv6(const struct ipv6_str i1, const struct ipv6_str i2);
+struct ipv6_str Or_Ipv6(const struct ipv6_str i1, const struct ipv6_str i2);
+struct ipv6_str hton_ipv6(struct ipv6_str s);
+struct ipv6_str ntoh_ipv6(struct ipv6_str s);
+
+
+////////////////////////////////////////////////
+///            Regex pattern extraction based on signature library for VideoNOC
+gs_param_handle_t register_handle_for_signaturelib_get_content_id_slot_2(struct FTA * f, struct gs_string* signature_file);
+gs_uint32_t signaturelib_get_content_id(struct gs_string* result, struct gs_string* url, gs_uint32_t content_length, gs_param_handle_t handle);
+gs_retval_t deregister_handle_for_signaturelib_get_content_id_slot_2(gs_param_handle_t handle);
+
+gs_uint32_t signaturelib_get_fqdn(struct gs_string* result);
+gs_uint32_t signaturelib_get_channel_type(struct gs_string* result);
+
+#endif
diff --git a/include/lfta/rts_udaf.h b/include/lfta/rts_udaf.h
new file mode 100644 (file)
index 0000000..fc6bae3
--- /dev/null
@@ -0,0 +1,84 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef _RTS_UDAF_H_INCLUDED_
+#define _RTS_UDAF_H_INCLUDED_
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "rts_external.h"
+
+
+//                     avg_udaf
+void avg_udaf_lfta_LFTA_AGGR_INIT_(gs_sp_t);
+void avg_udaf_lfta_LFTA_AGGR_UPDATE_(gs_sp_t,gs_uint32_t);
+gs_retval_t avg_udaf_lfta_LFTA_AGBGR_FLUSHME_(gs_sp_t);
+void avg_udaf_lfta_LFTA_AGGR_OUTPUT_(struct gs_string *,gs_sp_t);
+void avg_udaf_lfta_LFTA_AGGR_DESTROY_(gs_sp_t);
+
+//             moving sum
+void moving_sum_lfta_LFTA_AGGR_INIT_(gs_sp_t b);
+void moving_sum_lfta_LFTA_AGGR_UPDATE_(gs_sp_t b, gs_uint32_t v, gs_uint32_t N);
+gs_retval_t moving_sum_lfta_LFTA_AGGR_FLUSHME_(gs_sp_t b);
+void moving_sum_lfta_LFTA_AGGR_OUTPUT_(gs_uint64_t *r, gs_sp_t b);
+gs_retval_t moving_sum_lfta_LFTA_AGGR_DESTROY_(gs_sp_t b);
+
+
+//      first aggregate
+void FIRST_lfta_LFTA_AGGR_INIT_(gs_uint32_t* scratch);
+void FIRST_lfta_LFTA_AGGR_UPDATE_(gs_uint32_t* scratch, gs_uint32_t val);
+gs_retval_t FIRST_lfta_LFTA_AGGR_FLUSHME_(gs_uint32_t* scratch);
+void FIRST_lfta_LFTA_AGGR_OUTPUT_(gs_uint32_t* res, gs_uint32_t* scratch);
+void FIRST_lfta_LFTA_AGGR_DESTROY_(gs_uint32_t* scratch);
+
+void FIRST_ULL_lfta_LFTA_AGGR_INIT_(gs_uint64_t* scratch);
+void FIRST_ULL_lfta_LFTA_AGGR_UPDATE_(gs_uint64_t* scratch, gs_uint64_t val);
+gs_retval_t FIRST_ULL_lfta_LFTA_AGGR_FLUSHME_(gs_uint64_t* scratch);
+void FIRST_ULL_lfta_LFTA_AGGR_OUTPUT_(gs_uint64_t* res, gs_uint64_t* scratch);
+void FIRST_ULL_lfta_LFTA_AGGR_DESTROY_(gs_uint64_t* scratch);
+
+void FIRST_STR_lfta_LFTA_AGGR_INIT_(struct gs_string* scratch);
+void FIRST_STR_lfta_LFTA_AGGR_UPDATE_(struct gs_string* scratch, struct gs_string* val);
+gs_retval_t FIRST_STR_lfta_LFTA_AGGR_FLUSHME_(struct gs_string* scratch);
+void FIRST_STR_lfta_LFTA_AGGR_OUTPUT_(struct gs_string* res, struct gs_string* scratch);
+void FIRST_STR_lfta_LFTA_AGGR_DESTROY_(struct gs_string* scratch);
+
+//      last aggregate
+void LAST_lfta_LFTA_AGGR_INIT_(gs_uint32_t* scratch);
+void LAST_lfta_LFTA_AGGR_UPDATE_(gs_uint32_t* scratch, gs_uint32_t val);
+gs_retval_t LAST_lfta_LFTA_AGGR_FLUSHME_(gs_uint32_t* scratch);
+void LAST_lfta_LFTA_AGGR_OUTPUT_(gs_uint32_t* res, gs_uint32_t* scratch);
+void LAST_lfta_LFTA_AGGR_DESTROY_(gs_uint32_t* scratch);
+
+void LAST_ULL_lfta_LFTA_AGGR_INIT_(gs_uint64_t* scratch);
+void LAST_ULL_lfta_LFTA_AGGR_UPDATE_(gs_uint64_t* scratch, gs_uint64_t val);
+gs_retval_t LAST_ULL_lfta_LFTA_AGGR_FLUSHME_(gs_uint64_t* scratch);
+void LAST_ULL_lfta_LFTA_AGGR_OUTPUT_(gs_uint64_t* res, gs_uint64_t* scratch);
+void LAST_ULL_lfta_LFTA_AGGR_DESTROY_(gs_uint64_t* scratch);
+
+void LAST_STR_lfta_LFTA_AGGR_INIT_(struct gs_string* scratch);
+void LAST_STR_lfta_LFTA_AGGR_UPDATE_(struct gs_string* scratch, struct gs_string* val);
+gs_retval_t LAST_STR_lfta_LFTA_AGGR_FLUSHME_(struct gs_string* scratch);
+void LAST_STR_lfta_LFTA_AGGR_OUTPUT_(struct gs_string* res, struct gs_string* scratch);
+void LAST_STR_lfta_LFTA_AGGR_DESTROY_(struct gs_string* scratch);
+
+//             running_array_aggr aggregate
+void running_array_aggr_lfta_LFTA_AGGR_INIT_(char* scratch);
+void running_array_aggr_lfta_LFTA_AGGR_UPDATE_(char* scratch, gs_uint32_t val);
+gs_retval_t running_array_aggr_lfta_LFTA_AGGR_FLUSHME_(char* scratch);
+void running_array_aggr_lfta_LFTA_AGGR_OUTPUT_(struct gs_string* res, char* scratch);
+void running_array_aggr_lfta_LFTA_AGGR_DESTROY_(char* scratch);
+
+
+#endif
diff --git a/include/lfta/schema_prototypes.h b/include/lfta/schema_prototypes.h
new file mode 100644 (file)
index 0000000..7a02b4c
--- /dev/null
@@ -0,0 +1,513 @@
+#ifndef __SCHEMA_PROTOTYPES__
+#define __SCHEMA_PROTOTYPES__
+
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+
+#define PRECOMP
+#include "gsconfig.h"
+#include "gstypes.h"
+
+#include "fta.h"
+#include "rts_external.h"
+#include "packet.h"
+#include "md_stdlib.h"
+#include "schemaparser.h"
+
+
+// *** SAMPLING RELATED CONSTANTS
+// ******************************
+
+// Make sure the hash table sizes are powers of 2-1 since they are used to compute the module with an and.
+// collions on the flow hash are handled properly so they are not that bad
+#define MAX_FLOWRECORD_HASH 0x1fffff
+// keep the collision rate low on denies
+#define MAX_DENY_HASH 0x7fffff
+// one out of SAMPLING_RATE+1 sampling
+#define SAMPLING_RATE 19
+// sampling probability
+#define FLOWSAMPPROB (((gs_float_t)1)/((gs_float_t)SAMPLING_RATE+1))
+// wait for SAMPLED_FLOW_TIMEOUT  seconds idle time to time a flow out
+#define SAMPLED_FLOW_TIMEOUT 30
+// check if we haven't seen that flow in SAMPLED_FLOW_IDLE_TIME seconds to make sure we don't catch it in the midle
+#define SAMPLED_FLOW_IDLE_TIME 30
+
+// PACKET SAMPLING RATE one in SAMPLED_PACKETS will be sampled
+#define SAMPLED_PACKETS 200
+// SAMPLING probability
+#define PACKETSAMPPROB (((gs_float_t)1)/((gs_float_t)SAMPLED_PACKETS))
+
+// COMBINE probability
+#define COMBINEDPROB (((gs_float_t)1)-(((gs_float_t)1)-FLOWSAMPPROB)*(((gs_float_t)1)-PACKETSAMPPROB))
+
+/* General packet access functions */
+
+static inline gs_retval_t get_system_time(struct packet * p, gs_uint32_t * t)
+{
+       *t=(gs_uint32_t) p->systemTime;
+       return 0;
+}
+
+/* CSV access function using position as 3rd argument */
+
+static inline gs_retval_t get_csv_uint(struct packet * p, gs_uint32_t * t,gs_uint32_t pos)
+{
+       if (p->ptype != PTYPE_CSV) return -1;
+       if (p->record.csv.numberfields < pos) return -1;
+    *t = strtoul((const char*)p->record.csv.fields[pos-1], NULL, 10);
+       return 0;
+}
+
+static inline gs_retval_t get_csv_ullong(struct packet * p, gs_uint64_t * t,gs_uint32_t pos)
+{
+    if (p->ptype != PTYPE_CSV) return -1;
+    if (p->record.csv.numberfields < pos) return -1;
+    *t = strtoull((const char*)p->record.csv.fields[pos-1], NULL, 10);    
+    return 0;
+}
+
+static inline gs_retval_t get_csv_ip(struct packet * p, gs_uint32_t * t,gs_uint32_t pos)
+{
+       unsigned ip1,ip2,ip3,ip4;
+    if (p->ptype != PTYPE_CSV) return -1;
+    if (p->record.csv.numberfields < pos) return -1;
+    sscanf((const char*) p->record.csv.fields[pos-1],"%u.%u.%u.%u",&ip1,&ip2,&ip3,&ip4);
+       *t=(ip1<<24)|(ip2<<16)|(ip3<<8)|ip4;
+    return 0;
+}
+static inline gs_retval_t get_csv_ipv6(struct packet * p, struct ipv6_str * t,gs_uint32_t pos)
+{
+    gs_uint32_t v[8];
+       if (p->ptype != PTYPE_CSV) return -1;
+    if (p->record.csv.numberfields < pos) return -1;
+    sscanf((const char*) p->record.csv.fields[pos-1],"%x:%x:%x:%x:%x:%x:%x:%x",&v[0],&v[1],&v[2],&v[3],&v[4],&v[5],&v[6],&v[7]);
+       t->v[0]=htonl(v[0]<<16|v[1]);
+       t->v[1]=htonl(v[2]<<16|v[3]);
+       t->v[2]=htonl(v[4]<<16|v[5]);
+       t->v[3]=htonl(v[6]<<16|v[7]);
+       
+    return 0;
+}
+static inline gs_retval_t get_csv_string(struct packet * p, struct gs_string * t,gs_uint32_t pos)
+{
+    
+    if (p->ptype != PTYPE_CSV) return -1;
+    if (p->record.csv.numberfields < pos) return -1;
+       t->data=(gs_sp_t)p->record.csv.fields[pos-1];
+    if (pos == p->record.csv.numberfields)
+        t->length=strlen((const char*)p->record.csv.fields[pos-1]);
+    else
+        t->length=p->record.csv.fields[pos] - p->record.csv.fields[pos-1] - 1;
+       t->owner=0;
+    return 0;
+}
+static inline gs_retval_t get_csv_bool(struct packet * p, gs_uint32_t * t,gs_uint32_t pos)
+{
+    if (p->ptype != PTYPE_CSV) return -1;
+    if (p->record.csv.numberfields < pos) return -1;
+       *t=0;
+       if ((strlen((const char*)p->record.csv.fields[pos-1])==4) &&
+               (strncasecmp("TRUE",(const char*)p->record.csv.fields[pos-1],4) ==0) ) {
+               *t=1;
+       }
+    return 0;
+}
+static inline gs_retval_t get_csv_int(struct packet * p, gs_int32_t * t,gs_uint32_t pos)
+{
+    if (p->ptype != PTYPE_CSV) return -1;
+    if (p->record.csv.numberfields < pos) return -1;
+    *t = strtol((const char*)p->record.csv.fields[pos-1], NULL, 10);
+    return 0;
+}
+static inline gs_retval_t get_csv_llong(struct packet * p, gs_int64_t * t,gs_uint32_t pos)
+{
+    if (p->ptype != PTYPE_CSV) return -1;
+    if (p->record.csv.numberfields < pos) return -1;
+    *t = strtoll((const char*)p->record.csv.fields[pos-1], NULL, 10);
+    return 0;
+}
+static inline gs_retval_t get_csv_float(struct packet * p, gs_float_t * t,gs_uint32_t pos)
+{
+    if (p->ptype != PTYPE_CSV) return -1;
+    if (p->record.csv.numberfields < pos) return -1;
+    *t = strtod((const char*)p->record.csv.fields[pos-1], NULL);
+    return 0;
+}
+
+#include <lfta/csv_macro.h>
+
+static inline __attribute__((always_inline)) unsigned int gs_strtoul (const char *str, size_t len) {
+        unsigned int value = 0;
+
+        switch (len) { // handle up to 10 digits, assume we're 32-bit
+            case 10:    value += (str[len-10] - '0') * 1000000000;
+            case  9:    value += (str[len- 9] - '0') * 100000000;
+            case  8:    value += (str[len- 8] - '0') * 10000000;
+            case  7:    value += (str[len- 7] - '0') * 1000000;
+            case  6:    value += (str[len- 6] - '0') * 100000;
+            case  5:    value += (str[len- 5] - '0') * 10000;
+            case  4:    value += (str[len- 4] - '0') * 1000;
+            case  3:    value += (str[len- 3] - '0') * 100;
+            case  2:    value += (str[len- 2] - '0') * 10;
+            case  1:    value += (str[len- 1] - '0');
+                return value;
+            default:
+                return 0;
+        }
+}
+
+static inline __attribute__((always_inline)) unsigned long long gs_strtoull (const char *str, size_t len) {
+        unsigned long long value = 0;
+
+        switch (len) { // handle up to 10 digits, assume we're 32-bit
+            case 20:    value += (str[len-20] - '0') * 10000000000000000000UL;
+            case 19:    value += (str[len-19] - '0') * 1000000000000000000UL;
+            case 18:    value += (str[len-18] - '0') * 100000000000000000UL;
+            case 17:    value += (str[len-17] - '0') * 10000000000000000UL;
+            case 16:    value += (str[len-16] - '0') * 1000000000000000UL;
+            case 15:    value += (str[len-15] - '0') * 100000000000000UL;
+            case 14:    value += (str[len-14] - '0') * 10000000000000UL;
+            case 13:    value += (str[len-13] - '0') * 1000000000000UL;
+            case 12:    value += (str[len-12] - '0') * 100000000000UL;
+            case 11:    value += (str[len-11] - '0') * 10000000000UL;
+            case 10:    value += (str[len-10] - '0') * 1000000000UL;
+            case  9:    value += (str[len- 9] - '0') * 100000000UL;
+            case  8:    value += (str[len- 8] - '0') * 10000000UL;
+            case  7:    value += (str[len- 7] - '0') * 1000000UL;
+            case  6:    value += (str[len- 6] - '0') * 100000UL;
+            case  5:    value += (str[len- 5] - '0') * 10000UL;
+            case  4:    value += (str[len- 4] - '0') * 1000UL;
+            case  3:    value += (str[len- 3] - '0') * 100UL;
+            case  2:    value += (str[len- 2] - '0') * 10UL;
+            case  1:    value += (str[len- 1] - '0');
+                return value;
+            default:
+                return 0;
+        }
+}
+
+static inline gs_retval_t get_csv2_uint(struct packet * p, gs_uint32_t * t,gs_uint32_t pos)
+{
+//    *t = strtoul((const char*)p->record.csv2.fields[pos-1], NULL, 10);
+    *t = gs_strtoul((const char*)p->record.csv2.fields[pos-1], p->record.csv2.field_lens[pos-1]);
+    
+       return 0;
+}
+
+static inline gs_retval_t get_csv2_ullong(struct packet * p, gs_uint64_t * t,gs_uint32_t pos)
+{
+//    *t = strtoull((const char*)p->record.csv2.fields[pos-1], NULL, 10);    
+    *t = gs_strtoull((const char*)p->record.csv2.fields[pos-1], p->record.csv2.field_lens[pos-1]);
+    return 0;
+}
+
+static inline gs_retval_t get_csv2_ip(struct packet * p, gs_uint32_t * t,gs_uint32_t pos)
+{
+       unsigned ip1,ip2,ip3,ip4;
+    sscanf((const char*) p->record.csv2.fields[pos-1],"%u.%u.%u.%u",&ip1,&ip2,&ip3,&ip4);
+       *t=(ip1<<24)|(ip2<<16)|(ip3<<8)|ip4;
+    return 0;
+}
+static inline gs_retval_t get_csv2_ipv6(struct packet * p, struct ipv6_str * t,gs_uint32_t pos)
+{
+    gs_uint32_t v[8];
+    sscanf((const char*) p->record.csv2.fields[pos-1],"%x:%x:%x:%x:%x:%x:%x:%x",&v[0],&v[1],&v[2],&v[3],&v[4],&v[5],&v[6],&v[7]);
+       t->v[0]=htonl(v[0]<<16|v[1]);
+       t->v[1]=htonl(v[2]<<16|v[3]);
+       t->v[2]=htonl(v[4]<<16|v[5]);
+       t->v[3]=htonl(v[6]<<16|v[7]);
+       
+    return 0;
+}
+static inline gs_retval_t get_csv2_string(struct packet * p, struct gs_string * t,gs_uint32_t pos)
+{ 
+       t->data=(gs_sp_t)p->record.csv2.fields[pos-1];
+    /*
+    if (pos == p->record.csv2.numberfields)
+        t->length=strlen((const char*)p->record.csv2.fields[pos-1]);
+    else
+        t->length=p->record.csv2.fields[pos] - p->record.csv2.fields[pos-1] - 1;
+    */
+    t->length=p->record.csv2.field_lens[pos-1];
+       t->owner=0;
+    return 0;
+}
+static inline gs_retval_t get_csv2_bool(struct packet * p, gs_uint32_t * t,gs_uint32_t pos)
+{
+       *t=0;
+       if ((strlen((const char*)p->record.csv2.fields[pos-1])==4) &&
+               (strncasecmp("TRUE",(const char*)p->record.csv2.fields[pos-1],4) ==0) ) {
+               *t=1;
+       }
+    return 0;
+}
+static inline gs_retval_t get_csv2_int(struct packet * p, gs_int32_t * t,gs_uint32_t pos)
+{
+    *t = strtol((const char*)p->record.csv2.fields[pos-1], NULL, 10);
+    return 0;
+}
+static inline gs_retval_t get_csv2_llong(struct packet * p, gs_int64_t * t,gs_uint32_t pos)
+{
+    *t = strtoll((const char*)p->record.csv2.fields[pos-1], NULL, 10);
+    return 0;
+}
+static inline gs_retval_t get_csv2_float(struct packet * p, gs_float_t * t,gs_uint32_t pos)
+{
+    *t = strtod((const char*)p->record.csv2.fields[pos-1], NULL);
+    return 0;
+}
+
+#include <lfta/csv2_macro.h>
+
+/* GDAT access function using position as 3rd argument */
+
+//#define GDATDEBUG
+
+static inline gs_retval_t get_gdat_uint(struct packet * p, gs_uint32_t * t,gs_uint32_t pos)
+{
+    struct access_result ar;
+#ifdef GDATDEBUG
+       fprintf(stderr,"Decode uint");
+#endif
+       if (p->ptype != PTYPE_GDAT) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+       if (p->record.gdat.numfields<pos) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+       ar=ftaschema_get_field_by_index(p->record.gdat.schema,pos-1,p->record.gdat.data,p->record.gdat.datasz);
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+       if (ar.field_data_type!=UINT_TYPE) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"DONE\n");
+#endif
+       *t=ar.r.ui;
+    return 0;
+}
+
+static inline gs_retval_t get_gdat_ullong(struct packet * p, gs_uint64_t * t,gs_uint32_t pos)
+{
+    struct access_result ar;
+#ifdef GDATDEBUG
+    fprintf(stderr,"Decode ullong");
+#endif
+    if (p->ptype != PTYPE_GDAT) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (p->record.gdat.numfields<pos) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    ar=ftaschema_get_field_by_index(p->record.gdat.schema,pos-1,p->record.gdat.data,p->record.gdat.datasz);
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (ar.field_data_type!=ULLONG_TYPE) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"DONE\n");
+#endif
+    *t=ar.r.ul;
+    return 0;
+}
+
+static inline gs_retval_t get_gdat_ip(struct packet * p, gs_uint32_t * t,gs_uint32_t pos)
+{
+    struct access_result ar;
+    if (p->ptype != PTYPE_GDAT) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"Decode ip");
+#endif
+    if (p->record.gdat.numfields<pos) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    ar=ftaschema_get_field_by_index(p->record.gdat.schema,pos-1,p->record.gdat.data,p->record.gdat.datasz);
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (ar.field_data_type!=IP_TYPE) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"DONE\n");
+#endif
+    *t=ar.r.ui;
+    return 0;
+}
+static inline gs_retval_t get_gdat_ipv6(struct packet * p, struct ipv6_str * t,gs_uint32_t pos)
+{
+    struct access_result ar;
+    if (p->ptype != PTYPE_GDAT) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"Decode ipv6");
+#endif
+    if (p->record.gdat.numfields<pos) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    ar=ftaschema_get_field_by_index(p->record.gdat.schema,pos-1,p->record.gdat.data,p->record.gdat.datasz);
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (ar.field_data_type!=IPV6_TYPE) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"DONE\n");
+#endif
+    t->v[0]=ar.r.ip6.v[0];
+    t->v[1]=ar.r.ip6.v[1];
+    t->v[2]=ar.r.ip6.v[2];
+    t->v[3]=ar.r.ip6.v[3];
+    return 0;
+}
+static inline gs_retval_t get_gdat_string(struct packet * p, struct gs_string * t,gs_uint32_t pos)
+{
+    struct access_result ar;
+#ifdef GDATDEBUG
+    fprintf(stderr,"Decode string");
+#endif
+    if (p->ptype != PTYPE_GDAT) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (p->record.gdat.numfields<pos) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    ar=ftaschema_get_field_by_index(p->record.gdat.schema,pos-1,p->record.gdat.data,p->record.gdat.datasz);
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (ar.field_data_type!=VSTR_TYPE) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"DONE\n");
+#endif
+    t->data=(gs_sp_t)ar.r.vs.offset;
+       t->length=ar.r.vs.length;
+    return 0;
+}
+static inline gs_retval_t get_gdat_bool(struct packet * p, gs_uint32_t * t,gs_uint32_t pos)
+{
+    struct access_result ar;
+#ifdef GDATDEBUG
+    fprintf(stderr,"Decode bool");
+#endif
+    if (p->ptype != PTYPE_GDAT) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (p->record.gdat.numfields<pos) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    ar=ftaschema_get_field_by_index(p->record.gdat.schema,pos-1,p->record.gdat.data,p->record.gdat.datasz);
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (ar.field_data_type!=BOOL_TYPE) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"DONE\n");
+#endif
+    *t=ar.r.ui;
+    return 0;
+}
+static inline gs_retval_t get_gdat_int(struct packet * p, gs_int32_t * t,gs_uint32_t pos)
+{
+    struct access_result ar;
+#ifdef GDATDEBUG
+    fprintf(stderr,"Decode int");
+#endif
+    if (p->ptype != PTYPE_GDAT) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (p->record.gdat.numfields<pos) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    ar=ftaschema_get_field_by_index(p->record.gdat.schema,pos-1,p->record.gdat.data,p->record.gdat.datasz);
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (ar.field_data_type!=INT_TYPE) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"DONE\n");
+#endif
+    *t=ar.r.i;
+    return 0;
+}
+static inline gs_retval_t get_gdat_llong(struct packet * p, gs_int64_t * t,gs_uint32_t pos)
+{
+    struct access_result ar;
+#ifdef GDATDEBUG
+    fprintf(stderr,"Decode llong");
+#endif
+    if (p->ptype != PTYPE_GDAT) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (p->record.gdat.numfields<pos) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    ar=ftaschema_get_field_by_index(p->record.gdat.schema,pos-1,p->record.gdat.data,p->record.gdat.datasz);
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (ar.field_data_type!=LLONG_TYPE) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"DONE\n");
+#endif
+    *t=ar.r.l;
+    return 0;
+}
+static inline gs_retval_t get_gdat_float(struct packet * p, gs_float_t * t,gs_uint32_t pos)
+{
+    struct access_result ar;
+#ifdef GDATDEBUG
+    fprintf(stderr,"Decode float");
+#endif
+    if (p->ptype != PTYPE_GDAT) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (p->record.gdat.numfields<pos) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    ar=ftaschema_get_field_by_index(p->record.gdat.schema,pos-1,p->record.gdat.data,p->record.gdat.datasz);
+#ifdef GDATDEBUG
+    fprintf(stderr,".");
+#endif
+    if (ar.field_data_type!=FLOAT_TYPE) return -1;
+#ifdef GDATDEBUG
+    fprintf(stderr,"DONE\n");
+#endif
+    *t=ar.r.f;
+    return 0;
+}
+
+#include <lfta/gdat_macro.h>
+
+// External functions
+
+
+
+
+#endif
+
diff --git a/include/packet.h b/include/packet.h
new file mode 100644 (file)
index 0000000..8f91891
--- /dev/null
@@ -0,0 +1,65 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef PACKET_H
+#define PACKET_H
+
+#include "gsconfig.h"
+#include "gstypes.h"
+
+#ifndef IPV6_STR
+#define IPV6_STR
+struct ipv6_str{
+    gs_uint32_t v[4];
+};
+#endif
+
+#define PTYPE_CSV 1
+#define PTYPE_GDAT 2
+
+#define CSVELEMENTS 1000
+#define GDATELEMENTS 1000
+
+struct csv {
+    gs_uint32_t numberfields;
+    gs_sp_t fields[CSVELEMENTS];
+};
+
+struct csv2 {       // SSE accelerated CSV processor
+    gs_uint32_t numberfields;
+    gs_sp_t fields[CSVELEMENTS];
+    gs_uint32_t field_lens[CSVELEMENTS];
+    gs_uint8_t parsed[CSVELEMENTS];
+};
+
+struct gdat {
+    gs_schemahandle_t schema;
+    gs_uint32_t numfields;
+    gs_uint32_t datasz;
+    gs_uint8_t data[MAXTUPLESZ];
+};
+
+struct packet {
+    gs_uint32_t systemTime;
+    gs_uint32_t ptype; /* type of record e.g. PTYPE_CSV */
+    union {
+        struct csv csv; /* content of CSV record being processed */
+        struct csv2 csv2;     
+        struct gdat gdat;
+       } record;
+    
+};
+
+
+#endif
diff --git a/include/rdtsc.h b/include/rdtsc.h
new file mode 100644 (file)
index 0000000..346f5d4
--- /dev/null
@@ -0,0 +1,36 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef __RDTSC_H__
+#define __RDTSC_H__
+
+#include "gsconfig.h"
+#include "gstypes.h"
+
+#if defined(__i386__) || defined(__x86_64__)
+
+static __inline__ gs_uint64_t rdtsc(void)
+{
+    gs_uint64_t x=0;
+    gs_uint32_t low;
+    gs_uint32_t high;
+    __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high));
+    x=((gs_uint64_t)high)<<32;
+    x=x|((gs_uint64_t)low);
+    return x;
+}
+#endif
+
+#endif // __RDTSC_H__
+
diff --git a/include/schemaparser.h b/include/schemaparser.h
new file mode 100644 (file)
index 0000000..7d13a4c
--- /dev/null
@@ -0,0 +1,317 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef __INTERFACE_LIB_INCLUDED__
+#define __INTERFACE_LIB_INCLUDED__
+#include "gsconfig.h"
+#include "gstypes.h"
+
+#include<stdio.h>
+#include "byteswap.h"
+#include "type_indicators.h"
+#include "fta.h"
+#include <fta_stat.h>
+/* #include"type_objects.h"            */
+/* #include"parse_fta.h"               */
+
+
+/*//////////////////////////////////////////////////////
+////                   Include data type definitions.  */
+
+/*                     Include vstring.h to get the vstring definition. */
+
+/* XXXX OS This data definitions and prototypes are mirrored in schemaparser.h
+ * any changes have to be reflected there !!
+ */
+
+#include"vstring.h"
+
+#include<sys/time.h>
+/*
+#ifndef _TIMEVAL_T
+#define _TIMEVAL_T
+struct timeval {
+    long  tv_sec;
+    long  tv_usec;
+};
+#endif
+*/
+
+struct fstring_str{
+       gs_int32_t size;
+       gs_sp_t data;   // gs_int8_t *
+};
+
+/*                     Universal result holder.        */
+#ifndef _struct_access_result_defined_
+#define _struct_access_result_defined_
+struct access_result {
+       int field_data_type; // as defined
+       union {
+               gs_int32_t i;
+               gs_uint32_t ui;
+               gs_int64_t l;
+               gs_uint64_t ul;
+               gs_float_t f;
+               struct timeval t;               // defined in sys/time.h
+               struct vstring vs;
+               struct fstring_str fs;
+               struct hfta_ipv6_str ip6;
+       } r;
+};
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*//////////////////////////////////////
+////           Version functions               */
+
+gs_int32_t get_schemaparser_version();
+gs_int32_t *get_schemaparser_accepted_versions();      // returns zero-terminated array
+gs_int32_t schemaparser_accepts_version(gs_int32_t v); // 1 if true, 0 o'wise.
+
+
+/*/////////////////////////////////////////////////
+////                   Helper functions        */
+
+// int fta_field_size(int dt, int *is_udef);
+
+
+/*///////////////////////////////////////////////////
+////                   Interface functions     */
+
+
+/*///  FTA management          ////////////// */
+
+/*                     Create a new schema representation, return
+                       an integer handle.
+                       Input is a char array with the stream schema.
+                       returns -1 on error.
+                       Diagnostics written to stderr.
+                       use the _prot version to also to accept a PROTOCOL (table)
+*/
+
+gs_schemahandle_t ftaschema_parse_string(gs_csp_t f);  // gs_csp_t is const char *
+gs_schemahandle_t ftaschema_parse_string_prot(gs_csp_t f);     // gs_csp_t is const char *
+
+/*                     Create a new schema representation, return
+                       an integer handle.
+                       Input is a STREAM schema in a file.
+                       use the _prot version to also to accept a PROTOCOL (table)
+                       returns -1 on error.
+                       Diagnostics written to stderr.
+*/
+gs_schemahandle_t ftaschema_parse_file(FILE *f);
+gs_schemahandle_t ftaschema_parse_file_prot(FILE *f);
+
+/*                     Release memory used by the schema representation.
+                       return non-zero on error.
+*/
+gs_int32_t ftaschema_free(gs_schemahandle_t sh);       // gs_sp_t is char *
+
+/* name of fta schema null terminated */
+/* Returns NULL if sh is out of bounds.        */
+/* NO ALLOCATION IS PERFORMED!   Must treat result as const. */
+gs_sp_t ftaschema_name(gs_schemahandle_t sh);
+
+/*             key of fta
+               This function is omitted because we are using name only.
+FTAkey * ftaschema_key(schema_handle sh);
+*/
+
+/*/////                Tuple management        //////////////////// */
+
+/* number of entries in a tuple */
+/* Return -1 if the schema handle is out of range.     */
+gs_int32_t ftaschema_tuple_len(gs_schemahandle_t sh);
+
+
+/* tuple entry name */
+/* Returns NULL if sh or index is out of bounds.       */
+/* NO ALLOCATION IS PERFORMED!   Must treat result as const. */
+gs_sp_t ftaschema_field_name(gs_schemahandle_t sh, gs_uint32_t index);
+
+
+/* returns field offset by name (for direct access)  */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is -1 (field_offset) / UNDEFINED_TYPE (field_type)
+       gs_sp_t is char *
+*/
+gs_int32_t ftaschema_get_field_offset_by_name(gs_schemahandle_t sh, gs_csp_t fieldname);
+gs_int32_t ftaschema_get_field_type_by_name(gs_schemahandle_t sh, gs_csp_t fieldname);
+
+/* get field_offset, field_type bu index instead of name */
+gs_int32_t ftaschema_get_field_offset_by_index(gs_schemahandle_t sh, gs_int32_t index);
+gs_int32_t ftaschema_get_field_type_by_index(gs_schemahandle_t sh, gs_int32_t index);
+
+
+/* returns field value based on name */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is of type UNDEFINED_TYPE
+   NO COPYING IS PERFORMED FOR vstring TYPES.
+       gs_sp_t is char *
+*/
+struct access_result ftaschema_get_field_by_name(gs_schemahandle_t sh,
+                               gs_csp_t fieldname, void * data, gs_int32_t len);
+
+/* return field value by index */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is of type UNDEFINED_TYPE
+   NO COPYING IS PERFORMED FOR vstring TYPES.
+*/
+struct access_result ftaschema_get_field_by_index(gs_schemahandle_t sh,
+                               gs_uint32_t index, void * data, gs_uint32_t len);
+
+/* The following functions deals with temporal status tuples */
+
+//             Get location of eof, temporal-tuple metadata.
+gs_int32_t ftaschema_get_tuple_metadata_offset(gs_schemahandle_t sh);
+
+/* checks whether tuple is temporal
+  return value 1 indicates that tuple istemporal, 0 - not temporal
+*/
+gs_int32_t ftaschema_is_temporal_tuple(gs_int32_t schema_handle, void *data);
+//gs_int32_t ftaschema_is_temporal_tuple_offset(int metadata_offset, void *data) ;
+#define ftaschema_is_temporal_tuple_offset(metadata_offset,data) (*((gs_sp_t)(data) + (metadata_offset)) == TEMPORAL_TUPLE)
+
+/* checks whether tuple is special end-of_file tuple
+  return value 1 indicates that tuple is eof_tuple, 0 - otherwise
+*/
+gs_int32_t ftaschema_is_eof_tuple(gs_int32_t schema_handle, void *data);
+gs_int32_t ftaschema_is_eof_tuple_offset(int metadata_offset, void *data) ;
+
+
+
+
+
+/* extracts the trace from the temporal tuple */
+gs_int32_t ftaschema_get_trace(gs_int32_t schema_handle, void* data,
+       gs_int32_t len,
+       gs_uint64_t * trace_id, gs_uint32_t* sz, fta_stat** trace );
+
+
+/*     The following functions operate directly on the tuple
+    to return field values.  Problem set to 1 if the len is too small.
+    unpack_vstr does not make a copy of the buffer.
+       Neither does unpack_fstring
+*/
+gs_uint32_t fta_unpack_uint(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_uint32_t fta_unpack_ushort(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_uint32_t fta_unpack_bool(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_int32_t fta_unpack_int(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_uint64_t fta_unpack_ullong(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_int64_t fta_unpack_llong(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_float_t fta_unpack_float(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+struct timeval fta_unpack_timeval(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+struct vstring fta_unpack_vstr(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+struct hfta_ipv6_str fta_unpack_ipv6(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_sp_t fta_unpack_fstring(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+
+gs_uint32_t fta_unpack_uint_nocheck(void *data, gs_uint32_t offset);
+gs_uint32_t fta_unpack_ushort_nocheck(void *data, gs_uint32_t offset);
+gs_uint32_t fta_unpack_bool_nocheck(void *data, gs_uint32_t offset);
+gs_int32_t fta_unpack_int_nocheck(void *data, gs_uint32_t offset);
+gs_uint64_t fta_unpack_ullong_nocheck(void *data, gs_uint32_t offset);
+gs_int64_t fta_unpack_llong_nocheck(void *data, gs_uint32_t offset);
+gs_float_t fta_unpack_float_nocheck(void *data, gs_uint32_t offset);
+struct timeval fta_unpack_timeval_nocheck(void *data, gs_uint32_t offset);
+struct hfta_ipv6_str fta_unpack_ipv6_nocheck(void *data, gs_uint32_t offset);
+
+//             THe same as above, but no ntoh xform
+gs_uint32_t fta_unpack_uint_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_uint32_t fta_unpack_ushort_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_uint32_t fta_unpack_bool_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_int32_t fta_unpack_int_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_uint64_t fta_unpack_ullong_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_int64_t fta_unpack_llong_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_float_t fta_unpack_float_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+struct timeval fta_unpack_timeval_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+struct hfta_ipv6_str fta_unpack_ipv6_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+struct vstring fta_unpack_vstr_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+gs_sp_t fta_unpack_fstring_noxf(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem);
+
+gs_uint32_t fta_unpack_uint_noxf_nocheck(void *data, gs_uint32_t offset);
+gs_uint32_t fta_unpack_ushort_noxf_nocheck(void *data, gs_uint32_t offset);
+gs_uint32_t fta_unpack_bool_noxf_nocheck(void *data, gs_uint32_t offset);
+gs_int32_t fta_unpack_int_noxf_nocheck(void *data, gs_uint32_t offset);
+gs_uint64_t fta_unpack_ullong_noxf_nocheck(void *data, gs_uint32_t offset);
+gs_int64_t fta_unpack_llong_noxf_nocheck(void *data, gs_uint32_t offset);
+gs_float_t fta_unpack_float_noxf_nocheck(void *data, gs_uint32_t offset);
+struct timeval fta_unpack_timeval_noxf_nocheck(void *data, gs_uint32_t offset);
+struct hfta_ipv6_str fta_unpack_ipv6_noxf_nocheck(void *data, gs_uint32_t offset);
+
+
+
+/*///////              Param block management          ///////////////*/
+
+
+/* number of parameters */
+/*     Return -1 if sh is out of bounds        */
+gs_int32_t ftaschema_parameter_len(gs_schemahandle_t sh);
+
+/* parameter entry name */
+/*     Return NULL if sh or index is out of bounds.    */
+/*     NO COPYING IS PERFORMED */
+gs_sp_t ftaschema_parameter_name(gs_schemahandle_t sh, gs_uint32_t index);
+
+/*
+               No need to create param handles, it is done at schema parse time.
+               (downside: must be careful to set all parameters if
+                the user sends param blocks to multiple instances)
+
+        creates a parameter structure handle for a particular schema
+paramhandle ftaschema_create_paramhandle(schema_handle sh);
+
+        frees a parameter structure handle
+int ftaschema_free_paramhandle(paramhandle ph);
+*/
+
+
+/* set parameter value for parameter handle */
+/*     Pass in the parameter in its char string representation. */
+/*  Return value is -1 on error, else 0        */
+gs_int32_t ftaschema_setparam_by_name(gs_schemahandle_t sh, gs_sp_t param_name,
+                              gs_sp_t param_val, gs_int32_t len);
+
+/* set parameter value for parameter handle */
+/*     Pass in the parameter in its char string representation. */
+/*  Return value is -1 on error, else 0        */
+gs_int32_t ftaschema_setparam_by_index(gs_schemahandle_t sh, gs_int32_t index,
+                               gs_sp_t param_val, gs_int32_t len);
+
+/* creates the parameter block which can be passed in control and
+   init operations. The function allocates the memory returned and
+   the caller is responsible to free it.
+   Return value is -1 on error, else 0.
+   ALL VALUES CONVERTED TO NETWORK BYTE ORDER
+   */
+
+gs_int32_t ftaschema_create_param_block(gs_schemahandle_t sh, void ** block, gs_int32_t * size);
+
+//void ftaschema_debugdump(int handle);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git a/include/simple_http.h b/include/simple_http.h
new file mode 100644 (file)
index 0000000..ed001f0
--- /dev/null
@@ -0,0 +1,36 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include "gstypes.h"
+#include "gshub.h"
+
+#ifdef __cplusplus  
+extern "C" { 
+#endif 
+
+// perform HTTP GET. Non-zero return value indicates an error
+int http_get_request(endpoint addr, gs_csp_t url, gs_uint32_t* http_code,  gs_sp_t json_response);
+
+// perform HTTP POST. Non-zero return value indicates an error
+int http_post_request(endpoint addr, gs_csp_t url, gs_sp_t json_request, gs_uint32_t* http_code);
+
+// perform HTTP POST. Non-zero return value indicates an error
+//     THis version lets you pass in additional headers, which must
+//     be properly formatted.  Some differences in default header.
+int http_post_request_hdr(endpoint addr, gs_csp_t url, gs_sp_t json_request, gs_uint32_t* http_code, gs_sp_t extra_headers);
+
+#ifdef __cplusplus 
+} 
+#endif 
diff --git a/include/stringhash.h b/include/stringhash.h
new file mode 100644 (file)
index 0000000..40f4725
--- /dev/null
@@ -0,0 +1,874 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef _STRINGHASH_H
+#define _STRINGHASH_H
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+#include <stdint.h>
+#include <string.h>
+
+//Provides 5-universal hash functions.
+//Both a direct polynomial based one,
+//and the much faster tabulation based one.
+//
+//It also provides 2-universal string hashing.
+//For most applicatoins, introdcing a slight error,
+//if you want almost 5-uninversal hashing for strings,
+//you can do a 2-universal hashing into 32-bit integer
+//getting very few collissoins, and then use the above
+//5-universal one.
+
+
+
+typedef gs_uint8_t INT8;
+typedef gs_uint16_t INT16;
+typedef gs_uint32_t INT32;
+typedef gs_uint64_t INT64;
+
+typedef INT64 * Hash61bit5univID;
+typedef INT32** HashTab32bit5univID;
+typedef INT32** HashTab32bitLPID;
+typedef INT64** HashTab64bitLPID;
+typedef INT64 * Hash32bit2univID;
+typedef INT32 Hash32bitUnivID;
+
+const INT32 MAX_INT32 = UINT_MAX;
+
+typedef struct {
+  INT64 str_compr_hid[16];
+  INT64 string_hid;
+  INT64 length_factor;
+  //  INT64 last_compr_hid;
+} VISHID;
+
+typedef VISHID * VarINT32StringHash32bit2univID;
+
+
+typedef struct {
+  INT32 int_str[16];
+  INT64 str_compr_hid[16];
+  INT64 string_hid;
+  INT64 length_factor;
+  //  INT64 last_compr_hid;
+} VSHID;
+
+typedef VSHID * VarStringHash32bit2univID;
+
+
+
+
+
+// different views of a 64-bit double word
+typedef union {
+  INT64 as_int64;
+  INT32 as_int32s[2];
+  INT16 as_int16s[4];
+} int64views;
+
+const INT64 LowOnes = (((INT64)1)<<32)-1;
+
+#define LOW(x)  ((x)&LowOnes)    // extract lower 32 bits from INT64
+#define HIGH(x) ((x)>>32)        // extract higher 32 bits from INT64
+
+const INT64 Prime61 = (((INT64)1)<<61) - 1;
+
+
+//Random numbers from random.org based on atmostpheric noise.
+INT64 Random64[200]= {0x285eb7722a62ce6eull,
+                      0xa84c7463e2b7856bull,
+                     0xb29100d6abcc8666ull,
+                     0xf9bfca5b7461fb1full,
+                     0x51c8dafc30c88dadull,
+                     0x0687468c365ec51dull,
+                     0x2bf2cd3ad64b6218ull,
+                     0xc20565a4d1f00f9eull,
+                     0x7d533575d313c658ull,
+                     0xbf2fba6b00725b85ull,
+                     0x4cfc2f6557e722beull,
+                     0xedbce818556dfb2bull,
+                     0xd9df508027db1bbeull,
+                     0x21f2d922f712f48bull,
+                     0xcd8b289d83a65804ull,
+                     0x4a19cfb02445a6d2ull,
+                     0xc95e56b1e19a4f94ull,
+                     0xcfeeeaccaf477248ull,
+                     0x4eec3378b73bb25cull,
+                     0x18a3f38d1c48b2beull,
+                     0x71b79ab5cb1e3730ull,
+                     0x79cdb30e2f38309dull,
+                     0xb41d4983bdbc8d6full,
+                     0xba9f57c01b66b7e3ull,
+                     0xe400503c95c16568ull,
+                      0x5977bfd4630294f1ull,
+                      0x57d4d7940099676full,
+                      0xd945de9268f4b191ull,
+                     0x4034711421eaf806ull,
+                     0x6d8108a4a6d58c22ull,
+                     0x5c421818ddbdd4eeull,
+                     0xbd9b7e4071713c13ull,
+                     0xa60d1d6e793e5eb2ull,
+                     0x7443fb031b8ec6c7ull,
+                     0xd8290c7120e05d4aull,
+                     0x797fb1d9a6a8d27full,
+                     0x543ec268ab1f2e45ull,
+                     0xcaf2a6139701f320ull,
+                     0x9519611d130bee47ull,
+                     0x19bbc533f018be1aull,
+                     0xdbfacdfeb573133dull,
+                     0x3255dacc4c7bfe12ull,
+                     0xbc6c9228e5518f6eull,
+                     0xb5c1681037347178ull,
+                     0xbaaa2cfef186bfadull,
+                     0x1834b8ab0f9e876eull,
+                     0x9d7b7f228433e0f7ull,
+                     0xa99cc292d003dd09ull,
+                     0xc0cb8037046b5295ull,
+                     0xa6ffa3d4671aa3d2ull,
+                     0xc27023fbee2862e6ull,
+                     0x5a9877bcc4bd3172ull,
+                     0xfcb0da3caf9fcfe0ull,
+                     0xc35ef57e1866ceaeull,
+                     0xd4f7c927d169a115ull,
+                     0x699054518fc74756ull,
+                     0xa75cbf617fc9db8dull,
+                     0x7f3adf4369665a9cull,
+                     0x6b98eeeb4c517f42ull,
+                     0xa12e44f5de954f24ull,
+                     0x5789ded4dced978eull,
+                     0xe4dd20ed27cd3567ull,
+                     0x9b4e90c365b8790bull,
+                     0xd486ed6e099f499bull,
+                     0x3f3d0ccfeaa0c0dcull,
+                     0x548c746cdb192adaull,
+                     0x8ce636d8469fe2dcull,
+                     0xca59ec929549a6a1ull,
+                     0x647b9878deaba1f0ull,
+                     0xebbb4b2641c54d34ull,
+                     0x7be6d2918b680abdull,
+                     0x02ad265fb4733490ull,
+                     0xfe1053044faf3486ull,
+                     0x539ea358ff6b6df3ull,
+                     0x025d73224a2b5826ull,
+                     0x7daad302451f41b3ull,
+                     0x6038455ddb535976ull,
+                     0x8d6d00a9a728a067ull,
+                     0xe9f03d61d4965d59ull,
+                     0x38314b8102daff3bull,
+                     0x56b335e7893a76f1ull,
+                     0x1048ca2f415712abull,
+                     0xa9bc989a891dc173ull,
+                     0xb741df3ae02836c2ull,
+                     0x7711e6c6f5830783ull,
+                     0x8edbf2be9226e24bull,
+                     0xe4a4b8ba310fc2e2ull,
+                     0xbc7b67f4a02f23c8ull,
+                     0x5669b1a9d6d8df17ull,
+                     0xdd3ebf2e3c516e26ull,
+                     0x77bdd6def5236c4full,
+                     0x9aeb54bdffacd65eull,
+                     0xab676483404a21b8ull,
+                     0xf7270f77a9d1b3a3ull,
+                     0x3794e1cdcc7de433ull,
+                     0x8e2b74d3a06aa56aull,
+                     0x572698d05b901d40ull,
+                     0x7bd6c265c1dd5cdfull,
+                     0xd2f68a53970db82eull,
+                     0x0e1d5f5dd9bd23bdull,
+                      0x48814c6813505051ull,
+                      0x8f2d21a7d4e4a481ull,
+                      0x144531c871920cf3ull,
+                      0x45c6f81c7fbc3b2full,
+                      0xc562f1fc7f07a944ull,
+                      0xaabdf3d0aa9872e4ull,
+                      0x8db1f9d827c8df98ull,
+                      0xea787210e13c16c7ull,
+                      0xd43f6f582629ff39ull,
+                      0x6ec7599da4cb298dull,
+                      0xfa99d7196097dd94ull,
+                      0xbe3a8a172a62f40dull,
+                      0x07477bc03d9d5471ull,
+                      0x03777d1ee44c0fa6ull,
+                      0x5c6df847b0ae6fd1ull,
+                      0xc1fc3bc2352d8125ull,
+                      0x6800e3321d35b697ull,
+                      0x51cc735e1b0920a8ull,
+                      0x93dc60a2430c11acull,
+                      0x13b6bf8ffc4e9e30ull,
+                      0xada08114e6a01701ull,
+                      0x1459b7a4254da4cdull,
+                      0xf7575cd7ededcdfdull,
+                      0x1e43675ed5ed33eeull,
+                      0x639f5ff579cc30d4ull,
+                      0x8f4f75d7eea7e300ull,
+                      0x518939accd43dadeull,
+                      0x989a77577fac24e2ull,
+                      0x86c5e3998c819d51ull,
+                      0xb84770f9cc15d139ull,
+                      0x11544010174c2c99ull,
+                      0xfb238b962405a579ull,
+                      0xca5bddde9b80cb7bull,
+                      0xbbe71928190dfab4ull,
+                      0x0ec620294742b8c8ull,
+                      0x90bc7a703ed63900ull,
+                      0x2c8a80e1e85f72bbull,
+                      0xf19ab262ed2ad914ull,
+                      0xa233e89fab33793cull,
+                      0x75b6f59568a958f5ull,
+                      0x31fb15af9a41aca2ull,
+                      0xf89db05aa21b3d1cull,
+                      0x0023d08c52147f63ull,
+                      0x8e0e3c2aba81e8fdull,
+                      0xdb2efd057c157e71ull,
+                      0x1a1797a83e39dfe4ull,
+                      0x3afc43e1979f507dull,
+                      0x0e647a8d8abe0936ull,
+                      0xc8e03f27082eb0daull,
+                      0xc1b0c11db52da528ull,
+                      0xadeb52a144f497ceull,
+                      0x046fc2f53bd97c9bull,
+                      0x2d587fdf5fae80d5ull,
+                      0x14036c3fb77fd73eull,
+                      0x883f768734d14676ull,
+                      0x212df988a83caffeull,
+                      0x36b41dac32387e17ull,
+                      0x9dbee8d7cf804bccull,
+                      0x34d9a58fb9a35794ull,
+                      0xda82beba879e3576ull,
+                      0x0366148280e5adf1ull,
+                      0x634085dcdba7b174ull,
+                      0x8451523252446534ull,
+                      0xc74ce8b4d5175b9aull,
+                      0x40afebd30a9a4837ull,
+                      0x7232952ce84e90beull,
+                      0x7443a6e37b87992dull,
+                      0xace8a33649218d9aull,
+                      0x9ad8af9614b75655ull,
+                      0xd518d9a700179ac2ull,
+                      0xc7f906d90fd36259ull,
+                      0xe2c47ec3abd8a12dull,
+                      0xca05e96fcbbb76c1ull,
+                      0x7186661c9ddf4973ull,
+                      0x0146f5f47d5f42c2ull,
+                      0x74a7c485608ea178ull,
+                      0x8cb5e3e5f84f3040ull,
+                      0xb330869dc366037dull,
+                      0x0dbc4d22f932bbd4ull,
+                      0xa8460b43946a5ecbull,
+                      0xcee72c72fe5ddea6ull,
+                      0x9f953cc7859b2a4eull,
+                      0x95ea396619e60182ull,
+                      0xfe9890efa6aa8c3eull,
+                      0x3c9a5691d1e25799ull,
+                      0xa54eeb19aa718b62ull,
+                      0x69907b2ec11d82b7ull,
+                      0x408c5405984caa65ull,
+                      0x6f11a21711640470ull,
+                      0x20b9227a8f53f9aeull,
+                      0x42df63b7ec442178ull,
+                      0xbec247f79407d00aull,
+                      0x2946c31558eab2bcull,
+                      0x84d045ffa174048eull,
+                      0x28bad532ba4a450cull,
+                      0x93ccf0cbaa274d7aull,
+                      0xff30008411d25158ull,
+                      0x3845ce6dcc30080aull,
+                      0xcf5925239b6f3dbaull,
+                      0x1f148649ed53660dull};
+
+
+
+
+
+
+gs_int32_t nextrandom = 0;
+gs_int32_t endrandom = 100;
+
+
+// The first "endrandom" numbers returned are truely random INT64.
+// They are perfect for bases of new hash functions, and currently
+// we have just enough such random numbers for tabulation based
+// 5-universal hashing, or one of the other schemes provided.
+// The remaining ones are based on the pseudo-random mrand48() which
+// returns a signed 32-bit number. We do not use the unsigned lrand48()
+// which only returns 31-bit.
+inline static INT64 RandINT64() {
+  INT64 r,r1;
+  if (nextrandom<endrandom) r=Random64[nextrandom++];
+  else {
+    if (nextrandom==endrandom)
+      fprintf(stderr,"Switching from random to pseudo-random in Rand64");
+    r =(INT64) mrand48();
+    r1 = (INT64) mrand48();
+    r=r<<32;
+    r=r^r1;
+  }
+  return r;
+}
+
+
+/* Computes ax+b mod Prime, possibly plus Prime,
+   exploiting the structure of Prime.  */
+inline static INT64 MultAddPrime(INT32 x, INT64 a, INT64 b) {
+  INT64 a0,a1,c0,c1,c;
+  a0 = LOW(a)*x;
+  a1 = HIGH(a)*x;
+  c0 = a0+(a1<<32);
+  c1 = (a0>>32)+a1;
+  c  = (c0&Prime61)+(c1>>29)+b;
+  return c;
+} // 12 instructions
+
+/* CWtrick for 32-bit key x with prime 2^61-1 */
+inline static INT64 Hash61bit5univ(INT32 x, Hash61bit5univID index) {
+  INT64 h;
+  gs_int32_t i;
+
+  h = index[0];
+  for (i=1;i<5;i++) h = MultAddPrime(x,h,index[i]);
+  h = (h&Prime61)+(h>>61);
+  if (h>=Prime61) h-=Prime61;
+  return h;
+}
+
+
+
+inline static INT64* InitHash61bit5univ() {
+  gs_int32_t i;
+
+  Hash61bit5univID hid = (INT64*) malloc(5*sizeof(INT64));
+  for (i=0;i<5;i++) {
+    hid[i]=RandINT64();
+    hid[i] = (hid[i]&Prime61)+(hid[i]>>61);
+    if (hid[i]>=Prime61) hid[i]-=Prime61;
+  }
+  return hid;
+}
+
+inline static HashTab32bit5univID InitHashTab32bit5univ() {
+  gs_uint32_t i,j;
+  HashTab32bit5univID htab;
+  Hash61bit5univID h61id;
+
+
+  htab = (HashTab32bit5univID) malloc(3*sizeof(INT32*));
+  for (i=0;i<3;i++) {
+     htab[i] = (INT32*) malloc(65538*sizeof(INT32));
+     h61id = InitHash61bit5univ();
+     for (j=0;j<65538;j++) htab[i][j]=Hash61bit5univ(j,h61id);
+  }
+  return htab;
+}
+
+/* tabulation based hashing for 32-bit key x using 16-bit characters.*/
+inline INT64 HashTab32bit5univ(INT32 x, HashTab32bit5univID htab) {
+  INT32 x0, x1, x2;
+  x0 = x&65535;
+  x1 = x>>16;
+  x2 = x0 + x1;
+  x2 = 2 - (x2>>16) + (x2&65535);  // optional compression
+  return htab[0][x0]^htab[1][x1]^htab[2][x2];
+} // 8 + 4 = 12 instructions
+
+
+/* Tabulation based hashing for 32-bit keys using 16-bit characters.*/
+/* Uses 500KB tables and makes 2 lookups per hash. */
+
+inline static HashTab32bitLPID InitHashShortTab32bitLP() {
+  gs_uint32_t i,j;
+  HashTab32bitLPID htab;
+  Hash61bit5univID h61id;
+
+
+  htab = (HashTab32bitLPID) malloc(2*sizeof(INT32*));
+  for (i=0;i<2;i++) {
+     htab[i] = (INT32*) malloc(65536*sizeof(INT32));
+     h61id = InitHash61bit5univ();
+     for (j=0;j<65536;j++) htab[i][j]=Hash61bit5univ(j,h61id);
+  }
+  return htab;
+}
+
+/* tabulation based hashing for 32-bit key x using 16-bit characters.*/
+inline INT64 HashShortTab32bitLP(INT32 x, HashTab32bitLPID htab) {
+  INT32 x0, x1;
+  x0 = x&65535;
+  x1 = x>>16;
+  return htab[0][x0]^htab[1][x1];
+}
+
+
+/* Tabulation based hashing for 32-bit keys using 8-bit characters.*/
+/* Uses 4KB tables and makes 4 lookups per hash. */
+
+inline static HashTab32bitLPID InitHashCharTab32bitLP() {
+  gs_uint32_t i,j;
+  HashTab32bitLPID htab;
+  Hash61bit5univID h61id;
+
+
+  htab = (HashTab32bitLPID) malloc(4*sizeof(INT32*));
+  for (i=0;i<4;i++) {
+     htab[i] = (INT32*) malloc(256*sizeof(INT32));
+     h61id = InitHash61bit5univ();
+     for (j=0;j<256;j++) htab[i][j]=Hash61bit5univ(j,h61id);
+  }
+  return htab;
+}
+
+inline INT32 HashCharTab32bitLP(INT32 x, HashTab32bitLPID htab) {
+  INT8 c;
+  INT32 h;
+  gs_int32_t i;
+
+  c=x;
+  h=htab[0][c];
+  for (i=1;i<4;i++) {
+    x>>=8;
+    c=x;
+    h=h^htab[i][c];
+  }
+  return h;
+}
+
+
+/* Tabulation based hashing for 64-bit keys using 16-bit characters.*/
+/* Uses 2MB tables and makes 4 lookups per hash. */
+
+
+inline static HashTab64bitLPID InitHashShortTab64bitLP() {
+  gs_int32_t i,j;
+  HashTab64bitLPID htab;
+  Hash61bit5univID h61id;
+
+
+  htab = (HashTab64bitLPID) malloc(4*sizeof(INT64*));
+  for (i=0;i<4;i++) {
+     htab[i] = (INT64*) malloc(65536*sizeof(INT64));
+     h61id = InitHash61bit5univ();
+     for (j=0;j<65536;j++) htab[i][j]=Hash61bit5univ(j,h61id);
+     h61id = InitHash61bit5univ();
+     for (j=0;j<65536;j++) htab[i][j]+=Hash61bit5univ(j,h61id)<<32;
+  }
+  return htab;
+}
+
+inline INT64 HashShortTab64bitLP(INT64 x, HashTab64bitLPID htab) {
+  INT16 c;
+  INT64 h;
+  gs_int32_t i;
+
+  c=x;
+  h=htab[0][c];
+  for (i=1;i<4;i++) {
+    x>>=16;
+    c=x;
+    h=h^htab[i][c];
+  }
+  return h;
+}
+
+/* Tabulation based hashing for 64-bit keys using 8-bit characters.*/
+/* Uses 14KB tables and makes 8 lookups per hash. */
+
+inline static HashTab64bitLPID InitHashCharTab64bitLP() {
+  gs_int32_t i,j;
+  HashTab64bitLPID htab;
+  Hash61bit5univID h61id;
+
+
+  htab = (HashTab64bitLPID) malloc(8*sizeof(INT64*));
+  for (i=0;i<8;i++) {
+     htab[i] = (INT64*) malloc(256*sizeof(INT64));
+     h61id = InitHash61bit5univ();
+     for (j=0;j<256;j++) htab[i][j]=Hash61bit5univ(j,h61id);
+     h61id = InitHash61bit5univ();
+     for (j=0;j<256;j++) htab[i][j]+=Hash61bit5univ(j,h61id)<<32;
+  }
+  return htab;
+}
+
+inline INT64 HashCharTab64bitLP(INT64 x, HashTab64bitLPID htab) {
+  INT8 c;
+  INT64 h;
+  gs_int32_t i;
+
+  c=x;
+  h=htab[0][c];
+  for (i=1;i<8;i++) {
+    x>>=8;
+    c=x;
+    h=h^htab[i][c];
+  }
+  return h;
+}
+
+
+/* Tabulation based hashing for 34-bit keys using 10-11-bit characters.*/
+/* Uses 20KB tables and makes 3 lookups per hash. */
+
+inline static HashTab32bitLPID InitHashMipTab32bitLP() {
+  gs_int32_t i,j;
+  HashTab32bitLPID htab;
+  Hash61bit5univID h61id;
+
+
+  htab = (HashTab32bitLPID) malloc(6*sizeof(INT32*));
+  for (i=0;i<2;i++) {
+     htab[i] = (INT32*) malloc(0x800*sizeof(INT32));
+     h61id = InitHash61bit5univ();
+     for (j=0;j<0x800;j++) htab[i][j]=(INT32) Hash61bit5univ(j,h61id);
+  }
+  for (i=2;i<3;i++) {
+     htab[i] = (INT32*) malloc(0x400*sizeof(INT32));
+     h61id = InitHash61bit5univ();
+     for (j=0;j<0x400;j++) htab[i][j]=(INT32) Hash61bit5univ(j,h61id);
+  }
+  return htab;
+}
+
+inline INT32 HashMipTab32bitLP(INT32 x, HashTab32bitLPID htab) {
+  INT32 c;
+  INT32 h;
+  gs_int32_t i;
+
+  h=0;
+  for (i=0;i<2;i++) {
+    c= x & 0x7FFull;
+    h=h^htab[i][c];
+    x>>=11;
+  }
+  c= x & 0x3FFull;
+  h=h^htab[2][c];
+  return h;
+}
+
+/* Tabulation based hashing for 64-bit keys using 10-11-bit characters.*/
+/* Uses 80KB tables and makes 6 lookups per hash. */
+
+inline static HashTab64bitLPID InitHashMipTab64bitLP() {
+  gs_int32_t i,j;
+  HashTab64bitLPID htab;
+  Hash61bit5univID h61id;
+
+
+  htab = (HashTab64bitLPID) malloc(6*sizeof(INT64*));
+  for (i=0;i<4;i++) {
+     htab[i] = (INT64*) malloc(0x800*sizeof(INT64));
+     h61id = InitHash61bit5univ();
+     for (j=0;j<0x800;j++) htab[i][j]=Hash61bit5univ(j,h61id);
+     h61id = InitHash61bit5univ();
+     for (j=0;j<0x800;j++) htab[i][j]+=Hash61bit5univ(j,h61id)<<32;
+  }
+  for (i=4;i<6;i++) {
+     htab[i] = (INT64*) malloc(0x400*sizeof(INT64));
+     h61id = InitHash61bit5univ();
+     for (j=0;j<0x400;j++) htab[i][j]=Hash61bit5univ(j,h61id);
+     h61id = InitHash61bit5univ();
+     for (j=0;j<0x400;j++) htab[i][j]+=Hash61bit5univ(j,h61id)<<32;
+  }
+  return htab;
+}
+
+inline INT64 HashMipTab64bitLP(INT64 x, HashTab64bitLPID htab) {
+  INT64 c;
+  INT64 h;
+  gs_int32_t i;
+
+  h=0;
+  for (i=0;i<4;i++) {
+    c= x & 0x7FFull;
+    h=h^htab[i][c];
+    x>>=11;
+  }
+  for (i=4;i<6;i++) {
+    c= x & 0x3FFull;
+    h=h^htab[i][c];
+    x>>=10;
+  }
+  return h;
+}
+
+
+
+inline static Hash32bit2univID InitHash32bit2univ() {
+  Hash32bit2univID hid = (INT64*) malloc(2*sizeof(INT64));
+  hid[0]=RandINT64();
+  hid[1]=RandINT64();
+  return hid;
+}
+
+inline INT32 Hash32bit2univ(INT32 x, Hash32bit2univID hid) {
+  INT64 H;
+  INT32 h;
+  H = (x*hid[0])+hid[1];
+  h = H >> 32;
+  return h;
+}
+
+
+// For the string hashing below is for string of 32bit integers, and
+// the output is a 2-universal 32-bit number.
+
+inline static Hash32bit2univID InitStringHash32bit2univ(gs_int32_t length) {
+  gs_int32_t i;
+  Hash32bit2univID hid = (INT64*) malloc((length+1)*sizeof(INT64));
+  for (i=0;i<=length;i++) hid[i]=RandINT64();
+  return hid;
+}
+
+
+
+//assumes string length even
+inline INT32 EvenStringHash32bit2univ(INT32 * x, gs_int32_t length,
+                                      Hash32bit2univID hid) {
+  gs_int32_t i;
+  INT64 H;
+  INT32 h;
+  INT64 xh1,xh2,y;
+
+  H=0;
+  for (i=0;i<length;i+=2) {
+    xh1=x[i]+hid[i+1];
+    xh2=x[i+1]+hid[i];
+    y=xh1*xh2;
+    H = H^y;
+  }
+  H=H^hid[length];
+  h = H >> 32;
+  return h;
+}
+
+//assumes string length odd
+inline INT32 OddStringHash32bit2univ(INT32 * x, gs_int32_t length,
+                                      Hash32bit2univID hid) {
+  gs_int32_t i;
+  INT64 H;
+  INT32 h;
+  INT64 xh1,xh2,y;
+
+  H = x[0]*hid[0];
+  for (i=1;i<length;i+=2) {
+    xh1=x[i]+hid[i+1];
+    xh2=x[i+1]+hid[i];
+    y=xh1*xh2;
+    H = H^y;
+  }
+  H=H^hid[length];
+  h = H >> 32;
+  return h;
+}
+
+//Below we have the generic algorithm for fixed length string hashing
+//For shorter strings of length < 6, it is worthwhile using
+//specialized versions with fewer tests.
+//All versions rely on the some initialization above.
+inline INT32 StringHash32bit2univ(INT32 * x, gs_int32_t length, Hash32bit2univID hid) {
+//  gs_int32_t i;
+//  INT64 H=0;
+//  INT32 h;
+//  for (i=0;i<length;i++) H = H^(x[i]*hid[i]);
+//  H=H^hid[length];
+//  h = H >> 32;
+//  return h;
+  if (length&1) return OddStringHash32bit2univ(x,length,hid);
+  else return EvenStringHash32bit2univ(x,length,hid);
+}
+
+
+//string of length 2
+inline INT32 String2Hash32bit2univ(INT32 * x,Hash32bit2univID hid) {
+  INT64 H;
+  INT32 h;
+  INT64 xh1,xh2;
+
+  xh1=x[0]+hid[1];
+  xh2=x[1]+hid[0];
+  H=xh1*xh2;
+  H=H^hid[2];
+  h = H >> 32;
+  return h;
+}
+
+//string of length 3
+inline INT32 String3Hash32bit2univ(INT32 * x,Hash32bit2univID hid) {
+  INT64 H;
+  INT32 h;
+  INT64 xh1,xh2,y;
+
+  H = x[0]*hid[0];
+  xh1=x[1]+hid[2];
+  xh2=x[2]+hid[1];
+  y=xh1*xh2;
+  H = H^y;
+  H=H^hid[3];
+  h = H >> 32;
+  return h;
+}
+
+
+inline static VarINT32StringHash32bit2univID InitVarINT32StringHash32bitUniv() {
+  gs_int32_t i;
+  VarINT32StringHash32bit2univID hid;
+
+  hid = (VarINT32StringHash32bit2univID) malloc(sizeof(VISHID));
+  for (i=0;i<16;i++) hid->str_compr_hid[i]=RandINT64();
+  hid->string_hid = RandINT64() & Prime61;
+  //  hid->last_compr_hid = RandINT64() | 0x1ull;
+  return hid;
+  }
+
+inline INT32 VarINT32StringHash32bitUniv(INT32 * x, gs_int32_t length, VarINT32StringHash32bit2univID hid) {
+
+  INT32 h,i,j,d;
+  gs_int32_t e;
+  INT64 C,H,M;
+  INT64 xh1,xh2,y;
+  INT64 HxM00,HxM01,HxM10,HxM11,C0,C1,C2,CC;
+
+  if (length<16) return StringHash32bit2univ(x,length,hid->str_compr_hid);
+  H=0;
+  i=0;
+  for (;;) {
+     d=length-i;
+     C = 0;
+     j=0;
+     if (d>16) d=16;
+     else if (d&1) {
+       C = x[i]*hid->str_compr_hid[j];
+        i++;
+        j++;
+     }
+     for (e=((int) (d>>1));e>0;e--) {
+         xh1=x[i]+hid->str_compr_hid[j+1];
+         xh2=x[i+1]+hid->str_compr_hid[j];
+         y=xh1*xh2;
+         C = C^y;
+         i+=2;
+        j+=2;
+     }
+     if (i==(INT32) length) {
+        H<<=4;
+        H+=C;
+        H+=((INT64) length)*hid->length_factor;
+        h=(H>>32);
+        return h;
+     }
+     C>>=4;
+     H+=C;
+     M=hid->string_hid;
+     //Multiply H*M mod Prime61, possibly plus Prime,
+     //exploiting the structure of Prime61.
+     //We assume H<2*Prime61 and M<=Prime61, e.g.,
+     //H*M <2^123.
+     HxM00 = LOW(H)*LOW(M);
+     HxM01 = LOW(H)*HIGH(M);
+     HxM10 = HIGH(H)*LOW(M);
+     HxM11 = HIGH(H)*HIGH(M); //has at most 60 bits
+     C0 = HxM00+(HxM01<<32)+(HxM10<<32);//overflow doesn't matter here.
+     C0 = C0&Prime61;              //Has at most 61 bits.
+     C1 = (HxM00>>32)+HxM01+HxM10; //Overflow impossible each <=62 bits
+     C1 = C1>>29;                  //Has at most 33 bits.
+     C2 = HxM11<<3;                //Has at most 123-64+3=62 bits.
+     CC = C0+C1+C2;                //At most 63 bits.
+     H = (CC&Prime61)+(CC>>61);    //<2*Prime
+  }
+}
+
+inline static VarStringHash32bit2univID InitVarStringHash32bitUniv() {
+  gs_int32_t i;
+  VarStringHash32bit2univID hid;
+
+  hid = (VarStringHash32bit2univID) malloc(sizeof(VSHID));
+  for (i=0;i<16;i++) {
+    hid->int_str[i]=0;
+    hid->str_compr_hid[i]=RandINT64();
+  }
+  hid->string_hid = RandINT64() & Prime61;
+  //  hid->last_compr_hid = RandINT64() | 0x1ull;
+  return hid;
+  }
+
+inline INT32 VarStringHash32bitUniv(char * x, gs_int32_t length,
+                                         VarStringHash32bit2univID hid) {
+
+  INT32 h,i,l,d,str_ix;
+  INT64 C,H,M;
+  INT64 xh1,xh2,y;
+  INT64 HxM00,HxM01,HxM10,HxM11,C0,C1,C2,CC;
+
+  // Assumes hid->int_str[*]==0
+
+  if (length<=60) {
+    memcpy(hid->int_str,x,length);
+    d=(length+3)>>2; //<16
+    h=StringHash32bit2univ(hid->int_str,d,hid->str_compr_hid);
+    for (i=0;i<d;i++) hid->int_str[i]=0;
+    return h;
+  }
+  H=0;
+  str_ix=0;
+  for (;;) {
+     C = 0;
+     l=length-str_ix;
+     if (l>64) l=64;
+     memcpy(hid->int_str,x+str_ix,l);
+     str_ix+=l;
+     d=(l+3)>>2;
+     i=0;
+     if (d&1) {
+       C = hid->int_str[i]*hid->str_compr_hid[i];
+        i++;
+     }
+     while (i<d) {
+         xh1=hid->int_str[i]+hid->str_compr_hid[i+1];
+         xh2=hid->int_str[i+1]+hid->str_compr_hid[i];
+         y=xh1*xh2;
+         C = C^y;
+         i+=2;
+     }
+     for (i=0;i<d;i++) hid->int_str[i]=0;
+     if (str_ix==(INT32) length) {
+        H<<=4;
+        H+=C;
+        H+=((INT64) length)*hid->length_factor;
+        h=(H>>32);
+        return h;
+     }
+     C>>=4;
+     H+=C;
+     M=hid->string_hid;
+     //Multiply H*M mod Prime61, possibly plus Prime,
+     //exploiting the structure of Prime61.
+     //We assume H<2*Prime61 and M<=Prime61, e.g.,
+     //H*M <2^123.
+     HxM00 = LOW(H)*LOW(M);
+     HxM01 = LOW(H)*HIGH(M);
+     HxM10 = HIGH(H)*LOW(M);
+     HxM11 = HIGH(H)*HIGH(M); //has at most 60 bits
+     C0 = HxM00+(HxM01<<32)+(HxM10<<32);//overflow doesn't matter here.
+     C0 = C0&Prime61;              //Has at most 61 bits.
+     C1 = (HxM00>>32)+HxM01+HxM10; //Overflow impossible each <=62 bits
+     C1 = C1>>29;                  //Has at most 33 bits.
+     C2 = HxM11<<3;                //Has at most 123-64+3=62 bits.
+     CC = C0+C1+C2;                //At most 63 bits.
+     H = (CC&Prime61)+(CC>>61);    //<2*Prime
+  }
+}
+
+
+#endif
+
diff --git a/include/systat.h b/include/systat.h
new file mode 100644 (file)
index 0000000..2e4f634
--- /dev/null
@@ -0,0 +1,25 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef SYSTAT_H
+#define SYSTAT_H
+
+struct systemstat {
+   gs_int32_t process_priority_level;
+   gs_int32_t resource_priority_level;
+  /* ... */
+};
+
+#endif
diff --git a/include/type_indicators.h b/include/type_indicators.h
new file mode 100644 (file)
index 0000000..b54581f
--- /dev/null
@@ -0,0 +1,41 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef _TYPE_INDICATORS_DEFINED__
+#define _TYPE_INDICATORS_DEFINED__
+
+//      WARNING!
+//      This file replicated in gscpv2/src/ftacmp
+//      These files must be synched!
+
+
+#define UINT_TYPE 0
+#define INT_TYPE 1
+#define ULLONG_TYPE 2
+#define LLONG_TYPE 3
+#define USHORT_TYPE 4
+#define FLOAT_TYPE 5
+#define BOOL_TYPE 6
+#define VSTR_TYPE 7
+#define TIMEVAL_TYPE 8
+#define IP_TYPE 9
+#define FSTRING_TYPE 10
+#define IPV6_TYPE 11
+#define UNDEFINED_TYPE 12
+
+
+
+#endif
+
diff --git a/include/vstring.h b/include/vstring.h
new file mode 100644 (file)
index 0000000..5d0d0e3
--- /dev/null
@@ -0,0 +1,51 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+ * vstring.h: definition of vstring struct for use in applications and hfta
+ */
+#ifndef VSTRING_H
+#define VSTRING_H
+
+#include "gsconfig.h"
+#include "gstypes.h"
+
+/* vstring32 has to match string32 definition in rts_string.h however, the data
+   types differ */
+
+struct vstring32 {
+    gs_uint32_t length;
+    gs_uint32_t offset;
+    gs_uint32_t reserved;
+};
+
+//     vstring is the unpacked version of a string,
+//     vstring32 is its repreentation in a gs record.
+//     This complication is necessary to support
+//     old gsdat files.
+
+
+struct vstring {
+    gs_uint32_t length;
+    gs_p_t offset;
+    gs_uint32_t reserved;
+};
+
+struct hfta_ipv6_str{
+        gs_uint32_t v[4];
+};
+
+
+#endif
diff --git a/lib/.keep b/lib/.keep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/qlib/CSVEXAMPLELIB/ex2_src.gsql b/qlib/CSVEXAMPLELIB/ex2_src.gsql
new file mode 100644 (file)
index 0000000..ae84e7d
--- /dev/null
@@ -0,0 +1,17 @@
+//   Copyright 2014 AT&T Intellectual Property
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+// -------------------------------------------
+
+select systemTime,uintInPosition1,ullongInPosition2,ipInPosition3,count(*) as Cnt
+from [csv].CSV_EXAMPLE
+group by systemTime,uintInPosition1,ullongInPosition2,ipInPosition3
diff --git a/qlib/CSVEXAMPLELIB/output_spec.cfg b/qlib/CSVEXAMPLELIB/output_spec.cfg
new file mode 100644 (file)
index 0000000..4274cf2
--- /dev/null
@@ -0,0 +1 @@
+ex2_src,stream,,,,,
diff --git a/src/Makefile b/src/Makefile
new file mode 100644 (file)
index 0000000..fd6b5d4
--- /dev/null
@@ -0,0 +1,36 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+all: install
+
+libs: 
+       cd lib ; make
+
+compiler: 
+       cd ftacmp ; make
+
+btools: 
+       cd tools ; make
+
+clean:
+       cd lib ; make clean
+       cd ftacmp ; make clean
+       cd tools ; make clean
+       rm -ff ../lib/*.a
+
+install: libs compiler  btools
+       cd lib ; make install
+       cd ftacmp ; make install
+       cd tools ; make install
diff --git a/src/ftacmp/Makefile b/src/ftacmp/Makefile
new file mode 100644 (file)
index 0000000..856dd31
--- /dev/null
@@ -0,0 +1,163 @@
+#!/bin/make
+
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+#SHELL = /bin/sh
+
+.SUFFIXES:.cpp .cc
+
+CXX=g++
+
+INCLUDES = -I../../include -I../../include/hfta
+LDLIBS = -L../../lib -lm # -lgscphostaux 
+C++OPTS = -ggdb  -D_BSD_SIGNALS $(INCLUDES) -DPREFILTER_OK -std=c++11 
+C++LDOPTS = -ggdb 
+
+# For Driver
+CC_ARGS = \
+       -g 
+#CC_OBJECT_FLAG = -o
+#CC_COMPILE_FLAG = -c
+#CC_EXECUTABLE_FLAG   = -o 
+
+CPPFLAGS= $(C++OPTS)
+
+TARGETS = translate_fta gen_tuple_access
+SRCS = $(TARGETS:=.cpp)
+
+# we need to suppress writable strings warnings on Mac for flex/bison generated C++ code
+OS= $(shell uname -s)
+ifeq ($(OS),Darwin)
+       WARN=-Wno-deprecated-writable-strings
+endif
+ifeq ($(OS),Linux)
+       WARN=-Wno-write-strings
+endif
+
+all: translate_fta gen_tuple_access interfacelib.a
+       cp interfacelib.a ../../lib/libgscpinterface.a ; ranlib ../../lib/libgscpinterface.a
+
+default_targets: $(TARGETS)
+
+%.tab.o: %.tab.cc
+       $(CXX) $(CPPFLAGS) $(WARN) $(INCLUDES) -c $< -o $@
+
+%lexer.o: %lexer.cc
+       $(CXX) $(CPPFLAGS) $(WARN) $(INCLUDES) -c $< -o $@      
+
+%.o: %.cc
+       $(CXX) $(CPPFLAGS) $(INCLUDES) -c $< -o $@
+
+#FTA_OBJECTS:=analyze_fta.o ext_fcns.tab.o ext_fcnslexer.o fta.tab.o ftalexer.o generate_lfta_code.o generate_utils.o parse_schema.o query_plan.o stream_query.o translate_fta.o type_objects.o iface_q.o ifq.tab.o ifqlexer.o res.tab.o reslexer.o niclexer.o nic_def.o nic.tab.o generate_nic_code.o  partn.tab.o partnlexer.o niclexer.o parse_partn.o xmllexer.o xml.tab.o field_list.o
+
+# without niclexer.o
+FTA_OBJECTS:=analyze_fta.o ext_fcns.tab.o ext_fcnslexer.o fta.tab.o ftalexer.o generate_lfta_code.o generate_utils.o parse_schema.o query_plan.o stream_query.o translate_fta.o type_objects.o iface_q.o ifq.tab.o ifqlexer.o res.tab.o reslexer.o nic_def.o nic.tab.o generate_nic_code.o  partn.tab.o partnlexer.o niclexer.o parse_partn.o xmllexer.o xml.tab.o field_list.o
+
+
+GEN_OBJECTS:=fta.tab.o ftalexer.o generate_utils.o parse_schema.o gen_tuple_access.o type_objects.o
+
+LIB_OBJECTS:=fta.tab.o ftalexer.o parse_schema.o type_objects.o schemaparser.o
+
+translate_fta: $(FTA_OBJECTS)
+       $(CXX) $(CC_ARGS) $(LDLIBS) $(CC_EXECUTABLE_FLAG) $(FTA_OBJECTS) -o $@
+
+gen_tuple_access: $(GEN_OBJECTS)
+       $(CXX) $(CC_ARGS) $(LDLIBS) $(CC_EXECUTABLE_FLAG) $(GEN_OBJECTS) -o $@
+
+interfacelib.a: $(LIB_OBJECTS)
+       ar -r $@ $(LIB_OBJECTS) 
+
+#interfacelib.a: fta.tab.o ftalexer.o parse_schema.o type_objects.o schemaparser.o
+#      ar -r $@  $?
+
+
+test_interfacelib: test_interfacelib.o interfacelib.a
+       $(CXX) $(CC_ARGS) $(LDLIBS) $(CC_EXECUTABLE_FLAG) $(LIB_OBJECTS) $@
+
+test_interfacelib.cc : schemaparser.h schemaparser_impl.h
+
+# translate_fta source files
+translate_fta.cc : parse_fta.h parse_schema.h parse_ext_fcns.h analyze_fta.h query_plan.h generate_lfta_code.h stream_query.h generate_utils.h nic_def.h generate_nic_code.h parse_partn.h print_plan.h
+
+analyze_fta.cc : parse_fta.h parse_schema.h parse_ext_fcns.h analyze_fta.h type_objects.h 
+
+ext_fcnslexer.cc : parse_ext_fcns.h ext_fcns.tab.cc.h 
+
+fta.tab.cc : parse_fta.h parse_schema.h
+
+ftalexer.cc : parse_fta.h parse_schema.h fta.tab.cc.h
+
+generate_lfta_code.cc : parse_fta.h parse_schema.h analyze_fta.h generate_utils.h query_plan.h generate_lfta_code.h generate_nic_code.h
+
+generate_utils.cc : generate_utils.h ../../include/lapp.h
+
+parse_schema.cc : parse_fta.h parse_schema.h type_objects.h
+
+query_plan.cc : query_plan.h analyze_fta.h generate_utils.h
+
+stream_query.cc : stream_query.h generate_utils.h analyze_fta.h 
+
+type_objects.cc : type_objects.h
+
+iface_q.cc : iface_q.h
+
+ifq.tab.cc : parse_fta.h
+
+ifqlexer.cc : parse_fta.h ifq.tab.cc.h
+
+res.tab.cc : iface_q.h
+
+reslexer.cc : parse_fta.h res.tab.cc.h
+
+niclexer.cc : nic_def.h nic.tab.cc.h
+
+nic_def.cc : nic_def.h 
+
+nic.tab.cc : nic_def.h 
+
+generate_nic_code.cc : parse_fta.h parse_schema.h analyze_fta.h generate_utils.h query_plan.h generate_nic_code.h analyze_fta.h
+
+partn.tab.cc : parse_partn.h
+
+partnlexer.cc : parse_partn.h partn.tab.cc.h 
+
+niclexer.cc : nic_def.h nic.tab.cc.h
+
+parse_partn.cc : parse_partn.h parse_schema.h analyze_fta.h
+
+xmllexer.cc : parse_fta.h xml.tab.hh 
+
+xml.tab.cc : xml_t.h
+
+field_list.cc : xml_t.h field_list.h
+
+# gen_tuple_access source files
+schemaparser.cc : schemaparser_impl.h ../../include/schemaparser.h parse_fta.h parse_schema.h generate_utils.h ../../include/hfta/host_tuple.h ../../include/lapp.h
+
+clean:
+       rm -f *.o core $(TARGETS) ./ii_files/*.ii interfacelib.a ../../bin/gen_tuple_access ../../bin/translate_fta
+
+del: 
+       rm -f core $(TARGETS)
+
+cleandrive:
+       rm -f *.o *.a core driver ./ii_files/*.ii
+
+install: all
+       cp translate_fta ../../bin/ ; cp gen_tuple_access ../../bin/ ; cp interfacelib.a ../../lib/libgscpinterface.a ; ranlib ../../lib/libgscpinterface.a
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
diff --git a/src/ftacmp/analyze_fta.cc b/src/ftacmp/analyze_fta.cc
new file mode 100644 (file)
index 0000000..8c9fd3b
--- /dev/null
@@ -0,0 +1,5897 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include<unistd.h>
+
+#include "parse_fta.h"
+#include "parse_schema.h"
+#include "parse_ext_fcns.h"
+
+
+#include"analyze_fta.h"
+
+#include"type_objects.h"
+
+#include <string>
+#include<list>
+
+using namespace std;
+
+extern string hostname;                        // name of the current host
+
+//                     Utility function
+
+string int_to_string(int i){
+    string ret;
+    char tmpstr[100];
+    sprintf(tmpstr,"%d",i);
+    ret=tmpstr;
+    return(ret);
+}
+
+
+//                             Globals
+
+//                     These represent derived information from the
+//                     query analysis stage.  I extract them from a class,
+//                     perhaps this is dangerous.
+
+static gb_table *gb_tbl=NULL;                  // Table of all group-by attributes.
+static aggregate_table *aggr_tbl=NULL; // Table of all referenced aggregates.
+
+// static cplx_lit_table *complex_literals=NULL;       // Table of literals with constructors.
+static param_table *param_tbl=NULL;            // Table of all referenced parameters.
+
+vector<scalarexp_t *> partial_fcns_list;
+int wh_partial_start, wh_partial_end;
+int gb_partial_start, gb_partial_end;
+int aggr_partial_start, aggr_partial_end;
+int sl_partial_start, sl_partial_end;
+
+
+//                     Infer the table of a column refrence and return the table ref.
+//                     First, extract the
+//                     field name and table name.  If no table name is used,
+//                     search all tables to try to find a unique match.
+//                     Of course, plenty of error checking.
+
+//             Return the set of tablevar indices in the FROM clause
+//             which contain a field with the same name.
+vector<int> find_source_tables(string field, tablevar_list_t *fm, table_list *Schema){
+       int i;
+       vector<int> tv;
+//     vector<string> tn = fm->get_schema_names();
+       vector<int> tn = fm->get_schema_refs();
+// printf("Calling find_source_tables on field %s\n",field.c_str());
+       for(i=0;i<tn.size();i++){
+//             if(Schema->contains_field(Schema->find_tbl(tn[i]), field) ){
+               if(Schema->contains_field(tn[i], field) ){
+                       tv.push_back(i);
+// printf("\tfound in table %s\n",tn[i].c_str());
+               }
+       }
+       return(tv);
+}
+
+int infer_tablevar_from_ifpref(ifpref_t *ir, tablevar_list_t *fm){
+       int i;
+       string tname = ir->get_tablevar();
+       if(tname ==""){
+               if(fm->size()==1) return 0;
+               fprintf(stderr,"ERROR, interface parameter %s has no tablevar specified and there is more than one table variable in the FROM clause.\n",ir->to_string().c_str());
+               return -1;
+       }
+       for(i=0;i<fm->size();++i){
+               if(tname == fm->get_tablevar_name(i))
+                       return i;
+       }
+       fprintf(stderr,"ERROR, interface parameter %s has no matching table variable in the FROM clause.\n",ir->to_string().c_str());
+       return -1;
+}
+
+
+//             compute the index of the tablevar in the from clause that the
+//             colref is in.
+//             return -1 if no tablevar can be imputed.
+int infer_tablevar_from_colref(colref_t *cr, tablevar_list_t *fm, table_list *schema){
+       int i;
+       string table_name;
+       int table_ref;
+       vector<int> tv;
+       vector<tablevar_t *> fm_tbls = fm->get_table_list();
+
+       string field = cr->get_field();
+
+// printf("Calling infer_tablevar_from_colref on field %s.\n",field.c_str());
+       if(cr->uses_default_table() ){
+               tv = find_source_tables(field, fm, schema);
+               if(tv.size() > 1){
+                       fprintf(stderr,"ERROR, line %d, character %d : field %s exists in multiple table variables: ",
+                               cr->get_lineno(), cr->get_charno(),field.c_str() );
+                       for(i=0;i<tv.size();i++){
+                               fprintf(stderr,"%s ",fm_tbls[ tv[i] ]->to_string().c_str() );
+                       }
+                       fprintf(stderr,"\n\tYou must specify one of these.\n");
+                       return(-1);
+               }
+               if(tv.size() == 0){
+                       fprintf(stderr,"ERROR, line %d, character %d: field %s does not exist in any table.\n",
+                               cr->get_lineno(), cr->get_charno(),field.c_str() );
+                       return(-1);
+               }
+
+               return(tv[0]);
+       }
+
+//                     The table source is named -- but is it a schema name
+//                     or a var name?
+
+       string interface = cr->get_interface();
+       table_name = cr->get_table_name();
+
+//             if interface is not specified, prefer to look at the tablevar names
+//             Check for duplicates.
+       if(interface==""){
+               for(i=0;i<fm_tbls.size();++i){
+                       if(table_name == fm_tbls[i]->get_var_name())
+                               tv.push_back(i);
+               }
+               if(tv.size() > 1){
+                       fprintf(stderr,"ERROR, there are two or more table variables for column ref %s.%s (line %d, char %d).\n",table_name.c_str(), field.c_str(), cr->get_lineno(), cr->get_charno() );
+                       return(-1);
+               }
+               if(tv.size() == 1) return(tv[0]);
+       }
+
+//             Tableref not found by looking at tableref vars, or an interface
+//             was specified.  Try to match on schema and interface.
+//             Check for duplicates.
+       for(i=0;i<fm_tbls.size();++i){
+               if(table_name == fm_tbls[i]->get_var_name() && interface == fm_tbls[i]->get_interface())
+                       tv.push_back(i);
+       }
+       if(tv.size() > 1){
+               fprintf(stderr,"ERROR, (line %d, char %d) there are two or more table variables whose schemas match for column ref \n",
+                       cr->get_lineno(), cr->get_charno() );
+               if(interface != "") fprintf(stderr,"%s.",interface.c_str());
+               fprintf(stderr,"%s.%s\n",table_name.c_str(), field.c_str());
+               return(-1);
+       }
+
+       if(tv.size() == 0 ){
+               fprintf(stderr,"ERROR, line %d, character %d : no table reference found for column ref ", cr->get_lineno(), cr->get_charno());
+               if(interface != "") fprintf(stderr,"%s.",interface.c_str());
+               fprintf(stderr,"%s.%s\n",table_name.c_str(), field.c_str());
+               return(-1)      ;
+       }
+
+       return(tv[0]);
+}
+
+
+//                     Reset temporal properties of a scalar expression
+void reset_temporal(scalarexp_t *se){
+       col_id ci;
+       vector<scalarexp_t *> operands;
+       int o;
+
+       se->get_data_type()->reset_temporal();
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+       case SE_COLREF:
+               return;
+       case SE_UNARY_OP:
+               reset_temporal(se->get_left_se());
+               return;
+       case SE_BINARY_OP:
+               reset_temporal(se->get_left_se());
+               reset_temporal(se->get_right_se());
+               return;
+       case SE_AGGR_STAR:
+               return;
+       case SE_AGGR_SE:
+               reset_temporal(se->get_left_se());
+               return;
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       reset_temporal(operands[o]);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in reset_temporal, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+}
+
+//             Verify that column references exist in their
+//             declared tables.  As a side effect, assign
+//             their data types.  Other side effects :
+//
+//             return -1 on error
+
+int verify_colref(scalarexp_t *se, tablevar_list_t *fm,
+                                       table_list *schema, gb_table *gtbl){
+       int l_ret, r_ret;
+       int gb_ref;
+       colref_t *cr;
+       ifpref_t *ir;
+       string field, table_source, type_name;
+       data_type *dt;
+       vector<string> tn;
+       vector<int> tv;
+       int table_var;
+       int o;
+       vector<scalarexp_t *> operands;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+               return(1);
+       case SE_IFACE_PARAM:
+               ir = se->get_ifpref();
+               table_var = infer_tablevar_from_ifpref(ir, fm);
+               if(table_var < 0) return(table_var);
+               ir->set_tablevar_ref(table_var);
+               return(1);
+       case SE_UNARY_OP:
+               return( verify_colref(se->get_left_se(), fm, schema, gtbl) );
+       case SE_BINARY_OP:
+               l_ret = verify_colref(se->get_left_se(), fm, schema, gtbl);
+               r_ret = verify_colref(se->get_right_se(), fm, schema, gtbl);
+               if( (l_ret < 0 ) || (r_ret < 0) ) return(-1);
+               return(1);
+       case SE_COLREF:
+               cr = se->get_colref();
+               field = cr->get_field();
+
+//                             Determine if this is really a GB ref.
+//                             (the parser can only see that its a colref).
+               if(gtbl != NULL){
+                       gb_ref = gtbl->find_gb(cr, fm, schema);
+               }else{
+                       gb_ref = -1;
+               }
+
+               se->set_gb_ref(gb_ref);
+
+               if(gb_ref < 0){
+//                             Its a colref, verify its existance and
+//                             record the data type.
+                       table_var = infer_tablevar_from_colref(cr,fm,schema);
+                       if(table_var < 0) return(table_var);
+
+       //                      Store the table ref in the colref.
+                       cr->set_tablevar_ref(table_var);
+                       cr->set_schema_ref(fm->get_schema_ref(table_var));
+                       cr->set_interface("");
+                       cr->set_table_name(fm->get_tablevar_name(table_var));
+
+
+                       type_name = schema->get_type_name(cr->get_schema_ref(), field);
+                       param_list *modifiers = schema->get_modifier_list(cr->get_schema_ref(), field);
+                       dt = new data_type(type_name, modifiers);
+                       se->set_data_type(dt);
+               }else{
+//                             Else, its a gbref, use the GB var's data type.
+                       se->set_data_type(gtbl->get_data_type(gb_ref));
+               }
+
+               return(1);
+       case SE_AGGR_STAR:
+               return(1);
+       case SE_AGGR_SE:
+               return( verify_colref(se->get_left_se(), fm, schema, gtbl) );
+       case SE_FUNC:
+               operands = se->get_operands();
+               r_ret = 1;
+               for(o=0;o<operands.size();o++){
+                       l_ret = verify_colref(operands[o], fm, schema, gtbl);
+                       if(l_ret < 0) r_ret = -1;
+               }
+               return(r_ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in verify_colref, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               return(-1);
+       }
+       return(-1);
+}
+
+
+int verify_predicate_colref(predicate_t *pr, tablevar_list_t *fm, table_list *schema, gb_table *gtbl){
+       int l_ret, r_ret;
+       std::vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               return(verify_colref(pr->get_left_se(),fm,schema, gtbl) );
+       case PRED_COMPARE:
+               l_ret = verify_colref(pr->get_left_se(),fm,schema, gtbl) ;
+               r_ret = verify_colref(pr->get_right_se(),fm,schema, gtbl) ;
+               if( (l_ret < 0) || (r_ret < 0) ) return(-1);
+               return(1);
+       case PRED_UNARY_OP:
+               return(verify_predicate_colref(pr->get_left_pr(),fm,schema, gtbl));
+       case PRED_BINARY_OP:
+               l_ret = verify_predicate_colref(pr->get_left_pr(),fm,schema, gtbl) ;
+               r_ret = verify_predicate_colref(pr->get_right_pr(),fm,schema, gtbl) ;
+               if( (l_ret < 0) || (r_ret < 0) ) return(-1);
+               return(1);
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               l_ret = 0;
+               for(o=0;o<op_list.size();++o){
+                       if(verify_colref(op_list[o],fm,schema,gtbl) < 0) l_ret = -1;
+               }
+               return(l_ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in verify_predicate_colref, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+       }
+
+       return(-1);
+}
+
+
+bool literal_only_se(scalarexp_t *se){         // really only literals.
+       int o;
+       vector<scalarexp_t *> operands;
+
+       if(se == NULL) return(1);
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               return(true);
+       case SE_PARAM:
+               return(false);
+       case SE_IFACE_PARAM:
+               return(false);
+       case SE_UNARY_OP:
+               return( literal_only_se(se->get_left_se()) );
+       case SE_BINARY_OP:
+               return( literal_only_se(se->get_left_se()) &&
+                               literal_only_se(se->get_right_se()) );
+       case SE_COLREF:
+               return false;
+       case SE_AGGR_STAR:
+               return false;
+       case SE_AGGR_SE:
+               return false;
+               return(1);
+       case SE_FUNC:
+               return false;
+       default:
+               return false;
+       }
+       return false;
+}
+
+
+
+
+//             Verify that column references exist in their
+//             declared tables.  As a side effect, assign
+//             their data types.  Other side effects :
+//
+
+int bind_to_schema_se(scalarexp_t *se, tablevar_list_t *fm, table_list *schema){
+       int l_ret, r_ret;
+       int gb_ref;
+       colref_t *cr;
+       string field, table_source, type_name;
+       data_type *dt;
+       vector<string> tn;
+       vector<int> tv;
+       int tablevar_ref;
+       int o;
+       vector<scalarexp_t *> operands;
+
+       if(se == NULL) return(1);
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               return(1);
+       case SE_PARAM:
+               return(1);
+       case SE_IFACE_PARAM:
+               return(1);
+       case SE_UNARY_OP:
+               return( bind_to_schema_se(se->get_left_se(), fm, schema) );
+       case SE_BINARY_OP:
+               l_ret = bind_to_schema_se(se->get_left_se(), fm, schema);
+               r_ret = bind_to_schema_se(se->get_right_se(), fm, schema);
+               if( (l_ret < 0 ) || (r_ret < 0) ) return(-1);
+               return(1);
+       case SE_COLREF:
+               if(se->is_gb()) return(1);      // gb ref not a colref.
+
+               cr = se->get_colref();
+               field = cr->get_field();
+
+               tablevar_ref = infer_tablevar_from_colref(cr,fm,schema);
+               if(tablevar_ref < 0){
+                       return(tablevar_ref);
+               }else{
+       //                      Store the table ref in the colref.
+                       cr->set_tablevar_ref(tablevar_ref);
+                       cr->set_schema_ref(fm->get_schema_ref(tablevar_ref));
+                       cr->set_interface("");
+                       cr->set_table_name(fm->get_tablevar_name(tablevar_ref));
+
+//                             Check the data type
+                       type_name = schema->get_type_name(cr->get_schema_ref(), field);
+                       param_list *modifiers = schema->get_modifier_list(cr->get_schema_ref(), field);
+                       data_type dt(type_name, modifiers);
+//                     if(! dt.equals(se->get_data_type()) ){
+//                     if(! dt.subsumes_type(se->get_data_type()) ){
+                       if(! se->get_data_type()->subsumes_type(&dt) ){
+                               fprintf(stderr,"INTERNAL ERROR in bind_to_schema_se: se's type is %d, table's is %d, colref is %s.\n",
+                                       dt.type_indicator(), se->get_data_type()->type_indicator(), cr->to_string().c_str());
+                               return(-1);
+                       }
+               }
+               return(1);
+       case SE_AGGR_STAR:
+               return(1);
+       case SE_AGGR_SE:        // Probably I should just return,
+                                               // aggregate se's are explicitly bound to the schema.
+//                     return( bind_to_schema_se(se->get_left_se(), fm, schema, gtbl) );
+               return(1);
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return 1;
+
+               operands = se->get_operands();
+               r_ret = 1;
+               for(o=0;o<operands.size();o++){
+                       l_ret = bind_to_schema_se(operands[o], fm, schema);
+                       if(l_ret < 0) r_ret = -1;
+               }
+               return(r_ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in bind_to_schema_se, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               return(-1);
+       }
+       return(-1);
+}
+
+
+int bind_to_schema_pr(predicate_t *pr, tablevar_list_t *fm, table_list *schema){
+       int l_ret, r_ret;
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               return(bind_to_schema_se(pr->get_left_se(),fm,schema) );
+       case PRED_COMPARE:
+               l_ret = bind_to_schema_se(pr->get_left_se(),fm,schema) ;
+               r_ret = bind_to_schema_se(pr->get_right_se(),fm,schema) ;
+               if( (l_ret < 0) || (r_ret < 0) ) return(-1);
+               return(1);
+       case PRED_UNARY_OP:
+               return(bind_to_schema_pr(pr->get_left_pr(),fm,schema));
+       case PRED_BINARY_OP:
+               l_ret = bind_to_schema_pr(pr->get_left_pr(),fm,schema) ;
+               r_ret = bind_to_schema_pr(pr->get_right_pr(),fm,schema) ;
+               if( (l_ret < 0) || (r_ret < 0) ) return(-1);
+               return(1);
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               l_ret = 0;
+               for(o=0;o<op_list.size();++o){
+                       if(bind_to_schema_se(op_list[o],fm,schema) < 0) l_ret = -1;
+               }
+               return(l_ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in bind_to_schema_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+       }
+
+       return(-1);
+}
+
+
+
+
+
+
+//                     verify_colref assigned data types to the column refs.
+//                     Now assign data types to all other nodes in the
+//                     scalar expression.
+//
+//                     return -1 on error
+
+temporal_type compute_se_temporal(scalarexp_t *se, map<col_id, temporal_type> &tcol){
+       int l_ret, r_ret;
+       data_type *dt;
+       bool bret;
+       vector<scalarexp_t *> operands;
+       vector<data_type *> odt;
+       int o, fcn_id;
+       vector<bool> handle_ind;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               return(constant_t);
+       case SE_PARAM:
+               return(varying_t);
+       case SE_IFACE_PARAM:
+               return(varying_t);              // actually, this should not be called.
+       case SE_UNARY_OP:
+               return data_type::compute_temporal_type(
+                       compute_se_temporal(se->get_left_se(), tcol), se->get_op()
+               );
+       case SE_BINARY_OP:
+               return data_type::compute_temporal_type(
+                       compute_se_temporal(se->get_left_se(), tcol),
+                       compute_se_temporal(se->get_right_se(), tcol),
+                       se->get_left_se()->get_data_type()->get_type(),
+                       se->get_right_se()->get_data_type()->get_type(),
+                       se->get_op()
+               );
+       case SE_COLREF:
+               {
+                       col_id cid(se->get_colref() );
+                       if(tcol.count(cid) > 0){ return tcol[cid];
+                       }else{ return varying_t;}
+               }
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+       case SE_FUNC:
+       default:
+               return varying_t;
+       }
+       return(varying_t);
+}
+
+
+
+//                     verify_colref assigned data types to the column refs.
+//                     Now assign data types to all other nodes in the
+//                     scalar expression.
+//
+//                     return -1 on error
+
+int assign_data_types(scalarexp_t *se, table_list *schema,
+                                               table_exp_t *fta_tree, ext_fcn_list *Ext_fcns){
+       int l_ret, r_ret;
+       data_type *dt;
+       bool bret;
+       vector<scalarexp_t *> operands;
+       vector<data_type *> odt;
+       int o, fcn_id;
+       vector<bool> handle_ind;
+       vector<bool> constant_ind;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               dt = new data_type( se->get_literal()->get_type() );
+               se->set_data_type(dt);
+               if( ! dt->is_defined() ){
+                       fprintf(stderr,"ERROR, Literal type is undefined, line =%d, char = %d, literal=%s\n",
+                               se->get_literal()->get_lineno(),se->get_literal()->get_charno(), se->get_literal()->to_string().c_str() );
+                       return(-1);
+               }else{
+                       return(1);
+               }
+       case SE_PARAM:
+               {
+                       string pname = se->get_param_name();
+                       dt = param_tbl->get_data_type(pname);
+// A SE_PARRAM can change its value mid-query so using one
+// to set a window is dangerous.  TODO check for this and issue a warning.
+                       dt->set_temporal(constant_t);
+                       se->set_data_type(dt);
+                       if( ! dt->is_defined() ){
+                               fprintf(stderr,"ERROR, parameter %s has undefined type, line =%d, char = %d\n",
+                                       pname.c_str(), se->get_lineno(),se->get_charno() );
+                               return(-1);
+                       }
+                       return(1);
+               }
+       case SE_IFACE_PARAM:
+               dt = new data_type( "STRING" );
+               se->set_data_type(dt);
+               return(1);
+       case SE_UNARY_OP:
+               l_ret = assign_data_types(se->get_left_se(), schema, fta_tree, Ext_fcns);
+               if(l_ret < 0) return -1;
+
+               dt = new data_type(se->get_left_se()->get_data_type(),se->get_op() );
+               se->set_data_type(dt);
+               if( ! dt->is_defined() ){
+                       fprintf(stderr,"ERROR, unary operator %s not defined for type %s, line=%d, char = %d\n",
+                               se->get_op().c_str(), se->get_left_se()->get_data_type()->to_string().c_str(),
+                               se->get_lineno(), se->get_charno() );
+                       return(-1);
+               }else{
+                       return(1);
+               }
+       case SE_BINARY_OP:
+               l_ret = assign_data_types(se->get_left_se(),  schema, fta_tree, Ext_fcns);
+               r_ret = assign_data_types(se->get_right_se(),  schema, fta_tree, Ext_fcns);
+               if( (l_ret < 0 ) || (r_ret < 0) ) return(-1);
+
+               dt = new data_type(se->get_left_se()->get_data_type(),se->get_right_se()->get_data_type(),se->get_op() );
+               se->set_data_type(dt);
+               if( ! dt->is_defined() ){
+                       fprintf(stderr,"ERROR, Binary operator %s not defined for type %s, %s line=%d, char = %d\n",
+                               se->get_op().c_str(), se->get_left_se()->get_data_type()->to_string().c_str(),
+                               se->get_right_se()->get_data_type()->to_string().c_str(),
+                               se->get_lineno(), se->get_charno() );
+                       return(-1);
+               }else{
+                       return(1);
+               }
+       case SE_COLREF:
+               dt = se->get_data_type();
+               bret = dt->is_defined();
+               if( bret ){
+                       return(1);
+               }else{
+                       fprintf(stderr,"ERROR, column reference type  is undefined, line =%d, char = %d, colref=%s\n",
+                               se->get_colref()->get_lineno(),se->get_colref()->get_charno(), se->get_colref()->to_string().c_str() );
+                       return(-1);
+               }
+       case SE_AGGR_STAR:
+               dt = new data_type("Int");      // changed Uint to Int
+               se->set_data_type(dt);
+               return(1);
+       case SE_AGGR_SE:
+               l_ret = assign_data_types(se->get_left_se(), schema, fta_tree, Ext_fcns);
+               if(l_ret < 0) return -1;
+
+               dt = new data_type();
+               dt->set_aggr_data_type(se->get_op(), se->get_left_se()->get_data_type());
+               se->set_data_type(dt);
+
+               if( ! dt->is_defined() ){
+                       fprintf(stderr,"ERROR, aggregate %s not defined for type %s, line=%d, char = %d\n",
+                               se->get_op().c_str(), se->get_left_se()->get_data_type()->to_string().c_str(),
+                               se->get_lineno(), se->get_charno() );
+                       return(-1);
+               }else{
+                       return(1);
+               }
+       case SE_FUNC:
+
+               operands = se->get_operands();
+               r_ret = 1;
+               for(o=0;o<operands.size();o++){
+                       l_ret = assign_data_types(operands[o], schema, fta_tree, Ext_fcns);
+                       odt.push_back(operands[o]->get_data_type());
+                       if(l_ret < 0) r_ret = -1;
+               }
+               if(r_ret < 0) return(r_ret);
+
+//                     Is it an aggregate extraction function?
+               fcn_id = Ext_fcns->lookup_extr(se->get_op(), odt);
+               if(fcn_id >= 0){
+                       int actual_fcn_id = Ext_fcns->get_actual_fcn_id(fcn_id);
+                       int subaggr_id = Ext_fcns->get_subaggr_id(fcn_id);
+                       int n_fcn_params = Ext_fcns->get_nparams(actual_fcn_id);
+//                             Construct a se for the subaggregate.
+                       vector<scalarexp_t *> op_a;
+                       int n_aggr_oprs = operands.size()-n_fcn_params+1;
+                       for(o=0;o<n_aggr_oprs;++o){
+                                       op_a.push_back(operands[o]);
+                       }
+//                             check handle params
+                       vector<bool> handle_a = Ext_fcns->get_handle_indicators(subaggr_id);
+                       for(o=0;o<op_a.size();o++){
+                       if(handle_a[o]){
+                               if(op_a[o]->get_operator_type() != SE_LITERAL &&
+                                               op_a[o]->get_operator_type() != SE_IFACE_PARAM &&
+                                               op_a[o]->get_operator_type() != SE_PARAM){
+                                               fprintf(stderr,"ERROR, the %d-th parameter of UDAF %s (extractor %s) must be a literal or query parameter (because it is a pass-by-HANDLE parameter).\n  Line=%d, char=%d.\n",
+                               o+1, Ext_fcns->get_fcn_name(subaggr_id).c_str(), se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                               return(-1);
+                                       }
+                               }
+                       }
+                       vector<bool> is_const_a=Ext_fcns->get_const_indicators(subaggr_id);
+                       for(o=0;o<op_a.size();o++){
+                       if(is_const_a[o]){
+                               if(op_a[o]->get_data_type()->get_temporal() != constant_t){
+                                               fprintf(stderr,"ERROR, the %d-th parameter of UDAF %s (extractor %s) must be constant.\n  Line=%d, char=%d.\n",
+                               o+1, Ext_fcns->get_fcn_name(subaggr_id).c_str(), se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                               return(-1);
+                                       }
+                               }
+                       }
+
+                       scalarexp_t *se_a  = new scalarexp_t(Ext_fcns->get_fcn_name(subaggr_id).c_str(), op_a);
+                       se_a->set_fcn_id(subaggr_id);
+                       se_a->set_data_type(Ext_fcns->get_fcn_dt(subaggr_id));
+                       se_a->set_aggr_id(0);           // label this as a UDAF.
+
+
+//                             Change this se to be the actual function
+                       vector<scalarexp_t *> op_f;
+                       op_f.push_back(se_a);
+                       for(o=n_aggr_oprs;o<operands.size();++o)
+                               op_f.push_back(operands[o]);
+//                             check handle params
+                       vector<bool> handle_f = Ext_fcns->get_handle_indicators(actual_fcn_id);
+                       for(o=0;o<op_f.size();o++){
+                       if(handle_f[o]){
+                               if(op_f[o]->get_operator_type() != SE_LITERAL &&
+                                               op_f[o]->get_operator_type() != SE_IFACE_PARAM &&
+                                               op_f[o]->get_operator_type() != SE_PARAM){
+                                               fprintf(stderr,"ERROR, the %d-th parameter of fcn %s (extractor %s) must be a literal or query parameter (because it is a pass-by-HANDLE parameter).\n  Line=%d, char=%d.\n",
+                               o+1, Ext_fcns->get_fcn_name(actual_fcn_id).c_str(), se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                               return(-1);
+                                       }
+                               }
+                       }
+                       vector<bool> is_const_f=Ext_fcns->get_const_indicators(actual_fcn_id);
+                       for(o=0;o<op_f.size();o++){
+                       if(is_const_f[o]){
+                               if(op_f[o]->get_data_type()->get_temporal() != constant_t){
+                                               fprintf(stderr,"ERROR, the %d-th parameter of fcn %s (extractor %s) must be constant.\n  Line=%d, char=%d.\n",
+                               o+1, Ext_fcns->get_fcn_name(actual_fcn_id).c_str(), se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                               return(-1);
+                                       }
+                               }
+                       }
+
+                       se->param_list = op_f;
+                       se->op = Ext_fcns->get_fcn_name(actual_fcn_id);
+                       se->set_fcn_id(actual_fcn_id);
+                       se->set_data_type(Ext_fcns->get_fcn_dt(actual_fcn_id));
+                       return(1);
+               }
+               if(fcn_id == -2){
+                       fprintf(stderr,"Warning: multiple subsuming aggregate extractors found for %s\n",se->get_op().c_str());
+               }
+
+//                     Is it a UDAF?
+               fcn_id = Ext_fcns->lookup_udaf(se->get_op(), odt);
+               if(fcn_id >= 0){
+                       se->set_fcn_id(fcn_id);
+                       se->set_data_type(Ext_fcns->get_fcn_dt(fcn_id));
+                       se->set_aggr_id(0);             // label this as a UDAF.
+//                     Finally, verify that all HANDLE parameters are literals or params.
+                       handle_ind = Ext_fcns->get_handle_indicators(se->get_fcn_id() );
+                       for(o=0;o<operands.size();o++){
+                               if(handle_ind[o]){
+                                       if(operands[o]->get_operator_type() != SE_LITERAL &&
+                                               operands[o]->get_operator_type() != SE_IFACE_PARAM &&
+                                               operands[o]->get_operator_type() != SE_PARAM){
+                                               fprintf(stderr,"ERROR, the %d-th parameter of UDAF %s must be a literal or query parameter (because it is a pass-by-HANDLE parameter).\n  Line=%d, char=%d.\n",
+                                       o+1, se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                               return(-1);
+                                       }
+                               }
+                       }
+                       constant_ind = Ext_fcns->get_const_indicators(se->get_fcn_id());
+                       for(o=0;o<operands.size();o++){
+                       if(constant_ind[o]){
+                               if(operands[o]->get_data_type()->get_temporal() != constant_t){
+                                               fprintf(stderr,"ERROR, the %d-th parameter of UDAF %s  must be constant.\n  Line=%d, char=%d.\n",
+                               o+1, se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                               return(-1);
+                                       }
+                               }
+                       }
+
+//     UDAFS as superaggregates not yet supported.
+if(se->is_superaggr()){
+fprintf(stderr,"WARNING: UDAF superagggregates (%s) are not yet supported, ignored.\n  Line=%d, char=%d.\n", se->get_op().c_str(),se->get_lineno(), se->get_charno());
+se->set_superaggr(false);
+}
+                       return(1);
+               }
+               if(fcn_id == -2){
+                       fprintf(stderr,"Warning: multiple subsuming UDAFs found for %s\n",se->get_op().c_str());
+               }
+
+//                     Is it a stateful fcn?
+               fcn_id = Ext_fcns->lookup_sfun(se->get_op(), odt);
+               if(fcn_id >= 0){
+                       se->set_fcn_id(fcn_id);
+                       se->set_data_type(Ext_fcns->get_fcn_dt(fcn_id));
+                       se->set_storage_state(Ext_fcns->get_storage_state(fcn_id)); // label as sfun
+//                     Finally, verify that all HANDLE parameters are literals or params.
+                       handle_ind = Ext_fcns->get_handle_indicators(se->get_fcn_id() );
+                       for(o=0;o<operands.size();o++){
+                               if(handle_ind[o]){
+                                       if(operands[o]->get_operator_type() != SE_LITERAL &&
+                                               operands[o]->get_operator_type() != SE_IFACE_PARAM &&
+                                               operands[o]->get_operator_type() != SE_PARAM){
+                                               fprintf(stderr,"ERROR, the %d-th parameter of UDAF %s must be a literal or query parameter (because it is a pass-by-HANDLE parameter).\n  Line=%d, char=%d.\n",
+                                       o+1, se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                               return(-1);
+                                       }
+                               }
+                       }
+                       constant_ind = Ext_fcns->get_const_indicators(se->get_fcn_id());
+                       for(o=0;o<operands.size();o++){
+                       if(constant_ind[o]){
+                               if(operands[o]->get_data_type()->get_temporal() != constant_t){
+                                               fprintf(stderr,"ERROR, the %d-th parameter of UDAF %s  must be constant.\n  Line=%d, char=%d.\n",
+                               o+1, se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                               return(-1);
+                                       }
+                               }
+                       }
+
+                       if(se->is_superaggr()){
+                               fprintf(stderr,"WARNING: stateful function %s cannot be marked as a superaggregate, ignored.\n  Line=%d, char=%d.\n", se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                       }
+                       return(1);
+               }
+               if(fcn_id == -2){
+                       fprintf(stderr,"Warning: multiple stateful fcns found for %s\n",se->get_op().c_str());
+               }
+
+
+//                     Is it a regular function?
+               fcn_id = Ext_fcns->lookup_fcn(se->get_op(), odt);
+               if( fcn_id < 0 ){
+                       fprintf(stderr,"ERROR, no external function %s(",se->get_op().c_str());
+                       for(o=0;o<operands.size();o++){
+                               if(o>0) fprintf(stderr,", ");
+                               fprintf(stderr,"%s",operands[o]->get_data_type()->to_string().c_str());
+                       }
+                       fprintf(stderr,") is defined, line %d, char %d\n", se->get_lineno(), se->get_charno() );
+                       if(fcn_id == -2) fprintf(stderr,"(multiple subsuming functions found)\n");
+
+                       return(-1);
+               }
+
+               se->set_fcn_id(fcn_id);
+               dt = Ext_fcns->get_fcn_dt(fcn_id);
+
+               if(! dt->is_defined() ){
+                       fprintf(stderr,"ERROR, external function %s(",se->get_op().c_str());
+                       for(o=0;o<operands.size();o++){
+                               if(o>0) fprintf(stderr,", ");
+                               fprintf(stderr,"%s",operands[o]->get_data_type()->to_string().c_str());
+                       }
+                       fprintf(stderr,") has undefined type, line %d, char %d\n", se->get_lineno(), se->get_charno() );
+                       return(-1);
+               }
+
+//                     Finally, verify that all HANDLE parameters are literals or params.
+               handle_ind = Ext_fcns->get_handle_indicators(se->get_fcn_id() );
+               for(o=0;o<operands.size();o++){
+                       if(handle_ind[o]){
+                               if(operands[o]->get_operator_type() != SE_LITERAL &&
+                                               operands[o]->get_operator_type() != SE_IFACE_PARAM &&
+                                               operands[o]->get_operator_type() != SE_PARAM){
+                                       fprintf(stderr,"ERROR, the %d-th parameter of function %s must be a literal or query parameter (because it is a pass-by-HANDLE parameter).\n  Line=%d, char=%d.\n",
+                               o+1, se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                       return(-1);
+                               }
+                       }
+               }
+               constant_ind = Ext_fcns->get_const_indicators(se->get_fcn_id());
+               for(o=0;o<operands.size();o++){
+               if(constant_ind[o]){
+                       if(operands[o]->get_data_type()->get_temporal() != constant_t){
+                                       fprintf(stderr,"ERROR, the %d-th parameter of function %s  must be constant.\n  Line=%d, char=%d.\n",
+                       o+1, se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                       return(-1);
+                               }
+                       }
+               }
+
+
+               if(se->is_superaggr()){
+                       fprintf(stderr,"WARNING: function %s cannot be marked as a superaggregate, ignored.\n  Line=%d, char=%d.\n", se->get_op().c_str(),se->get_lineno(), se->get_charno());
+               }
+
+               se->set_data_type(dt);
+               return(1);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in assign_data_types, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               return(-1);
+       }
+       return(-1);
+}
+
+
+int assign_predicate_data_types(predicate_t *pr, table_list *schema,
+                                                       table_exp_t *fta_tree, ext_fcn_list *Ext_fcns){
+       int l_ret, r_ret;
+       int i;
+       data_type *dt, *dtl;
+       vector<data_type *> odt;
+       vector<literal_t *> litl;
+       vector<scalarexp_t *> operands;
+       vector<bool> handle_ind;
+       vector<bool> constant_ind;
+       int o, fcn_id;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               l_ret = assign_data_types(pr->get_left_se(),schema, fta_tree, Ext_fcns); // , ext_fcn_set);
+               litl = pr->get_lit_vec();
+               dt = pr->get_left_se()->get_data_type();
+
+               for(i=0;i<litl.size();i++){
+                       dtl = new data_type( litl[i]->get_type() );
+                       if( ! dt->is_comparable(dtl,pr->get_op()) ){
+                               fprintf(stderr,"ERROR line %d, char %d: IS_IN types must be comparable (lhs type is %s, rhs type is %s).\n",
+                                       litl[i]->get_lineno(), litl[i]->get_charno(), dt->to_string().c_str(),dtl->to_string().c_str() );
+                               delete dtl;
+                               return(-1);
+                       }
+                       delete dtl;
+               }
+               return(1);
+       case PRED_COMPARE:
+               l_ret = assign_data_types(pr->get_left_se(),schema, fta_tree, Ext_fcns); // , ext_fcn_set) ;
+               r_ret = assign_data_types(pr->get_right_se(),schema, fta_tree, Ext_fcns); // , ext_fcn_set) ;
+               if( (l_ret < 0) || (r_ret < 0) ) return(-1);
+
+               if( !(pr->get_left_se()->get_data_type()->is_comparable(pr->get_right_se()->get_data_type(), pr->get_op() ) )){
+                       fprintf(stderr,"ERROR line %d, char %d, operands of comparison must have comparable types (%s %s %s).\n",
+                               pr->get_lineno(), pr->get_charno(), pr->get_left_se()->get_data_type()->to_string().c_str(),
+                                pr->get_right_se()->get_data_type()->to_string().c_str(), pr->get_op().c_str() );
+                       return(-1);
+               }else{
+                       return(1);
+               }
+       case PRED_UNARY_OP:
+               return(assign_predicate_data_types(pr->get_left_pr(),schema,fta_tree, Ext_fcns)); // , ext_fcn_set));
+       case PRED_BINARY_OP:
+               l_ret = assign_predicate_data_types(pr->get_left_pr(),schema,fta_tree, Ext_fcns); // , ext_fcn_set);
+               r_ret = assign_predicate_data_types(pr->get_right_pr(),schema,fta_tree, Ext_fcns); // , ext_fcn_set);
+               if( (l_ret < 0) || (r_ret < 0) ) return(-1);
+               return(1);
+       case PRED_FUNC:
+               operands = pr->get_op_list();
+               r_ret = 1;
+               for(o=0;o<operands.size();o++){
+                       l_ret = assign_data_types(operands[o], schema, fta_tree, Ext_fcns); // , ext_fcn_set);
+                       odt.push_back(operands[o]->get_data_type());
+                       if(l_ret < 0) r_ret = -1;
+               }
+               if(r_ret < 0) return(r_ret);
+
+               fcn_id = Ext_fcns->lookup_pred(pr->get_op(), odt);
+               if( fcn_id < 0 ){
+                       fprintf(stderr,"ERROR, no external predicate %s(",pr->get_op().c_str());
+                       for(o=0;o<operands.size();o++){
+                               if(o>0) fprintf(stderr,", ");
+                               fprintf(stderr,"%s",operands[o]->get_data_type()->to_string().c_str());
+                       }
+                       fprintf(stderr,") is defined, line %d, char %d\n", pr->get_lineno(), pr->get_charno() );
+                       if(fcn_id == -2) fprintf(stderr,"(multiple subsuming predicates found)\n");
+                       return(-1);
+               }
+
+//             ext_fcn_set.insert(fcn_id);
+               pr->set_fcn_id(fcn_id);
+
+//                     Finally, verify that all HANDLE parameters are literals or params.
+               handle_ind = Ext_fcns->get_handle_indicators(pr->get_fcn_id() );
+               for(o=0;o<operands.size();o++){
+                       if(handle_ind[o]){
+                               if(operands[o]->get_operator_type() != SE_LITERAL &&
+                                               operands[o]->get_operator_type() != SE_IFACE_PARAM &&
+                                               operands[o]->get_operator_type() != SE_PARAM){
+                                       fprintf(stderr,"ERROR, the %d-th parameter of predicate %s must be a literal or query parameter (because it is a pass-by-HANDLE parameter).\n  Line=%d, char=%d.\n",
+                               o+1, pr->get_op().c_str(),pr->get_lineno(), pr->get_charno());
+                                       exit(1);
+                               }
+                       }
+               }
+               constant_ind = Ext_fcns->get_const_indicators(pr->get_fcn_id());
+               for(o=0;o<operands.size();o++){
+               if(constant_ind[o]){
+                       if(operands[o]->get_data_type()->get_temporal() != constant_t){
+                                       fprintf(stderr,"ERROR, the %d-th parameter of predicate %s  must be constant.\n  Line=%d, char=%d.\n",
+                       o+1, pr->get_op().c_str(),pr->get_lineno(), pr->get_charno());
+                                       exit(1);
+                               }
+                       }
+               }
+
+
+//                     Check if this predicate function is special sampling function
+               pr->is_sampling_fcn = Ext_fcns->is_sampling_fcn(pr->get_fcn_id());
+
+
+               return(l_ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in assign_predicate_data_types, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+       }
+
+       return(-1);
+}
+
+
+
+/////////////////////////////////////////////////////////////////////
+////////////////               Make a deep copy of a se / pred tree
+/////////////////////////////////////////////////////////////////////
+
+
+//             duplicate a select element
+select_element *dup_select(select_element *sl, aggregate_table *aggr_tbl){
+       return new select_element(dup_se(sl->se,aggr_tbl),sl->name.c_str());
+}
+
+//             duplicate a scalar expression.
+scalarexp_t *dup_se(scalarexp_t *se,
+                                 aggregate_table *aggr_tbl
+                                ){
+  int p;
+  vector<scalarexp_t *> operand_list;
+  vector<data_type *> dt_signature;
+  scalarexp_t *ret_se, *l_se, *r_se;
+
+  switch(se->get_operator_type()){
+    case SE_LITERAL:
+               ret_se = new scalarexp_t(se->get_literal());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_PARAM:
+               ret_se = scalarexp_t::make_param_reference(se->get_op().c_str());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_IFACE_PARAM:
+               ret_se = scalarexp_t::make_iface_param_reference(se->get_ifpref());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_COLREF:
+               ret_se = new scalarexp_t(se->get_colref()->duplicate());
+               ret_se->rhs.scalarp = se->rhs.scalarp;  // carry along notation
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_UNARY_OP:
+               l_se = dup_se(se->get_left_se(),  aggr_tbl);
+               ret_se = new scalarexp_t(se->get_op().c_str(), l_se);
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_BINARY_OP:
+               l_se = dup_se(se->get_left_se(), aggr_tbl);
+               r_se = dup_se(se->get_right_se(), aggr_tbl);
+
+               ret_se = new scalarexp_t(se->get_op().c_str(), l_se, r_se);
+               ret_se->use_decorations_of(se);
+
+               return(ret_se);
+
+    case SE_AGGR_STAR:
+               ret_se = scalarexp_t::make_star_aggr(se->get_op().c_str());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_AGGR_SE:
+               l_se = dup_se(se->get_left_se(),  aggr_tbl);
+               ret_se = scalarexp_t::make_se_aggr(se->get_op().c_str(), l_se);
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+       case SE_FUNC:
+               {
+                       operand_list = se->get_operands();
+                       vector<scalarexp_t *> new_operands;
+                       for(p=0;p<operand_list.size();p++){
+                               l_se = dup_se(operand_list[p], aggr_tbl);
+                               new_operands.push_back(l_se);
+                       }
+
+                       ret_se = new scalarexp_t(se->get_op().c_str(), new_operands);
+                       ret_se->use_decorations_of(se);
+                       return(ret_se);
+               }
+
+       default:
+               printf("INTERNAL ERROR in dup_se: operator type %d\n",se->get_operator_type());
+               exit(1);
+       break;
+  }
+  return(NULL);
+
+}
+
+
+
+predicate_t *dup_pr(predicate_t *pr,
+                                                aggregate_table *aggr_tbl
+                                                ){
+
+  vector<literal_t *> llist;
+  scalarexp_t *se_l, *se_r;
+  predicate_t *pr_l, *pr_r, *ret_pr;
+  vector<scalarexp_t *> op_list, new_op_list;
+  int o;
+
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               se_l = dup_se(pr->get_left_se(), aggr_tbl);
+               ret_pr = new predicate_t(se_l, pr->get_lit_vec());
+               return(ret_pr);
+
+       case PRED_COMPARE:
+               se_l = dup_se(pr->get_left_se(), aggr_tbl);
+               se_r = dup_se(pr->get_right_se(),  aggr_tbl);
+               ret_pr = new predicate_t(se_l, pr->get_op().c_str(), se_r);
+               return(ret_pr);
+
+       case PRED_UNARY_OP:
+               pr_l = dup_pr(pr->get_left_pr(), aggr_tbl);
+               ret_pr = new predicate_t(pr->get_op().c_str(), pr_l);
+               return(ret_pr);
+
+       case PRED_BINARY_OP:
+               pr_l = dup_pr(pr->get_left_pr(), aggr_tbl);
+               pr_r = dup_pr(pr->get_right_pr(), aggr_tbl);
+               ret_pr = new predicate_t(pr->get_op().c_str(), pr_l, pr_r);
+               return(ret_pr);
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       se_l = dup_se(op_list[o], aggr_tbl);
+                       new_op_list.push_back(se_l);
+               }
+               ret_pr=  new predicate_t(pr->get_op().c_str(), new_op_list);
+               ret_pr->set_fcn_id(pr->get_fcn_id());
+               ret_pr->is_sampling_fcn = pr->is_sampling_fcn;
+               return(ret_pr);
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in dup_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return(0);
+
+}
+
+table_exp_t *dup_table_exp(table_exp_t *te){
+       int i;
+       table_exp_t *ret = new table_exp_t();
+
+       ret->query_type = te->query_type;
+
+       ss_map::iterator ss_i;
+       for(ss_i=te->nmap.begin();ss_i!=te->nmap.end();++ss_i){
+               ret->nmap[(*ss_i).first] = (*ss_i).second;
+       }
+
+       for(i=0;i<te->query_params.size();++i){
+               ret->query_params.push_back(new
+                var_pair_t(te->query_params[i]->name,te->query_params[i]->val) );
+       }
+
+       if(te->sl){
+               ret->sl = new select_list_t();
+               ret->sl->lineno = te->sl->lineno; ret->sl->charno = te->sl->charno;
+               vector<select_element *> select_list = te->sl->get_select_list();
+               for(i=0;i<select_list.size();++i){
+                       scalarexp_t *se = dup_se(select_list[i]->se,NULL);
+                       ret->sl->append(se,select_list[i]->name);
+               }
+       }
+
+       ret->fm = te->fm->duplicate();
+
+       if(te->wh) ret->wh = dup_pr(te->wh,NULL);
+       if(te->hv) ret->hv = dup_pr(te->hv,NULL);
+       if(te->cleaning_when) ret->cleaning_when = dup_pr(te->cleaning_when,NULL);
+       if(te->cleaning_by) ret->cleaning_by = dup_pr(te->cleaning_by,NULL);
+       if(te->closing_when) ret->closing_when = dup_pr(te->closing_when,NULL);
+
+       for(i=0;i<te->gb.size();++i){
+               extended_gb_t *tmp_g =  te->gb[i]->duplicate();
+               ret->gb.push_back(tmp_g);
+       }
+
+       ret->mergevars = te->mergevars;
+       if(te->slack)
+               ret->slack = dup_se(te->slack,NULL);
+       ret->lineno = te->lineno;
+       ret->charno = te->charno;
+
+       return(ret);
+}
+
+
+
+
+
+
+
+/////////////////////////////////////////////////////////////////////////
+//                     Bind colrefs to a member of their FROM list
+
+void bind_colref_se(scalarexp_t *se,
+                                 vector<tablevar_t *> &fm,
+                                 int prev_ref, int new_ref
+                                ){
+  int p;
+  vector<scalarexp_t *> operand_list;
+  colref_t *cr;
+  ifpref_t *ir;
+
+  switch(se->get_operator_type()){
+    case SE_LITERAL:
+    case SE_PARAM:
+               return;
+    case SE_IFACE_PARAM:
+               ir = se->get_ifpref();
+               if(ir->get_tablevar_ref() == prev_ref){
+                       ir->set_tablevar_ref(new_ref);
+                       ir->set_tablevar(fm[new_ref]->get_var_name());
+               }
+               return;
+
+    case SE_COLREF:
+               cr=se->get_colref();
+               if(cr->get_tablevar_ref() == prev_ref){
+                       cr->set_tablevar_ref(new_ref);
+//                     cr->set_interface(fm[new_ref]->get_interface());
+                       cr->set_table_name(fm[new_ref]->get_var_name());
+               }
+               return;
+
+    case SE_UNARY_OP:
+               bind_colref_se(se->get_left_se(),  fm, prev_ref, new_ref);
+               return;
+
+    case SE_BINARY_OP:
+               bind_colref_se(se->get_left_se(), fm, prev_ref, new_ref);
+               bind_colref_se(se->get_right_se(),  fm, prev_ref, new_ref);
+               return;
+
+    case SE_AGGR_STAR:
+    case SE_AGGR_SE:
+               return;
+
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return;
+
+               operand_list = se->get_operands();
+               for(p=0;p<operand_list.size();p++){
+                       bind_colref_se(operand_list[p], fm, prev_ref, new_ref);
+               }
+               return;
+
+       default:
+               printf("INTERNAL ERROR in bind_colref_se: operator type %d\n",se->get_operator_type());
+               exit(1);
+       break;
+  }
+  return;
+
+}
+
+
+
+
+void bind_colref_pr(predicate_t *pr,
+                                 vector<tablevar_t *> &fm,
+                                 int prev_ref, int new_ref
+                                ){
+  vector<scalarexp_t *> op_list;
+  int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               bind_colref_se(pr->get_left_se(), fm, prev_ref, new_ref);
+               return;
+
+       case PRED_COMPARE:
+               bind_colref_se(pr->get_left_se(), fm, prev_ref, new_ref);
+               bind_colref_se(pr->get_right_se(),  fm, prev_ref, new_ref);
+               return;
+
+       case PRED_UNARY_OP:
+               bind_colref_pr(pr->get_left_pr(), fm, prev_ref, new_ref);
+               return;
+
+       case PRED_BINARY_OP:
+               bind_colref_pr(pr->get_left_pr(), fm, prev_ref, new_ref);
+               bind_colref_pr(pr->get_right_pr(), fm, prev_ref, new_ref);
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       bind_colref_se(op_list[o], fm, prev_ref, new_ref);
+               }
+               return;
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in bind_colref_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return;
+
+}
+
+
+/////////////////////////////////////////////////////////////////////
+//             verify that the se refs only literals and params.
+//         (use to verify that the expression should stay in the hfta
+//              during a split)
+/////////////////////////////////////////////////////////////////////
+
+bool is_literal_or_param_only(scalarexp_t *se){
+       int o;
+       vector<scalarexp_t *> operands;
+       bool sum = true;
+
+       if(se == NULL) return(true);
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+               return(true);
+       case SE_IFACE_PARAM:
+               return(false);          // need to treat as colref
+       case SE_UNARY_OP:
+               return(is_literal_or_param_only(se->get_left_se()) );
+       case SE_BINARY_OP:
+               return(
+                       is_literal_or_param_only(se->get_left_se()) &&
+                       is_literal_or_param_only(se->get_right_se())
+                       );
+       case SE_COLREF:
+               return(false);
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               return(false);
+       case SE_FUNC:
+//                     The fcn might have special meaning at the lfta ...
+               return(false);
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in is_literal_or_param_only, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return(0);
+}
+
+
+
+/////////////////////////////////////////////////////////////////////
+//             Search for gb refs.
+//         (use to verify that no gbrefs in a gb def.)
+/////////////////////////////////////////////////////////////////////
+
+
+int count_gb_se(scalarexp_t *se){
+       int o;
+       vector<scalarexp_t *> operands;
+       int sum = 0;
+
+       if(se == NULL) return(0);
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return(0);
+       case SE_UNARY_OP:
+               return(count_gb_se(se->get_left_se()) );
+       case SE_BINARY_OP:
+               return(
+                       count_gb_se(se->get_left_se()) +
+                       count_gb_se(se->get_right_se())
+                       );
+       case SE_COLREF:
+               if(se->get_gb_ref() < 0) return(0);
+               return(1);
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               return(0);
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       sum +=  count_gb_se(operands[o]);
+               }
+               return(sum);
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in count_gb_se, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return(0);
+}
+
+
+/////////////////////////////////////////////////////////////////////
+////////////////               Search for stateful fcns.
+/////////////////////////////////////////////////////////////////////
+
+
+int se_refs_sfun(scalarexp_t *se){
+       int o;
+       vector<scalarexp_t *> operands;
+       int sum = 0;
+
+       if(se == NULL) return(0);
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return(0);
+       case SE_UNARY_OP:
+               return(se_refs_sfun(se->get_left_se()) );
+       case SE_BINARY_OP:
+               return(
+                       se_refs_sfun(se->get_left_se()) +
+                       se_refs_sfun(se->get_right_se())
+                       );
+       case SE_COLREF:
+               return(0);
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               return(0);
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       sum +=  se_refs_sfun(operands[o]);
+               }
+               if(se->get_aggr_ref()>=0) sum++; // is it tagged as a UDAF?
+
+//                     for now, stateful functions count as aggregates.
+               if(se->get_storage_state() != "")
+                       sum++;
+
+               return(sum);
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in se_refs_sfun, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return(0);
+}
+
+
+//             Return a count of the number of stateful fcns in this predicate.
+int pred_refs_sfun(predicate_t *pr){
+       vector<scalarexp_t *> op_list;
+       int o, aggr_sum;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               return(se_refs_sfun(pr->get_left_se()) );
+       case PRED_COMPARE:
+               return(
+                       se_refs_sfun(pr->get_left_se()) +
+                       se_refs_sfun(pr->get_right_se())
+               );
+       case PRED_UNARY_OP:
+               return(pred_refs_sfun(pr->get_left_pr()) );
+       case PRED_BINARY_OP:
+               return(
+                       pred_refs_sfun(pr->get_left_pr()) +
+                       pred_refs_sfun(pr->get_right_pr())
+               );
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               aggr_sum = 0;
+               for(o=0;o<op_list.size();++o){
+                       aggr_sum += se_refs_sfun(op_list[o]);
+               }
+               return(aggr_sum);
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in pred_refs_sfun, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return(0);
+}
+
+//////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////
+////////////////               Search for aggregates.
+/////////////////////////////////////////////////////////////////////
+
+
+int count_aggr_se(scalarexp_t *se, bool strict){
+       int o;
+       vector<scalarexp_t *> operands;
+       int sum = 0;
+
+       if(se == NULL) return(0);
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return(0);
+       case SE_UNARY_OP:
+               return(count_aggr_se(se->get_left_se(), strict) );
+       case SE_BINARY_OP:
+               return(
+                       count_aggr_se(se->get_left_se(), strict) +
+                       count_aggr_se(se->get_right_se(), strict)
+                       );
+       case SE_COLREF:
+               return(0);
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               return(1);
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       sum +=  count_aggr_se(operands[o], strict);
+               }
+               if(se->get_aggr_ref()>=0) sum++; // is it tagged as a UDAF?
+
+//                     now, stateful functions can count as aggregates.
+//                     if we are being strict.
+               if(! strict && se->get_storage_state() != "")
+                       sum++;
+
+               return(sum);
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in count_aggr_se, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return(0);
+}
+
+
+//             Return a count of the number of aggregate fcns in this predicate.
+int count_aggr_pred(predicate_t *pr, bool strict){
+       vector<scalarexp_t *> op_list;
+       int o, aggr_sum;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               return(count_aggr_se(pr->get_left_se(), strict) );
+       case PRED_COMPARE:
+               return(
+                       count_aggr_se(pr->get_left_se(), strict) +
+                       count_aggr_se(pr->get_right_se(), strict)
+               );
+       case PRED_UNARY_OP:
+               return(count_aggr_pred(pr->get_left_pr(), strict) );
+       case PRED_BINARY_OP:
+               return(
+                       count_aggr_pred(pr->get_left_pr(), strict) +
+                       count_aggr_pred(pr->get_right_pr(), strict)
+               );
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               aggr_sum = 0;
+               for(o=0;o<op_list.size();++o){
+                       aggr_sum += count_aggr_se(op_list[o], strict);
+               }
+               return(aggr_sum);
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in count_aggr_pred, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return(0);
+}
+
+//////////////////////////////////////////////////
+///            Analyze tablevar refs
+
+void get_tablevar_ref_se(scalarexp_t *se, vector<int> &reflist){
+       int o;
+       vector<scalarexp_t *> operands;
+       int vref;
+       colref_t *cr;
+       ifpref_t *ir;
+
+       if(se == NULL) return;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+               return;
+       case SE_IFACE_PARAM:
+               ir = se->get_ifpref();
+               vref = ir->get_tablevar_ref();
+               for(o=0;o<reflist.size();++o){
+                       if(vref == reflist[o]) return;
+               }
+               reflist.push_back(vref);
+               return;
+       case SE_UNARY_OP:
+               get_tablevar_ref_se(se->get_left_se(), reflist);
+               return;
+       case SE_BINARY_OP:
+               get_tablevar_ref_se(se->get_left_se(), reflist);
+               get_tablevar_ref_se(se->get_right_se(), reflist);
+               return;
+       case SE_COLREF:
+               if(se->is_gb()) return;
+               cr = se->get_colref();
+               vref = cr->get_tablevar_ref();
+               for(o=0;o<reflist.size();++o){
+                       if(vref == reflist[o]) return;
+               }
+               reflist.push_back(vref);
+               return;
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               return;
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return;
+
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       get_tablevar_ref_se(operands[o], reflist);
+               }
+               return;
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in get_tablevar_ref_se, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return;
+}
+
+
+void get_tablevar_ref_pr(predicate_t *pr, vector<int> &reflist){
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               get_tablevar_ref_se(pr->get_left_se(),reflist);
+               return;
+       case PRED_COMPARE:
+               get_tablevar_ref_se(pr->get_left_se(),reflist);
+               get_tablevar_ref_se(pr->get_right_se(),reflist);
+               return;
+       case PRED_UNARY_OP:
+               get_tablevar_ref_pr(pr->get_left_pr(),reflist);
+               return;
+       case PRED_BINARY_OP:
+               get_tablevar_ref_pr(pr->get_left_pr(),reflist);
+               get_tablevar_ref_pr(pr->get_right_pr(),reflist);
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       get_tablevar_ref_se(op_list[o],reflist);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in get_tablevar_ref_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+       }
+
+       return;
+}
+
+
+//                     Walk SE tree and gather STATES ref'd by STATEFUL fcns.
+
+void gather_fcn_states_se(scalarexp_t *se, set<string> &states_refd, ext_fcn_list *Ext_fcns){
+       int agg_id;
+       int o;
+       vector<scalarexp_t *> operands;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return;
+       case SE_UNARY_OP:
+               gather_fcn_states_se(se->get_left_se(), states_refd, Ext_fcns) ;
+               return;
+       case SE_BINARY_OP:
+               gather_fcn_states_se(se->get_left_se(), states_refd, Ext_fcns);
+               gather_fcn_states_se(se->get_right_se(), states_refd,Ext_fcns);
+               return;
+       case SE_COLREF:
+               return;
+       case SE_AGGR_STAR:
+               return;
+       case SE_AGGR_SE:
+               gather_fcn_states_se(se->get_left_se(), states_refd, Ext_fcns);
+               return;
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       gather_fcn_states_se(operands[o], states_refd, Ext_fcns);
+               }
+               if(se->get_storage_state() != ""){
+                       states_refd.insert(se->get_storage_state());
+               }
+               return;
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in gather_fcn_states_se, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return;
+}
+
+
+//                     Walk SE tree and gather STATES ref'd by STATEFUL fcns.
+
+void gather_fcn_states_pr(predicate_t *pr, set<string> &states_refd, ext_fcn_list *Ext_fcns){
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               gather_fcn_states_se(pr->get_left_se(),states_refd, Ext_fcns) ;
+               return;
+       case PRED_COMPARE:
+               gather_fcn_states_se(pr->get_left_se(),states_refd, Ext_fcns) ;
+               gather_fcn_states_se(pr->get_right_se(),states_refd, Ext_fcns) ;
+               return;
+       case PRED_UNARY_OP:
+               gather_fcn_states_pr(pr->get_left_pr(),states_refd, Ext_fcns);
+               return;
+       case PRED_BINARY_OP:
+               gather_fcn_states_pr(pr->get_left_pr(),states_refd, Ext_fcns) ;
+               gather_fcn_states_pr(pr->get_right_pr(),states_refd, Ext_fcns) ;
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       gather_fcn_states_se(op_list[o],states_refd, Ext_fcns);
+               }
+               return;
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in gather_fcn_states_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return;
+}
+
+
+
+
+//                     walk se tree and collect aggregates into aggregate table.
+//                     duplicate aggregates receive the same idx to the table.
+
+void build_aggr_tbl_fm_se(scalarexp_t *se, aggregate_table *aggregate_table, ext_fcn_list *Ext_fcns){
+       int agg_id;
+       int o;
+       vector<scalarexp_t *> operands;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return;
+       case SE_UNARY_OP:
+               build_aggr_tbl_fm_se(se->get_left_se(), aggregate_table, Ext_fcns) ;
+               return;
+       case SE_BINARY_OP:
+               build_aggr_tbl_fm_se(se->get_left_se(), aggregate_table, Ext_fcns);
+               build_aggr_tbl_fm_se(se->get_right_se(), aggregate_table,Ext_fcns);
+               return;
+       case SE_COLREF:
+               return;
+       case SE_AGGR_STAR:
+               agg_id = aggregate_table->add_aggr(se->get_op(),NULL,se->is_superaggr());
+               se->set_aggr_id(agg_id);
+               return;
+       case SE_AGGR_SE:
+               agg_id = aggregate_table->add_aggr(se->get_op(),se->get_left_se(),se->is_superaggr());
+               se->set_aggr_id(agg_id);
+               return;
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       build_aggr_tbl_fm_se(operands[o], aggregate_table, Ext_fcns);
+               }
+               if(se->get_aggr_ref() >= 0){ // it's been tagged as a UDAF
+                       agg_id = aggregate_table->add_aggr(se->get_op(), se->get_fcn_id(), operands, Ext_fcns->get_storage_dt(se->get_fcn_id()), se->is_superaggr(), Ext_fcns->is_running_aggr(se->get_fcn_id()),Ext_fcns->has_lfta_bailout(se->get_fcn_id()));
+                       se->set_aggr_id(agg_id);
+               }
+               return;
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in build_aggr_tbl_fm_se, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return;
+}
+
+
+//                     walk se tree and collect aggregates into aggregate table.
+//                     duplicate aggregates receive the same idx to the table.
+
+void build_aggr_tbl_fm_pred(predicate_t *pr, aggregate_table *aggregate_table,ext_fcn_list *Ext_fcns){
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               build_aggr_tbl_fm_se(pr->get_left_se(),aggregate_table, Ext_fcns) ;
+               return;
+       case PRED_COMPARE:
+               build_aggr_tbl_fm_se(pr->get_left_se(),aggregate_table, Ext_fcns) ;
+               build_aggr_tbl_fm_se(pr->get_right_se(),aggregate_table, Ext_fcns) ;
+               return;
+       case PRED_UNARY_OP:
+               build_aggr_tbl_fm_pred(pr->get_left_pr(),aggregate_table, Ext_fcns);
+               return;
+       case PRED_BINARY_OP:
+               build_aggr_tbl_fm_pred(pr->get_left_pr(),aggregate_table, Ext_fcns) ;
+               build_aggr_tbl_fm_pred(pr->get_right_pr(),aggregate_table, Ext_fcns) ;
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       build_aggr_tbl_fm_se(op_list[o],aggregate_table, Ext_fcns);
+               }
+               return;
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in build_aggr_tbl_fm_pred, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return;
+}
+
+
+//                     Return true if the two scalar expressions
+//                     represent the same value (e.g., use to eliminate
+//                     duplicate aggregates).
+bool is_equivalent_se(scalarexp_t *se1, scalarexp_t *se2){
+       vector<scalarexp_t *> operands1;
+       vector<scalarexp_t *> operands2;
+       int o;
+
+//             First handle the case of nulls (e.g. COUNT aggrs)
+       if(se1 == NULL && se2 == NULL) return(true);
+       if(se1 == NULL || se2 == NULL) return(false);
+
+//             In all cases, must be the same oeprator type and same operator.
+       if(se1->get_operator_type() != se2->get_operator_type())
+               return(false);
+       if(se1->get_op() != se2->get_op() )
+               return(false);
+
+       switch(se1->get_operator_type()){
+       case SE_LITERAL:
+               return(se1->get_literal()->is_equivalent(se2->get_literal()) );
+       case SE_PARAM:
+               return(se1->get_param_name() == se2->get_param_name() );
+       case SE_IFACE_PARAM:
+               return(se1->get_ifpref()->is_equivalent(se2->get_ifpref()) );
+       case SE_UNARY_OP:
+               return(is_equivalent_se(se1->get_left_se(), se2->get_left_se()) );
+       case SE_BINARY_OP:
+               if(is_equivalent_se(se1->get_left_se(), se2->get_left_se()) )
+                       return(is_equivalent_se(se1->get_right_se(), se2->get_right_se()) );
+               return(false);
+       case SE_COLREF:
+               if(se1->is_gb() && se2->is_gb())
+                       return( se1->get_gb_ref() == se2->get_gb_ref() );
+               if(se1->is_gb() || se2->is_gb())
+                       return(false);
+               return(se1->get_colref()->is_equivalent(se2->get_colref()) );
+       case SE_AGGR_STAR:
+               return(true);
+       case SE_AGGR_SE:
+               return(is_equivalent_se(se1->get_left_se(), se2->get_left_se()) );
+       case SE_FUNC:
+               if(se1->get_op() != se2->get_op()) return(false);
+
+               operands1 = se1->get_operands();
+               operands2 = se2->get_operands();
+               if(operands1.size() != operands2.size()) return(false);
+
+               for(o=0;o<operands1.size();o++){
+                       if(! is_equivalent_se(operands1[o], operands2[o]) )
+                               return(false);
+               }
+               return(true);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in is_equivalent_se, line %d, character %d: unknown operator type %d\n",
+                               se1->get_lineno(), se1->get_charno(),se1->get_operator_type());
+               exit(1);
+       }
+       return(false);
+}
+
+
+//             Similar to is_equivalent_se, but with a looser definition
+//             of equivalence of colrefs.  Here, say they are equivalent
+//             if their base table is the same.  Use to find equivalent
+//             predicates on base tables.
+bool is_equivalent_se_base(scalarexp_t *se1, scalarexp_t *se2, table_list *Schema){
+       vector<scalarexp_t *> operands1;
+       vector<scalarexp_t *> operands2;
+       int o;
+
+       if(se1->get_operator_type() == SE_COLREF && se1->is_gb()){
+               se1 = se1->get_right_se();
+       }
+       if(se2->get_operator_type() == SE_COLREF && se2->is_gb()){
+               se2 = se2->get_right_se();
+       }
+
+//             First handle the case of nulls (e.g. COUNT aggrs)
+       if(se1 == NULL && se2 == NULL) return(true);
+       if(se1 == NULL || se2 == NULL) return(false);
+
+//             In all cases, must be the same oeprator type and same operator.
+       if(se1->get_operator_type() != se2->get_operator_type())
+               return(false);
+       if(se1->get_op() != se2->get_op() )
+               return(false);
+
+       switch(se1->get_operator_type()){
+       case SE_LITERAL:
+               return(se1->get_literal()->is_equivalent(se2->get_literal()) );
+       case SE_PARAM:
+               return(se1->get_param_name() == se2->get_param_name() );
+       case SE_IFACE_PARAM:
+               return(se1->get_ifpref()->is_equivalent(se2->get_ifpref()) );
+       case SE_UNARY_OP:
+               return(is_equivalent_se_base(se1->get_left_se(), se2->get_left_se(), Schema) );
+       case SE_BINARY_OP:
+               if(is_equivalent_se_base(se1->get_left_se(), se2->get_left_se(), Schema) )
+                       return(is_equivalent_se_base(se1->get_right_se(), se2->get_right_se(), Schema) );
+               return(false);
+       case SE_COLREF:
+/*
+               if(se1->is_gb() && se2->is_gb())
+                       return( se1->get_gb_ref() == se2->get_gb_ref() );
+               if(se1->is_gb() || se2->is_gb())
+                       return(false);
+*/
+               return(se1->get_colref()->is_equivalent_base(se2->get_colref(), Schema) );
+       case SE_AGGR_STAR:
+               return(true);
+       case SE_AGGR_SE:
+               return(is_equivalent_se_base(se1->get_left_se(), se2->get_left_se(), Schema) );
+       case SE_FUNC:
+               if(se1->get_op() != se2->get_op()) return(false);
+
+               operands1 = se1->get_operands();
+               operands2 = se2->get_operands();
+               if(operands1.size() != operands2.size()) return(false);
+
+               for(o=0;o<operands1.size();o++){
+                       if(! is_equivalent_se_base(operands1[o], operands2[o], Schema) )
+                               return(false);
+               }
+               return(true);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in is_equivalent_se, line %d, character %d: unknown operator type %d\n",
+                               se1->get_lineno(), se1->get_charno(),se1->get_operator_type());
+               exit(1);
+       }
+       return(false);
+}
+
+
+//             Find predicates which are equivalent when
+//             looking at the base tables.  Use to find
+//             common prefilter.
+bool is_equivalent_pred_base(predicate_t *p1, predicate_t *p2, table_list *Schema){
+int i, o;
+
+//             First handle the case of nulls
+       if(p1 == NULL && p2 == NULL) return(true);
+       if(p1 == NULL || p2 == NULL) return(false);
+
+
+  if(p1->get_operator_type() != p2->get_operator_type())
+         return(false);
+  if(p1->get_op() != p2->get_op())
+         return(false);
+
+    vector<literal_t *> ll1;
+    vector<literal_t *> ll2;
+       vector<scalarexp_t *> op_list1, op_list2;
+
+
+  switch(p2->get_operator_type()){
+     case PRED_COMPARE:
+        if( ! is_equivalent_se_base(p1->get_left_se(),p2->get_left_se(), Schema) )
+            return(false);
+        return( is_equivalent_se_base(p1->get_right_se(),p2->get_right_se(), Schema) );
+    break;
+    case PRED_IN:
+        if( ! is_equivalent_se_base(p1->get_left_se(),p2->get_left_se(), Schema) )
+            return(false);
+        ll1 = p1->get_lit_vec();
+        ll2 = p2->get_lit_vec();
+        if(ll1.size() != ll2.size())
+            return(false);
+        for(i=0;i<ll1.size();i++){
+          if(! ll1[i]->is_equivalent( ll2[i] ) )
+            return(false);
+        }
+        return(true);
+    break;
+     case PRED_UNARY_OP:
+        return(is_equivalent_pred_base(p1->get_left_pr(), p2->get_left_pr(), Schema) );
+    break;
+     case PRED_BINARY_OP:
+        if(! is_equivalent_pred_base(p1->get_left_pr(), p2->get_left_pr(), Schema))
+            return(false);
+        return(is_equivalent_pred_base(p1->get_right_pr(), p2->get_right_pr(), Schema) );
+    break;
+        case PRED_FUNC:
+               op_list1 = p1->get_op_list();
+               op_list2 = p2->get_op_list();
+               if(op_list1.size() != op_list2.size()) return(false);
+               for(o=0;o<op_list1.size();++o){
+                       if(! is_equivalent_se_base(op_list1[o],op_list2[o], Schema) ) return(false);
+               }
+               return(true);
+
+   }
+
+    return(false);
+}
+
+
+
+bool is_equivalent_class_pred_base(predicate_t *p1, predicate_t *p2, table_list *Schema,ext_fcn_list *Ext_fcns){
+  if((p1->get_operator_type()!=PRED_FUNC)||(p2->get_operator_type()!=PRED_FUNC))
+         return(false);
+  if(p1->get_fcn_id() != p2->get_fcn_id())
+               return false;
+  vector<bool> cl_op = Ext_fcns->get_class_indicators(p1->get_fcn_id());
+  int o;
+  vector<scalarexp_t *> op_list1 = p1->get_op_list();
+  vector<scalarexp_t *> op_list2 = p2->get_op_list();
+  if(op_list1.size() != op_list2.size()) return(false);
+  for(o=0;o<op_list1.size();++o){
+         if(cl_op[o]){
+               if(! is_equivalent_se_base(op_list1[o],op_list2[o], Schema) )
+                       return(false);
+       }
+  }
+  return true;
+
+}
+
+
+
+
+//                     Verify that the scalar expression (in a such that clause)
+//                     is acceptable in an aggregation query.  No column
+//                     references allowed outside aggergates, except for
+//                     references to group-by attributes.
+//                     return true if OK, false if bad.
+bool verify_aggr_query_se(scalarexp_t *se){
+       vector <scalarexp_t *> operands;
+       int o;
+
+    switch(se->get_operator_type()){
+    case SE_LITERAL:
+    case SE_PARAM:
+    case SE_IFACE_PARAM:
+        return(true );
+    case SE_UNARY_OP:
+        return(verify_aggr_query_se(se->get_left_se() ) );
+    case SE_BINARY_OP:
+        return(verify_aggr_query_se(se->get_left_se() ) &&
+            verify_aggr_query_se(se->get_right_se() ) );
+    case SE_COLREF:
+        if(se->is_gb() ) return(true);
+        fprintf(stderr,"ERROR: the select clause in an aggregate query can "
+                        "only reference constants, group-by attributes, and "
+                        "aggregates,  (%s) line %d, character %d.\n",
+                        se->get_colref()->to_string().c_str(),
+                                               se->get_lineno(), se->get_charno() );
+        return(false);
+    case SE_AGGR_STAR:
+    case SE_AGGR_SE:
+//                     colrefs and gbrefs allowed.
+//                     check for nested aggregation elsewhere, so just return TRUE
+        return(true);
+       case SE_FUNC:
+//                     If its a UDAF, just return true
+               if(se->get_aggr_ref() >= 0) return true;
+
+               operands = se->get_operands();
+
+               for(o=0;o<operands.size();o++){
+                       if(! verify_aggr_query_se(operands[o]) )
+                               return(false);
+               }
+               return(true);
+    default:
+        fprintf(stderr,"INTERNAL ERROR in verify_aggr_query_se, line %d, character %d: unknown operator type %d\n",
+                se->get_lineno(), se->get_charno(),se->get_operator_type());
+        exit(1);
+    }
+    return(false);
+}
+
+
+
+
+//                     Find complex literals.
+//                     NOTE : This analysis should be deferred to
+//                                code generation time.
+//                     This analysis drills into aggr se specs.
+//                     Shouldn't this be done at the aggregate table?
+//                     But, its not a major loss of efficiency.
+//                             UPDATE : drilling into aggr se's is causnig a problem
+//                                     so I've eliminated it.
+
+bool find_complex_literal_se(scalarexp_t *se, ext_fcn_list *Ext_fcns,
+                                                               cplx_lit_table *complex_literals){
+       literal_t *l;
+       vector<scalarexp_t *> operands;
+       int o;
+       scalarexp_t *param_se;
+       data_type *dt;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               l = se->get_literal();
+               if(l->constructor_name() != ""){
+                       int cl_idx = complex_literals->add_cpx_lit(l, false);
+                       l->set_cpx_lit_ref(cl_idx);
+               }
+               return(true);
+       case SE_PARAM:
+               return(true );
+//                     SE_IFACE_PARAM should not exist when this is called.
+       case SE_UNARY_OP:
+               return(find_complex_literal_se(se->get_left_se(), Ext_fcns, complex_literals ) );
+       case SE_BINARY_OP:
+               return(find_complex_literal_se(se->get_left_se(), Ext_fcns, complex_literals ) &&
+                       find_complex_literal_se(se->get_right_se(), Ext_fcns, complex_literals ) );
+       case SE_COLREF:
+               return(true);
+       case SE_AGGR_STAR:
+               return(true);
+       case SE_AGGR_SE:
+               return true;
+//             return(find_complex_literal_se(se->get_left_se(), Ext_fcns, complex_literals ) );
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return true;
+
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       find_complex_literal_se(operands[o], Ext_fcns, complex_literals);
+               }
+               return(true);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_complex_literal_se, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return(false);
+}
+
+
+
+
+void find_complex_literal_pr(predicate_t *pr, ext_fcn_list *Ext_fcns,
+                                                               cplx_lit_table *complex_literals){
+       int i,o;
+       vector<literal_t *> litl;
+       vector<scalarexp_t *> op_list;
+
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               find_complex_literal_se(pr->get_left_se(), Ext_fcns, complex_literals) ;
+               litl = pr->get_lit_vec();
+               for(i=0;i<litl.size();i++){
+                       if(litl[i]->constructor_name() != ""){
+                               int cl_idx = complex_literals->add_cpx_lit(litl[i],false);
+                               litl[i]->set_cpx_lit_ref(cl_idx);
+                       }
+               }
+               return;
+       case PRED_COMPARE:
+               find_complex_literal_se(pr->get_left_se(), Ext_fcns, complex_literals) ;
+               find_complex_literal_se(pr->get_right_se(), Ext_fcns, complex_literals) ;
+               return;
+       case PRED_UNARY_OP:
+               find_complex_literal_pr(pr->get_left_pr(), Ext_fcns, complex_literals);
+               return;
+       case PRED_BINARY_OP:
+               find_complex_literal_pr(pr->get_left_pr(), Ext_fcns, complex_literals) ;
+               find_complex_literal_pr(pr->get_right_pr(), Ext_fcns, complex_literals) ;
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       find_complex_literal_se(op_list[o],Ext_fcns, complex_literals);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_complex_literal_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return;
+}
+
+
+//             Find all things which are passed as handle parameters to functions
+//             (query parameters, (simple) literals, complex literals)
+//             These expressions MUST be processed with find_complex_literal_??
+//             first.
+//                     TODO: this analysis drills into the aggregate SEs.
+//                     Shouldn't this be done on the aggr table SEs instead?
+//                     to avoid duplication.  THe handle registration
+//                     might be expensive ...
+//                     REVISED : drilling into aggr se's is causing problems, eliminated.
+
+void find_param_handles_se(scalarexp_t *se, ext_fcn_list *Ext_fcns,
+                                               vector<handle_param_tbl_entry *> &handle_tbl){
+       vector<scalarexp_t *> operands;
+       vector<bool> handle_ind;
+       int o;
+       scalarexp_t *param_se;
+       data_type *dt;
+       literal_t *l;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               return;
+       case SE_PARAM:
+               return;
+//             case SE_IFACE_PARAM:            SHOULD NOT EXIST when this is called
+       case SE_UNARY_OP:
+               find_param_handles_se(se->get_left_se(), Ext_fcns, handle_tbl ) ;
+               return;
+       case SE_BINARY_OP:
+               find_param_handles_se(se->get_left_se(), Ext_fcns , handle_tbl) ;
+               find_param_handles_se(se->get_right_se(), Ext_fcns, handle_tbl ) ;
+               return;
+       case SE_COLREF:
+               return;
+       case SE_AGGR_STAR:
+               return;
+       case SE_AGGR_SE:
+//             find_param_handles_se(se->get_left_se(), Ext_fcns, handle_tbl ) ;
+               return;
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return ;
+
+               operands = se->get_operands();
+               handle_ind = Ext_fcns->get_handle_indicators(se->get_fcn_id() );
+               for(o=0;o<operands.size();o++){
+                       if(handle_ind[o]){
+                               handle_param_tbl_entry *he;
+                               param_se = operands[o];
+                               if(param_se->get_operator_type() != SE_LITERAL &&
+                                               param_se->get_operator_type() != SE_PARAM){
+                                       fprintf(stderr,"ERROR, the %d-th parameter of function %s must be a literal or query parameter (because it is a pass-by-HANDLE parameter).\n  Line=%d, char=%d.\n",
+                               o+1, se->get_op().c_str(),se->get_lineno(), se->get_charno());
+                                       exit(1);
+                               }
+
+                               if(param_se->get_operator_type() == SE_PARAM){
+                                       he = new handle_param_tbl_entry(
+                                               se->get_op(), o, param_se->get_param_name(),
+                                               param_se->get_data_type()->get_type_str());
+                               }else{
+                                       l = param_se->get_literal();
+                                       if(l->is_cpx_lit()){
+                                               he = new handle_param_tbl_entry(
+                                                       se->get_op(), o, l->get_cpx_lit_ref(),
+                                               param_se->get_data_type()->get_type_str());
+                                       }else{
+                                               he = new handle_param_tbl_entry(
+                                                       se->get_op(), o, l,
+                                               param_se->get_data_type()->get_type_str());
+                                       }
+                               }
+                               param_se->set_handle_ref(handle_tbl.size());
+                               handle_tbl.push_back(he);
+                       }else{
+                               find_param_handles_se(operands[o], Ext_fcns, handle_tbl ) ;
+                       }
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_param_handles, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return;
+}
+
+
+void find_param_handles_pr(predicate_t *pr, ext_fcn_list *Ext_fcns,
+                                               vector<handle_param_tbl_entry *> &handle_tbl){
+       vector<literal_t *> litl;
+       vector<scalarexp_t *> op_list;
+       scalarexp_t *param_se;
+       vector<bool> handle_ind;
+       int o;
+       literal_t *l;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               find_param_handles_se(pr->get_left_se(), Ext_fcns, handle_tbl) ;
+               return;
+       case PRED_COMPARE:
+               find_param_handles_se(pr->get_left_se(), Ext_fcns, handle_tbl) ;
+               find_param_handles_se(pr->get_right_se(), Ext_fcns, handle_tbl) ;
+               return;
+       case PRED_UNARY_OP:
+               find_param_handles_pr(pr->get_left_pr(), Ext_fcns, handle_tbl);
+               return;
+       case PRED_BINARY_OP:
+               find_param_handles_pr(pr->get_left_pr(), Ext_fcns, handle_tbl) ;
+               find_param_handles_pr(pr->get_right_pr(), Ext_fcns, handle_tbl) ;
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               handle_ind = Ext_fcns->get_handle_indicators(pr->get_fcn_id() );
+               for(o=0;o<op_list.size();++o){
+                       if(handle_ind[o]){
+                               handle_param_tbl_entry *he;
+                               param_se = op_list[o];
+                               if(param_se->get_operator_type() != SE_LITERAL &&
+                                               param_se->get_operator_type() != SE_PARAM){
+                                       fprintf(stderr,"ERROR, the %d-th parameter of predicate %s must be a literal or query parameter (because it is a pass-by-HANDLE parameter).\n  Line=%d, char=%d.\n",
+                               o+1, pr->get_op().c_str(),pr->get_lineno(), pr->get_charno());
+                                       exit(1);
+                               }
+
+                               if(param_se->get_operator_type() == SE_PARAM){
+                                       he = new handle_param_tbl_entry(
+                                               pr->get_op(), o, param_se->get_param_name(),
+                                               param_se->get_data_type()->get_type_str());
+                               }else{
+                                       l = param_se->get_literal();
+                                       if(l->is_cpx_lit()){
+                                               he = new handle_param_tbl_entry(
+                                                       pr->get_op(), o, l->get_cpx_lit_ref(),
+                                               param_se->get_data_type()->get_type_str());
+                                       }else{
+                                               he = new handle_param_tbl_entry(
+                                                       pr->get_op(), o, l,
+                                               param_se->get_data_type()->get_type_str());
+                                       }
+                               }
+                               param_se->set_handle_ref(handle_tbl.size());
+                               handle_tbl.push_back(he);
+                       }else{
+                               find_param_handles_se(op_list[o], Ext_fcns, handle_tbl ) ;
+                       }
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_param_handles_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return;
+}
+
+
+//                     Verify the HAVING predicate : it
+//                     can access gb vars, aggregates, and constants,
+//                     but not colrefs.
+//                     return 1 if OK, -1 if bad.
+//                     Perhaps replace by a pair of fcns which counts non-gb colrefs?
+
+//                     Extended to deal with cleaning_by, cleaning_when :
+//                     verify that any aggregate function
+//                     has the multiple output property.
+
+int verify_having_se(scalarexp_t *se, const char *clause, ext_fcn_list *Ext_fcns){
+       int l_ret, r_ret;
+       vector<scalarexp_t *> operands;
+       vector<data_type *> odt;
+       int o;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               return(1);
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return(1);
+       case SE_UNARY_OP:
+               return(verify_having_se(se->get_left_se(), clause, Ext_fcns) );
+       case SE_BINARY_OP:
+               l_ret = verify_having_se(se->get_left_se(), clause, Ext_fcns);
+               r_ret = verify_having_se(se->get_right_se(), clause, Ext_fcns);
+               if( (l_ret < 0 ) || (r_ret < 0) ) return(-1);
+               return(1);
+       case SE_COLREF:
+               if(se->is_gb()) return 1;
+               fprintf(stderr,"ERROR, %s clause references a non-group by attribute line =%d, char = %d, colref=%s\n", clause,
+                       se->get_colref()->get_lineno(),se->get_colref()->get_charno(), se->get_colref()->to_string().c_str() );
+               return(-1);
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+//                     colrefs and gbrefs allowed.
+//                     check for nested aggregation elsewhere, so just return TRUE
+               if(!se->is_superaggr() && !strcmp(clause,"CLEANING_WHEN")){
+                       fprintf(stderr,"ERROR, %s clause references a superaggregate, line =%d, char = %d, op=%s\n", clause,
+                               se->get_lineno(),se->get_charno(), se->get_op().c_str() );
+                       return(-1);
+               }
+
+//                             Ensure that aggregate refs allow multiple outputs
+//                             in CLEANING_WHEN, CLEANING_BY
+               if(!strcmp(clause,"CLEANING_WHEN") || !strcmp(clause,"CLEANING_BY")){
+                       if(! aggr_table_entry::multiple_return_allowed(true,Ext_fcns,se->get_fcn_id())){
+                               fprintf(stderr,"ERROR, the %s clause references aggregate %s, which does not allow multiple outputs, line=%d, char=%d\n",clause,
+                                 se->get_op().c_str(),se->get_lineno(),se->get_charno() );
+                               return(-1);
+                       }
+               }
+
+
+               return(1);
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0 && !se->is_superaggr() && !strcmp(clause,"CLEANING_WHEN")){
+                       fprintf(stderr,"ERROR, %s clause references a superaggregate, line =%d, char = %d, op=%s\n", clause,
+                       se->get_colref()->get_lineno(),se->get_colref()->get_charno(), se->get_op().c_str() );
+               return(-1);
+               }
+
+               if(!strcmp(clause,"CLEANING_WHEN") || !strcmp(clause,"CLEANING_BY")){
+                       if(se->get_aggr_ref() >= 0  && ! aggr_table_entry::multiple_return_allowed(true,Ext_fcns,se->get_fcn_id())){
+                               fprintf(stderr,"ERROR, the %s clause references aggregate %s, which does not allow multiple outputs, line=%d, char=%d\n",clause,
+                                 se->get_op().c_str(),se->get_lineno(),se->get_charno() );
+                               return(-1);
+                       }
+               }
+
+               if(se->get_aggr_ref() >= 0)     // don't descent into aggregates.
+                       return 1;
+
+               operands = se->get_operands();
+               r_ret = 1;
+               for(o=0;o<operands.size();o++){
+                       l_ret = verify_having_se(operands[o], clause, Ext_fcns);
+                       if(l_ret < 0) r_ret = -1;
+               }
+               if(r_ret < 0) return(-1); else return(1);
+               return(1);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in verify_having_se, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               return(-1);
+       }
+       return(-1);
+}
+
+
+//                     Verify the HAVING predicate : it
+//                     can access gb vars, aggregates, and constants,
+//                     but not colrefs.
+//                     return 1 if OK, -1 if bad.
+//                     Perhaps replace by a pair of fcns which counts non-gb colrefs?
+
+
+int verify_having_pred(predicate_t *pr, const char *clause, ext_fcn_list *Ext_fcns){
+       int l_ret, r_ret;
+       vector<literal_t *> litl;
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               return(verify_having_se(pr->get_left_se(), clause, Ext_fcns));
+       case PRED_COMPARE:
+               l_ret = verify_having_se(pr->get_left_se(), clause, Ext_fcns) ;
+               r_ret = verify_having_se(pr->get_right_se(), clause, Ext_fcns) ;
+               if( (l_ret < 0) || (r_ret < 0) ) return(-1); else return(1);
+       case PRED_UNARY_OP:
+               return(verify_having_pred(pr->get_left_pr(), clause, Ext_fcns));
+       case PRED_BINARY_OP:
+               l_ret = verify_having_pred(pr->get_left_pr(), clause, Ext_fcns);
+               r_ret = verify_having_pred(pr->get_right_pr(), clause, Ext_fcns);
+               if( (l_ret < 0) || (r_ret < 0) ) return(-1);
+               return(1);
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               l_ret = 1;
+               for(o=0;o<op_list.size();++o){
+                       if( verify_having_se(op_list[o], clause, Ext_fcns) < 0) l_ret = -1;
+               }
+               return(l_ret);
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in verify_having_pred, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+       }
+
+       return(-1);
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+///////                        cnf and pred analysis and manipulation
+
+// ----------------------------------------------------------------------
+//  Convert the predicates to a list of conjuncts
+//  (not actually cnf).  Do some analysis
+//  on their properties.
+// ----------------------------------------------------------------------
+
+
+//  Put into list clist the predicates that
+//  are AND'ed together.
+
+void make_cnf_from_pr(predicate_t *pr, vector<cnf_elem *> &clist){
+
+  if(pr == NULL) return;
+
+  switch(pr->get_operator_type()){
+     case PRED_COMPARE:
+        clist.push_back(new cnf_elem(pr));
+        return;
+        break;
+     case PRED_IN:
+        clist.push_back(new cnf_elem(pr));
+        return;
+        break;
+     case PRED_UNARY_OP:
+        clist.push_back(new cnf_elem(pr));
+        return;
+        break;
+     case PRED_BINARY_OP:
+        if(pr->get_op() == "OR"){
+                       clist.push_back(new cnf_elem(pr));
+                       return;
+               }
+               if(pr->get_op() =="AND"){
+                  make_cnf_from_pr(pr->get_left_pr(),clist);
+                  make_cnf_from_pr(pr->get_right_pr(),clist);
+                  return;
+               }
+       case PRED_FUNC:
+        clist.push_back(new cnf_elem(pr));
+        return;
+        break;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in make_cnf_from_pr: I don't recognize predicate operator %s\n",pr->get_op().c_str());
+               exit(1);
+                       break;
+          }
+}
+
+
+
+//  Find out what things are referenced in a se,
+//  to use for analyzing a predicate.
+//  Currently, is it simple (no operators), does it
+//  reference a group-by column, does it reference an
+//  attribute of a table.
+//
+//     analyze_cnf_se and analyze_cnf_pr are called by analyze_cnf
+
+
+void analyze_cnf_se(scalarexp_t *se, int &s, int &g, int &a, int &agr){
+ int p;
+ vector<scalarexp_t *> operand_list;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return;
+       case SE_COLREF:
+               if(se->is_gb() ) g=1;
+               else                    a=1;
+               return;
+       case SE_UNARY_OP:
+               s=0;
+               analyze_cnf_se(se->get_left_se(),s,g,a,agr);
+               return;
+       case SE_BINARY_OP:
+               s=0;
+               analyze_cnf_se(se->get_left_se(),s,g,a,agr);
+               analyze_cnf_se(se->get_right_se(),s,g,a,agr);
+               return;
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               agr = 1;
+               return;
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0){
+                       agr = 1;
+                       return;
+               }
+               s = 0;
+               operand_list = se->get_operands();
+               for(p=0;p<operand_list.size();p++){
+                       analyze_cnf_se(operand_list[p],s,g,a,agr);
+               }
+       break;
+       }
+
+       return;
+}
+
+
+
+void analyze_cnf_pr(predicate_t *pr, int &g, int &a,  int &agr){
+int dum_simple, o;
+vector<scalarexp_t *> op_list;
+
+
+       switch(pr->get_operator_type()){
+       case PRED_COMPARE:
+               analyze_cnf_se(pr->get_left_se(),dum_simple,g,a,agr);
+               analyze_cnf_se(pr->get_right_se(),dum_simple,g,a,agr);
+               return;
+       case PRED_IN:
+               analyze_cnf_se(pr->get_left_se(),dum_simple,g,a,agr);
+               return;
+       case PRED_UNARY_OP:
+               analyze_cnf_pr(pr->get_left_pr(),g,a,agr);
+               return;
+       case PRED_BINARY_OP:
+               analyze_cnf_pr(pr->get_left_pr(),g,a,agr);
+               analyze_cnf_pr(pr->get_right_pr(),g,a,agr);
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       analyze_cnf_se(op_list[o],dum_simple,g,a,agr);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in analyze_cnf_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+}
+
+
+
+//  analyze a conjunct of a predicate.
+//  Is it atomic (e.g., a single predicate),
+//  and if so do a further analysis.
+
+void analyze_cnf(cnf_elem *c){
+
+//  analyze the predicate.
+   analyze_cnf_pr(c->pr, c->pr_gb, c->pr_attr, c->pr_aggr);
+
+   if((c->pr->get_operator_type()!= PRED_COMPARE) && (c->pr->get_operator_type()!= PRED_IN)){
+               return;
+   }
+
+
+//  its an atomic predicate -- get more info
+   c->is_atom = 1;
+
+       if(c->pr->get_op() == "=")
+               c->eq_pred = 1;
+       else
+               c->eq_pred = 0;
+
+       if(c->pr->get_operator_type() == PRED_IN)
+               c->in_pred = 1;
+       else
+               c->in_pred = 0;
+
+       c->l_simple = 1; c->l_gb = c->l_attr = c->l_aggr = 0;
+       analyze_cnf_se(c->pr->get_left_se(),c->l_simple,c->l_gb,c->l_attr, c->l_aggr);
+
+       if(c->pr->get_operator_type() == PRED_COMPARE){
+               c->r_simple = 1; c->r_gb = c->r_attr = c->r_aggr = 0;
+               analyze_cnf_se(c->pr->get_left_se(),c->r_simple,c->r_gb,c->r_attr, c->r_aggr);
+       }
+}
+
+void analyze_constraint_se(scalarexp_t *se,
+                       int &n_agr, int &n_gb, int &n_par, int &n_func, int &n_op, ext_fcn_list *Ext_fcns, bool enter_gb){
+ int l_agr, l_gb, l_par, l_func, l_op;
+ int r_agr, r_gb, r_par, r_func, r_op;
+ int p;
+ vector<scalarexp_t *> operand_list;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_IFACE_PARAM:
+               n_agr=0; n_gb = 0; n_par = 0; n_func = 0; n_op = 0;
+               return;
+       case SE_PARAM:
+               n_agr=0; n_gb = 0; n_par = 1; n_func = 0; n_op = 0;
+               return;
+       case SE_COLREF:
+               n_agr=0; n_gb = 0; n_par = 0; n_func = 0; n_op = 0;
+               if(se->is_gb() ){
+                       if(enter_gb){
+                               analyze_constraint_se(se->get_right_se(),n_agr,n_gb,n_par,n_func,n_op,Ext_fcns,enter_gb);
+                       }else{
+                               n_gb=1;
+                       }
+               }
+               return;
+       case SE_UNARY_OP:
+               analyze_constraint_se(se->get_left_se(),n_agr,n_gb,n_par,n_func,n_op,Ext_fcns,enter_gb);
+               n_op++;
+               return;
+       case SE_BINARY_OP:
+               analyze_constraint_se(se->get_left_se(),l_agr,l_gb,l_par,l_func,l_op,Ext_fcns,enter_gb);
+               analyze_constraint_se(se->get_right_se(),r_agr,r_gb,r_par, r_func,r_op,Ext_fcns,enter_gb);
+               n_agr=l_agr+r_agr;
+               n_gb=l_gb+r_gb;
+               n_par=l_par+r_par;
+               n_func=l_func+r_func;
+               n_op=l_op+r_op+1;
+               return;
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               n_agr=1; n_gb = 0; n_par = 0; n_func = 0; n_op = 0;
+               return;
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0){
+                       n_agr=1; n_gb = 0; n_par = 0; n_op = 0;
+                       if(Ext_fcns)
+                               n_func = Ext_fcns->estimate_fcn_cost(se->get_fcn_id());
+                       else
+                               n_func = 1;
+                       return;
+               }
+               n_agr=0; n_gb = 0; n_par = 0;  n_op = 0;
+               if(Ext_fcns)
+                       n_func = Ext_fcns->estimate_fcn_cost(se->get_fcn_id());
+               else
+                       n_func = 1;
+               operand_list = se->get_operands();
+               for(p=0;p<operand_list.size();p++){
+                       analyze_constraint_se(operand_list[p],l_agr,l_gb,l_par,l_func,l_op,Ext_fcns,enter_gb);
+                       n_agr+=l_agr;
+                       n_gb+=l_gb;
+                       n_par+=l_par;
+                       n_func+=l_func;
+                       n_op += l_op;
+               }
+       break;
+       }
+
+       return;
+}
+
+//             Estimate the cost of a constraint.
+//             WARNING a lot of cost assumptions are embedded in the code.
+void analyze_constraint_pr(predicate_t *pr,
+               int &n_agr, int &n_gb, int &n_par, int &n_func, int &n_op,
+               int &n_cmp_s, int &n_cmp_c, int &n_in, int &n_pred, int &n_bool, ext_fcn_list *Ext_fcns, bool enter_gb){
+ int l_agr, l_gb, l_par, l_func, l_op, l_cmp_s, l_cmp_c, l_in, l_pred,l_bool;
+ int r_agr, r_gb, r_par, r_func, r_op, r_cmp_s, r_cmp_c, r_in, r_pred,r_bool;
+
+int o;
+vector<scalarexp_t *> op_list;
+
+
+       switch(pr->get_operator_type()){
+       case PRED_COMPARE:
+               analyze_constraint_se(pr->get_left_se(),l_agr,l_gb,l_par,l_func, l_op,Ext_fcns,enter_gb);
+               analyze_constraint_se(pr->get_right_se(),r_agr,r_gb,r_par,r_func,r_op,Ext_fcns,enter_gb);
+               n_agr=l_agr+r_agr; n_gb=l_gb+r_gb; n_par=l_par+r_par;
+               n_func=l_func+r_func; n_op=l_op+r_op;
+               if(pr->get_left_se()->get_data_type()->complex_comparison(
+                       pr->get_right_se()->get_data_type())
+           ){
+                       n_cmp_s = 0; n_cmp_c=1;
+               }else{
+                       n_cmp_s = 1; n_cmp_c=0;
+               }
+               n_in = 0; n_pred = 0; n_bool = 0;
+               return;
+       case PRED_IN:
+//                     Tread IN predicate as sequence of comparisons
+               analyze_constraint_se(pr->get_left_se(),n_agr,n_gb,n_par,n_func,n_op,Ext_fcns,enter_gb);
+               if(pr->get_left_se()->get_data_type()->complex_comparison(
+                       pr->get_right_se()->get_data_type())
+           ){
+                       n_cmp_s = 0; n_cmp_c=pr->get_lit_vec().size();
+               }else{
+                       n_cmp_s = pr->get_lit_vec().size(); n_cmp_c=0;
+               }
+               n_in = 0; n_pred = 0; n_bool = 0;
+               return;
+       case PRED_UNARY_OP:
+               analyze_constraint_pr(pr->get_left_pr(),n_agr,n_gb,n_par,n_func,n_op,n_cmp_s,n_cmp_c,n_in,n_pred,n_bool,Ext_fcns,enter_gb);
+               n_bool++;
+               return;
+       case PRED_BINARY_OP:
+               analyze_constraint_pr(pr->get_left_pr(),l_agr,l_gb,l_par,l_func,l_op,l_cmp_s,l_cmp_c,l_in,l_pred,l_bool,Ext_fcns,enter_gb);
+               analyze_constraint_pr(pr->get_right_pr(),r_agr,r_gb,r_par,r_func,r_op,r_cmp_s,r_cmp_c,r_in,r_pred,r_bool,Ext_fcns,enter_gb);
+               n_agr=l_agr+r_agr; n_gb=l_gb+r_gb; n_par=l_par+r_par;
+               n_func=l_func+r_func; n_op=l_op+r_op;
+               n_cmp_s=l_cmp_s+r_cmp_s; n_cmp_c=l_cmp_c+r_cmp_c;
+               n_in=l_in+r_in; n_pred=l_pred+r_pred; n_bool=l_bool+r_bool+1;
+               return;
+       case PRED_FUNC:
+               n_agr=n_gb=n_par=n_func=n_op=n_cmp_s=n_cmp_c=n_in=n_bool=0;
+               if(Ext_fcns)
+                       n_pred = Ext_fcns->estimate_fcn_cost(pr->get_fcn_id());
+               else
+                       n_pred = 1;
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       analyze_constraint_se(op_list[o],l_agr,l_gb,l_par,l_func,l_op,Ext_fcns,enter_gb);
+                       n_agr+=l_agr; n_gb+=l_gb; n_par+=l_par; n_func+=l_func; n_op+=l_op;
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in analyze_cnf_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+}
+
+void compute_cnf_cost(cnf_elem *c, ext_fcn_list *Ext_fcns){
+ int n_agr, n_gb, n_par, n_func, n_op, n_cmp_s, n_cmp_c, n_in, n_pred,n_bool;
+       analyze_constraint_pr(c->pr,n_agr, n_gb, n_par, n_func, n_op,
+                                               n_cmp_s, n_cmp_c, n_in, n_pred,n_bool, Ext_fcns,false);
+
+//printf("nfunc=%d n_pred=%d, n_cmp_c=%d, n_op=%d, n_cmp_s=%d,n_bool=%d\n", n_func, n_pred, n_cmp_c, n_op, n_cmp_s, n_bool);
+       c->cost = (n_func+n_pred)+10*n_cmp_c+n_op+n_cmp_s+n_bool;
+}
+
+bool prefilter_compatible(cnf_elem *c, ext_fcn_list *Ext_fcns){
+ int n_agr, n_gb, n_par, n_func, n_op, n_cmp_s, n_cmp_c, n_in, n_pred,n_bool;
+       analyze_constraint_pr(c->pr,n_agr, n_gb, n_par, n_func, n_op,
+                                               n_cmp_s, n_cmp_c, n_in, n_pred,n_bool, Ext_fcns,true);
+//printf("prefilter_compatible, n_par=%d, n_gb=%d, n_agr=%d, n_func=%d, n_pred=%d, n_comp_c=%d, n_cmp_s=%d, n_bool=%d\n",n_gb,n_par,n_agr,n_func,n_pred,n_cmp_c,n_cmp_s,n_bool);
+       if(n_par || n_agr)
+               return false;
+       int cost = (n_func+n_pred)+10*n_cmp_c+n_op+n_cmp_s+n_bool;
+//printf("cost=%d\n",cost);
+       return cost<10;
+}
+
+//             The prefilter needs to translate constraints on
+//             gbvars into constraints involving their underlying SEs.
+//             The following two routines attach GB def info.
+
+void insert_gb_def_se(scalarexp_t *se, gb_table *gtbl){
+ int p;
+ vector<scalarexp_t *> operand_list;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_IFACE_PARAM:
+       case SE_PARAM:
+       case SE_AGGR_STAR:
+               return;
+       case SE_COLREF:
+               if(se->is_gb() ){
+                        se->rhs.scalarp = gtbl->get_def(se->get_gb_ref());
+               }
+               return;
+       case SE_UNARY_OP:
+               insert_gb_def_se(se->get_left_se(),gtbl);
+               return;
+       case SE_BINARY_OP:
+               insert_gb_def_se(se->get_left_se(),gtbl);
+               insert_gb_def_se(se->get_right_se(),gtbl);
+               return;
+       case SE_AGGR_SE:
+               insert_gb_def_se(se->get_left_se(),gtbl);
+               return;
+       case SE_FUNC:
+               operand_list = se->get_operands();
+               for(p=0;p<operand_list.size();p++){
+                       insert_gb_def_se(operand_list[p],gtbl);
+               }
+       break;
+       }
+
+       return;
+}
+void insert_gb_def_pr(predicate_t *pr, gb_table *gtbl){
+vector<scalarexp_t *> op_list;
+int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_COMPARE:
+               insert_gb_def_se(pr->get_left_se(),gtbl);
+               insert_gb_def_se(pr->get_right_se(),gtbl);
+               return;
+       case PRED_IN:
+               insert_gb_def_se(pr->get_left_se(),gtbl);
+               return;
+       case PRED_UNARY_OP:
+               insert_gb_def_pr(pr->get_left_pr(),gtbl);
+               return;
+       case PRED_BINARY_OP:
+               insert_gb_def_pr(pr->get_left_pr(),gtbl);
+               insert_gb_def_pr(pr->get_right_pr(),gtbl);
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       insert_gb_def_se(op_list[o],gtbl);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in insert_gb_def_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+}
+
+//             Substitute gbrefs with their definitions
+void subs_gbrefs_se(scalarexp_t *se, table_list *Schema){
+ int p;
+ vector<scalarexp_t *> operand_list;
+ scalarexp_t *lse,*rse;
+ colref_t *cr;
+ string b_tbl;
+ int b_idx;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_IFACE_PARAM:
+       case SE_PARAM:
+       case SE_AGGR_STAR:
+               return;
+       case SE_COLREF:
+               cr = se->get_colref();
+               b_tbl = Schema->get_basetbl_name(cr->schema_ref,cr->field);
+               b_idx = Schema->get_table_ref(b_tbl);
+               cr->tablevar_ref = b_idx;
+               return;
+       case SE_UNARY_OP:
+               lse=se->get_left_se();
+               if(lse->get_operator_type()==SE_COLREF && lse->is_gb()){
+                       se->lhs.scalarp = lse->get_right_se();
+                       subs_gbrefs_se(se,Schema);
+                       return;
+               }
+               subs_gbrefs_se(se->get_left_se(),Schema);
+               return;
+       case SE_BINARY_OP:
+               lse=se->get_left_se();
+               if(lse->get_operator_type()==SE_COLREF && lse->is_gb()){
+                       se->lhs.scalarp = lse->get_right_se();
+                       subs_gbrefs_se(se,Schema);
+                       return;
+               }
+               rse=se->get_right_se();
+               if(rse->get_operator_type()==SE_COLREF && rse->is_gb()){
+                       se->rhs.scalarp = rse->get_right_se();
+                       subs_gbrefs_se(se,Schema);
+                       return;
+               }
+               subs_gbrefs_se(se->get_left_se(),Schema);
+               subs_gbrefs_se(se->get_right_se(),Schema);
+               return;
+       case SE_AGGR_SE:
+               lse=se->get_left_se();
+               if(lse->get_operator_type()==SE_COLREF && lse->is_gb()){
+                       se->lhs.scalarp = lse->get_right_se();
+                       subs_gbrefs_se(se,Schema);
+                       return;
+               }
+               subs_gbrefs_se(se->get_left_se(),Schema);
+               return;
+       case SE_FUNC:
+               operand_list = se->get_operands();
+               for(p=0;p<operand_list.size();p++){
+                       lse=operand_list[p];
+                       if(lse->get_operator_type()==SE_COLREF && lse->is_gb()){
+                               se->param_list[p] = lse->get_right_se();
+                               subs_gbrefs_se(se,Schema);
+                               return;
+                       }
+               }
+               for(p=0;p<operand_list.size();p++){
+                       subs_gbrefs_se(operand_list[p],Schema);
+               }
+       break;
+       }
+
+       return;
+}
+
+void subs_gbrefs_pr(predicate_t *pr, table_list *Schema){
+vector<scalarexp_t *> op_list;
+int o;
+scalarexp_t *lse,*rse;
+
+       switch(pr->get_operator_type()){
+       case PRED_COMPARE:
+               lse=pr->get_left_se();
+               if(lse->get_operator_type()==SE_COLREF && lse->is_gb()){
+                       pr->lhs.sexp = lse->get_right_se();
+                       subs_gbrefs_pr(pr,Schema);
+                       return;
+               }
+               rse=pr->get_right_se();
+               if(rse->get_operator_type()==SE_COLREF && rse->is_gb()){
+                       pr->rhs.sexp = rse->get_right_se();
+                       subs_gbrefs_pr(pr,Schema);
+                       return;
+               }
+               subs_gbrefs_se(pr->get_left_se(),Schema);
+               subs_gbrefs_se(pr->get_right_se(),Schema);
+               return;
+       case PRED_IN:
+               lse=pr->get_left_se();
+               if(lse->get_operator_type()==SE_COLREF && lse->is_gb()){
+                       pr->lhs.sexp = lse->get_right_se();
+                       subs_gbrefs_pr(pr,Schema);
+                       return;
+               }
+               subs_gbrefs_se(pr->get_left_se(),Schema);
+               return;
+       case PRED_UNARY_OP:
+               subs_gbrefs_pr(pr->get_left_pr(),Schema);
+               return;
+       case PRED_BINARY_OP:
+               subs_gbrefs_pr(pr->get_left_pr(),Schema);
+               subs_gbrefs_pr(pr->get_right_pr(),Schema);
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       lse=op_list[o];
+                       if(lse->get_operator_type()==SE_COLREF && lse->is_gb()){
+                               pr->param_list[o] = lse->get_right_se();
+                               subs_gbrefs_pr(pr,Schema);
+                               return;
+                       }
+                       subs_gbrefs_se(op_list[o],Schema);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in subs_gbrefs_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+}
+
+
+//             Search for references to "expensive" fields.
+int expensive_refs_se(scalarexp_t *se, table_list *Schema){
+ int p;
+ vector<scalarexp_t *> operand_list;
+ int cnt=0;
+table_def *td;
+param_list *plist;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_IFACE_PARAM:
+       case SE_PARAM:
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               return 0;
+       case SE_COLREF:
+               if(se->is_gb())
+                       return expensive_refs_se(se->rhs.scalarp,Schema);
+               td = Schema->get_table(se->lhs.colref->schema_ref);
+               plist = td->get_modifier_list(se->lhs.colref->field);
+               if(plist->contains_key("expensive"))
+                       return 1;
+               return 0;
+       case SE_UNARY_OP:
+               return expensive_refs_se(se->get_left_se(),Schema);
+       case SE_BINARY_OP:
+               cnt += expensive_refs_se(se->get_left_se(),Schema);
+               cnt += expensive_refs_se(se->get_right_se(),Schema);
+               return cnt;
+       case SE_FUNC:
+               operand_list = se->get_operands();
+               for(p=0;p<operand_list.size();p++){
+                       cnt += expensive_refs_se(operand_list[p],Schema);
+               }
+               return cnt;
+       break;
+       }
+
+       return 0;
+}
+
+int expensive_refs_pr(predicate_t *pr, table_list *Schema){
+vector<scalarexp_t *> op_list;
+int o;
+int cnt=0;
+
+       switch(pr->get_operator_type()){
+       case PRED_COMPARE:
+               cnt += expensive_refs_se(pr->get_left_se(),Schema);
+               cnt += expensive_refs_se(pr->get_right_se(),Schema);
+               return cnt;
+       case PRED_IN:
+               return expensive_refs_se(pr->get_left_se(),Schema);
+       case PRED_UNARY_OP:
+               return expensive_refs_pr(pr->get_left_pr(),Schema);
+       case PRED_BINARY_OP:
+               cnt += expensive_refs_pr(pr->get_left_pr(),Schema);
+               cnt += expensive_refs_pr(pr->get_right_pr(),Schema);
+               return cnt;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       cnt += expensive_refs_se(op_list[o],Schema);
+               }
+               return cnt;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in expensive_refs_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+}
+
+
+//             TODO: allow "cheap" functions and predicates.
+bool simple_field_constraint(cnf_elem *c){
+       vector<literal_t *> ll;
+       int l;
+       predicate_t *p = c->pr;
+ int l_agr, l_gb, l_par, l_func, l_op;
+ int r_agr, r_gb, r_par, r_func, r_op;
+ col_id_set left_colids, right_colids;
+
+//                     Verify that it is a simple atom
+       switch(p->get_operator_type()){
+       case PRED_COMPARE:
+//                             Must be an equality predicate which references
+//                             which referecnes no aggregates, parameters, functions, or
+//                             group-by variables, and should be a constraint of
+//                             a single colref.
+//                             AND should not require a complex comparison.
+               if(p->get_op() != "=") return(false);
+               analyze_constraint_se(p->get_left_se(),l_agr, l_gb, l_par, l_func,l_op,NULL,false);
+               analyze_constraint_se(p->get_right_se(),r_agr, r_gb, r_par, r_func,l_op,NULL,false);
+               if(l_agr>0 || l_gb>0 || l_par>0 || l_func>0 ||
+                  r_agr>0 || r_gb>0 || r_par>0 || r_func>0 ) return(false);
+//                             I will count on there being no gbvars in the constraint.
+//                             TODO: allow gbvars which are colrefs.
+               gather_se_col_ids(p->get_left_se(), left_colids, NULL);
+               gather_se_col_ids(p->get_right_se(), right_colids, NULL);
+               if(left_colids.size()+right_colids.size() != 1) return(false);
+
+
+//                     Normalize : the colref should be on the lhs.
+               if(right_colids.size() > 0){
+                       p->swap_scalar_operands();
+               }
+
+//                     Disallow complex (and therefore expensive) comparisons.
+               if(p->get_left_se()->get_data_type()->complex_comparison(
+                       p->get_right_se()->get_data_type() ) )
+                               return(false);
+
+//                     passed all the tests.
+               return(true);
+       case PRED_IN:
+//                     LHS must be a non-gbvar colref.
+               analyze_constraint_se(p->get_left_se(),l_agr, l_gb, l_par, l_func,l_op,NULL,false);
+               if(l_agr>0 || l_gb>0 || l_par>0 || l_func>0 ) return(false);
+//                             I will count on there being no gbvars in the constraint.
+//                             TODO: allow gbvars which are colrefs.
+               gather_se_col_ids(p->get_left_se(), left_colids, NULL);
+               if(left_colids.size() != 1) return(false);
+//                     Disallow complex (and therefore expensive) comparisons.
+               if(p->get_left_se()->get_data_type()->complex_comparison(
+                       p->get_left_se()->get_data_type() ) )
+                               return(false);
+
+
+//                     All entries in the IN list must be literals
+//                     Currently, this is the only possibility.
+               return(true);
+               break;
+       case PRED_UNARY_OP:
+               return(false);
+       case PRED_BINARY_OP:
+               return(false);
+       case PRED_FUNC:
+               return(false);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in simple_field_cosntraint, line %d, character %d, unknown predicate operator type %d\n",
+                       p->get_lineno(), p->get_charno(), p->get_operator_type() );
+               exit(1);
+       }
+
+       return(false);
+}
+
+//             As the name implies, return the colref constrained by the
+//             cnf elem.  I will be counting on the LHS being a SE pointing
+//             to a colref.
+
+//                     This fcn assumes that in fact exactly
+//                     one colref is constrained.
+colref_t *get_constrained_colref(scalarexp_t *se){
+ int p;
+ vector<scalarexp_t *> operand_list;
+colref_t *ret;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               return(NULL);
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return(NULL);
+       case SE_COLREF:
+               return(se->get_colref());
+       case SE_UNARY_OP:
+               return(get_constrained_colref(se->get_left_se()));
+       case SE_BINARY_OP:
+               ret=get_constrained_colref(se->get_left_se());
+               if(ret == NULL) return(get_constrained_colref(se->get_right_se()));
+               else return ret;
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               return(NULL);
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return NULL;
+
+               operand_list = se->get_operands();
+               for(p=0;p<operand_list.size();p++){
+                       ret=get_constrained_colref(operand_list[p]);
+                       if(ret != NULL) return(ret);
+
+               }
+               return(NULL);
+       break;
+       }
+
+       return(NULL);
+}
+
+
+colref_t *get_constrained_colref(predicate_t *p){
+       return(get_constrained_colref(p->get_left_se()));
+}
+colref_t *get_constrained_colref(cnf_elem *c){
+       return get_constrained_colref(c->pr->get_left_se());
+}
+
+
+
+
+/*
+void add_colref_constraint_to_cnf(cnf_elem *dst, predicate_t *src_p,
+                                                       string target_fld, string target_tbl, int tblref){
+
+//                     Make a copy of the predicate to be added.
+//                     ASSUME no aggregates.
+       predicate_t *pr = dup_pr(src_p,NULL);
+
+//                     Modify the ref to the base table.
+//                     ASSUME lhs is the colref
+       pr->get_left_se()->get_colref()->set_table_name(target_tbl);
+       pr->get_left_se()->get_colref()->set_table_ref(tblref);
+
+       if(dst->pr == NULL) dst->pr = pr;
+       else dst->pr = new predicate_t("OR", dst->pr, pr);
+
+}
+*/
+
+
+//////////////////////////////////////////////////////
+///////////////                Represent a node in a predicate tree
+struct common_pred_node{
+       set<int> lftas;
+       predicate_t *pr;
+       vector<predicate_t *> predecessor_preds;
+       vector<common_pred_node *> children;
+
+       string target_tbl;
+       string target_fld;
+       int target_ref;
+
+       common_pred_node(){
+               pr = NULL;
+       }
+};
+
+
+predicate_t *make_common_pred(common_pred_node *pn){
+  int n;
+
+       if(pn->children.size() == 0){
+               if(pn->pr == NULL){
+                       fprintf(stderr,"INTERNAL ERROR in make_common_pred, pred node ahs no children and no predicate.\n");
+                       exit(1);
+               }
+               return( dup_pr(pn->pr,NULL) );
+       }
+
+       predicate_t *curr_pr = make_common_pred( pn->children[0] );
+    for(n=1;n<pn->children.size();++n){
+               curr_pr = new predicate_t("OR", make_common_pred(pn->children[n]),curr_pr);
+       }
+
+       if(pn->pr != NULL)
+               curr_pr = new predicate_t("AND", dup_pr(pn->pr,NULL), curr_pr);
+
+       return(curr_pr);
+}
+
+
+bool operator<(const cnf_set &c1, const cnf_set &c2){
+       if(c1.lfta_id.size() < c2.lfta_id.size())
+               return true;
+       return false;
+}
+
+
+//             Compute the predicates for the prefilter.
+//             the prefilter preds are returned in prefilter_preds.
+//             pred_ids is the set of predicates used in the prefilter.
+//             the encoding is the lfta index, in the top 16 bits,
+//             then the index of the cnf element in the bottom 16 bits.
+//             This set of for identifying which preds do not need
+//             to be generated in the lftas.
+void find_common_filter(vector< vector<cnf_elem *> > &where_list, table_list *Schema, ext_fcn_list *Ext_fcns, vector<cnf_set *> &prefilter_preds, set<unsigned int > &pred_ids){
+       int p, p2, l, c;
+
+       vector<cnf_set *> pred_list, sort_list;
+
+//             Create list of tagged, prefilter-safe CNFs.
+       for(l=0;l<where_list.size();++l){
+               for(c=0;c<where_list[l].size();++c){
+                       if(prefilter_compatible(where_list[l][c],Ext_fcns)){
+                               if(expensive_refs_pr(where_list[l][c]->pr,Schema)==0)
+                                       pred_list.push_back(new cnf_set(where_list[l][c]->pr,l,c));
+                       }
+               }
+       }
+
+//             Eliminate duplicates
+       for(p=0;p<pred_list.size();++p){
+               if(pred_list[p]){
+                       for(p2=p+1;p2<pred_list.size();++p2){
+                               if(pred_list[p2]){
+                                       if(is_equivalent_pred_base(pred_list[p]->pr, pred_list[p2]->pr,Schema)){
+                                               pred_list[p]->subsume(pred_list[p2]);
+                                               delete pred_list[p2];
+                                               pred_list[p2] = NULL;
+                                       }
+                               }
+                       }
+               }
+       }
+
+//             combine preds that occur in the exact same lftas.
+       for(p=0;p<pred_list.size();++p){
+               if(pred_list[p]){
+                       for(p2=p+1;p2<pred_list.size();++p2){
+                               if(pred_list[p2]){
+                                       if(pred_list[p]->lfta_id == pred_list[p2]->lfta_id){
+                                               pred_list[p]->combine_pred(pred_list[p2]);
+                                               delete pred_list[p2];
+                                               pred_list[p2] = NULL;
+                                       }
+                               }
+                       }
+               }
+       }
+
+//             Compress the list
+       for(p=0;p<pred_list.size();++p){
+               if(pred_list[p]){
+                       sort_list.push_back(pred_list[p]);
+               }
+       }
+//             Sort it
+       sort(sort_list.begin(), sort_list.end(),compare_cnf_set());
+
+//             Return the top preds, up to 64 of them.
+       for(p=0;p<sort_list.size() && p<64;p++){
+               prefilter_preds.push_back(sort_list[p]);
+               sort_list[p]->add_pred_ids(pred_ids);
+       }
+
+//             Substitute gb refs with their defs
+//             While I'm at it, substitute base table sch ref for tblref.
+       for(p=0;p<prefilter_preds.size() ;p++){
+               subs_gbrefs_pr(prefilter_preds[p]->pr,Schema);
+       }
+
+}
+
+
+
+
+
+///////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+//             Find partial functions and register them.
+//             Do a DFS so that nested partial fcn calls
+//             get evaluated in the right order.
+//             Don't drill down into aggregates -- their arguments are evaluated
+//             earlier than the select list is.
+//
+//             Modification for function caching:
+//             Pass in a ref counter, and partial fcn indicator.
+//             Cache fcns ref'd at least once.
+//             pass in NULL for fcn_ref_cnt to turn off fcn caching analysis
+
+
+void find_partial_fcns(scalarexp_t *se, vector<scalarexp_t *> *pf_list,
+               vector<int> *fcn_ref_cnt, vector<bool> *is_partial_fcn,
+               ext_fcn_list *Ext_fcns){
+       vector<scalarexp_t *> operands;
+       int o, f;
+
+       if(se == NULL) return;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return;
+       case SE_UNARY_OP:
+               find_partial_fcns(se->get_left_se(), pf_list, fcn_ref_cnt, is_partial_fcn, Ext_fcns) ;
+               return;
+       case SE_BINARY_OP:
+               find_partial_fcns(se->get_left_se(), pf_list, fcn_ref_cnt, is_partial_fcn, Ext_fcns);
+               find_partial_fcns(se->get_right_se(), pf_list, fcn_ref_cnt, is_partial_fcn, Ext_fcns);
+               return;
+       case SE_COLREF:
+               return;
+       case SE_AGGR_STAR:
+               return;
+       case SE_AGGR_SE:
+//             find_partial_fcns(se->get_left_se(), pf_list, Ext_fcns) ;
+               return;
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return;
+
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       find_partial_fcns(operands[o], pf_list, fcn_ref_cnt, is_partial_fcn, Ext_fcns);
+               }
+
+               if(Ext_fcns->is_partial(se->get_fcn_id()) || Ext_fcns->get_fcn_cost(se->get_fcn_id()) >= COST_HIGH){
+                       if(fcn_ref_cnt){
+                         for(f=0;f<pf_list->size();++f){
+                               if(is_equivalent_se(se,(*pf_list)[f])){
+                                       se->set_partial_ref(f);
+                                       (*fcn_ref_cnt)[f]++;
+                                       break;
+                               }
+                         }
+                       }else{
+                               f=pf_list->size();
+                       }
+                       if(f==pf_list->size() && (Ext_fcns->is_partial(se->get_fcn_id()) ||  fcn_ref_cnt)){
+                               se->set_partial_ref(pf_list->size());
+                               pf_list->push_back(se);
+                               if(fcn_ref_cnt){
+                                       fcn_ref_cnt->push_back(1);
+                                       is_partial_fcn->push_back(Ext_fcns->is_partial(se->get_fcn_id()));
+                               }
+                       }
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_partial_fcns, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return;
+}
+
+
+void find_partial_fcns_pr(predicate_t *pr,  vector<scalarexp_t *> *pf_list,
+               vector<int> *fcn_ref_cnt, vector<bool> *is_partial_fcn,
+                                                                       ext_fcn_list *Ext_fcns){
+       vector<literal_t *> litl;
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               find_partial_fcns(pr->get_left_se(), pf_list, fcn_ref_cnt, is_partial_fcn, Ext_fcns) ;
+               return;
+       case PRED_COMPARE:
+               find_partial_fcns(pr->get_left_se(), pf_list, fcn_ref_cnt, is_partial_fcn, Ext_fcns) ;
+               find_partial_fcns(pr->get_right_se(), pf_list, fcn_ref_cnt, is_partial_fcn, Ext_fcns) ;
+               return;
+       case PRED_UNARY_OP:
+               find_partial_fcns_pr(pr->get_left_pr(), pf_list, fcn_ref_cnt, is_partial_fcn, Ext_fcns);
+               return;
+       case PRED_BINARY_OP:
+               find_partial_fcns_pr(pr->get_left_pr(), pf_list, fcn_ref_cnt, is_partial_fcn, Ext_fcns) ;
+               find_partial_fcns_pr(pr->get_right_pr(), pf_list, fcn_ref_cnt, is_partial_fcn, Ext_fcns) ;
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       find_partial_fcns(op_list[o],pf_list,fcn_ref_cnt, is_partial_fcn, Ext_fcns);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_partial_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return;
+}
+
+
+
+void find_combinable_preds(predicate_t *pr,  vector<predicate_t *> *pr_list,
+                                                               table_list *Schema, ext_fcn_list *Ext_fcns){
+       vector<literal_t *> litl;
+       vector<scalarexp_t *> op_list;
+       int f,o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               return;
+       case PRED_COMPARE:
+               return;
+       case PRED_UNARY_OP:
+               find_combinable_preds(pr->get_left_pr(), pr_list, Schema, Ext_fcns);
+               return;
+       case PRED_BINARY_OP:
+               find_combinable_preds(pr->get_left_pr(), pr_list, Schema, Ext_fcns) ;
+               find_combinable_preds(pr->get_right_pr(), pr_list, Schema, Ext_fcns) ;
+               return;
+       case PRED_FUNC:
+               if(Ext_fcns->is_combinable(pr->get_fcn_id())){
+                 for(f=0;f<pr_list->size();++f){
+                       if(is_equivalent_pred_base(pr,(*pr_list)[f],Schema)){
+                               pr->set_combinable_ref(f);
+                               break;
+                       }
+                 }
+                 if(f == pr_list->size()){
+                       pr->set_combinable_ref(pr_list->size());
+                       pr_list->push_back(pr);
+                 }
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_partial_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return;
+}
+
+
+//--------------------------------------------------------------------
+//             Collect refs to aggregates.
+
+
+void collect_agg_refs(scalarexp_t *se, set<int> &agg_refs){
+       vector<scalarexp_t *> operands;
+       int o;
+
+       if(se == NULL) return;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return;
+       case SE_UNARY_OP:
+               collect_agg_refs(se->get_left_se(), agg_refs) ;
+               return;
+       case SE_BINARY_OP:
+               collect_agg_refs(se->get_left_se(), agg_refs);
+               collect_agg_refs(se->get_right_se(), agg_refs);
+               return;
+       case SE_COLREF:
+               return;
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               agg_refs.insert(se->get_aggr_ref());
+               return;
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) agg_refs.insert(se->get_aggr_ref());
+
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       collect_agg_refs(operands[o], agg_refs);
+               }
+
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in collect_agg_refs, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return;
+}
+
+
+void collect_aggr_refs_pr(predicate_t *pr,  set<int> &agg_refs){
+       vector<literal_t *> litl;
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               collect_agg_refs(pr->get_left_se(), agg_refs) ;
+               return;
+       case PRED_COMPARE:
+               collect_agg_refs(pr->get_left_se(), agg_refs) ;
+               collect_agg_refs(pr->get_right_se(), agg_refs) ;
+               return;
+       case PRED_UNARY_OP:
+               collect_aggr_refs_pr(pr->get_left_pr(), agg_refs);
+               return;
+       case PRED_BINARY_OP:
+               collect_aggr_refs_pr(pr->get_left_pr(), agg_refs) ;
+               collect_aggr_refs_pr(pr->get_right_pr(), agg_refs) ;
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       collect_agg_refs(op_list[o],agg_refs);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in collect_aggr_refs_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return;
+}
+
+
+//--------------------------------------------------------------------
+//             Collect previously registered partial fcn refs.
+//             Do a DFS so that nested partial fcn calls
+//             get evaluated in the right order.
+//             Don't drill down into aggregates -- their arguments are evaluated
+//             earlier than the select list is.
+//             ------------->>> THEN WHY AM I DRILLING DOWN INTO AGGREGATES?
+
+void collect_partial_fcns(scalarexp_t *se, set<int> &pfcn_refs){
+       vector<scalarexp_t *> operands;
+       int o;
+
+       if(se == NULL) return;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return;
+       case SE_UNARY_OP:
+               collect_partial_fcns(se->get_left_se(), pfcn_refs) ;
+               return;
+       case SE_BINARY_OP:
+               collect_partial_fcns(se->get_left_se(), pfcn_refs);
+               collect_partial_fcns(se->get_right_se(), pfcn_refs);
+               return;
+       case SE_COLREF:
+               return;
+       case SE_AGGR_STAR:
+               return;
+       case SE_AGGR_SE:
+//             collect_partial_fcns(se->get_left_se(), pfcn_refs) ;
+               return;
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return;
+
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       collect_partial_fcns(operands[o], pfcn_refs);
+               }
+
+               if(se->is_partial()){
+                       pfcn_refs.insert(se->get_partial_ref());
+               }
+
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in collect_partial_fcns, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return;
+}
+
+
+void collect_partial_fcns_pr(predicate_t *pr,  set<int> &pfcn_refs){
+       vector<literal_t *> litl;
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               collect_partial_fcns(pr->get_left_se(), pfcn_refs) ;
+               return;
+       case PRED_COMPARE:
+               collect_partial_fcns(pr->get_left_se(), pfcn_refs) ;
+               collect_partial_fcns(pr->get_right_se(), pfcn_refs) ;
+               return;
+       case PRED_UNARY_OP:
+               collect_partial_fcns_pr(pr->get_left_pr(), pfcn_refs);
+               return;
+       case PRED_BINARY_OP:
+               collect_partial_fcns_pr(pr->get_left_pr(), pfcn_refs) ;
+               collect_partial_fcns_pr(pr->get_right_pr(), pfcn_refs) ;
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       collect_partial_fcns(op_list[o],pfcn_refs);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in collect_partial_fcns_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return;
+}
+
+
+
+
+///////////////////////////////////////////////////////////////
+////////////   Exported Functions      ///////////////////////////
+///////////////////////////////////////////////////////////////
+
+
+//             Count and collect refs to interface parameters.
+
+int count_se_ifp_refs(scalarexp_t *se, set<string> &ifpnames){
+       vector<scalarexp_t *> operands;
+       int o;
+       int ret = 0;
+
+       if(se == NULL) return 0;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+               return 0;
+       case SE_IFACE_PARAM:
+                       ifpnames.insert(se->get_ifpref()->to_string());
+               return 1;
+       case SE_UNARY_OP:
+               return count_se_ifp_refs(se->get_left_se(), ifpnames) ;
+       case SE_BINARY_OP:
+               ret = count_se_ifp_refs(se->get_left_se(), ifpnames);
+               ret += count_se_ifp_refs(se->get_right_se(), ifpnames);
+               return ret;
+       case SE_COLREF:
+               return 0;
+       case SE_AGGR_STAR:
+               return 0;
+       case SE_AGGR_SE:
+//             collect_partial_fcns(se->get_left_se(), pfcn_refs) ;
+               return 0;
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return 0;
+
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       ret += count_se_ifp_refs(operands[o], ifpnames);
+               }
+
+               return ret;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in count_se_ifp_refs, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return 0;
+}
+
+
+int count_pr_ifp_refs(predicate_t *pr,  set<string> &ifpnames){
+       vector<literal_t *> litl;
+       vector<scalarexp_t *> op_list;
+       int o;
+       int ret = 0;
+       if(pr == NULL) return 0;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               return count_se_ifp_refs(pr->get_left_se(), ifpnames) ;
+       case PRED_COMPARE:
+               ret = count_se_ifp_refs(pr->get_left_se(), ifpnames) ;
+               ret += count_se_ifp_refs(pr->get_right_se(), ifpnames) ;
+               return ret;
+       case PRED_UNARY_OP:
+               return count_pr_ifp_refs(pr->get_left_pr(), ifpnames);
+       case PRED_BINARY_OP:
+               ret = count_pr_ifp_refs(pr->get_left_pr(), ifpnames) ;
+               ret += count_pr_ifp_refs(pr->get_right_pr(), ifpnames) ;
+               return ret;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       ret += count_se_ifp_refs(op_list[o],ifpnames);
+               }
+               return ret;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in count_pr_ifp_refs, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return 0;
+}
+
+//             Resolve ifp refs, convert them to string literals.
+
+int resolve_se_ifp_refs(scalarexp_t *se, string ifm, string ifn, ifq_t *ifdb,  string &err){
+       vector<scalarexp_t *> operands;
+       vector<string> ifvals;
+       int o;
+       int ierr;
+       string serr;
+       int ret = 0;
+       literal_t *tmp_l;
+       ifpref_t *ir;
+
+       if(se == NULL) return 0;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+               return 0;
+       case SE_IFACE_PARAM:
+               ir = se->get_ifpref();
+               ifvals = ifdb->get_iface_vals(ifm, ifn, ir->get_pname(), ierr, serr);
+               if(ierr){
+                       err += "ERROR looking for parameter "+ir->get_pname()+" in interface "+ifm+"."+ifn+", "+serr+"\n";
+                       return 1;
+               }
+               if(ifvals.size() == 0){
+                       err += "ERROR looking for parameter "+ir->get_pname()+" in interface "+ifm+"."+ifn+", no parameter values.\n";
+                       return 1;
+               }
+               if(ifvals.size() > 1){
+                       err += "ERROR looking for parameter "+ir->get_pname()+" in interface "+ifm+"."+ifn+", multiple parameter values ("+int_to_string(ifvals.size())+").\n";
+                       return 1;
+               }
+               tmp_l = new literal_t( ifvals[0]);
+               se->convert_to_literal(tmp_l);
+               return 0;
+       case SE_UNARY_OP:
+               return resolve_se_ifp_refs( se->get_left_se(), ifm, ifn,ifdb,err) ;
+       case SE_BINARY_OP:
+               ret = resolve_se_ifp_refs( se->get_left_se(), ifm, ifn,ifdb,err);
+               ret += resolve_se_ifp_refs( se->get_right_se(), ifm, ifn,ifdb,err);
+               return ret;
+       case SE_COLREF:
+               return 0;
+       case SE_AGGR_STAR:
+               return 0;
+       case SE_AGGR_SE:
+//             collect_partial_fcns(se->get_left_se(), pfcn_refs) ;
+               return 0;
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return 0;
+
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       ret += resolve_se_ifp_refs(operands[o], ifm, ifn, ifdb,err);
+               }
+
+               return ret;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in resolve_se_ifp_refs, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return 0;
+}
+
+
+int resolve_pr_ifp_refs(predicate_t *pr,  string ifm, string ifn, ifq_t *ifdb,  string &err){
+       vector<literal_t *> litl;
+       vector<scalarexp_t *> op_list;
+       int o;
+       int ret = 0;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               return resolve_se_ifp_refs(pr->get_left_se(), ifm, ifn, ifdb, err) ;
+       case PRED_COMPARE:
+               ret = resolve_se_ifp_refs(pr->get_left_se(), ifm, ifn, ifdb, err) ;
+               ret += resolve_se_ifp_refs(pr->get_right_se(), ifm, ifn, ifdb, err) ;
+               return ret;
+       case PRED_UNARY_OP:
+               return resolve_pr_ifp_refs(pr->get_left_pr(), ifm, ifn, ifdb, err);
+       case PRED_BINARY_OP:
+               ret = resolve_pr_ifp_refs(pr->get_left_pr(), ifm, ifn, ifdb, err) ;
+               ret += resolve_pr_ifp_refs(pr->get_right_pr(), ifm, ifn, ifdb, err) ;
+               return ret;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       ret += resolve_se_ifp_refs(op_list[o],ifm, ifn, ifdb, err);
+               }
+               return ret;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in resolve_pr_ifp_refs, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return 0;
+}
+
+
+string impute_query_name(table_exp_t *fta_tree, string default_nm){
+       string retval = fta_tree->get_val_of_name("query_name");
+       if(retval == "") retval = default_nm;
+       if(retval == "") retval = "default_query";
+       return(retval);
+}
+
+//             Convert the parse tree into an intermediate form,
+//             which admits analysis better.
+//
+//             TODO : rationalize the error return policy.
+//
+//             TODO : the query_summary_class object contains
+//                     the parse tree.
+//             TODO: revisit the issue when nested subqueries are implemented.
+//             One possibility: implement accessor methods to hide the
+//             complexity
+//             For now: this class contains data structures not in table_exp_t
+//             (with a bit of duplication)
+
+//             Return NULL on error.
+//             print error messages to stderr.
+
+
+query_summary_class *analyze_fta(table_exp_t *fta_tree, table_list *schema,
+                               ext_fcn_list *Ext_fcns, string default_name){
+       int i,j, k, retval;
+
+//                     Create the summary struct -- no analysis is done here.
+       query_summary_class *qs = new query_summary_class(fta_tree);
+       qs->query_type = fta_tree->query_type;
+
+//////////////         Do common analysis
+
+//             Extract query name.  Already imputed for the qnodes.
+//     qs->query_name = impute_query_name(fta_tree, default_name);
+       qs->query_name = default_name;
+//printf("query name is %s\n",qs->query_name.c_str());
+
+//             extract definitions.  Don't grab the query name.
+
+       map<string, string> nmap = fta_tree->get_name_map();
+       map<string, string>::iterator nmi;
+       for(nmi=nmap.begin(); nmi!=nmap.end(); ++nmi){
+               string pname = (*nmi).first;
+               if(pname != "query_name" )
+                       (qs->definitions)[pname] = (*nmi).second;
+       }
+
+///
+///                            FROM analysis
+
+//             First, verify that all the referenced tables are defined.
+//             Then, bind the tablerefs in the FROM list to schemas in
+//             the schema list.
+       tablevar_list_t *tlist = fta_tree->get_from();
+       vector<tablevar_t *> tbl_vec = tlist->get_table_list();
+
+       bool found_error = false;
+       for(i=0;i<tbl_vec.size();i++){
+               int sch_no = schema->find_tbl(tbl_vec[i]->get_schema_name());
+               if(sch_no < 0)  {
+                 fprintf(stderr,"Error, table <%s> not found in the schema file\n",
+                       tbl_vec[i]->get_schema_name().c_str() );
+                 fprintf(stderr,"\tline=%d, char=%d\n",tbl_vec[i]->get_lineno(),
+                                       tbl_vec[i]->get_charno() );
+                 return(NULL);
+               }
+
+               tbl_vec[i]->set_schema_ref(sch_no);
+
+//                             If accessing a UDOP, mangle the name
+//                     This needs to be done in translate_fta.cc, not here.
+/*
+               if(schema->get_schema_type(sch_no) == OPERATOR_VIEW_SCHEMA){
+                       string mngl_name = tbl_vec[i]->get_schema_name() + silo_nm;
+                       tbl_vec[i]->set_schema_name(mngl_name);
+               }
+*/
+
+//                     No FTA schema should have an interface defined on it.
+               if(tbl_vec[i]->get_interface()!="" && schema->get_schema_type(sch_no) != PROTOCOL_SCHEMA){
+                       fprintf(stderr,"WARNING: interface %s specified for schema %s, but this schema is a STREAM and does not have an interface.\n",tbl_vec[i]->get_interface().c_str(), tbl_vec[i]->get_schema_name().c_str());
+               }
+//                     Fill in default interface
+               if(tbl_vec[i]->get_interface()=="" && schema->get_schema_type(sch_no) == PROTOCOL_SCHEMA){
+                       tbl_vec[i]->set_interface("default");
+                       tbl_vec[i]->set_ifq(true);
+               }
+//                     Fill in default machine
+               if(tbl_vec[i]->get_interface()!=""  && tbl_vec[i]->get_machine()=="" && schema->get_schema_type(sch_no) == PROTOCOL_SCHEMA && (! tbl_vec[i]->get_ifq())){
+                       tbl_vec[i]->set_machine(hostname);
+               }
+
+               if(schema->get_schema_type(sch_no) == PROTOCOL_SCHEMA){
+//                     Record the set of interfaces accessed
+                       string ifstr;
+                       if(tbl_vec[i]->get_ifq()){
+                               ifstr = "["+tbl_vec[i]->get_interface()+"]";
+                       }else{
+                               if(tbl_vec[i]->get_machine() != "localhost"){
+                                       ifstr = "&apos;"+tbl_vec[i]->get_machine()+"&apos;."+tbl_vec[i]->get_interface();
+                               }else{
+                                       ifstr = tbl_vec[i]->get_interface();
+                               }
+                       }
+//printf("ifstr is %s, i=%d, machine=%s, interface=%s\n",ifstr.c_str(),i,tbl_vec[i]->get_machine().c_str(),tbl_vec[i]->get_interface().c_str());
+                       if(qs->definitions.count("_referenced_ifaces")){
+                               ifstr = qs->definitions["_referenced_ifaces"]+","+ifstr;
+                       }
+                       qs->definitions["_referenced_ifaces"] = ifstr;
+               }
+
+       }
+       if(found_error) return(NULL);
+
+//                     Ensure that all tablevars have are named
+//                     and that no two tablevars have the same name.
+       int tblvar_no = 0;
+//             First, gather the set of variable
+       set<string> tblvar_names;
+       for(i=0;i<tbl_vec.size();i++){
+               if(tbl_vec[i]->get_var_name() != ""){
+                       if(tblvar_names.count(tbl_vec[i]->get_var_name()) > 0){
+                               fprintf(stderr,"ERROR, query has two table variables named %s.  line=%d, char=%d\n", tbl_vec[i]->get_var_name().c_str(), tbl_vec[i]->get_lineno(), tbl_vec[i]->get_charno());
+                               return(NULL);
+                       }
+                       tblvar_names.insert(tbl_vec[i]->get_var_name());
+               }
+       }
+//             Now generate variable names for unnamed tablevars
+       for(i=0;i<tbl_vec.size();i++){
+               if(tbl_vec[i]->get_var_name() == ""){
+                       char tmpstr[200];
+                       sprintf(tmpstr,"_t%d",tblvar_no);
+                       string newvar = tmpstr;
+                       while(tblvar_names.count(newvar) > 0){
+                               tblvar_no++;
+                               sprintf(tmpstr,"_t%d",tblvar_no);
+                               newvar = tmpstr;
+                       }
+                       tbl_vec[i]->set_range_var(newvar);
+                       tblvar_names.insert(newvar);
+               }
+       }
+
+//             Process inner/outer join properties
+       int jprop = fta_tree->get_from()->get_properties();
+//             Require explicit INNER_JOIN, ... specification for join queries.
+       if(jprop < 0){
+               if(qs->query_type != MERGE_QUERY && tbl_vec.size() > 1){
+                       fprintf(stderr,"ERROR, a join query must specify one of INNER_JOIM, OUTER_JOIN, LEFT_OUTER_JOIN, RIGHT_OUTER_JOIN, FILTER_JOIN.\n");
+                       return(NULL);
+               }
+       }
+
+       if(jprop == OUTER_JOIN_PROPERTY){
+               for(i=0;i<tbl_vec.size();i++) tbl_vec[i]->set_property(1);
+       }
+       if(jprop == LEFT_OUTER_JOIN_PROPERTY)
+               tbl_vec[0]->set_property(1);
+       if(jprop == RIGHT_OUTER_JOIN_PROPERTY)
+               tbl_vec[tbl_vec.size()-1]->set_property(1);
+       if(jprop == FILTER_JOIN_PROPERTY){
+               if(fta_tree->get_from()->get_temporal_range() == 0){
+                       fprintf(stderr,"ERROR, a filter join must have a non-zero tempoal range.\n");
+                       return NULL;
+               }
+               if(tbl_vec.size() != 2){
+                       fprintf(stderr,"ERROR, a filter join must be between two table variables.\n");
+                       return NULL;
+               }
+               colref_t *cr = fta_tree->get_from()->get_colref();
+               string field = cr->get_field();
+
+               int fi0 = schema->get_field_idx(tbl_vec[0]->get_schema_name(), field);
+               if(fi0 < 0){
+                       fprintf(stderr,"ERROR, temporal attribute %s for a filter join can't be found in schema %s\n",field.c_str(), tbl_vec[0]->get_schema_name().c_str());
+                       return NULL;
+               }
+               cr->set_schema_ref(tbl_vec[0]->get_schema_ref());
+               cr->set_tablevar_ref(0);
+               string type_name = schema->get_type_name(tbl_vec[0]->get_schema_ref(),field);
+               param_list *modifiers = schema->get_modifier_list(cr->get_schema_ref(), field);
+               data_type *dt0 = new data_type(type_name, modifiers);
+               if(dt0->get_type_str() != "UINT"){
+                       fprintf(stderr,"ERROR, the temporal attribute in a filter join must be a UINT.\n");
+                       return NULL;
+               }
+               if(! dt0->is_increasing()){
+                       fprintf(stderr,"ERROR, the temporal attribtue in a filter join must be temporal increasing.\n");
+                       return NULL;
+               }
+       }
+
+
+
+/////////////////////
+///            Build the query param table
+       vector<var_pair_t *> query_params = fta_tree->query_params;
+       int p;
+       for(p=0;p<query_params.size();++p){
+               string pname = query_params[p]->name;
+               string dtname = query_params[p]->val;
+
+               if(pname == ""){
+                       fprintf(stderr,"ERROR parameter has empty name.\n");
+                       found_error = true;
+               }
+               if(dtname == ""){
+                       fprintf(stderr,"ERROR parameter %s has empty type.\n",pname.c_str());
+                       found_error = true;
+               }
+               data_type *dt = new data_type(dtname);
+               if(!(dt->is_defined())){
+                       fprintf(stderr,"ERROR parameter %s has invalid type (%s).\n",pname.c_str(), dtname.c_str());
+                       found_error = true;
+               }
+
+               qs->add_query_param(pname, dt, false);
+       }
+       if(found_error) return(NULL);
+//             unpack the param table to a global for easier analysis.
+       param_tbl=qs->param_tbl;
+
+//////////////////             MERGE specialized analysis
+
+       if(qs->query_type == MERGE_QUERY){
+//                     Verify that
+//                             1) there are two *different* streams ref'd in the FROM clause
+//                                     However, only emit a warning.
+//                                     (can't detect a problem if one of the interfaces is the
+//                                      default interface).
+//                             2) They have the same layout (e.g. same types but the
+//                                     names can be different
+//                             3) the two columns can unambiguously be mapped to
+//                                     fields of the two tables, one per table.  Exception:
+//                                     the column names are the same and exist in both tables.
+//                                     FURTHERMORE the positions must be the same
+//                             4) after mapping, verify that both colrefs are temporal
+//                                     and in the same direction.
+               if(tbl_vec.size() < 2){
+                       fprintf(stderr,"ERROR, a MERGE query operates over at least 2 tables, %lu were supplied.\n",tbl_vec.size() );
+                       return(NULL);
+               }
+
+               vector<field_entry *> fev0 = schema->get_fields(
+                       tbl_vec[0]->get_schema_name()
+               );
+
+
+               int cv;
+               for(cv=1;cv<tbl_vec.size();++cv){
+                       vector<field_entry *> fev1 = schema->get_fields(
+                               tbl_vec[cv]->get_schema_name()
+                       );
+
+                       if(fev0.size() != fev1.size()){
+                               fprintf(stderr,"ERROR, the input stream %s to the merge operator has different schema than input stream %s.\n",tbl_vec[cv]->get_schema_name().c_str(), tbl_vec[0]->get_schema_name().c_str());
+                               return(NULL);
+                       }
+
+//                     Only need to ensure that the list of types are the same.
+//                     THe first table supplies the output colnames,
+//                     and all temporal properties are lost, except for the
+//                     merge-by columns.
+                       int f;
+                       for(f=0;f<fev0.size();++f){
+                               data_type dt0(fev0[f]->get_type(),fev0[f]->get_modifier_list());
+                               data_type dt1(fev1[f]->get_type(),fev1[f]->get_modifier_list());
+                               if(! dt0.equal_subtypes(&dt1) ){
+                               fprintf(stderr,"ERROR, the input stream %s to the merge operator has different schema than input stream %s.\n",tbl_vec[cv]->get_schema_name().c_str(), tbl_vec[0]->get_schema_name().c_str());
+                                       return(NULL);
+                               }
+                       }
+               }
+
+//             copy over the merge-by cols.
+               qs->mvars = fta_tree->mergevars;
+
+               if(qs->mvars.size() == 0){      // need to discover the merge vars.
+                       int mergevar_pos = -1;
+                       int f;
+                       for(f=0;f<fev0.size();++f){
+                               data_type dt0(fev0[f]->get_type(),fev0[f]->get_modifier_list());
+                               if(dt0.is_temporal()){
+                                       mergevar_pos = f;
+                                       break;
+                               }
+                       }
+                       if(mergevar_pos >= 0){
+                               for(cv=0;cv<tbl_vec.size();++cv){
+                                       vector<field_entry *> fev1 = schema->get_fields(tbl_vec[cv]->get_schema_name());
+                                       qs->mvars.push_back(new colref_t(tbl_vec[cv]->get_var_name().c_str(),fev1[mergevar_pos]->get_name().c_str() ));
+                               }
+                       }else{
+                               fprintf(stderr,"ERROR, no merge-by column found.\n");
+                               return(NULL);
+                       }
+               }
+
+//                     Ensure same number of tables, merge cols.
+               if(tbl_vec.size() != qs->mvars.size()){
+                       fprintf(stderr,"ERROR, merge query has different numbers of table variables (%lu) and merge columns (%lu)\n",tbl_vec.size(), qs->mvars.size());
+                       return(NULL);
+               }
+
+//             Ensure that the merge-by are from different tables
+//             also, sort colrefs so that they align with the FROM list using tmp_crl
+               set<int> refd_sources;
+               vector<colref_t *> tmp_crl(qs->mvars.size(),NULL);
+               for(cv=0;cv<qs->mvars.size();++cv){
+                       int tblvar=infer_tablevar_from_colref(qs->mvars[cv],fta_tree->fm,schema);
+                       if(tblvar<0){
+                               fprintf(stderr,"ERROR, Merge column %d (%s) was not found in any of the tables.\n",cv,qs->mvars[cv]->to_string().c_str());
+                       }
+                       refd_sources.insert(tblvar);
+                       tmp_crl[tblvar] = qs->mvars[cv];
+               }
+               if(refd_sources.size() != qs->mvars.size()){
+                       fprintf(stderr,"ERROR, The %lu merge columns reference only %lu table variables.\n",qs->mvars.size(), refd_sources.size());
+                       return(NULL);
+               }
+
+//                     1-1 mapping, so use tmp_crl as the merge column list.
+               qs->mvars = tmp_crl;
+
+
+
+//                     Look up the colrefs in their schemas, verify that
+//                     they are at the same place, that they are both temporal
+//                     in the same way.
+//                     It seems that this should be done more in the schema objects.
+               int fi0 = schema->get_field_idx(tbl_vec[0]->get_schema_name(), qs->mvars[0]->get_field());
+               if(fi0 < 0){
+                       fprintf(stderr,"ERROR, Merge temporal field %s not found.\n",qs->mvars[0]->get_field().c_str());
+                       exit(1);
+               }
+               for(cv=1;cv<qs->mvars.size();++cv){
+                       int fi1 = schema->get_field_idx(tbl_vec[cv]->get_schema_name(), qs->mvars[0]->get_field());
+                       if(fi0!=fi1){
+                               fprintf(stderr,"ERROR, the merge columns for table variables %s and %s must be in the same position.\n",tbl_vec[0]->get_var_name().c_str(), tbl_vec[cv]->get_var_name().c_str());
+                               return NULL;
+                       }
+               }
+
+               field_entry *fe0 = schema->get_field(tbl_vec[0]->get_schema_name(),fi0);
+               data_type dt0(fe0->get_type(),fe0->get_modifier_list());
+               if( (!dt0.is_temporal()) ){
+                       fprintf(stderr,"ERROR, merge column %d must be temporal.\n",0);
+                       return(NULL);
+               }
+               for(cv=0;cv<qs->mvars.size();++cv){
+                       field_entry *fe1 = schema->get_field(tbl_vec[cv]->get_schema_name(),fi0);
+                       data_type dt1(fe1->get_type(),fe1->get_modifier_list());
+                       if( (!dt1.is_temporal()) ){
+                               fprintf(stderr,"ERROR, merge column %d must be temporal.\n",cv);
+                               return(NULL);
+                       }
+
+
+                       if( dt0.get_temporal() != dt1.get_temporal()){
+                               fprintf(stderr,"ERROR, the merge columns (0 and %d) must be temporal in the same direction.\n",cv);
+                               return(NULL);
+                       }
+               }
+
+//                     If there is a SLACK specification, verify
+//                     that it is literal-only and that its type is compatible
+//                     with that of the merge columns
+               qs->slack = fta_tree->slack;
+               if(qs->slack){
+                       if(! literal_only_se(qs->slack)){
+                               fprintf(stderr,"ERROR, the SLACK expression is not literal-only.\n");
+                               return NULL;
+                       }
+
+                       assign_data_types(qs->slack, schema, fta_tree, Ext_fcns );
+                       data_type sdt(&dt0, qs->slack->get_data_type(), string("+"));
+                       if(sdt.get_type() == undefined_t){
+                               fprintf(stderr,"ERROR, the SLACK expression data type is not compatible with the data type of the merge columns.\n");
+                               return NULL;
+                       }
+               }
+
+
+//                     All the tests have passed, there is nothing
+//                     else to fill in.
+
+       }
+
+//////////////////             SELECT specialized analysis
+
+       if(qs->query_type == SELECT_QUERY){
+//             unpack the gb_tbl, aggr_tbl, param_tbl, and complex_literals
+//             objects into globals, for easier syntax.
+       gb_tbl = qs->gb_tbl;
+       aggr_tbl = qs->aggr_tbl;
+
+
+//             Build the table of group-by attributes.
+//             (se processing done automatically).
+//             NOTE : Doing the SE processing here is getting cumbersome,
+//                     I should process these individually.
+//             NOTE : I should check for duplicate names.
+//             NOTE : I should ensure that the def of one GB does not
+//                     refrence the value of another.
+       vector<extended_gb_t *> gb_list = fta_tree->get_groupby();
+       int n_temporal = 0;
+       string temporal_gbvars = "";
+       map<string, int> gset_gbnames;
+
+//             For generating the set of GB patterns for this aggregation query.
+       vector<bool> inner_pattern;
+       vector<vector<bool> > pattern_set;
+       vector<vector<vector<bool> > > pattern_components;
+
+       vector<gb_t *> r_gbs, c_gbs, g_gbs;
+       int n_patterns;
+
+       for(i=0;i<gb_list.size();i++){
+               switch(gb_list[i]->type){
+               case gb_egb_type:
+                       retval = gb_tbl->add_gb_attr(
+                               gb_list[i]->gb, fta_tree->fm, schema,fta_tree, Ext_fcns
+                       );
+                       if(retval < 0){
+                               return NULL;  // nothing added to gb_tbl, so this can trigger a segfault 2 lines below
+                       }else{
+                               if(gb_tbl->get_data_type(i)->is_temporal()){
+                                       n_temporal++;
+                                       if(temporal_gbvars != "") temporal_gbvars+=" ";
+                                       temporal_gbvars += gb_tbl->get_name(i);
+                               }
+                       }
+
+                       inner_pattern.clear();
+                       pattern_set.clear();
+                       inner_pattern.push_back(true);
+                       pattern_set.push_back(inner_pattern);
+                       pattern_components.push_back(pattern_set);
+
+                       gb_tbl->gb_entry_type.push_back("");
+                       gb_tbl->gb_entry_count.push_back(1);
+                       gb_tbl->pattern_components.push_back(pattern_set);
+
+               break;
+               case rollup_egb_type:
+                       r_gbs = gb_list[i]->gb_lists[0]->get_gb_list();
+                       for(j=0;j<r_gbs.size();++j){
+                               retval = gb_tbl->add_gb_attr(
+                                       r_gbs[j], fta_tree->fm, schema,fta_tree, Ext_fcns
+                               );
+                               if(retval < 0){
+                                       found_error = true;
+                               }else{          // rollup gb can't be temporal
+                                       gb_tbl->reset_temporal(gb_tbl->size()-1);
+                               }
+                       }
+
+                       inner_pattern.resize(r_gbs.size());
+                       pattern_set.clear();
+                       for(j=0;j<=r_gbs.size();++j){
+                               for(k=0;k<r_gbs.size();++k){
+                                       if(k < j)
+                                               inner_pattern[k] = true;
+                                       else
+                                               inner_pattern[k] = false;
+                               }
+                               pattern_set.push_back(inner_pattern);
+                       }
+                       pattern_components.push_back(pattern_set);
+
+                       gb_tbl->gb_entry_type.push_back("ROLLUP");
+                       gb_tbl->gb_entry_count.push_back(r_gbs.size());
+                       gb_tbl->pattern_components.push_back(pattern_set);
+               break;
+               case cube_egb_type:
+                       c_gbs = gb_list[i]->gb_lists[0]->get_gb_list();
+                       for(j=0;j<c_gbs.size();++j){
+                               retval = gb_tbl->add_gb_attr(
+                                       c_gbs[j], fta_tree->fm, schema,fta_tree, Ext_fcns
+                               );
+                               if(retval < 0){
+                                       found_error = true;
+                               }else{          // cube gb can't be temporal
+                                       gb_tbl->reset_temporal(gb_tbl->size()-1);
+                               }
+                       }
+
+                       inner_pattern.resize(c_gbs.size());
+                       pattern_set.clear();
+                       n_patterns = 1 << c_gbs.size();
+                       for(j=0;j<n_patterns;++j){
+                               int test_bit = 1;
+                               for(k=0;k<c_gbs.size();++k,test_bit = test_bit << 1){
+                                       if((j & test_bit) != 0)
+                                               inner_pattern[k] = true;
+                                       else
+                                               inner_pattern[k] = false;
+                               }
+                               pattern_set.push_back(inner_pattern);
+                       }
+                       pattern_components.push_back(pattern_set);
+
+                       gb_tbl->gb_entry_type.push_back("CUBE");
+                       gb_tbl->gb_entry_count.push_back(c_gbs.size());
+                       gb_tbl->pattern_components.push_back(pattern_set);
+               break;
+               case gsets_egb_type:
+               {
+                       gset_gbnames.clear();
+                       for(j=0;j<gb_list[i]->gb_lists.size();++j){
+                               g_gbs = gb_list[i]->gb_lists[j]->get_gb_list();
+                               for(k=0;k<g_gbs.size();++k){
+                                       if(g_gbs[k]->type != GB_COLREF){
+                                               fprintf(stderr,"Error, group-by fields in a GROUPING_SETS clause must be table references, not computed values (field is %s\n",g_gbs[k]->name.c_str());
+                                               found_error = true;
+                                       }else{
+                                               if(gset_gbnames.count(g_gbs[k]->name) == 0){
+                                                       retval = gb_tbl->add_gb_attr(
+                                                               g_gbs[k], fta_tree->fm, schema,fta_tree, Ext_fcns
+                                                       );
+                                                       if(retval < 0){
+                                                               found_error = true;
+                                                       }else{          // gsets gb can't be temporal
+                                                               gb_tbl->reset_temporal(gb_tbl->size()-1);
+                                                       }
+                                                       int pos = gset_gbnames.size();
+                                                       gset_gbnames[g_gbs[k]->name] = pos;
+                                               }
+                                       }
+                               }
+                       }
+
+                       if(gset_gbnames.size() > 63){
+                               fprintf(stderr,"Error, at most 63 distinct fields can be referenced in a GROUPING_SETS clause.\n");
+                               found_error = true;
+                       }
+
+                       inner_pattern.resize(gset_gbnames.size());
+                       pattern_set.clear();
+                       set<unsigned long long int> signatures;
+                       for(j=0;j<gb_list[i]->gb_lists.size();++j){
+                               g_gbs = gb_list[i]->gb_lists[j]->get_gb_list();
+                               set<string> refd_gbs;
+                               for(k=0;k<g_gbs.size();++k){
+                                       refd_gbs.insert(g_gbs[k]->name);
+                               }
+                               fill(inner_pattern.begin(),inner_pattern.end(),false);
+                               unsigned long long int signature = 0;
+                               set<string>::iterator ssi;
+                               for(ssi = refd_gbs.begin(); ssi != refd_gbs.end(); ++ssi){
+                                       inner_pattern[gset_gbnames[(*ssi)]] = true;
+                                       signature |= (1 << gset_gbnames[(*ssi)]);
+                               }
+                               if(signatures.count(signature)){
+                                       fprintf(stderr,"Warning, duplicate GROUPING_SETS pattern found, ignoring:\n\t");
+                                       set<string>::iterator ssi;
+                                       for(ssi = refd_gbs.begin(); ssi != refd_gbs.end(); ++ssi){
+                                               fprintf(stderr," %s",(*ssi).c_str());
+                                       }
+                                       fprintf(stderr,"\n");
+                               }else{
+                                       signatures.insert(signature);
+                                       pattern_set.push_back(inner_pattern);
+                               }
+                       }
+                       pattern_components.push_back(pattern_set);
+
+                       gb_tbl->gb_entry_type.push_back("GROUPING_SETS");
+                       gb_tbl->gb_entry_count.push_back(gset_gbnames.size());
+                       gb_tbl->pattern_components.push_back(pattern_set);
+               }
+               break;
+               default:
+               break;
+               }
+       }
+       if(found_error) return(NULL);
+       if(n_temporal > 1){
+               fprintf(stderr,"ERROR, query has multiple temporal group-by variables (%s).  Cast away the temporality of all but one of these.\n", temporal_gbvars.c_str());
+               return NULL;
+       }
+
+//             Compute the set of patterns.  Take the cross product of all pattern components.
+       vector<vector<bool> > gb_patterns;
+       int n_components = pattern_components.size();
+       vector<int> pattern_pos(n_components,0);
+       bool done = false;
+       while(! done){
+               vector<bool> pattern;
+               for(j=0;j<n_components;j++){
+                       pattern.insert(pattern.end(),pattern_components[j][pattern_pos[j]].begin(),
+                               pattern_components[j][pattern_pos[j]].end());
+               }
+               gb_patterns.push_back(pattern);
+               for(j=0;j<n_components;j++){
+                       pattern_pos[j]++;
+                       if(pattern_pos[j] >= pattern_components[j].size())
+                               pattern_pos[j] = 0;
+                       else
+                               break;
+               }
+               if(j >= n_components)
+                       done = true;
+       }
+       gb_tbl->gb_patterns = gb_patterns;
+
+
+//             Process the supergroup, if any.
+       vector<colref_t *> sgb = fta_tree->get_supergb();
+       for(i=0;i<sgb.size();++i){
+               int gbr = gb_tbl->find_gb(sgb[i],fta_tree->fm, schema);
+               if(gbr < 0){
+                       fprintf(stderr, "ERROR, supergroup attribute %s is not defined as a group-by variable.\n",sgb[i]->to_string().c_str());
+                       found_error = true;
+               }
+               if(qs->sg_tbl.count(gbr)){
+                       fprintf(stderr,"WARNING, duplicate supergroup attribute %s.\n",sgb[i]->to_string().c_str());
+               }
+               qs->sg_tbl.insert(gbr);
+       }
+       if(found_error) return(NULL);
+
+       if(qs->sg_tbl.size() > 0 && gb_tbl->gb_patterns.size()>0){
+               fprintf(stderr,"Error, SUPERGROUP incompatible with CUBE, ROLLUP, and GROUPING_SETS.\n");
+               return NULL;
+       }
+
+
+
+       predicate_t *wh = fta_tree->get_where();
+       predicate_t *hv = fta_tree->get_having();
+       predicate_t *cw = fta_tree->get_cleaning_when();
+       predicate_t *cb = fta_tree->get_cleaning_by();
+       predicate_t *closew = fta_tree->get_closing_when();
+
+       if(closew != NULL  && gb_tbl->gb_patterns.size()>1){
+               fprintf(stderr,"Error, CLOSING_WHEN incompatible with CUBE, ROLLUP, and GROUPING_SETS.\n");
+               return NULL;
+       }
+
+
+
+//             Verify that all column references are valid, and if so assign
+//             the data type.
+
+       vector<select_element *> sl_list = fta_tree->get_sl_vec();
+       for(i=0;i<sl_list.size();i++){
+               retval = verify_colref(sl_list[i]->se, fta_tree->fm, schema, gb_tbl);
+               if(retval < 0) found_error = true;
+       }
+       if(wh != NULL)
+               retval = verify_predicate_colref(wh, fta_tree->fm, schema, gb_tbl);
+       if(retval < 0) found_error = true;
+       if(hv != NULL)
+               retval = verify_predicate_colref(hv, fta_tree->fm, schema, gb_tbl);
+       if(retval < 0) found_error = true;
+       if(cw != NULL)
+               retval = verify_predicate_colref(cw, fta_tree->fm, schema, gb_tbl);
+       if(retval < 0) found_error = true;
+       if(cb != NULL)
+               retval = verify_predicate_colref(cb, fta_tree->fm, schema, gb_tbl);
+       if(retval < 0) found_error = true;
+       if(closew != NULL)
+               retval = verify_predicate_colref(closew, fta_tree->fm, schema, gb_tbl);
+       if(retval < 0) found_error = true;
+
+       if(found_error) return(NULL);
+
+//             Verify that all of the scalar expressions
+//             and comparison predicates have compatible types.
+
+       n_temporal = 0;
+       string temporal_output_fields;
+       for(i=0;i<sl_list.size();i++){
+               retval = assign_data_types(sl_list[i]->se, schema, fta_tree, Ext_fcns );
+               if(retval < 0){
+                        found_error = true;
+               }else{
+                       if(sl_list[i]->se->get_data_type()->is_temporal()){
+                               n_temporal++;
+                               temporal_output_fields += " "+int_to_string(i);
+                       }
+               }
+       }
+       if(n_temporal > 1){
+               fprintf(stderr,"ERROR, query has multiple temporal output fields (positions%s).  Cast away the temporality of all but one of these.\n", temporal_output_fields.c_str());
+               found_error=true;
+       }
+       if(wh != NULL)
+               retval = assign_predicate_data_types(wh, schema, fta_tree, Ext_fcns);
+       if(retval < 0) found_error = true;
+       if(hv != NULL)
+               retval = assign_predicate_data_types(hv, schema, fta_tree, Ext_fcns);
+       if(retval < 0) found_error = true;
+       if(cw != NULL)
+               retval = assign_predicate_data_types(cw, schema, fta_tree, Ext_fcns);
+       if(retval < 0) found_error = true;
+       if(cb != NULL)
+               retval = assign_predicate_data_types(cb, schema, fta_tree, Ext_fcns);
+       if(retval < 0) found_error = true;
+       if(closew != NULL)
+               retval = assign_predicate_data_types(closew, schema, fta_tree, Ext_fcns);
+       if(retval < 0) found_error = true;
+
+       if(found_error) return(NULL);
+
+//                     Impute names for the unnamed columns.
+       set<string> curr_names;
+       int s;
+       for(s=0;s<sl_list.size();++s){
+               curr_names.insert(sl_list[s]->name);
+       }
+       for(s=0;s<sl_list.size();++s){
+               if(sl_list[s]->name == "")
+                       sl_list[s]->name = impute_colname(curr_names, sl_list[s]->se);
+       }
+
+
+//             Check the aggregates.
+//             No aggrs allowed in the WHERE predicate.
+//             (no aggrs in the GB defs, but that is examined elsewhere)
+//             Therefore, aggregates are allowed only the select clause.
+//
+//             The query is an aggregation query if there is a group-by clause, or
+//             if any aggregate is referenced.  If there is a group-by clause,
+//             at least one aggregate must be referenced.
+//             If the query is an aggregate query, the scalar expressions in
+//             the select clause can reference only constants, aggregates, or group-by
+//             attributes.
+//             Also, if the query is an aggregate query, build a table referencing
+//             the aggregates.
+//
+//             No nested aggregates allowed.
+//
+
+//             First, count references in the WHERE predicate.
+//             (if there are any references, report an error).
+//                     can ref group vars, tuple fields, and stateful fcns.
+
+       if(wh != NULL){
+               retval = count_aggr_pred(wh, true);
+               if(retval > 0){
+                       fprintf(stderr,"ERROR, no aggregate references are allowed in the WHERE clause.\n");
+                       return(NULL);
+               }
+       }
+
+//             NOTE : Here I need an analysis of the having clause
+//             to verify that it only refs GB attrs and aggregates.
+//                     (also, superaggregates, stateful fcns)
+       if(hv!=NULL){
+               retval = verify_having_pred(hv, "HAVING", Ext_fcns);
+               if(retval < 0) return(NULL);
+       }
+
+//             Cleaning by has same reference rules as Having
+       if(cb!=NULL){
+               retval = verify_having_pred(cb, "CLEANING_BY", Ext_fcns);
+               if(retval < 0) return(NULL);
+       }
+
+//             Cleaning when has same reference rules as Having,
+//             except that references to non-superaggregates are not allowed.
+//             This is tested for when "CLEANING_BY" is passed in as the clause.
+       if(cw!=NULL){
+               retval = verify_having_pred(cw, "CLEANING_WHEN", Ext_fcns);
+               if(retval < 0) return(NULL);
+       }
+
+//             CLOSING_WHEN : same rules as HAVING
+       if(closew!=NULL){
+               retval = verify_having_pred(closew, "CLOSING_WHEN", Ext_fcns);
+               if(retval < 0) return(NULL);
+       }
+
+
+//             Collect aggregates in the HAVING and CLEANING clauses
+       if(hv != NULL){
+               build_aggr_tbl_fm_pred(hv, aggr_tbl, Ext_fcns);
+       }
+       if(cw != NULL){
+               build_aggr_tbl_fm_pred(cw, aggr_tbl, Ext_fcns);
+       }
+       if(cb != NULL){
+               build_aggr_tbl_fm_pred(cb, aggr_tbl, Ext_fcns);
+       }
+       if(closew != NULL){
+               build_aggr_tbl_fm_pred(closew, aggr_tbl, Ext_fcns);
+       }
+
+//             Collect aggregate refs in the SELECT clause.
+
+       for(i=0;i<sl_list.size();i++)
+               build_aggr_tbl_fm_se(sl_list[i]->se, aggr_tbl, Ext_fcns);
+
+
+//             Collect references to states of stateful functions
+       if(wh != NULL){
+               gather_fcn_states_pr(wh, qs->states_refd, Ext_fcns);
+       }
+       if(hv != NULL){
+               gather_fcn_states_pr(hv, qs->states_refd, Ext_fcns);
+       }
+       if(cw != NULL){
+               gather_fcn_states_pr(cw, qs->states_refd, Ext_fcns);
+       }
+       if(cb != NULL){
+               gather_fcn_states_pr(cb, qs->states_refd, Ext_fcns);
+       }
+       if(closew != NULL){                     // should be no stateful fcns here ...
+               gather_fcn_states_pr(closew, qs->states_refd, Ext_fcns);
+       }
+       for(i=0;i<sl_list.size();i++)
+               gather_fcn_states_se(sl_list[i]->se, qs->states_refd, Ext_fcns);
+
+
+//             If this is an aggregate query, it had normally references
+//             some aggregates.  Its not necessary though, just emit a warning.
+//             (acts as SELECT DISTINCT)
+
+       bool is_aggr_query = gb_tbl->size() > 0 || aggr_tbl->size() > 0;
+       if(is_aggr_query && aggr_tbl->size() == 0){
+               fprintf(stderr,"Warning, query contains a group-by clause but does not reference aggregates..\n");
+       }
+
+//             If this is an aggregate query,
+//                     1) verify that the SEs in the SELECT clause reference
+//                             only constants, aggregates, and group-by attributes.
+//                     2) No aggregate scalar expression references an aggregate
+//                             or any stateful function.
+//                     3) either it references both CLEANING clauses or neither.
+//                     4) all superaggregates must have the superaggr_allowed property.
+//                     5) all aggregates ref'd in the CLEANING_WHEN ad CLEANING_BY
+//                        clauses must have the multiple_output property.
+
+
+       if(is_aggr_query){
+               if(gb_list.size() == 0){
+                       fprintf(stderr,"ERROR, aggregation queries must have at least one group-by variable (which should be temporal).\n");
+                       return NULL;
+               }
+//                     Ensure that at least one gbvar is temporal
+               if(! fta_tree->name_exists("no_temporal_aggr")){
+                       bool found_temporal = false;
+               for(i=0;i<gb_tbl->size();i++){
+                               if(gb_tbl->get_data_type(i)->is_temporal()){
+                                       found_temporal = true;
+                               }
+                       }
+                       if(! found_temporal){
+                               fprintf(stderr,"ERROR, at least one of the group-by variables must be temporal (unless no_temporal_aggr is set)\n");
+                               exit(1);
+                       }
+               }
+
+               if((!cb && cw) || (cb && !cw)){
+                       fprintf(stderr,"ERROR, an aggregate query must either include both a CLEANING_WHEN and a CLEANING_BY clause, or neither.\n");
+                       return(NULL);
+               }
+
+               bool refs_running = false;
+               int a;
+               for(a=0; a<aggr_tbl->size(); ++a){
+                       refs_running |= aggr_tbl->is_running_aggr(a);
+               }
+
+               if(closew){
+                       if(cb || cw){
+                               fprintf(stderr, "ERROR, cannot reference both CLOSING_WHEN and either CLEANING_WHEN or CLEANING_BY.\n");
+                               return(NULL);
+                       }
+                       if(!refs_running){
+                               fprintf(stderr, "ERROR, if you reference CLOSING_WHEN you must reference at least one running window aggregate.\n");
+                               return(NULL);
+                       }
+               }
+
+               if(refs_running && !closew){
+                               fprintf(stderr, "ERROR, if you reference a running window aggregate you must reference a CLOSING_WHEN clause.\n");
+                       return(NULL);
+               }
+
+               bool st_ok = true;
+               for(i=0;i<sl_list.size();i++){
+                       bool ret_bool = verify_aggr_query_se(sl_list[i]->se);
+                       st_ok = st_ok && ret_bool;
+               }
+               if(! st_ok)
+                       return(NULL);
+
+               for(i=0;i<aggr_tbl->size();i++){
+                       if(aggr_tbl->is_superaggr(i)){
+                               if(! aggr_tbl->superaggr_allowed(i)){
+                                       fprintf(stderr,"ERROR, aggregate %s cannot be a superaggregate\n",aggr_tbl->get_op(i).c_str());
+                                       return NULL;
+                               }
+                       }
+                       if(aggr_tbl->is_builtin(i)){
+                               if(count_aggr_se(aggr_tbl->get_aggr_se(i), true) > 0){
+                                       fprintf(stderr,"ERROR no nested aggregation allowed.\n");
+                                       return(NULL);
+                               }
+                       }else{
+                               vector<scalarexp_t *> opl = aggr_tbl->get_operand_list(i);
+                               int o;
+                               for(o=0;o<opl.size();++o){
+                                       if(count_aggr_se(opl[o], true) > 0){
+                                               fprintf(stderr,"ERROR no nested aggregation allowed.\n");
+                                               return(NULL);
+                                       }
+                               }
+                       }
+               }
+       }else{
+//                     Ensure that non-aggregate query doesn't reference some things
+               if(cb || cw){
+                       fprintf(stderr,"ERROR, a non-aggregate query may not reference a CLEANING_WHEN or a CLEANING_BY clause.\n");
+                       return(NULL);
+               }
+               if(closew){
+                       fprintf(stderr,"ERROR, a non-aggregate query may not reference a CLOSING_WHEN clause.\n");
+                       return(NULL);
+               }
+               if(qs->states_refd.size()){
+                       fprintf(stderr,"ERROR, a non-aggregate query may not refernece stateful functions.\n");
+                       return(NULL);
+               }
+       }
+
+
+
+//             Convert the predicates into CNF.  OK to pass NULL ptr.
+       make_cnf_from_pr(wh, qs->wh_cnf);
+       make_cnf_from_pr(hv, qs->hav_cnf);
+       make_cnf_from_pr(cb, qs->cb_cnf);
+       make_cnf_from_pr(cw, qs->cw_cnf);
+       make_cnf_from_pr(closew, qs->closew_cnf);
+
+//             Analyze the predicates.
+
+       for(i=0;i<qs->wh_cnf.size();i++)
+               analyze_cnf(qs->wh_cnf[i]);
+       for(i=0;i<qs->hav_cnf.size();i++)
+               analyze_cnf(qs->hav_cnf[i]);
+       for(i=0;i<qs->cb_cnf.size();i++)
+               analyze_cnf(qs->cb_cnf[i]);
+       for(i=0;i<qs->cw_cnf.size();i++)
+               analyze_cnf(qs->cw_cnf[i]);
+       for(i=0;i<qs->closew_cnf.size();i++)
+               analyze_cnf(qs->closew_cnf[i]);
+
+
+//                     At this point, the old analysis program
+//                     gathered all refs to partial functions,
+//                     complex literals, and parameters accessed via a handle.
+//                     I think its better to delay this
+//                     until code generation time, as the query will be
+//                     in general split.
+
+    }
+
+       return(qs);
+}
+
+///////////////////////////////////////////////////////////////////////
+
+//             Expand gbvars with their definitions.
+
+scalarexp_t *expand_gbvars_se(scalarexp_t *se, gb_table &gb_tbl){
+       int o;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return se;
+       case SE_UNARY_OP:
+               se->lhs.scalarp = expand_gbvars_se(se->get_left_se(),gb_tbl);
+               return se;
+       case SE_BINARY_OP:
+               se->lhs.scalarp = expand_gbvars_se(se->get_left_se(),gb_tbl);
+               se->rhs.scalarp = expand_gbvars_se(se->get_right_se(),gb_tbl);
+               return se;
+       case SE_COLREF:
+               if( se->is_gb() ){
+                       return( dup_se(gb_tbl.get_def(se->get_gb_ref()),NULL) );
+               }
+               return se;
+//                     don't descend into aggr defs.
+       case SE_AGGR_STAR:
+               return se;
+       case SE_AGGR_SE:
+               return se;
+       case SE_FUNC:
+               for(o=0;o<se->param_list.size();o++){
+                       se->param_list[o] = expand_gbvars_se(se->param_list[o], gb_tbl);
+               }
+               return se;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in expand_gbvars, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return se;
+}
+
+void expand_gbvars_pr(predicate_t *pr, gb_table &gb_tbl){
+       vector<scalarexp_t *> op_list;
+       int o;
+       bool found = false;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               pr->lhs.sexp = expand_gbvars_se(pr->get_left_se(), gb_tbl);
+               return;
+       case PRED_COMPARE:
+               pr->lhs.sexp = expand_gbvars_se(pr->get_left_se(),gb_tbl) ;
+               pr->rhs.sexp = expand_gbvars_se(pr->get_right_se(),gb_tbl) ;
+               return;
+       case PRED_UNARY_OP:
+               expand_gbvars_pr(pr->get_left_pr(),gb_tbl) ;
+               return;
+       case PRED_BINARY_OP:
+               expand_gbvars_pr(pr->get_left_pr(),gb_tbl) ;
+               expand_gbvars_pr(pr->get_right_pr(),gb_tbl) ;
+               return;
+       case PRED_FUNC:
+               for(o=0;o<pr->param_list.size();++o){
+                       pr->param_list[o] = expand_gbvars_se(pr->param_list[o],gb_tbl) ;
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in expand_gbvars_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+       }
+       return;
+}
+
+
+
+
+//             return true if the se / pr contains any gbvar on the list.
+
+
+bool contains_gb_se(scalarexp_t *se, set<int> &gref_set){
+       vector<scalarexp_t *> operands;
+       int o;
+       bool found = false;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return false;
+       case SE_UNARY_OP:
+               return contains_gb_se(se->get_left_se(),gref_set);
+       case SE_BINARY_OP:
+               return( contains_gb_se(se->get_left_se(),gref_set) ||
+                       contains_gb_se(se->get_right_se(),gref_set) );
+       case SE_COLREF:
+               if( se->is_gb() ){
+                       return( gref_set.count(se->get_gb_ref()) > 0);
+               }
+               return false;
+//                     don't descend into aggr defs.
+       case SE_AGGR_STAR:
+               return false;
+       case SE_AGGR_SE:
+               return false;
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       found = found || contains_gb_se(operands[o], gref_set);
+               }
+               return found;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in contains_gb_se, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+       return false;
+}
+
+
+bool contains_gb_pr(predicate_t *pr, set<int> &gref_set){
+       vector<scalarexp_t *> op_list;
+       int o;
+       bool found = false;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               return contains_gb_se(pr->get_left_se(), gref_set);
+       case PRED_COMPARE:
+               return (contains_gb_se(pr->get_left_se(),gref_set)
+                       || contains_gb_se(pr->get_right_se(),gref_set) );
+       case PRED_UNARY_OP:
+               return contains_gb_pr(pr->get_left_pr(),gref_set) ;
+       case PRED_BINARY_OP:
+               return (contains_gb_pr(pr->get_left_pr(),gref_set)
+                       || contains_gb_pr(pr->get_right_pr(),gref_set) );
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       found = found ||contains_gb_se(op_list[o],gref_set) ;
+               }
+               return found;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in contains_gb_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+       }
+
+       return found;
+}
+
+
+//             Gather the set of columns accessed in this se.
+//             Descend into aggregate functions.
+
+void gather_se_col_ids(scalarexp_t *se, col_id_set &cid_set, gb_table *gtbl){
+       col_id ci;
+       vector<scalarexp_t *> operands;
+       int o;
+
+       if(! se)
+               return;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return;
+       case SE_UNARY_OP:
+               gather_se_col_ids(se->get_left_se(),cid_set,gtbl);
+               return;
+       case SE_BINARY_OP:
+               gather_se_col_ids(se->get_left_se(),cid_set,gtbl);
+               gather_se_col_ids(se->get_right_se(),cid_set,gtbl);
+               return;
+       case SE_COLREF:
+               if(! se->is_gb() ){
+                       ci.load_from_colref(se->get_colref() );
+                       if(ci.tblvar_ref < 0){
+                               fprintf(stderr,"INTERNAL WARNING: unbound colref (%s) accessed.\n",ci.field.c_str());
+                       }
+                       cid_set.insert(ci);
+               }else{
+                       if(gtbl==NULL){
+                               fprintf(stderr,"INTERNAL ERROR: gbvar ref in gather_se_col_ids, but gtbl is NULL.\n");
+                               exit(1);
+                       }
+                       gather_se_col_ids(gtbl->get_def(se->get_gb_ref()),cid_set,gtbl);
+               }
+               return;
+       case SE_AGGR_STAR:
+               return;
+       case SE_AGGR_SE:
+               gather_se_col_ids(se->get_left_se(),cid_set,gtbl);
+               return;
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       gather_se_col_ids(operands[o], cid_set,gtbl);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in gather_se_col_ids, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+}
+
+
+//             Gather the set of columns accessed in this se.
+
+void gather_pr_col_ids(predicate_t *pr, col_id_set &cid_set, gb_table *gtbl){
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               gather_se_col_ids(pr->get_left_se(), cid_set,gtbl);
+               return;
+       case PRED_COMPARE:
+               gather_se_col_ids(pr->get_left_se(),cid_set,gtbl) ;
+               gather_se_col_ids(pr->get_right_se(),cid_set,gtbl) ;
+               return;
+       case PRED_UNARY_OP:
+               gather_pr_col_ids(pr->get_left_pr(),cid_set,gtbl) ;
+               return;
+       case PRED_BINARY_OP:
+               gather_pr_col_ids(pr->get_left_pr(),cid_set,gtbl) ;
+               gather_pr_col_ids(pr->get_right_pr(),cid_set,gtbl) ;
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       gather_se_col_ids(op_list[o],cid_set,gtbl) ;
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in gather_pr_col_ids, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+       }
+}
+
+
+
+
+//             Gather the set of special operator or comparison functions referenced by this se.
+
+void gather_se_opcmp_fcns(scalarexp_t *se, set<string> &fcn_set){
+       col_id ci;
+       data_type *ldt, *rdt;
+       int o;
+       vector<scalarexp_t *> operands;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               if( se->get_literal()->constructor_name() != "")
+                       fcn_set.insert( se->get_literal()->constructor_name() );
+               return;
+       case SE_PARAM:
+               return;
+//                     SE_IFACE_PARAM should not exist when this is called.
+       case SE_UNARY_OP:
+               ldt = se->get_left_se()->get_data_type();
+               if(ldt->complex_operator(se->get_op()) ){
+                       fcn_set.insert( ldt->get_complex_operator(se->get_op()) );
+               }
+               gather_se_opcmp_fcns(se->get_left_se(),fcn_set);
+               return;
+       case SE_BINARY_OP:
+               ldt = se->get_left_se()->get_data_type();
+               rdt = se->get_right_se()->get_data_type();
+
+               if(ldt->complex_operator(rdt, se->get_op()) ){
+                       fcn_set.insert( ldt->get_complex_operator(rdt, se->get_op()) );
+               }
+               gather_se_opcmp_fcns(se->get_left_se(),fcn_set);
+               gather_se_opcmp_fcns(se->get_right_se(),fcn_set);
+               return;
+       case SE_COLREF:
+               return;
+       case SE_AGGR_STAR:
+               return;
+       case SE_AGGR_SE:
+               gather_se_opcmp_fcns(se->get_left_se(),fcn_set);
+               return;
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       gather_se_opcmp_fcns(operands[o], fcn_set);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in gather_se_opcmp_fcns, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+}
+
+
+//             Gather the set of special operator or comparison functions referenced by this se.
+
+void gather_pr_opcmp_fcns(predicate_t *pr, set<string> &fcn_set){
+       data_type *ldt, *rdt;
+       vector<scalarexp_t *> operands;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               ldt = pr->get_left_se()->get_data_type();
+               if(ldt->complex_comparison(ldt) ){
+                       fcn_set.insert( ldt->get_comparison_fcn(ldt) );
+               }
+               gather_se_opcmp_fcns(pr->get_left_se(), fcn_set);
+               return;
+       case PRED_COMPARE:
+               ldt = pr->get_left_se()->get_data_type();
+               rdt = pr->get_right_se()->get_data_type();
+               if(ldt->complex_comparison(rdt) ){
+                       fcn_set.insert( ldt->get_comparison_fcn(rdt) );
+               }
+               gather_se_opcmp_fcns(pr->get_left_se(),fcn_set) ;
+               gather_se_opcmp_fcns(pr->get_right_se(),fcn_set) ;
+               return;
+       case PRED_UNARY_OP:
+               gather_pr_opcmp_fcns(pr->get_left_pr(),fcn_set) ;
+               return;
+       case PRED_BINARY_OP:
+               gather_pr_opcmp_fcns(pr->get_left_pr(),fcn_set) ;
+               gather_pr_opcmp_fcns(pr->get_right_pr(),fcn_set) ;
+               return;
+       case PRED_FUNC:
+               operands = pr->get_op_list();
+               for(o=0;o<operands.size();o++){
+                       gather_se_opcmp_fcns(operands[o], fcn_set);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in verify_predicate_colref, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+       }
+}
+
+
+
+
+//             find the temporal variable divisor if any.
+//             Only forms allowed : temporal_colref, temporal_colref/const
+//             temporal_colref/const + const
+
+
+long long int find_temporal_divisor(scalarexp_t *se, gb_table *gbt,string &fnm){
+       long long int retval = 0;
+       data_type *ldt, *rdt;
+       int o;
+       vector<scalarexp_t *> operands;
+       scalarexp_t *t_se, *c_se;
+       string the_op;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               return(-1);
+       case SE_PARAM:
+               return(-1);
+//                     SE_IFACE_PARAM should not exist when this is called.
+       case SE_UNARY_OP:
+               return(-1);
+       case SE_BINARY_OP:
+               ldt = se->get_left_se()->get_data_type();
+               if(ldt->is_temporal()){
+                       t_se = se->get_left_se();
+                       c_se = se->get_right_se();
+               }else{
+                       t_se = se->get_left_se();
+                       c_se = se->get_right_se();
+               }
+               if((! t_se->get_data_type()->is_temporal()) ||  c_se->get_data_type()->is_temporal())
+                       return -1;
+
+               the_op = se->get_op();
+               if(the_op == "+" || the_op == "-")
+                       return find_temporal_divisor(t_se, gbt,fnm);
+               if(the_op == "/"){
+                       if(t_se->get_operator_type() == SE_COLREF && c_se->get_operator_type() == SE_LITERAL){
+                               fnm = t_se->get_colref()->get_field();
+                               string lits = c_se->get_literal()->to_string();
+                               sscanf(lits.c_str(),"%qd",&retval);
+                               return retval;
+                       }
+               }
+
+               return -1;
+       case SE_COLREF:
+               if(se->is_gb()){
+                       return find_temporal_divisor(gbt->get_def(se->get_gb_ref()), gbt,fnm);
+               }
+               if(se->get_data_type()->is_temporal()){
+                       fnm = se->get_colref()->get_field();
+                       return 1;
+               }
+               return 0;
+       case SE_AGGR_STAR:
+               return -1;
+       case SE_AGGR_SE:
+               return -1;
+       case SE_FUNC:
+               return -1;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_temporal_divisor, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+}
+
+
+//                     impute_colnames:
+//                     Create meaningful but unique names for the columns.
+string impute_colname(vector<select_element *> &sel_list, scalarexp_t *se){
+       set<string> curr_names;
+       int s;
+       for(s=0;s<sel_list.size();++s){
+               curr_names.insert(sel_list[s]->name);
+       }
+       return impute_colname(curr_names, se);
+}
+
+string impute_colname(set<string> &curr_names, scalarexp_t *se){
+string ret;
+scalarexp_t *seo;
+vector<scalarexp_t *> operand_list;
+string opstr;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               ret = "Literal";
+               break;
+    case SE_PARAM:
+               ret = "Param_" + se->get_param_name();
+               break;
+    case SE_IFACE_PARAM:
+               ret = "Iparam_" + se->get_ifpref()->get_pname();
+               break;
+    case SE_COLREF:
+               ret =  se->get_colref()->get_field() ;
+               break;
+    case SE_UNARY_OP:
+    case SE_BINARY_OP:
+               ret = "Field";
+               break;
+    case SE_AGGR_STAR:
+               ret = "Cnt";
+               break;
+    case SE_AGGR_SE:
+               ret = se->get_op();
+               seo = se->get_left_se();
+               switch(se->get_left_se()->get_operator_type()){
+               case SE_PARAM:
+                       ret += "_PARAM_"+seo->get_param_name();
+                       break;
+               case SE_IFACE_PARAM:
+                       ret += "_IPARAM_"+seo->get_ifpref()->get_pname();
+                       break;
+               case SE_COLREF:
+                       opstr =  seo->get_colref()->get_field();
+                       if(strncmp(ret.c_str(), opstr.c_str(),ret.size())){
+                               ret += "_" + opstr;
+                       }else{
+                               ret = opstr;
+                       }
+                       break;
+               case SE_AGGR_STAR:
+               case SE_AGGR_SE:
+                       opstr = seo->get_op();
+                       if(strncmp(ret.c_str(), opstr.c_str(),ret.size())){
+                               ret += "_" + seo->get_op();
+                       }else{
+                               ret = opstr;
+                       }
+                       break;
+               case SE_FUNC:
+                       opstr = seo->get_op();
+                       ret += "_" + seo->get_op();
+                       break;
+       case SE_UNARY_OP:
+       case SE_BINARY_OP:
+                       ret += "_SE";
+                       break;
+               default:
+                       ret += "_";
+                       break;
+               }
+               break;
+       case SE_FUNC:
+               ret = se->get_op();
+               operand_list = se->get_operands();
+               if(operand_list.size() > 0){
+                       seo = operand_list[0];
+                       switch(seo->get_operator_type()){
+                       case SE_PARAM:
+                               ret += "_PARAM_"+seo->get_param_name();
+                               break;
+                       case SE_IFACE_PARAM:
+                               ret += "_IPARAM_"+seo->get_ifpref()->get_pname();
+                               break;
+                       case SE_COLREF:
+                               ret += "_" + seo->get_colref()->get_field();
+                               break;
+                       case SE_AGGR_STAR:
+                       case SE_AGGR_SE:
+                       case SE_FUNC:
+                               ret += "_" + seo->get_op();
+                               break;
+               case SE_UNARY_OP:
+               case SE_BINARY_OP:
+                               ret += "_SE";
+                       break;
+                       default:
+                               ret += "_";
+                               break;
+                       }
+               }else{
+                       ret += "_func";
+               }
+               break;
+       }
+
+       if(ret == "Field"){
+               if(curr_names.count("Field0") == 0)
+                       ret = "Field0";
+       }
+       int iter = 1;
+       string base = ret;
+       while(curr_names.count(ret) > 0){
+               char tmpstr[500];
+               sprintf(tmpstr,"%s%d",base.c_str(),iter);
+               ret = tmpstr;
+               iter++;
+       }
+
+
+       curr_names.insert(ret);
+       return(ret);
+
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+//////////////         Methods of defined classes ///////////////////////
+//////////////////////////////////////////////////////////////////////
+
+//             helper fcn to enable col_id as map key.
+
+  bool operator<(const col_id &cr1, const col_id &cr2){
+       if(cr1.tblvar_ref < cr2.tblvar_ref) return(true);
+       if(cr1.tblvar_ref == cr2.tblvar_ref)
+          return (cr1.field < cr2.field);
+       return(false);
+  }
+
+
+//             Process the GB variables.
+//             At parse time, GB vars are either GB_COLREF,
+//             or GB_COMPUTED if the AS keyword is used.
+//             Cast GB vars as named entities with a SE as
+//             their definition (the colref in the case of GB_COLREF).
+//
+//             TODO: if there is a gbref in a gbdef,
+//             then I won't be able to compute the value without
+//             a complex dependence analysis.  So verify that there is no
+//             gbref in any of the GBdefs.
+//             BUT: a GBVAR_COLREF should be converted to a regular colref,
+//             which is not yet done.
+//
+//             TODO : sort out issue of GBVAR naming and identification.
+//             Determine where it is advantageous to convert GV_COLREF
+//             GBVARS to colrefs -- e.g. in group definition, in the WHERE clause,
+//             etc.
+//
+//             return -1 if there is a problem.
+
+int gb_table::add_gb_attr(
+                                                 gb_t *gb,
+                                                 tablevar_list_t *fm,
+                                                 table_list *schema,
+                                                 table_exp_t *fta_tree,
+                                                 ext_fcn_list *Ext_fcns
+                                                 ){
+       colref_t *cr;
+       int retval;
+       gb_table_entry *entry;
+
+       if(gb->type == GB_COLREF){
+               if(gb->table != "")
+                       cr = new colref_t(
+                               gb->interface.c_str(),gb->table.c_str(), gb->name.c_str()
+                       );
+               else
+                       cr = new colref_t(gb->name.c_str());
+
+               int tablevar_ref = infer_tablevar_from_colref(cr, fm, schema);
+               if(tablevar_ref < 0) return(tablevar_ref);
+
+               cr->set_tablevar_ref(tablevar_ref);
+               cr->set_schema_ref(fm->get_schema_ref(tablevar_ref));
+               cr->set_interface("");
+               cr->set_table_name(fm->get_tablevar_name(tablevar_ref));
+
+               entry = new gb_table_entry();
+               entry->name.field = cr->get_field();
+               entry->name.tblvar_ref = tablevar_ref;
+               entry->definition = new scalarexp_t(cr);
+               entry->ref_type = GBVAR_COLREF;
+       }else{
+               entry = new gb_table_entry();
+               entry->name.field = gb->name;
+               entry->name.tblvar_ref = -1;
+               entry->definition = gb->def;
+               entry->ref_type = GBVAR_SE;
+       }
+
+       retval = verify_colref(entry->definition, fm, schema, NULL);
+       if(retval < 0) return(retval);
+
+       retval = assign_data_types(entry->definition, schema, fta_tree, Ext_fcns);
+       if(retval < 0) return(retval);
+
+//             Verify that the gbvar def references no aggregates and no gbvars.
+       if(count_gb_se(entry->definition) > 0){
+               fprintf(stderr,"ERROR, group-by variable %s references other group-by variables in its definition.\n",entry->name.field.c_str() );
+               return(-1);
+       }
+       if(count_aggr_se(entry->definition, true) > 0){
+               fprintf(stderr,"ERROR, group-by variable %s references aggregates in its definition.\n",entry->name.field.c_str() );
+               return(-1);
+       }
+
+//                     Check for duplicates
+       int i;
+       for(i=0;i<gtbl.size();++i){
+               if(entry->name.field == gtbl[i]->name.field){
+                       fprintf(stderr,"ERROR, duplicate group-by variable name %s, positions %d and %lu.\n",entry->name.field.c_str(),i,gtbl.size());
+                       return -1;
+               }
+       }
+
+
+       gtbl.push_back(entry);
+
+       return(1);
+}
+
+
+//                     Try to determine if the colref is actually
+//                     a gbvar ref.
+//                     a) if no tablename associated with the colref,
+//                             1) try to find a matching GB_COMPUTED gbvar.
+//                             2) failing that, try to match to a single tablevar
+//                             3) if successful, search among GB_COLREF
+//                     b) else, try to match the tablename to a single tablevar
+//                             if successful, search among GB_COLREF
+int gb_table::find_gb(colref_t *cr, tablevar_list_t *fm, table_list *schema){
+       string c_field = cr->get_field();
+       int c_tblref;
+       int n_tbl;
+       int i;
+       vector<int> candidates;
+
+       if(cr->uses_default_table()){
+               for(i=0;i<gtbl.size();i++){
+                       if(gtbl[i]->ref_type==GBVAR_SE && c_field == gtbl[i]->name.field){
+                               return(i);
+                       }
+               }
+               candidates = find_source_tables(c_field, fm, schema);
+               if(candidates.size() != 1) return(-1); // can't find unique tablevar
+               for(i=0;i<gtbl.size();i++){
+                       if(gtbl[i]->ref_type==GBVAR_COLREF &&
+                                 c_field == gtbl[i]->name.field &&
+                                 candidates[0] == gtbl[i]->name.tblvar_ref){
+                               return(i);
+                       }
+               }
+               return(-1); // colref is not in gb table.
+       }
+
+//                     A table name must have been given.
+       vector<tablevar_t *> fm_tbls = fm->get_table_list();
+       string interface = cr->get_interface();
+       string table_name = cr->get_table_name();
+
+
+//                     if no interface name is given, try to search for the table
+//                     name among the tablevar names first.
+       if(interface==""){
+               for(i=0;i<fm_tbls.size();++i){
+                       if(table_name == fm_tbls[i]->get_var_name() && interface == fm_tbls[i]->get_interface())
+                               candidates.push_back(i);
+               }
+               if(candidates.size()>1) return(-1);
+               if(candidates.size()==1){
+                       for(i=0;i<gtbl.size();i++){
+                               if(gtbl[i]->ref_type==GBVAR_COLREF &&
+                                       c_field == gtbl[i]->name.field &&
+                                       candidates[0] == gtbl[i]->name.tblvar_ref){
+                                       return(i);
+                               }
+                       }
+                       return(-1);  // match semantics of bind to tablevar name first
+               }
+       }
+
+//             Interface name given, or no interface but no
+//             no tablevar match.  Try to match on schema name.
+       for(i=0;i<fm_tbls.size();++i){
+               if(table_name == fm_tbls[i]->get_var_name() && interface == fm_tbls[i]->get_interface())
+                       candidates.push_back(i);
+       }
+       if(candidates.size() != 1) return(-1);
+       for(i=0;i<gtbl.size();i++){
+               if(gtbl[i]->ref_type==GBVAR_COLREF &&
+                       c_field == gtbl[i]->name.field &&
+                       candidates[0] == gtbl[i]->name.tblvar_ref){
+                       return(i);
+               }
+       }
+
+//             No match found.
+       return(-1);
+
+}
+
+
+
+bool aggr_table_entry::fta_legal(ext_fcn_list *Ext_fcns){
+       if(is_builtin()){
+               if( (op == "COUNT") || (op == "SUM") || (op == "MIN") ||
+                       (op == "MAX") || (op == "AND_AGGR") || (op == "OR_AGGR") ||
+                       (op == "XOR_AGGR") )
+                               return(true);
+       }else{
+               return Ext_fcns->fta_legal(fcn_id);
+       }
+       return(false);
+}
+
+
+//             Return the set of subaggregates required to compute
+//             the desired aggregate.  THe operand of the subaggregates
+//             can only be * or the scalarexp used in the superaggr.
+//             This is indicated by the use_se vector.
+
+//             Is this code generation specific?
+
+vector<string> aggr_table_entry::get_subaggr_fcns(vector<bool> &use_se){
+       vector<string> ret;
+
+       if(op == "COUNT"){
+               ret.push_back("COUNT");
+               use_se.push_back(false);
+       }
+       if(op == "SUM"){
+               ret.push_back("SUM");
+               use_se.push_back(true);
+       }
+       if(op == "AVG"){
+               ret.push_back("SUM");
+               ret.push_back("COUNT");
+               use_se.push_back(true);
+               use_se.push_back(false);
+       }
+       if(op == "MIN"){
+               ret.push_back("MIN");
+               use_se.push_back(true);
+       }
+       if(op == "MAX"){
+               ret.push_back("MAX");
+               use_se.push_back(true);
+       }
+       if(op == "AND_AGGR"){
+               ret.push_back("AND_AGGR");
+               use_se.push_back(true);
+       }
+       if(op == "OR_AGGR"){
+               ret.push_back("OR_AGGR");
+               use_se.push_back(true);
+       }
+       if(op == "XOR_AGGR"){
+               ret.push_back("XOR_AGGR");
+               use_se.push_back(true);
+       }
+
+       return(ret);
+}
+
+//                     Code generation specific?
+
+vector<data_type *> aggr_table_entry::get_subaggr_dt(){
+       vector<data_type *> ret;
+       data_type *dt;
+
+       if(op == "COUNT"){
+               dt = new data_type("Int"); // was Uint
+               ret.push_back( dt );
+       }
+       if(op == "SUM"){
+               dt = new data_type();
+               dt->set_aggr_data_type( "SUM",operand->get_data_type() );
+               ret.push_back(dt);
+       }
+       if(op == "AVG"){
+               dt = new data_type();
+               dt->set_aggr_data_type( "SUM",operand->get_data_type() );
+               ret.push_back( dt );
+               dt = new data_type("Int");
+               ret.push_back( dt );
+       }
+       if(op == "MIN"){
+               dt = new data_type();
+               dt->set_aggr_data_type( "MIN",operand->get_data_type() );
+               ret.push_back( dt );
+       }
+       if(op == "MAX"){
+               dt = new data_type();
+               dt->set_aggr_data_type( "MAX",operand->get_data_type() );
+               ret.push_back( dt );
+       }
+       if(op == "AND_AGGR"){
+               dt = new data_type();
+               dt->set_aggr_data_type( "AND_AGGR",operand->get_data_type() );
+               ret.push_back( dt );
+       }
+       if(op == "OR_AGGR"){
+               dt = new data_type();
+               dt->set_aggr_data_type( "OR_AGGR",operand->get_data_type() );
+               ret.push_back( dt );
+       }
+       if(op == "XOR_AGGR"){
+               dt = new data_type();
+               dt->set_aggr_data_type( "XOR_AGGR",operand->get_data_type() );
+               ret.push_back( dt );
+       }
+
+       return(ret);
+}
+
+//             Code generation specific?
+
+scalarexp_t *aggr_table_entry::make_superaggr_se(vector<scalarexp_t *> se_refs){
+       scalarexp_t *se_l, *se_r, *ret_se = NULL;
+
+       if(op == "COUNT"){
+               ret_se = scalarexp_t::make_se_aggr("SUM", se_refs[0]);
+               return(ret_se);
+       }
+       if(op == "SUM"){
+               ret_se = scalarexp_t::make_se_aggr("SUM", se_refs[0]);
+               return(ret_se);
+       }
+       if(op == "AVG"){
+               se_l = scalarexp_t::make_se_aggr("SUM", se_refs[0]);
+               se_r = scalarexp_t::make_se_aggr("SUM", se_refs[1]);
+
+               ret_se = new scalarexp_t("/", se_l, se_r);
+               return(ret_se);
+       }
+       if(op == "MIN"){
+               ret_se = scalarexp_t::make_se_aggr("MIN", se_refs[0]);
+               return(ret_se);
+       }
+       if(op == "MAX"){
+               ret_se = scalarexp_t::make_se_aggr("MAX", se_refs[0]);
+               return(ret_se);
+       }
+       if(op == "AND_AGGR"){
+               ret_se = scalarexp_t::make_se_aggr("AND_AGGR", se_refs[0]);
+               return(ret_se);
+       }
+       if(op == "OR_AGGR"){
+               ret_se = scalarexp_t::make_se_aggr("OR_AGGR", se_refs[0]);
+               return(ret_se);
+       }
+       if(op == "XOR_AGGR"){
+               ret_se = scalarexp_t::make_se_aggr("XOR_AGGR", se_refs[0]);
+               return(ret_se);
+       }
+
+       return(ret_se);
+
+}
+
+
+//             Add a built-in aggr.
+int aggregate_table::add_aggr(string op, scalarexp_t *se, bool is_super){
+       int i;
+
+       for(i=0;i<agr_tbl.size();i++){
+               if(agr_tbl[i]->is_builtin() && op == agr_tbl[i]->op
+                 && is_equivalent_se(se,agr_tbl[i]->operand) ){
+//               && is_super == agr_tbl[i]->is_superaggr())
+                       if(is_super) agr_tbl[i]->set_super(true);
+                       return(i);
+               }
+       }
+
+       aggr_table_entry *ate = new aggr_table_entry(op, se, is_super);
+       agr_tbl.push_back(ate);
+       return(agr_tbl.size() - 1);
+}
+
+//             add a UDAF
+int aggregate_table::add_aggr(string op, int fcn_id, vector<scalarexp_t *> opl, data_type *sdt, bool is_super, bool is_running, bool has_lfta_bailout){
+       int i,o;
+
+       for(i=0;i<agr_tbl.size();i++){
+               if((! agr_tbl[i]->is_builtin()) && fcn_id == agr_tbl[i]->fcn_id
+                               && opl.size() == agr_tbl[i]->oplist.size() ){
+//                             && is_super == agr_tbl[i]->is_superaggr() ){
+                       for(o=0;o<opl.size();++o){
+                               if(! is_equivalent_se(opl[o],agr_tbl[i]->oplist[o]) )
+                                       break;
+                       }
+                       if(o == opl.size()){
+                               if(is_super) agr_tbl[i]->set_super(true);
+                               return i;
+                       }
+               }
+       }
+
+       aggr_table_entry *ate = new aggr_table_entry(op, fcn_id, opl, sdt,is_super,is_running, has_lfta_bailout);
+       agr_tbl.push_back(ate);
+       return(agr_tbl.size() - 1);
+}
+
+
+int cplx_lit_table::add_cpx_lit(literal_t *l, bool is_handle_ref){
+       int i;
+
+       for(i=0;i<cplx_lit_tbl.size();i++){
+               if(l->is_equivalent(cplx_lit_tbl[i])){
+                       hdl_ref_tbl[i] = hdl_ref_tbl[i] | is_handle_ref;
+                       return(i);
+               }
+       }
+
+       cplx_lit_tbl.push_back(l);
+       hdl_ref_tbl.push_back(is_handle_ref);
+       return(cplx_lit_tbl.size() - 1);
+}
+
+
+
+//------------------------------------------------------------
+//             parse_fta code
+
+
+gb_t *gb_t::duplicate(){
+       gb_t *ret = new gb_t(interface.c_str(), table.c_str(), name.c_str());
+       ret->type = type;
+       ret->lineno = lineno;
+       ret->charno = charno;
+       if(def != NULL)
+               ret->def = dup_se(def,NULL);
+       return ret;
+}
diff --git a/src/ftacmp/analyze_fta.h b/src/ftacmp/analyze_fta.h
new file mode 100644 (file)
index 0000000..32833c5
--- /dev/null
@@ -0,0 +1,784 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef __ANALYZE_FTA_H_DEFINED__
+#define __ANALYZE_FTA_H_DEFINED__
+
+
+
+#include "parse_fta.h"
+#include "parse_schema.h"
+#include"type_objects.h"
+#include "parse_ext_fcns.h"
+#include "iface_q.h"
+
+
+#include<set>
+#include<algorithm>
+using namespace std;
+
+
+//             Represent a component of a predicate,
+//             these components are ANDed together.
+//             Often they are simple enough to analyze.
+class cnf_elem{
+public:
+       int is_atom;    // i.e., is an atomic predicate
+       int eq_pred;    // And, it is a test for equality
+       int in_pred;    // Or, it is a an IN predicate
+
+       int pr_gb;              // the predicate refs a gb column.
+       int pr_attr;    // the predicate refs a table column.
+       int pr_aggr;    // the predicate refs an aggregate
+
+       int l_simple;   // the lhs is simple (just a colref)
+       int l_gb;               // the lhs refs a gb var
+       int l_attr;             // the lhs refs a table column
+       int l_aggr;             // the lhs refs an aggregate.
+
+       int r_simple;   // the rhs is simple (just a colref)
+       int r_gb;               // the rhs refs a gb var
+       int r_attr;             // the rhs refs a table column
+       int r_aggr;             // the rhs refs an aggregate.
+
+       int cost;               // an estiamte of the evaluation cost.
+
+   predicate_t *pr;
+
+       cnf_elem(predicate_t *p){
+               is_atom = 0;
+               eq_pred = 0; in_pred = 0;
+               pr_gb = pr_attr = pr_aggr = 0;
+               l_simple = l_gb = l_attr = l_aggr = 0;
+               r_simple = r_gb = r_attr = r_aggr = 0;
+               pr = p;
+       };
+
+       cnf_elem(){ is_atom = 0;
+               eq_pred = 0; in_pred = 0;
+               pr_gb = pr_attr = pr_aggr = 0;
+               l_simple = l_gb = l_attr = l_aggr = 0;
+               r_simple = r_gb = r_attr = r_aggr = 0;
+               pr = NULL;
+       };
+
+
+
+       void swap_scalar_operands(){
+       int tmp;
+       if(in_pred) return;     // can't swap IN predicates, se list always on right.
+       if(! is_atom) return;   // can only swap scalar expressions.
+
+       tmp = l_simple; l_simple = r_simple; r_simple = tmp;
+       tmp = l_gb; l_gb = r_gb; r_gb = tmp;
+       tmp = l_attr; l_attr = r_attr; r_attr = tmp;
+       tmp = l_aggr; l_aggr = r_aggr; r_aggr = tmp;
+
+       pr->swap_scalar_operands();
+  }
+};
+
+
+//             A GB variable is identified by its name and
+//             its source table variable -- so that joins can be expressed.
+//             GB Vars defined AS a scalar expression have a null tableref.
+
+struct col_id{
+  std::string field;
+  int tblvar_ref;
+//             Also carry the schema ref -- used to get data type info
+//             when defining variables.
+  int schema_ref;
+
+  col_id(){tblvar_ref = -1;};
+  col_id(colref_t *cr){
+         field = cr->field;
+         tblvar_ref = cr-> get_tablevar_ref();
+         schema_ref = cr->get_schema_ref();
+  };
+
+
+
+  void load_from_colref(colref_t *cr){
+         field = cr->field;
+         tblvar_ref = cr-> get_tablevar_ref();
+         schema_ref = cr->get_schema_ref();
+  };
+};
+
+struct lt_col_id{
+  bool operator()(const col_id &cr1, const col_id &cr2) const{
+       if(cr1.tblvar_ref < cr2.tblvar_ref) return(1);
+       if(cr1.tblvar_ref == cr2.tblvar_ref)
+          return (cr1.field < cr2.field);
+       return(0);
+  }
+};
+
+  bool operator<(const col_id &cr1, const col_id &cr2);
+
+
+//             Every GB variable is represented by its name
+//             (defined above) and the scalar expression which
+//             defines its value.  If the GB var is devlared as a
+//             colref, the add_gb_attr method of gb_table will
+//             create an SE consisting of the colref.
+//                     NOTE : using col_id is dangerous when the
+//                                     agregation operator is defiend over a self-join
+
+#define GBVAR_COLREF 1
+#define GBVAR_SE 2
+
+struct gb_table_entry{
+       col_id name;            // tblref in col_id refers to the tablevar.
+       scalarexp_t *definition;
+       int ref_type;
+
+       gb_table_entry(){
+               definition = NULL;
+       };
+       data_type *get_data_type(){
+               return(definition->get_data_type());
+       };
+       void reset_temporal(){
+               if(definition) definition->reset_temporal();
+       }
+};
+
+
+//             The GB table is the symbol table containing
+//             the GB vars.  This object puts a wrapper around
+//             access to the table.
+
+class gb_table{
+private:
+       std::vector<gb_table_entry *> gtbl;
+
+public:
+       std::vector<vector<bool> > gb_patterns;
+//             rollup, cube, and grouping_sets cannot be readily reconstructed by
+//             analyzing the patterns, so explicitly record them here.
+//             used only so that sgah_qpn::to_query_string produces 
+//             something meaningful.
+       std::vector<std::string> gb_entry_type;
+       std::vector<int> gb_entry_count;
+       std::vector<std::vector<std::vector<bool> > > pattern_components;
+
+       gb_table(){};
+
+       int add_gb_attr(gb_t *c, tablevar_list_t *fm, table_list *schema,
+                                       table_exp_t *fta_tree, ext_fcn_list *Ext_fcns);
+
+       void add_gb_var(std::string n, int t, scalarexp_t *d, int rt){
+               gb_table_entry *entry = new gb_table_entry();
+               entry->name.field = n;
+               entry->name.tblvar_ref = t;
+               entry->definition = d;
+               entry->ref_type = rt;
+               gtbl.push_back(entry);
+       };
+       data_type *get_data_type(int g){return(gtbl[g]->get_data_type());       };
+       int find_gb(colref_t *c, tablevar_list_t *fm, table_list *schema);
+       scalarexp_t *get_def(int i){return gtbl[i]->definition; };
+       std::string get_name(int i){return gtbl[i]->name.field; };
+       int get_tblvar_ref(int i){return gtbl[i]->name.tblvar_ref;      };
+       int get_reftype(int i){return gtbl[i]->ref_type;        };
+       int size(){return(gtbl.size()); };
+       void set_pattern_info(gb_table *g){
+               gb_patterns = g->gb_patterns;
+               gb_entry_type = g->gb_entry_type;
+               gb_entry_count = g->gb_entry_count;
+               pattern_components = g->pattern_components;
+       }
+       void reset_temporal(int i){
+               gtbl[i]->reset_temporal();
+       }
+};
+
+
+
+//                     Represent an aggregate to be calculated.
+//                     The unique identifier is the aggregate fcn, and the
+//                     expression aggregated over.
+//                     TODO: unify udaf with built-in better
+//                             (but then again, the core dumps help with debugging)
+
+struct aggr_table_entry{
+       std::string op;
+       scalarexp_t *operand;
+       std::vector<scalarexp_t *> oplist;
+       int fcn_id;             // -1 for built-in aggrs.
+       data_type *sdt; // storage data type.
+       data_type *rdt; // return value data type.
+       bool is_superag;
+       bool is_running;
+       bool bailout;
+
+       aggr_table_entry(){ sdt = NULL; rdt = NULL; is_superag = false;};
+       aggr_table_entry(std::string o, scalarexp_t *se, bool s){
+               op = o; operand = se; fcn_id = -1; sdt = NULL;
+               if(se){
+                       rdt = new data_type();
+                       rdt->set_aggr_data_type(o,se->get_data_type());
+               }else{
+                       rdt = new data_type("INT");
+               }
+               is_superag = s;
+               is_running = false;
+               bailout = false;
+       };
+       aggr_table_entry(std::string o, int f, std::vector<scalarexp_t *> s, data_type *st, bool spr, bool r, bool b_o){
+               op = o;
+               fcn_id = f;
+               operand = NULL;
+               oplist = s;
+               sdt = st;
+               rdt = NULL;
+               is_superag = spr;
+               is_running = r;
+               bailout = b_o;
+       }
+
+       bool fta_legal(ext_fcn_list *Ext_fcns);
+    bool is_star_aggr(){return operand==NULL;};
+       bool is_builtin(){return fcn_id < 0;};
+       int get_fcn_id(){return fcn_id;};
+       bool is_superaggr(){return is_superag;};
+       bool is_running_aggr(){return is_running;};
+       bool has_bailout(){return bailout;};
+    void set_super(bool s){is_superag = s;};
+
+       std::vector<std::string> get_subaggr_fcns(std::vector<bool> &use_se);
+       std::vector<data_type *> get_subaggr_dt();
+       scalarexp_t *make_superaggr_se(std::vector<scalarexp_t *> se_refs);
+       data_type *get_storage_type(){return sdt;};
+       std::vector<scalarexp_t *> get_operand_list(){return oplist;};
+
+       aggr_table_entry *duplicate(){
+               aggr_table_entry *dup = new aggr_table_entry();
+               dup->op = op;
+               dup->operand = operand;
+               dup->oplist = oplist;
+               dup->fcn_id = fcn_id;
+               dup->sdt = sdt;
+               dup->rdt = rdt;
+               dup->is_superag = is_superag;
+               dup->is_running = is_running;
+               dup->bailout = bailout;
+               return dup;
+       }
+
+       static bool superaggr_allowed(std::string op, ext_fcn_list *Ext_fcns){
+               if(op == "SUM" || op == "COUNT" || op == "MIN" || op=="MAX")
+                       return true;
+               return false;
+       }
+
+       bool superaggr_allowed(){
+               if(is_builtin())
+                       return aggr_table_entry::superaggr_allowed(op,NULL);
+//             Currently, no UDAFS allowed as superaggregates
+               return false;
+       }
+
+       static bool multiple_return_allowed(bool is_built_in, ext_fcn_list *Ext_fcns, int fcn_id){
+               if(is_built_in)
+                       return true;
+//                     Currently, no UDAFS allowed as stateful fcn params.
+//                     in cleaning_when, cleaning_by clauses.
+               if(Ext_fcns->is_running_aggr(fcn_id) || Ext_fcns->multiple_returns(fcn_id))
+                       return true;
+               return false;
+       }
+
+};
+
+
+class aggregate_table{
+public:
+       std::vector<aggr_table_entry *> agr_tbl;
+
+       aggregate_table(){};
+
+       int add_aggr(std::string op, scalarexp_t *se, bool is_spr);
+       int add_aggr(std::string op, int fcn_id, std::vector<scalarexp_t *> opl, data_type *sdt, bool is_spr, bool is_running, bool has_lfta_bailout);
+       int add_aggr(aggr_table_entry *a){agr_tbl.push_back(a); return agr_tbl.size(); };
+       int size(){return(agr_tbl.size());      };
+       scalarexp_t *get_aggr_se(int i){return agr_tbl[i]->operand;     };
+
+       data_type *get_data_type(int i){
+//             if(agr_tbl[i]->op == "COUNT")
+//                      return new data_type("uint");
+//             else
+                       if(! agr_tbl[i]->rdt){
+                               fprintf(stderr,"INTERNAL ERROR in aggregate_table::get_data_type : rdt is NULL.\n");
+                               exit(1);
+                       }
+                       return agr_tbl[i]->rdt;
+       };
+
+       std::string get_op(int i){return agr_tbl[i]->op;};
+
+       bool fta_legal(int i,ext_fcn_list *Ext_fcns){return agr_tbl[i]->fta_legal(Ext_fcns);    };
+    bool is_star_aggr(int i){return agr_tbl[i]->is_star_aggr(); };
+       bool is_builtin(int i){return agr_tbl[i]->is_builtin(); };
+       int get_fcn_id(int i){return agr_tbl[i]->get_fcn_id();};
+       bool is_superaggr(int i){return agr_tbl[i]->is_superaggr();};
+       bool is_running_aggr(int i){return agr_tbl[i]->is_running_aggr();};
+       bool has_bailout(int i){return agr_tbl[i]->has_bailout();};
+//     bool multiple_return_allowed(int i){
+//             return agr_tbl[i]->multiple_return_allowed(agr_tbl[i]->is_builtin(),NULL);
+//     };
+       bool superaggr_allowed(int i){return agr_tbl[i]->superaggr_allowed();};
+       std::vector<scalarexp_t *> get_operand_list(int i){
+               return agr_tbl[i]->get_operand_list();
+       }
+
+       std::vector<std::string> get_subaggr_fcns(int i, std::vector<bool> &use_se){
+               return(agr_tbl[i]->get_subaggr_fcns(use_se) );
+       };
+
+       std::vector<data_type *> get_subaggr_dt(int i){
+               return(agr_tbl[i]->get_subaggr_dt() );
+       }
+       data_type *get_storage_type(int i){
+               return( agr_tbl[i]->get_storage_type());
+       }
+
+       aggr_table_entry *duplicate(int i){
+               return agr_tbl[i]->duplicate();
+       };
+
+       scalarexp_t *make_superaggr_se(int i, std::vector<scalarexp_t *> se_refs){
+               return(agr_tbl[i]->make_superaggr_se(se_refs) );
+       };
+};
+
+
+class cplx_lit_table{
+       std::vector<literal_t *> cplx_lit_tbl;
+       std::vector<bool> hdl_ref_tbl;
+
+public:
+       cplx_lit_table(){};
+
+       int add_cpx_lit(literal_t *, bool);
+       int size(){return cplx_lit_tbl.size();};
+       literal_t *get_literal(int i){return cplx_lit_tbl[i];};
+       bool is_handle_ref(int i){return hdl_ref_tbl[i];};
+
+};
+
+enum param_handle_type { cplx_lit_e, litval_e, param_e};
+
+class handle_param_tbl_entry{
+private:
+
+public:
+       std::string fcn_name;
+       int param_slot;
+       literal_t *litval;
+       int complex_literal_idx;
+       std::string param_name;
+       param_handle_type val_type;
+    std::string type_name;
+
+       handle_param_tbl_entry(std::string fname, int slot,
+                                                       literal_t *l, std::string tnm){
+               fcn_name = fname; param_slot = slot;
+               val_type = litval_e;
+               litval = l;
+               type_name = tnm;
+       };
+       handle_param_tbl_entry(std::string fname, int slot, std::string p, std::string tnm){
+               fcn_name = fname; param_slot = slot;
+               val_type = param_e;
+               param_name = p;
+               type_name = tnm;
+       };
+       handle_param_tbl_entry(std::string fname, int slot, int ci, std::string tnm){
+               fcn_name = fname; param_slot = slot;
+               val_type = cplx_lit_e;
+               complex_literal_idx = ci;
+               type_name = tnm;
+       };
+
+       std::string lfta_registration_fcn(){
+               char tmps[500];
+               sprintf(tmps,"register_handle_for_%s_slot_%d",fcn_name.c_str(),param_slot);
+               return(tmps);
+       };
+       std::string hfta_registration_fcn(){return lfta_registration_fcn();};
+
+       std::string lfta_deregistration_fcn(){
+               char tmps[500];
+               sprintf(tmps,"deregister_handle_for_%s_slot_%d",fcn_name.c_str(),param_slot);
+               return(tmps);
+       };
+       std::string hfta_rdeegistration_fcn(){return lfta_registration_fcn();};
+
+};
+
+
+class param_table{
+//                     Store the data in vectors to preserve
+//                     listing order.
+       std::vector<std::string> pname;
+       std::vector<data_type *> pdtype;
+       std::vector<bool> phandle;
+
+       int find_name(std::string n){
+               int p;
+               for(p=0;p<pname.size();++p){
+                       if(pname[p] == n) break;
+               }
+               if(p == pname.size()) return(-1);
+               return(p);
+       };
+
+public:
+       param_table(){};
+
+//                     Add the param with the given name and associated
+//                     data type and handle use.
+//                     if its a new name, return true.
+//                     Else, take OR of use_handle, return false.
+//                     (builds param table and collects handle references).
+       bool add_param(std::string pnm, data_type *pdt, bool use_handle){
+               int p = find_name(pnm);
+               if(p == -1){
+                       pname.push_back(pnm);
+                       pdtype.push_back(pdt);
+                       phandle.push_back(use_handle);
+                       return(true);
+        }else{
+                       if(use_handle) phandle[p] = use_handle;
+                       return(false);
+               }
+
+       };
+
+       int size(){return pname.size(); };
+
+       std::vector<std::string> get_param_names(){
+               return(pname);
+       };
+
+       data_type *get_data_type(std::string pnm){
+               int p = find_name(pnm);
+               if(p >= 0){
+                       return(pdtype[p]);
+               }
+               return(new data_type("undefined_type"));
+       };
+
+       bool handle_access(std::string pnm){
+               int p = find_name(pnm);
+               if(p >= 0){
+                       return(phandle[p]);
+               }
+               return(false);
+       };
+
+};
+
+
+//                     Two columns are the same if they come from the
+//                     same source, and have the same field name.
+//                     (use to determine which fields must be unpacked).
+//                     NOTE : dangerous in the presence of self-joins.
+typedef std::set<col_id, lt_col_id> col_id_set;
+
+bool contains_gb_pr(predicate_t *pr, std::set<int> &gref_set);
+bool contains_gb_se(scalarexp_t *se, std::set<int> &gref_set);
+
+
+void gather_se_col_ids(scalarexp_t *se, col_id_set &cid_set,  gb_table *gtbl);
+void gather_pr_col_ids(predicate_t *pr, col_id_set &cid_set, gb_table *gtbl);
+
+void gather_se_opcmp_fcns(scalarexp_t *se, std::set<std::string> &fcn_set);
+void gather_pr_opcmp_fcns(predicate_t *pr, std::set<std::string> &fcn_set);
+
+////////////////////////////////////////////
+//             Structures to record usage of operator views.
+
+class opview_entry{
+public:
+       std::string parent_qname;
+       std::string root_name;
+       std::string view_name;
+       std::string exec_fl;            // name of executable file (if any)
+       std::string udop_alias;         // unique ID of the UDOP
+       std::string mangler;
+       int liveness_timeout;           // maximum delay between hearbeats from udop
+       int pos;
+       std::vector<std::string> subq_names;
+
+       opview_entry(){mangler="";};
+};
+
+class opview_set{
+public:
+       std::vector<opview_entry *> opview_list;
+
+       int append(opview_entry *opv){opview_list.push_back(opv);
+                                                                 return opview_list.size()-1;};
+       int size(){return opview_list.size();};
+       opview_entry *get_entry(int i){ return opview_list[i];};
+};
+
+/////////////////////////////////////////////////////////////////
+//             Wrap up all of the analysis of the FTA into this package.
+//
+//             There is some duplication between query_summary_class,
+//             but I'd rather avoid pushing analysis structures
+//             into the parse modules.
+//
+//             TODO: revisit the issue when nested subqueries are implemented.
+//             One possibility: implement accessor methods to hide the
+//             complexity
+//             For now: this class contains data structures not in table_exp_t
+//             (with a bit of duplication)
+
+struct query_summary_class{
+       std::string query_name;                 // the name of the query, becomes the name
+                                                                       // of the output.
+       int query_type;         // e.g. SELECT, MERGE, etc.
+
+       gb_table *gb_tbl;                       // Table of all group-by attributes.
+       std::set<int> sg_tbl;           // Names of the superGB attributes
+       aggregate_table *aggr_tbl;      // Table of all referenced aggregates.
+       std::set<std::string> states_refd;      // states ref'd by stateful fcns.
+
+
+//             copied from parse tree, then into query node.
+//             interpret the string representation of data type into a type_object
+       param_table *param_tbl;         // Table of all query parameters.
+
+//             There is stuff that is not copied over by analyze_fta,
+//             it still resides in fta_tree.
+    table_exp_t *fta_tree;             // The (decorated) parse tree.
+
+
+//             This is copied from the parse tree (except for "query_name")
+//             then copied to the query node in query_plan.cc:145
+       std::map<std::string, std::string> definitions; // additional definitions.
+
+
+//             CNF representation of the where and having predicates.
+       std::vector<cnf_elem *> wh_cnf;
+       std::vector<cnf_elem *> hav_cnf;
+       std::vector<cnf_elem *> cb_cnf;
+       std::vector<cnf_elem *> cw_cnf;
+       std::vector<cnf_elem *> closew_cnf;
+
+
+
+
+//             For MERGE type queries.
+       std::vector<colref_t *> mvars;
+       scalarexp_t *slack;
+
+////////                       Constructors
+       query_summary_class(){
+               init();
+       }
+
+       query_summary_class(table_exp_t *f){
+               fta_tree = f;
+               init();
+       }
+
+/////                  Methods
+
+       bool add_query_param(std::string pnm, data_type *pdt, bool use_handle){
+               return( param_tbl->add_param(pnm,pdt,use_handle));
+       };
+
+
+private:
+       void init(){
+//             Create the gb_tbl, aggr_tbl, and param_tbl objects
+               gb_tbl = new gb_table();
+               aggr_tbl = new aggregate_table();
+               param_tbl = new param_table();
+
+       }
+};
+
+int verify_colref(scalarexp_t *se, tablevar_list_t *fm,
+                                       table_list *schema, gb_table *gtbl);
+std::string impute_query_name(table_exp_t *fta_tree, std::string default_nm);
+
+query_summary_class *analyze_fta(table_exp_t *fta_tree, table_list *schema, ext_fcn_list *Ext_fcns, std::string qname);
+bool is_equivalent_se(scalarexp_t *se1, scalarexp_t *se2);
+bool is_equivalent_se_base(scalarexp_t *se1, scalarexp_t *se2, table_list *Schema);
+bool is_equivalent_pred_base(predicate_t *p1, predicate_t *p2, table_list *Schema);
+
+bool is_equivalent_class_pred_base(predicate_t *p1, predicate_t *p2, table_list *Schema,ext_fcn_list *Ext_fcns);
+void analyze_cnf(cnf_elem *c);
+
+void find_partial_fcns(scalarexp_t *se, std::vector<scalarexp_t *> *pf_list, std::vector<int> *fcn_ref_cnt, std::vector<bool> *is_partial_fcn, ext_fcn_list *Ext_fcns);
+void find_partial_fcns_pr(predicate_t *pr, std::vector<scalarexp_t *> *pf_list,std::vector<int> *fcn_ref_cnt, std::vector<bool> *is_partial_fcn, ext_fcn_list *Ext_fcns);
+void collect_partial_fcns(scalarexp_t *se, std::set<int> &pfcn_refs);
+void collect_partial_fcns_pr(predicate_t *pr,  std::set<int> &pfcn_refs);
+
+void find_combinable_preds(predicate_t *pr,  vector<predicate_t *> *pr_list,
+                                                               table_list *Schema, ext_fcn_list *Ext_fcns);
+
+void collect_agg_refs(scalarexp_t *se, std::set<int> &agg_refs);
+void collect_aggr_refs_pr(predicate_t *pr,  std::set<int> &agg_refs);
+
+int bind_to_schema_pr(predicate_t *pr, tablevar_list_t *fm, table_list *schema);
+int bind_to_schema_se(scalarexp_t *se, tablevar_list_t *fm, table_list *schema);
+
+temporal_type compute_se_temporal(scalarexp_t *se, std::map<col_id, temporal_type> &tcol);
+
+
+bool find_complex_literal_se(scalarexp_t *se, ext_fcn_list *Ext_fcns,
+                                                               cplx_lit_table *complex_literals);
+void find_complex_literal_pr(predicate_t *pr, ext_fcn_list *Ext_fcns,
+                                                               cplx_lit_table *complex_literals);
+void find_param_handles_se(scalarexp_t *se, ext_fcn_list *Ext_fcns,
+                                               std::vector<handle_param_tbl_entry *> &handle_tbl);
+void find_param_handles_pr(predicate_t *pr, ext_fcn_list *Ext_fcns,
+                                               std::vector<handle_param_tbl_entry *> &handle_tbl);
+
+//             Copy a scalar expression / predicate tree
+scalarexp_t *dup_se(scalarexp_t *se, aggregate_table *aggr_tbl);
+select_element *dup_select(select_element *sl, aggregate_table *aggr_tbl);
+predicate_t *dup_pr(predicate_t *pr, aggregate_table *aggr_tbl);
+
+//             Expand gbvars
+void expand_gbvars_pr(predicate_t *pr, gb_table &gb_tbl);
+scalarexp_t *expand_gbvars_se(scalarexp_t *se, gb_table &gb_tbl);
+
+
+//             copy a query
+table_exp_t *dup_table_exp(table_exp_t *te);
+
+
+//             Tie colrefs to a new range var
+void bind_colref_se(scalarexp_t *se,
+                                 std::vector<tablevar_t *> &fm,
+                                 int prev_ref, int new_ref
+                                );
+void bind_colref_pr(predicate_t *pr,
+                                 std::vector<tablevar_t *> &fm,
+                                 int prev_ref, int new_ref
+                                );
+
+
+std::string impute_colname(std::vector<select_element *> &sel_list, scalarexp_t *se);
+std::string impute_colname(std::set<std::string> &curr_names, scalarexp_t *se);
+
+bool is_literal_or_param_only(scalarexp_t *se);
+
+
+void build_aggr_tbl_fm_pred(predicate_t *pr, aggregate_table *agr_tbl);
+void build_aggr_tbl_fm_se(scalarexp_t *se, aggregate_table *agr_tbl);
+
+void compute_cnf_cost(cnf_elem *cm, ext_fcn_list *Ext_fcns);
+struct compare_cnf_cost{
+  bool operator()(const cnf_elem *c1, const cnf_elem *c2) const{
+       if(c1->cost < c2->cost) return(true);
+       return(false);
+  }
+};
+
+void get_tablevar_ref_se(scalarexp_t *se, std::vector<int> &reflist);
+void get_tablevar_ref_pr(predicate_t *pr, std::vector<int> &reflist);
+
+long long int find_temporal_divisor(scalarexp_t *se, gb_table *gbt, std::string &fnm);
+
+
+int count_se_ifp_refs(scalarexp_t *se, std::set<std::string> &ifpnames);
+int count_pr_ifp_refs(predicate_t *pr, std::set<std::string> &ifpnames);
+int resolve_se_ifp_refs(scalarexp_t *se, std::string ifm, std::string ifn, ifq_t *ifdb,  std::string &err);
+int resolve_pr_ifp_refs(predicate_t *pr, std::string ifm, std::string ifn, ifq_t *ifdb,  std::string &err);
+
+int pred_refs_sfun(predicate_t *pr);
+int se_refs_sfun(scalarexp_t *se);
+
+
+//             Represent preds for the prefilter, and
+//             the LFTAs which reference them.
+struct cnf_set{
+       predicate_t *pr;
+       std::set<int> lfta_id;
+       std::set<unsigned int> pred_id;
+
+       cnf_set(){};
+       cnf_set(predicate_t *p, unsigned int l, unsigned int i){
+               pr = dup_pr(p,NULL);            // NEED TO UPDATE dup_se TO PROPAGATE
+               lfta_id.insert(l);
+               pred_id.insert((l << 16)+i);
+       }
+       void subsume(cnf_set *c){
+               std::set<int>::iterator ssi;
+               for(ssi=c->lfta_id.begin();ssi!=c->lfta_id.end();++ssi){
+                       lfta_id.insert((*ssi));
+               }
+               std::set<unsigned int >::iterator spi;
+               for(spi=c->pred_id.begin();spi!=c->pred_id.end();++spi){
+                       pred_id.insert((*spi));
+               }
+       }
+       void combine_pred(cnf_set *c){
+               pr = new predicate_t("AND",pr,c->pr);
+               std::set<unsigned int >::iterator spi;
+               for(spi=c->pred_id.begin();spi!=c->pred_id.end();++spi){
+                       pred_id.insert((*spi));
+               }
+       }
+
+       void add_pred_ids(set<unsigned int> &pred_set){
+               std::set<unsigned int >::iterator spi;
+               for(spi=pred_id.begin();spi!=pred_id.end();++spi){
+                       pred_set.insert((*spi));
+               }
+       }
+
+       static unsigned int make_lfta_key(unsigned int l){
+               return l << 16;
+       }
+
+
+       ~cnf_set(){};
+};
+struct compare_cnf_set{
+  bool operator()(const cnf_set *c1, const cnf_set *c2) const{
+       if(c1->lfta_id.size() > c2->lfta_id.size()) return(true);
+       return(false);
+  }
+};
+
+bool operator<(const cnf_set &c1, const cnf_set &c2);
+
+
+void find_common_filter(std::vector< std::vector<cnf_elem *> > &where_list, table_list *Schema, ext_fcn_list *Ext_fcns, std::vector<cnf_set *> &prefilter_preds, std::set<unsigned int> &pred_ids);
+
+
+cnf_elem *find_common_filter(std::vector< std::vector<cnf_elem *> > &where_list, table_list *Schema);
+
+std::string int_to_string(int i);
+void insert_gb_def_pr(predicate_t *pr, gb_table *gtbl);
+void insert_gb_def_se(scalarexp_t *se, gb_table *gtbl);
+
+
+
+
+#endif
+
diff --git a/src/ftacmp/ext_fcns.l b/src/ftacmp/ext_fcns.l
new file mode 100644 (file)
index 0000000..084ae3a
--- /dev/null
@@ -0,0 +1,170 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+/*
+       MUST COMPILE WITH
+               flex -PExt_fcnsParser -oext_fcnslexer.cc ext_fcns.l
+       (or equivalent).
+*/     
+
+%{
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_ext_fcns.h"
+ #include <string.h>
+
+
+
+#include "ext_fcns.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int Ext_fcnsParserwrap(){return(1);}
+
+extern int Ext_fcnsParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_lineno : the line currently being parsed when the error occurs.
+               flexch : the character on the line where the error occurs
+               flex_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_ext_fcns_lineno = 1;
+int flex_ext_fcns_ch = 0;
+char flex_ext_fcns_linebuf[20000];
+
+//void Ext_fcnsParsererror(char *s);
+
+void Ext_fcnsParsererror(char *s){
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_ext_fcns_lineno, flex_ext_fcns_ch, s, Ext_fcnsParsertext, flex_ext_fcns_linebuf );
+       fprintf(stderr,"%*s\n",1+flex_ext_fcns_ch,"^");
+}
+
+
+%}
+       /* MKS needs the next line to increase the NFA table */
+%e 1200
+%option noyywrap
+
+%%
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+FUN            { flex_ext_fcns_ch+=Ext_fcnsParserleng; return FUN; }
+PRED   { flex_ext_fcns_ch+=Ext_fcnsParserleng; return PRED; }
+UDAF   { flex_ext_fcns_ch+=Ext_fcnsParserleng; return UDAF; }
+EXTR   { flex_ext_fcns_ch+=Ext_fcnsParserleng; return EXTR; }
+STATE  { flex_ext_fcns_ch+=Ext_fcnsParserleng; return STATE; }
+SFUN   { flex_ext_fcns_ch+=Ext_fcnsParserleng; return SFUN; }
+HANDLE         { flex_ext_fcns_ch+=Ext_fcnsParserleng; return HANDLE; }
+CONST          { flex_ext_fcns_ch+=Ext_fcnsParserleng; return CONST; }
+CLASS          { flex_ext_fcns_ch+=Ext_fcnsParserleng; return CLASS; }
+;      {flex_ext_fcns_ch+=Ext_fcnsParserleng; return SEMICOLON;}
+
+[(),\[\]]    { flex_ext_fcns_ch+=Ext_fcnsParserleng; return yytext[0]; }
+
+
+       /* names */
+
+[A-Za-z][A-Za-z0-9_]*  { flex_ext_fcns_ch+=Ext_fcnsParserleng; Ext_fcnsParserlval.strval = strdup(yytext); return NAME; }
+
+       /* numbers */
+
+[0-9]+ |
+[0-9]+UL       { flex_ext_fcns_ch+=Ext_fcnsParserleng; Ext_fcnsParserlval.strval = strdup(yytext);  return INTNUM; }
+
+       /* strings */
+
+'[^'\n]*'      {
+               
+               int c;
+               
+               Ext_fcnsParserlval.strval = strdup(Ext_fcnsParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_ext_fcns_ch+=Ext_fcnsParserleng; 
+                       Ext_fcnsParserlval.strval[Ext_fcnsParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+               
+'[^'\n]*$      { flex_ext_fcns_ch+=Ext_fcnsParserleng; Ext_fcnsParsererror("Unterminated string"); }
+
+
+
+ /*                                                                                                                    */
+ /*            Newline : advance the error reporting line number       */
+ /*            and grab the next line into flex_linebuf                        */
+ /*                                                                                                                    */
+
+\n.*           {flex_ext_fcns_ch=0; flex_ext_fcns_lineno++;
+                          strcpy(flex_ext_fcns_linebuf,Ext_fcnsParsertext+1);
+                          yyless(1);
+                          }
+
+[ \t\r]+       {flex_ext_fcns_ch+=Ext_fcnsParserleng; }        /* white space */
+
+"--".*$                {flex_ext_fcns_ch+=Ext_fcnsParserleng; };       /* comment */
+"//".*$                {flex_ext_fcns_ch+=Ext_fcnsParserleng; };       /* comment */
+
+ /*            Parse error on anything else.           */                              
+.|\n                   {fprintf(stderr,"Warning: unknown token (ignored)\n");  Ext_fcnsParsererror(yytext);}
+
+%%
+
+
diff --git a/src/ftacmp/ext_fcns.tab.cc b/src/ftacmp/ext_fcns.tab.cc
new file mode 100644 (file)
index 0000000..168c7b3
--- /dev/null
@@ -0,0 +1,1493 @@
+/* A Bison parser, made from ext_fcns.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON        1
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* If NAME_PREFIX is specified substitute the variables and functions
+   names.  */
+#define yyparse Ext_fcnsParserparse
+#define yylex   Ext_fcnsParserlex
+#define yyerror Ext_fcnsParsererror
+#define yylval  Ext_fcnsParserlval
+#define yychar  Ext_fcnsParserchar
+#define yydebug Ext_fcnsParserdebug
+#define yynerrs Ext_fcnsParsernerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259,
+     INTNUM = 260,
+     SEMICOLON = 261,
+     HANDLE = 262,
+     CONST = 263,
+     CLASS = 264,
+     FUN = 265,
+     PRED = 266,
+     EXTR = 267,
+     UDAF = 268,
+     STATE = 269,
+     SFUN = 270
+   };
+#endif
+#define NAME 258
+#define STRING_TOKEN 259
+#define INTNUM 260
+#define SEMICOLON 261
+#define HANDLE 262
+#define CONST 263
+#define CLASS 264
+#define FUN 265
+#define PRED 266
+#define EXTR 267
+#define UDAF 268
+#define STATE 269
+#define SFUN 270
+
+
+
+
+/* Copy the first part of user declarations.  */
+#line 8 "ext_fcns.y"
+
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "parse_ext_fcns.h"
+
+/*             Interface to ext_fcns parser    */
+       int yyparse();
+       void yyerror(char *s);
+       int yylex();
+extern int flex_ext_fcns_lineno, flex_ext_fcns_ch;
+
+/*             Return value    */
+extern ext_fcn_list *Ext_fcns;
+
+#define YYDEBUG 1
+
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#ifndef YYSTYPE
+#line 40 "ext_fcns.y"
+typedef union {
+       char* strval;
+       ext_fcn_list *ext_fcn_list_t;
+       ext_fcn_def *ext_fcn_t;
+       ext_fcn_param_list *plist_t;
+       param_list *tplist_t;
+       ext_fcn_param *param_t;
+       ext_fcn_modifier_list *modif_t;
+       } yystype;
+/* Line 193 of /usr/local/share/bison/yacc.c.  */
+#line 151 "ext_fcns.tab.cc"
+# define YYSTYPE yystype
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+#ifndef YYLTYPE
+typedef struct yyltype
+{
+  int first_line;
+  int first_column;
+  int last_line;
+  int last_column;
+} yyltype;
+# define YYLTYPE yyltype
+# define YYLTYPE_IS_TRIVIAL 1
+#endif
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 213 of /usr/local/share/bison/yacc.c.  */
+#line 172 "ext_fcns.tab.cc"
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
+#    define YYSTACK_ALLOC alloca
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
+      + YYSTACK_GAP_MAX)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         register YYSIZE_T yyi;                \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];    \
+       }                                       \
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;   \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  11
+#define YYLAST   136
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  21
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  10
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  39
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  117
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   270
+
+#define YYTRANSLATE(X) \
+  ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+      18,    19,     2,     2,    20,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,    16,     2,    17,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned char yyprhs[] =
+{
+       0,     0,     3,     5,     7,    10,    22,    31,    41,    48,
+      61,    71,    85,    96,   109,   119,   124,   125,   127,   129,
+     132,   136,   141,   143,   147,   151,   155,   159,   164,   169,
+     172,   173,   177,   179,   182,   185,   188,   192,   197,   202
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      22,     0,    -1,    23,    -1,    24,    -1,    23,    24,    -1,
+       3,    29,    10,    16,    26,    17,     3,    18,    25,    19,
+       6,    -1,     3,    29,    10,     3,    18,    25,    19,     6,
+      -1,    11,    16,    26,    17,     3,    16,    25,    17,     6,
+      -1,    11,     3,    16,    25,    17,     6,    -1,     3,    29,
+      13,    16,    26,    17,     3,     3,    18,    25,    19,     6,
+      -1,     3,    29,    13,     3,     3,    18,    25,    19,     6,
+      -1,     3,    29,    12,    16,    26,    17,     3,     3,     3,
+      18,    25,    19,     6,    -1,     3,    29,    12,     3,     3,
+       3,    18,    25,    19,     6,    -1,     3,    29,    15,    16,
+      26,    17,     3,     3,    18,    25,    19,     6,    -1,     3,
+      29,    15,     3,     3,    18,    25,    19,     6,    -1,     3,
+      14,     3,     6,    -1,    -1,    27,    -1,     3,    -1,     3,
+       3,    -1,    26,    20,     3,    -1,    26,    20,     3,     3,
+      -1,    28,    -1,    27,    20,    28,    -1,     3,    29,     7,
+      -1,     3,    29,     8,    -1,     3,    29,     9,    -1,     3,
+      29,     7,     9,    -1,     3,    29,     8,     9,    -1,     3,
+      29,    -1,    -1,    18,    30,    19,    -1,     3,    -1,     3,
+       3,    -1,     3,     4,    -1,     3,     5,    -1,    30,    20,
+       3,    -1,    30,    20,     3,     3,    -1,    30,    20,     3,
+       4,    -1,    30,    20,     3,     5,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned char yyrline[] =
+{
+       0,    75,    75,    78,    79,    82,    84,    86,    88,    90,
+      92,    94,    96,    98,   100,   102,   107,   109,   112,   114,
+     115,   116,   119,   121,   124,   126,   127,   128,   129,   130,
+     134,   136,   139,   141,   142,   143,   144,   145,   146,   147
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "NAME", "STRING_TOKEN", "INTNUM", 
+  "SEMICOLON", "HANDLE", "CONST", "CLASS", "FUN", "PRED", "EXTR", "UDAF", 
+  "STATE", "SFUN", "'['", "']'", "'('", "')'", "','", "$accept", "result", 
+  "fcn_list", "fcn_def", "opt_param_commalist", "modifier_list", 
+  "param_commalist", "param", "opt_type_param_commalist", 
+  "type_param_commalist", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,    91,    93,    40,    41,
+      44
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,    21,    22,    23,    23,    24,    24,    24,    24,    24,
+      24,    24,    24,    24,    24,    24,    25,    25,    26,    26,
+      26,    26,    27,    27,    28,    28,    28,    28,    28,    28,
+      29,    29,    30,    30,    30,    30,    30,    30,    30,    30
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     1,     1,     2,    11,     8,     9,     6,    12,
+       9,    13,    10,    12,     9,     4,     0,     1,     1,     2,
+       3,     4,     1,     3,     3,     3,     3,     4,     4,     2,
+       0,     3,     1,     2,     2,     2,     3,     4,     4,     4
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       0,    30,     0,     0,     2,     3,     0,     0,     0,     0,
+       0,     1,     4,     0,    32,     0,     0,     0,     0,     0,
+      16,    18,     0,    15,    33,    34,    35,    31,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    30,     0,    17,
+      22,    19,     0,     0,    36,    16,     0,     0,     0,     0,
+       0,     0,     0,    29,     0,     0,     0,    20,    37,    38,
+      39,     0,     0,     0,     0,    16,     0,    16,     0,    24,
+      25,    26,     8,    23,    16,    21,     0,     0,    16,     0,
+       0,     0,     0,     0,    27,    28,     0,     6,    16,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    10,
+      16,    14,    16,     7,     0,    12,    16,     0,     0,     5,
+       0,     0,     0,     0,     9,    13,    11
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+      -1,     3,     4,     5,    38,    22,    39,    40,     8,    15
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -46
+static const yysigned_char yypact[] =
+{
+       8,    -5,    -2,     7,     8,   -46,    25,    35,    11,     9,
+      50,   -46,   -46,    48,    41,    22,    -1,     0,     1,     2,
+      53,    55,    10,   -46,   -46,   -46,   -46,   -46,    56,    42,
+      50,    59,    50,    60,    50,    61,    50,    47,    49,    51,
+     -46,   -46,    64,    65,    44,    53,    14,    66,    15,    52,
+      19,    54,    20,    43,    67,    53,    58,    72,   -46,   -46,
+     -46,    57,    74,    62,    75,    53,    76,    53,    78,    73,
+      77,   -46,   -46,   -46,    53,   -46,    79,    69,    53,    80,
+      70,    81,    71,    85,   -46,   -46,    82,   -46,    53,    83,
+      88,    86,    87,    89,    90,    91,    84,    92,    93,   -46,
+      53,   -46,    53,   -46,    94,   -46,    53,    95,    96,   -46,
+      97,    98,   100,   101,   -46,   -46,   -46
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yysigned_char yypgoto[] =
+{
+     -46,   -46,   -46,   105,   -45,   -24,   -46,    38,    99,   -46
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, parse error.  */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+      61,     9,    29,    31,    33,    35,    46,    11,    48,     6,
+      50,     1,    52,     7,    10,    30,    32,    34,    36,     2,
+      80,    16,    82,    17,    18,    20,    19,    42,    13,    86,
+      43,    62,    64,    89,    43,    43,    66,    68,    14,    43,
+      43,    27,    28,    96,    24,    25,    26,    58,    59,    60,
+      69,    70,    71,    21,    23,   107,    37,   108,    41,    44,
+      45,   110,    47,    49,    51,     7,    54,    56,    57,    63,
+      65,    55,    67,    72,    74,    75,    76,    77,    79,    81,
+      78,    83,    84,    90,    92,    87,    85,    88,    94,    91,
+      93,    98,    99,    73,     0,   101,     0,   103,   105,    95,
+     109,     0,    97,   104,   114,   100,   115,   116,   102,    12,
+       0,   106,     0,     0,   111,   112,   113,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    53
+};
+
+static const yysigned_char yycheck[] =
+{
+      45,     3,     3,     3,     3,     3,    30,     0,    32,    14,
+      34,     3,    36,    18,    16,    16,    16,    16,    16,    11,
+      65,    10,    67,    12,    13,    16,    15,    17,     3,    74,
+      20,    17,    17,    78,    20,    20,    17,    17,     3,    20,
+      20,    19,    20,    88,     3,     4,     5,     3,     4,     5,
+       7,     8,     9,     3,     6,   100,     3,   102,     3,     3,
+      18,   106,     3,     3,     3,    18,    17,     3,     3,     3,
+      18,    20,    18,     6,    16,     3,    19,     3,     3,     3,
+      18,     3,     9,     3,     3,     6,     9,    18,     3,    19,
+      19,     3,     6,    55,    -1,     6,    -1,     6,     6,    17,
+       6,    -1,    19,    19,     6,    18,     6,     6,    18,     4,
+      -1,    18,    -1,    -1,    19,    19,    19,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    37
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,     3,    11,    22,    23,    24,    14,    18,    29,     3,
+      16,     0,    24,     3,     3,    30,    10,    12,    13,    15,
+      16,     3,    26,     6,     3,     4,     5,    19,    20,     3,
+      16,     3,    16,     3,    16,     3,    16,     3,    25,    27,
+      28,     3,    17,    20,     3,    18,    26,     3,    26,     3,
+      26,     3,    26,    29,    17,    20,     3,     3,     3,     4,
+       5,    25,    17,     3,    17,    18,    17,    18,    17,     7,
+       8,     9,     6,    28,    16,     3,    19,     3,    18,     3,
+      25,     3,    25,     3,     9,     9,    25,     6,    18,    25,
+       3,    19,     3,    19,     3,    17,    25,    19,     3,     6,
+      18,     6,    18,     6,    19,     6,    18,    25,    25,     6,
+      25,    19,    19,    19,     6,     6,     6
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT                goto yyabortlab
+#define YYERROR                goto yyerrlab1
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL         goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");                        \
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)           \
+  Current.first_line   = Rhs[1].first_line;      \
+  Current.first_column = Rhs[1].first_column;    \
+  Current.last_line    = Rhs[N].last_line;       \
+  Current.last_column  = Rhs[N].last_column;
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#define YYLEX  yylex ()
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+# define YYDSYMPRINT(Args)                     \
+do {                                           \
+  if (yydebug)                                 \
+    yysymprint Args;                           \
+} while (0)
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+\f
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+\f
+
+#if YYDEBUG
+/*-----------------------------.
+| Print this symbol on YYOUT.  |
+`-----------------------------*/
+
+static void
+#if defined (__STDC__) || defined (__cplusplus)
+yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue)
+#else
+yysymprint (yyout, yytype, yyvalue)
+    FILE* yyout;
+    int yytype;
+    YYSTYPE yyvalue;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvalue;
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyout, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+      YYPRINT (yyout, yytoknum[yytype], yyvalue);
+# endif
+    }
+  else
+    YYFPRINTF (yyout, "nterm %s (", yytname[yytype]);
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyout, ")");
+}
+#endif /* YYDEBUG. */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+static void
+#if defined (__STDC__) || defined (__cplusplus)
+yydestruct (int yytype, YYSTYPE yyvalue)
+#else
+yydestruct (yytype, yyvalue)
+    int yytype;
+    YYSTYPE yyvalue;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvalue;
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+}
+
+\f
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
+# else
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of parse errors so far.  */
+int yynerrs;
+
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule.  */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+
+                   &yystacksize);
+
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with.  */
+
+  if (yychar <= 0)             /* This means end of input.  */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more.  */
+
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE (yychar);
+
+      /* We have to keep this `#if YYDEBUG', since we use variables
+        which are defined only if `YYDEBUG' is set.  */
+      YYDPRINTF ((stderr, "Next token is "));
+      YYDSYMPRINT ((stderr, yychar1, yylval));
+      YYDPRINTF ((stderr, "\n"));
+    }
+
+  /* If the proper action on seeing token YYCHAR1 is to reduce or to
+     detect an error, take that action.  */
+  yyn += yychar1;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+             yychar, yytname[yychar1]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+
+#if YYDEBUG
+  /* We have to keep this `#if YYDEBUG', since we use variables which
+     are defined only if `YYDEBUG' is set.  */
+  if (yydebug)
+    {
+      int yyi;
+
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+                yyn - 1, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++)
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+  switch (yyn)
+    {
+        case 2:
+#line 75 "ext_fcns.y"
+    {Ext_fcns = yyvsp[0].ext_fcn_list_t;}
+    break;
+
+  case 3:
+#line 78 "ext_fcns.y"
+    {yyval.ext_fcn_list_t = new ext_fcn_list(yyvsp[0].ext_fcn_t);}
+    break;
+
+  case 4:
+#line 79 "ext_fcns.y"
+    {yyval.ext_fcn_list_t = yyvsp[-1].ext_fcn_list_t->append_ext_fcn_def(yyvsp[0].ext_fcn_t);}
+    break;
+
+  case 5:
+#line 82 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=new ext_fcn_def(yyvsp[-10].strval,yyvsp[-9].tplist_t,yyvsp[-6].modif_t,yyvsp[-4].strval,yyvsp[-2].plist_t); delete yyvsp[-6].modif_t; delete yyvsp[-2].plist_t; }
+    break;
+
+  case 6:
+#line 84 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=new ext_fcn_def(yyvsp[-7].strval,yyvsp[-6].tplist_t,NULL,yyvsp[-4].strval,yyvsp[-2].plist_t); delete yyvsp[-2].plist_t; }
+    break;
+
+  case 7:
+#line 86 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=new ext_fcn_def(yyvsp[-6].modif_t,yyvsp[-4].strval,yyvsp[-2].plist_t); delete yyvsp[-6].modif_t; delete yyvsp[-2].plist_t; }
+    break;
+
+  case 8:
+#line 88 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=new ext_fcn_def(NULL,yyvsp[-4].strval,yyvsp[-2].plist_t); delete yyvsp[-2].plist_t; }
+    break;
+
+  case 9:
+#line 90 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=new ext_fcn_def(yyvsp[-11].strval,yyvsp[-10].tplist_t,yyvsp[-7].modif_t,yyvsp[-5].strval,yyvsp[-4].strval,yyvsp[-2].plist_t); delete yyvsp[-7].modif_t; delete yyvsp[-2].plist_t; }
+    break;
+
+  case 10:
+#line 92 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=new ext_fcn_def(yyvsp[-8].strval,yyvsp[-7].tplist_t,NULL,yyvsp[-5].strval,yyvsp[-4].strval, yyvsp[-2].plist_t); delete yyvsp[-2].plist_t; }
+    break;
+
+  case 11:
+#line 94 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=new ext_fcn_def(yyvsp[-12].strval,yyvsp[-11].tplist_t,yyvsp[-8].modif_t,yyvsp[-6].strval,yyvsp[-5].strval, yyvsp[-4].strval, yyvsp[-2].plist_t); delete yyvsp[-8].modif_t; delete yyvsp[-2].plist_t; }
+    break;
+
+  case 12:
+#line 96 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=new ext_fcn_def(yyvsp[-9].strval,yyvsp[-8].tplist_t,NULL,yyvsp[-6].strval,yyvsp[-5].strval, yyvsp[-4].strval, yyvsp[-2].plist_t); delete yyvsp[-2].plist_t; }
+    break;
+
+  case 13:
+#line 98 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=ext_fcn_def::make_sfun_def(yyvsp[-11].strval,yyvsp[-10].tplist_t,yyvsp[-7].modif_t,yyvsp[-5].strval,yyvsp[-4].strval,yyvsp[-2].plist_t); delete yyvsp[-2].plist_t; }
+    break;
+
+  case 14:
+#line 100 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=ext_fcn_def::make_sfun_def(yyvsp[-8].strval,yyvsp[-7].tplist_t,NULL,yyvsp[-5].strval,yyvsp[-4].strval,yyvsp[-2].plist_t); delete yyvsp[-2].plist_t; }
+    break;
+
+  case 15:
+#line 102 "ext_fcns.y"
+    {
+                                       yyval.ext_fcn_t=ext_fcn_def::make_state_def(yyvsp[-3].strval,yyvsp[-1].strval); }
+    break;
+
+  case 16:
+#line 108 "ext_fcns.y"
+    {yyval.plist_t = NULL;}
+    break;
+
+  case 17:
+#line 109 "ext_fcns.y"
+    {yyval.plist_t = yyvsp[0].plist_t;}
+    break;
+
+  case 18:
+#line 113 "ext_fcns.y"
+    {yyval.modif_t = new ext_fcn_modifier_list(yyvsp[0].strval);}
+    break;
+
+  case 19:
+#line 114 "ext_fcns.y"
+    {yyval.modif_t = new ext_fcn_modifier_list(yyvsp[-1].strval, yyvsp[0].strval);}
+    break;
+
+  case 20:
+#line 115 "ext_fcns.y"
+    {yyval.modif_t = yyvsp[-2].modif_t->append(yyvsp[0].strval);       }
+    break;
+
+  case 21:
+#line 116 "ext_fcns.y"
+    {yyval.modif_t = yyvsp[-3].modif_t->append(yyvsp[-1].strval, yyvsp[0].strval);     }
+    break;
+
+  case 22:
+#line 120 "ext_fcns.y"
+    {yyval.plist_t = new ext_fcn_param_list(yyvsp[0].param_t);}
+    break;
+
+  case 23:
+#line 121 "ext_fcns.y"
+    {yyval.plist_t = yyvsp[-2].plist_t->append(yyvsp[0].param_t);}
+    break;
+
+  case 24:
+#line 125 "ext_fcns.y"
+    { yyval.param_t = new ext_fcn_param(yyvsp[-2].strval,yyvsp[-1].tplist_t,1,0,0);}
+    break;
+
+  case 25:
+#line 126 "ext_fcns.y"
+    { yyval.param_t = new ext_fcn_param(yyvsp[-2].strval,yyvsp[-1].tplist_t,0,1,0);}
+    break;
+
+  case 26:
+#line 127 "ext_fcns.y"
+    { yyval.param_t = new ext_fcn_param(yyvsp[-2].strval,yyvsp[-1].tplist_t,0,0,1);}
+    break;
+
+  case 27:
+#line 128 "ext_fcns.y"
+    { yyval.param_t = new ext_fcn_param(yyvsp[-3].strval,yyvsp[-2].tplist_t,1,0,1);}
+    break;
+
+  case 28:
+#line 129 "ext_fcns.y"
+    { yyval.param_t = new ext_fcn_param(yyvsp[-3].strval,yyvsp[-2].tplist_t,0,1,1);}
+    break;
+
+  case 29:
+#line 131 "ext_fcns.y"
+    { yyval.param_t = new ext_fcn_param(yyvsp[-1].strval,yyvsp[0].tplist_t,0,0,0);}
+    break;
+
+  case 30:
+#line 135 "ext_fcns.y"
+    {yyval.tplist_t = NULL;}
+    break;
+
+  case 31:
+#line 136 "ext_fcns.y"
+    {yyval.tplist_t = yyvsp[-1].tplist_t;}
+    break;
+
+  case 32:
+#line 140 "ext_fcns.y"
+    {yyval.tplist_t = new param_list(yyvsp[0].strval);}
+    break;
+
+  case 33:
+#line 141 "ext_fcns.y"
+    {yyval.tplist_t = new param_list(yyvsp[-1].strval,yyvsp[0].strval);}
+    break;
+
+  case 34:
+#line 142 "ext_fcns.y"
+    {yyval.tplist_t = new param_list(yyvsp[-1].strval,yyvsp[0].strval);}
+    break;
+
+  case 35:
+#line 143 "ext_fcns.y"
+    {yyval.tplist_t = new param_list(yyvsp[-1].strval,yyvsp[0].strval);}
+    break;
+
+  case 36:
+#line 144 "ext_fcns.y"
+    {yyval.tplist_t = yyvsp[-2].tplist_t->append(yyvsp[0].strval);}
+    break;
+
+  case 37:
+#line 145 "ext_fcns.y"
+    {yyval.tplist_t = yyvsp[-3].tplist_t->append(yyvsp[-1].strval,yyvsp[0].strval);}
+    break;
+
+  case 38:
+#line 146 "ext_fcns.y"
+    {yyval.tplist_t = yyvsp[-3].tplist_t->append(yyvsp[-1].strval,yyvsp[0].strval);}
+    break;
+
+  case 39:
+#line 147 "ext_fcns.y"
+    {yyval.tplist_t = yyvsp[-3].tplist_t->append(yyvsp[-1].strval,yyvsp[0].strval);}
+    break;
+
+
+    }
+
+/* Line 1016 of /usr/local/share/bison/yacc.c.  */
+#line 1272 "ext_fcns.tab.cc"
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         int yytype = YYTRANSLATE (yychar);
+         char *yymsg;
+         int yyx, yycount;
+
+         yycount = 0;
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         for (yyx = yyn < 0 ? -yyn : 0;
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+           if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen (yytname[yytype]);
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[yytype]);
+
+             if (yycount < 5)
+               {
+                 yycount = 0;
+                 for (yyx = yyn < 0 ? -yyn : 0;
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));
+                      yyx++)
+                   if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+                     {
+                       const char *yyq = ! yycount ? ", expecting " : " or ";
+                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yycount++;
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exhausted");
+       }
+      else
+#endif /* YYERROR_VERBOSE */
+       yyerror ("parse error");
+    }
+  goto yyerrlab1;
+
+
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action.  |
+`----------------------------------------------------*/
+yyerrlab1:
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      /* Return failure if at end of input.  */
+      if (yychar == YYEOF)
+        {
+         /* Pop the error token.  */
+          YYPOPSTACK;
+         /* Pop the rest of the stack.  */
+         while (yyssp > yyss)
+           {
+             YYDPRINTF ((stderr, "Error: popping "));
+             YYDSYMPRINT ((stderr,
+                           yystos[*yyssp],
+                           *yyvsp));
+             YYDPRINTF ((stderr, "\n"));
+             yydestruct (yystos[*yyssp], *yyvsp);
+             YYPOPSTACK;
+           }
+         YYABORT;
+        }
+
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+                 yychar, yytname[yychar1]));
+      yydestruct (yychar1, yylval);
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+
+  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+       {
+         yyn += YYTERROR;
+         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+           {
+             yyn = yytable[yyn];
+             if (0 < yyn)
+               break;
+           }
+       }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+       YYABORT;
+
+      YYDPRINTF ((stderr, "Error: popping "));
+      YYDSYMPRINT ((stderr,
+                   yystos[*yyssp], *yyvsp));
+      YYDPRINTF ((stderr, "\n"));
+
+      yydestruct (yystos[yystate], *yyvsp);
+      yyvsp--;
+      yystate = *--yyssp;
+
+
+#if YYDEBUG
+      if (yydebug)
+       {
+         short *yyssp1 = yyss - 1;
+         YYFPRINTF (stderr, "Error: state stack now");
+         while (yyssp1 != yyssp)
+           YYFPRINTF (stderr, " %d", *++yyssp1);
+         YYFPRINTF (stderr, "\n");
+       }
+#endif
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+
+
+#line 152 "ext_fcns.y"
+
+
diff --git a/src/ftacmp/ext_fcns.tab.cc.h b/src/ftacmp/ext_fcns.tab.cc.h
new file mode 100644 (file)
index 0000000..19c07ff
--- /dev/null
@@ -0,0 +1,87 @@
+/* A Bison parser, made from ext_fcns.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef BISON_EXT_FCNS_TAB_CC_H
+# define BISON_EXT_FCNS_TAB_CC_H
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259,
+     INTNUM = 260,
+     SEMICOLON = 261,
+     HANDLE = 262,
+     CONST = 263,
+     CLASS = 264,
+     FUN = 265,
+     PRED = 266,
+     EXTR = 267,
+     UDAF = 268,
+     STATE = 269,
+     SFUN = 270
+   };
+#endif
+#define NAME 258
+#define STRING_TOKEN 259
+#define INTNUM 260
+#define SEMICOLON 261
+#define HANDLE 262
+#define CONST 263
+#define CLASS 264
+#define FUN 265
+#define PRED 266
+#define EXTR 267
+#define UDAF 268
+#define STATE 269
+#define SFUN 270
+
+
+
+
+#ifndef YYSTYPE
+#line 40 "ext_fcns.y"
+typedef union {
+       char* strval;
+       ext_fcn_list *ext_fcn_list_t;
+       ext_fcn_def *ext_fcn_t;
+       ext_fcn_param_list *plist_t;
+       param_list *tplist_t;
+       ext_fcn_param *param_t;
+       ext_fcn_modifier_list *modif_t;
+       } yystype;
+/* Line 1281 of /usr/local/share/bison/yacc.c.  */
+#line 80 "ext_fcns.tab.cc.h"
+# define YYSTYPE yystype
+#endif
+
+extern YYSTYPE Ext_fcnsParserlval;
+
+
+#endif /* not BISON_EXT_FCNS_TAB_CC_H */
+
diff --git a/src/ftacmp/ext_fcns.y b/src/ftacmp/ext_fcns.y
new file mode 100644 (file)
index 0000000..0713293
--- /dev/null
@@ -0,0 +1,168 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+       MUST COMPILE WITH
+       bison --verbose --defines=ext_fcns.tab.cc.h -p Ext_fcnsParser -o ext_fcns.tab.cc ext_fcns.y
+        
+        (or equivalent).
+*/
+
+%{
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "parse_ext_fcns.h"
+
+/*             Interface to ext_fcns parser    */
+       int yyparse();
+       void yyerror(char *s);
+       int yylex();
+extern int flex_ext_fcns_lineno, flex_ext_fcns_ch;
+
+/*             Return value    */
+extern ext_fcn_list *Ext_fcns;
+
+#define YYDEBUG 1
+
+%}
+
+
+       /* symbolic tokens */
+
+%union {
+       char* strval;
+       ext_fcn_list *ext_fcn_list_t;
+       ext_fcn_def *ext_fcn_t;
+       ext_fcn_param_list *plist_t;
+       param_list *tplist_t;
+       ext_fcn_param *param_t;
+       ext_fcn_modifier_list *modif_t;
+       }
+
+       
+%token <strval> NAME
+%token <strval> STRING_TOKEN
+%token <strval> INTNUM
+
+
+%type <ext_fcn_t> fcn_def 
+%type <ext_fcn_list_t> fcn_list
+%type <plist_t> param_commalist
+%type <plist_t> opt_param_commalist
+%type <tplist_t> type_param_commalist
+%type <tplist_t> opt_type_param_commalist
+%type <param_t> param
+%type <modif_t> modifier_list
+       /* operators */
+
+
+       /* literal keyword tokens */
+
+%token SEMICOLON HANDLE CONST CLASS FUN PRED
+%token EXTR UDAF STATE SFUN
+
+
+%%
+
+result:        fcn_list        {Ext_fcns = $1;}
+       ;
+
+fcn_list:      fcn_def {$$ = new ext_fcn_list($1);}
+       |       fcn_list fcn_def        {$$ = $1->append_ext_fcn_def($2);}
+       ;
+
+fcn_def:       NAME opt_type_param_commalist FUN '[' modifier_list ']' NAME '(' opt_param_commalist ')' SEMICOLON  {
+                                       $$=new ext_fcn_def($1,$2,$5,$7,$9); delete $5; delete $9; }
+       |       NAME opt_type_param_commalist FUN NAME '(' opt_param_commalist ')' SEMICOLON  {
+                                       $$=new ext_fcn_def($1,$2,NULL,$4,$6); delete $6; }
+       |       PRED '[' modifier_list ']' NAME '[' opt_param_commalist ']' SEMICOLON  {
+                                       $$=new ext_fcn_def($3,$5,$7); delete $3; delete $7; }
+       |       PRED NAME '[' opt_param_commalist ']' SEMICOLON  {
+                                       $$=new ext_fcn_def(NULL,$2,$4); delete $4; }
+       |       NAME opt_type_param_commalist UDAF '[' modifier_list ']' NAME NAME '(' opt_param_commalist ')' SEMICOLON  {
+                                       $$=new ext_fcn_def($1,$2,$5,$7,$8,$10); delete $5; delete $10; }
+       |       NAME opt_type_param_commalist UDAF NAME NAME '(' opt_param_commalist ')' SEMICOLON  {
+                                       $$=new ext_fcn_def($1,$2,NULL,$4,$5, $7); delete $7; }
+       |       NAME opt_type_param_commalist EXTR '[' modifier_list ']' NAME NAME NAME '(' opt_param_commalist ')' SEMICOLON  {
+                                       $$=new ext_fcn_def($1,$2,$5,$7,$8, $9, $11); delete $5; delete $11; }
+       |       NAME opt_type_param_commalist EXTR NAME NAME NAME '(' opt_param_commalist ')' SEMICOLON  {
+                                       $$=new ext_fcn_def($1,$2,NULL,$4,$5, $6, $8); delete $8; }
+       |       NAME opt_type_param_commalist SFUN '[' modifier_list ']' NAME NAME '(' opt_param_commalist ')' SEMICOLON  {
+                                       $$=ext_fcn_def::make_sfun_def($1,$2,$5,$7,$8,$10); delete $10; }
+       |       NAME opt_type_param_commalist SFUN NAME NAME '(' opt_param_commalist ')' SEMICOLON  {
+                                       $$=ext_fcn_def::make_sfun_def($1,$2,NULL,$4,$5,$7); delete $7; }
+       |       NAME STATE NAME SEMICOLON  {
+                                       $$=ext_fcn_def::make_state_def($1,$3); }
+
+       ;
+
+opt_param_commalist:
+               /* empty */    {$$ = NULL;}
+       |       param_commalist {$$ = $1;}
+       ;
+       
+modifier_list:
+               NAME    {$$ = new ext_fcn_modifier_list($1);}
+       |       NAME NAME       {$$ = new ext_fcn_modifier_list($1, $2);}
+       |       modifier_list ',' NAME  {$$ = $1->append($3);   }       
+       |       modifier_list ',' NAME NAME     {$$ = $1->append($3, $4);       }       
+       ;
+       
+param_commalist:
+               param   {$$ = new ext_fcn_param_list($1);}
+       |       param_commalist ',' param {$$ = $1->append($3);}
+       ;
+
+param:
+               NAME opt_type_param_commalist HANDLE    { $$ = new ext_fcn_param($1,$2,1,0,0);}
+       |       NAME opt_type_param_commalist CONST     { $$ = new ext_fcn_param($1,$2,0,1,0);}
+       |       NAME opt_type_param_commalist CLASS     { $$ = new ext_fcn_param($1,$2,0,0,1);}
+       |       NAME opt_type_param_commalist HANDLE CLASS      { $$ = new ext_fcn_param($1,$2,1,0,1);}
+       |       NAME opt_type_param_commalist CONST CLASS       { $$ = new ext_fcn_param($1,$2,0,1,1);}
+       |       NAME opt_type_param_commalist
+                               { $$ = new ext_fcn_param($1,$2,0,0,0);}
+       ;
+
+opt_type_param_commalist:
+               /* empty */    {$$ = NULL;}
+       |       '(' type_param_commalist ')' {$$ = $2;}
+       ;
+
+type_param_commalist:
+               NAME    {$$ = new param_list($1);}
+       |       NAME NAME       {$$ = new param_list($1,$2);}
+       |       NAME STRING_TOKEN       {$$ = new param_list($1,$2);}
+       |       NAME INTNUM     {$$ = new param_list($1,$2);}
+       |       type_param_commalist ',' NAME {$$ = $1->append($3);}
+       |       type_param_commalist ',' NAME NAME {$$ = $1->append($3,$4);}
+       |       type_param_commalist ',' NAME STRING_TOKEN {$$ = $1->append($3,$4);}
+       |       type_param_commalist ',' NAME INTNUM {$$ = $1->append($3,$4);}
+       ;
+
+
+
+%%
diff --git a/src/ftacmp/ext_fcnslexer.cc b/src/ftacmp/ext_fcnslexer.cc
new file mode 100644 (file)
index 0000000..a1848c3
--- /dev/null
@@ -0,0 +1,1781 @@
+#define yy_create_buffer Ext_fcnsParser_create_buffer
+#define yy_delete_buffer Ext_fcnsParser_delete_buffer
+#define yy_scan_buffer Ext_fcnsParser_scan_buffer
+#define yy_scan_string Ext_fcnsParser_scan_string
+#define yy_scan_bytes Ext_fcnsParser_scan_bytes
+#define yy_flex_debug Ext_fcnsParser_flex_debug
+#define yy_init_buffer Ext_fcnsParser_init_buffer
+#define yy_flush_buffer Ext_fcnsParser_flush_buffer
+#define yy_load_buffer_state Ext_fcnsParser_load_buffer_state
+#define yy_switch_to_buffer Ext_fcnsParser_switch_to_buffer
+#define yyin Ext_fcnsParserin
+#define yyleng Ext_fcnsParserleng
+#define yylex Ext_fcnsParserlex
+#define yyout Ext_fcnsParserout
+#define yyrestart Ext_fcnsParserrestart
+#define yytext Ext_fcnsParsertext
+
+#line 19 "ext_fcnslexer.cc"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /cvsroot/gscpv4/src/ftacmp/ext_fcnslexer.cc,v 1.1.1.1 2013/12/02 17:44:57 spatsch Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <unistd.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yytext_ptr -= yy_more_len; \
+       yyleng = (int) (yy_cp - yytext_ptr); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 22
+#define YY_END_OF_BUFFER 23
+static yyconst short int yy_accept[68] =
+    {   0,
+        0,    0,   23,   21,   18,   17,   21,   11,   21,   21,
+       13,   10,   12,   12,   12,   12,   12,   12,   12,   12,
+       18,   17,    0,   16,   15,    0,    0,   13,    0,   12,
+       12,   12,   12,   12,   12,   12,   12,   12,   12,    0,
+       19,    0,   20,   14,   12,   12,   12,    1,   12,   12,
+       12,   12,   12,   12,   12,    4,   12,    2,    6,   12,
+        3,    9,    8,   12,    5,    7,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    1,    1,    1,    1,    1,    4,    5,
+        5,    1,    1,    5,    6,    1,    7,    8,    8,    8,
+        8,    8,    8,    8,    8,    8,    8,    1,    9,    1,
+        1,    1,    1,    1,   10,   11,   12,   13,   14,   15,
+       11,   16,   11,   11,   11,   17,   11,   18,   19,   20,
+       11,   21,   22,   23,   24,   11,   11,   25,   11,   11,
+        5,    1,    5,    1,   26,    1,   11,   11,   11,   11,
+
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
+       11,   11,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[27] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    1,    3,    1,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3
+    } ;
+
+static yyconst short int yy_base[73] =
+    {   0,
+        0,    0,   87,   88,   84,    0,   24,   88,   79,   77,
+       21,   88,    0,   13,   58,   58,   71,   59,   16,   66,
+       76,    0,   30,   88,   88,   74,   73,   27,   58,    0,
+       64,   55,   49,   53,   52,   55,   44,   57,   56,   62,
+       88,   61,   88,   88,   31,   28,   28,    0,   35,   34,
+       28,   21,   28,   20,   18,    0,   23,    0,    0,   24,
+        0,    0,    0,   23,    0,    0,   88,   51,   54,   33,
+       57,   60
+    } ;
+
+static yyconst short int yy_def[73] =
+    {   0,
+       67,    1,   67,   67,   67,   68,   69,   67,   67,   67,
+       67,   67,   70,   70,   70,   70,   70,   70,   70,   70,
+       67,   68,   69,   67,   67,   71,   72,   67,   67,   70,
+       70,   70,   70,   70,   70,   70,   70,   70,   70,   71,
+       67,   72,   67,   67,   70,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70,   70,   70,   70,   70,
+       70,   70,   70,   70,   70,   70,    0,   67,   67,   67,
+       67,   67
+    } ;
+
+static yyconst short int yy_nxt[115] =
+    {   0,
+        4,    5,    6,    7,    8,    9,   10,   11,   12,   13,
+       13,   14,   13,   15,   16,   17,   13,   13,   13,   18,
+       13,   19,   13,   20,   13,    4,   24,   25,   28,   31,
+       37,   32,   24,   25,   28,   30,   66,   65,   38,   64,
+       63,   62,   61,   60,   29,   59,   58,   57,   56,   55,
+       29,   22,   54,   22,   23,   23,   23,   40,   40,   40,
+       42,   42,   42,   43,   41,   53,   52,   51,   50,   49,
+       48,   47,   46,   45,   44,   43,   41,   21,   39,   36,
+       35,   34,   33,   27,   26,   21,   67,    3,   67,   67,
+       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+
+       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+       67,   67,   67,   67
+    } ;
+
+static yyconst short int yy_chk[115] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    7,    7,   11,   14,
+       19,   14,   23,   23,   28,   70,   64,   60,   19,   57,
+       55,   54,   53,   52,   11,   51,   50,   49,   47,   46,
+       28,   68,   45,   68,   69,   69,   69,   71,   71,   71,
+       72,   72,   72,   42,   40,   39,   38,   37,   36,   35,
+       34,   33,   32,   31,   29,   27,   26,   21,   20,   18,
+       17,   16,   15,   10,    9,    5,    3,   67,   67,   67,
+       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+
+       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+       67,   67,   67,   67
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+static int yy_more_flag = 0;
+static int yy_more_len = 0;
+#define yymore() (yy_more_flag = 1)
+#define YY_MORE_ADJ yy_more_len
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "ext_fcns.l"
+#define INITIAL 0
+/*
+       MUST COMPILE WITH
+               flex -PExt_fcnsParser -oext_fcnslexer.cc ext_fcns.l
+       (or equivalent).
+*/     
+#line 9 "ext_fcns.l"
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_ext_fcns.h"
+ #include <string.h>
+
+
+
+#include "ext_fcns.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int Ext_fcnsParserwrap(){return(1);}
+
+extern int Ext_fcnsParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_lineno : the line currently being parsed when the error occurs.
+               flexch : the character on the line where the error occurs
+               flex_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_ext_fcns_lineno = 1;
+int flex_ext_fcns_ch = 0;
+char flex_ext_fcns_linebuf[20000];
+
+//void Ext_fcnsParsererror(char *s);
+
+void Ext_fcnsParsererror(char *s){
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_ext_fcns_lineno, flex_ext_fcns_ch, s, Ext_fcnsParsertext, flex_ext_fcns_linebuf );
+       fprintf(stderr,"%*s\n",1+flex_ext_fcns_ch,"^");
+}
+
+
+/* MKS needs the next line to increase the NFA table */
+#line 498 "ext_fcnslexer.cc"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( yy_current_buffer->yy_is_interactive ) \
+               { \
+               int c = '*', n; \
+               for ( n = 0; n < max_size && \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+                       buf[n] = (char) c; \
+               if ( c == '\n' ) \
+                       buf[n++] = (char) c; \
+               if ( c == EOF && ferror( yyin ) ) \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+               result = n; \
+               } \
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+                 && ferror( yyin ) ) \
+               YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+       YY_USER_ACTION
+
+YY_DECL
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp = NULL, *yy_bp = NULL;
+       register int yy_act;
+
+#line 72 "ext_fcns.l"
+
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+#line 666 "ext_fcnslexer.cc"
+
+       if ( yy_init )
+               {
+               yy_init = 0;
+
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! yy_start )
+                       yy_start = 1;   /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( ! yy_current_buffer )
+                       yy_current_buffer =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+
+               yy_load_buffer_state();
+               }
+
+       while ( 1 )             /* loops until end-of-file is reached */
+               {
+               yy_more_len = 0;
+               if ( yy_more_flag )
+                       {
+                       yy_more_len = yy_c_buf_p - yytext_ptr;
+                       yy_more_flag = 0;
+                       }
+               yy_cp = yy_c_buf_p;
+
+               /* Support of yytext. */
+               *yy_cp = yy_hold_char;
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = yy_start;
+yy_match:
+               do
+                       {
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               yy_last_accepting_state = yy_current_state;
+                               yy_last_accepting_cpos = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 68 )
+                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 88 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+               if ( yy_act == 0 )
+                       { /* have to back up */
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       yy_act = yy_accept[yy_current_state];
+                       }
+
+               YY_DO_BEFORE_ACTION;
+
+
+do_action:     /* This label is used only to access EOF actions. */
+
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = yy_hold_char;
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 88 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; return FUN; }
+       YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 89 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; return PRED; }
+       YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 90 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; return UDAF; }
+       YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 91 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; return EXTR; }
+       YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 92 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; return STATE; }
+       YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 93 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; return SFUN; }
+       YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 94 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; return HANDLE; }
+       YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 95 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; return CONST; }
+       YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 96 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; return CLASS; }
+       YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 97 "ext_fcns.l"
+{flex_ext_fcns_ch+=Ext_fcnsParserleng; return SEMICOLON;}
+       YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 99 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; return yytext[0]; }
+       YY_BREAK
+/* names */
+case 12:
+YY_RULE_SETUP
+#line 104 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; Ext_fcnsParserlval.strval = strdup(yytext); return NAME; }
+       YY_BREAK
+/* numbers */
+case 13:
+#line 109 "ext_fcns.l"
+case 14:
+YY_RULE_SETUP
+#line 109 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; Ext_fcnsParserlval.strval = strdup(yytext);  return INTNUM; }
+       YY_BREAK
+/* strings */
+case 15:
+YY_RULE_SETUP
+#line 113 "ext_fcns.l"
+{
+               
+               int c;
+               
+               Ext_fcnsParserlval.strval = strdup(Ext_fcnsParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_ext_fcns_ch+=Ext_fcnsParserleng; 
+                       Ext_fcnsParserlval.strval[Ext_fcnsParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+       YY_BREAK
+case 16:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 130 "ext_fcns.l"
+{ flex_ext_fcns_ch+=Ext_fcnsParserleng; Ext_fcnsParsererror("Unterminated string"); }
+       YY_BREAK
+/*                                                                                                                     */
+/*             Newline : advance the error reporting line number       */
+/*             and grab the next line into flex_linebuf                        */
+/*                                                                                                                     */
+case 17:
+YY_RULE_SETUP
+#line 139 "ext_fcns.l"
+{flex_ext_fcns_ch=0; flex_ext_fcns_lineno++;
+                          strcpy(flex_ext_fcns_linebuf,Ext_fcnsParsertext+1);
+                          yyless(1);
+                          }
+       YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 144 "ext_fcns.l"
+{flex_ext_fcns_ch+=Ext_fcnsParserleng; }       /* white space */
+       YY_BREAK
+case 19:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 146 "ext_fcns.l"
+{flex_ext_fcns_ch+=Ext_fcnsParserleng; };      /* comment */
+       YY_BREAK
+case 20:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 147 "ext_fcns.l"
+{flex_ext_fcns_ch+=Ext_fcnsParserleng; };      /* comment */
+       YY_BREAK
+/*             Parse error on anything else.           */                              
+case 21:
+YY_RULE_SETUP
+#line 150 "ext_fcns.l"
+{fprintf(stderr,"Warning: unknown token (ignored)\n");         Ext_fcnsParsererror(yytext);}
+       YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 153 "ext_fcns.l"
+ECHO;
+       YY_BREAK
+#line 897 "ext_fcnslexer.cc"
+case YY_STATE_EOF(INITIAL):
+       yyterminate();
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = yy_hold_char;
+               YY_RESTORE_YY_MORE_OFFSET
+
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between yy_current_buffer and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       yy_n_chars = yy_current_buffer->yy_n_chars;
+                       yy_current_buffer->yy_input_file = yyin;
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state();
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++yy_c_buf_p;
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                               yy_cp = yy_c_buf_p;
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer() )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               yy_did_buffer_switch_on_eof = 0;
+
+                               if ( yywrap() )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               yy_c_buf_p =
+                                       yytext_ptr + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               yy_c_buf_p =
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+       {
+       register char *dest = yy_current_buffer->yy_ch_buf;
+       register char *source = yytext_ptr;
+       register int number_to_move, i;
+       int ret_val;
+
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( yy_current_buffer->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a single character, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+       else
+               {
+               int num_to_read =
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+                       YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = yy_current_buffer;
+
+                       int yy_c_buf_p_offset =
+                               (int) (yy_c_buf_p - b->yy_ch_buf);
+
+                       if ( b->yy_is_our_buffer )
+                               {
+                               int new_size = b->yy_buf_size * 2;
+
+                               if ( new_size <= 0 )
+                                       b->yy_buf_size += b->yy_buf_size / 8;
+                               else
+                                       b->yy_buf_size *= 2;
+
+                               b->yy_ch_buf = (char *)
+                                       /* Include room in for 2 EOB chars. */
+                                       yy_flex_realloc( (void *) b->yy_ch_buf,
+                                                        b->yy_buf_size + 2 );
+                               }
+                       else
+                               /* Can't grow it, we don't own it. */
+                               b->yy_ch_buf = 0;
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = yy_current_buffer->yy_buf_size -
+                                               number_to_move - 1;
+#endif
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+                       yy_n_chars, num_to_read );
+
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       if ( yy_n_chars == 0 )
+               {
+               if ( number_to_move == YY_MORE_ADJ )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       yy_current_buffer->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       yy_n_chars += number_to_move;
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+       return ret_val;
+       }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp;
+
+       yy_current_state = yy_start;
+
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+               {
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       yy_last_accepting_state = yy_current_state;
+                       yy_last_accepting_cpos = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 68 )
+                               yy_c = yy_meta[(unsigned int) yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+               }
+
+       return yy_current_state;
+       }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+       {
+       register int yy_is_jam;
+       register char *yy_cp = yy_c_buf_p;
+
+       register YY_CHAR yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               yy_last_accepting_state = yy_current_state;
+               yy_last_accepting_cpos = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 68 )
+                       yy_c = yy_meta[(unsigned int) yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+       yy_is_jam = (yy_current_state == 67);
+
+       return yy_is_jam ? 0 : yy_current_state;
+       }
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+       {
+       register char *yy_cp = yy_c_buf_p;
+
+       /* undo effects of setting up yytext */
+       *yy_cp = yy_hold_char;
+
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               register int number_to_move = yy_n_chars + 2;
+               register char *dest = &yy_current_buffer->yy_ch_buf[
+                                       yy_current_buffer->yy_buf_size + 2];
+               register char *source =
+                               &yy_current_buffer->yy_ch_buf[number_to_move];
+
+               while ( source > yy_current_buffer->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += (int) (dest - source);
+               yy_bp += (int) (dest - source);
+               yy_current_buffer->yy_n_chars =
+                       yy_n_chars = yy_current_buffer->yy_buf_size;
+
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       *--yy_cp = (char) c;
+
+
+       yytext_ptr = yy_bp;
+       yy_hold_char = *yy_cp;
+       yy_c_buf_p = yy_cp;
+       }
+#endif /* ifndef YY_NO_UNPUT */
+
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+       {
+       int c;
+
+       *yy_c_buf_p = yy_hold_char;
+
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       /* This was really a NUL. */
+                       *yy_c_buf_p = '\0';
+
+               else
+                       { /* need more input */
+                       int offset = yy_c_buf_p - yytext_ptr;
+                       ++yy_c_buf_p;
+
+                       switch ( yy_get_next_buffer() )
+                               {
+                               case EOB_ACT_LAST_MATCH:
+                                       /* This happens because yy_g_n_b()
+                                        * sees that we've accumulated a
+                                        * token and flags that we need to
+                                        * try matching the token before
+                                        * proceeding.  But for input(),
+                                        * there's no matching to consider.
+                                        * So convert the EOB_ACT_LAST_MATCH
+                                        * to EOB_ACT_END_OF_FILE.
+                                        */
+
+                                       /* Reset buffer status. */
+                                       yyrestart( yyin );
+
+                                       /* fall through */
+
+                               case EOB_ACT_END_OF_FILE:
+                                       {
+                                       if ( yywrap() )
+                                               return EOF;
+
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+#ifdef __cplusplus
+                                       return yyinput();
+#else
+                                       return input();
+#endif
+                                       }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       yy_c_buf_p = yytext_ptr + offset;
+                                       break;
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
+       *yy_c_buf_p = '\0';     /* preserve yytext */
+       yy_hold_char = *++yy_c_buf_p;
+
+
+       return c;
+       }
+#endif /* YY_NO_INPUT */
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+       {
+       if ( ! yy_current_buffer )
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+       yy_init_buffer( yy_current_buffer, input_file );
+       yy_load_buffer_state();
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+       {
+       if ( yy_current_buffer == new_buffer )
+               return;
+
+       if ( yy_current_buffer )
+               {
+               /* Flush out information for old buffer. */
+               *yy_c_buf_p = yy_hold_char;
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       yy_current_buffer = new_buffer;
+       yy_load_buffer_state();
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       yy_did_buffer_switch_on_eof = 1;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+       {
+       yy_n_chars = yy_current_buffer->yy_n_chars;
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+       yyin = yy_current_buffer->yy_input_file;
+       yy_hold_char = *yy_c_buf_p;
+       }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_is_our_buffer = 1;
+
+       yy_init_buffer( b, file );
+
+       return b;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+       {
+       if ( ! b )
+               return;
+
+       if ( b == yy_current_buffer )
+               yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+       if ( b->yy_is_our_buffer )
+               yy_flex_free( (void *) b->yy_ch_buf );
+
+       yy_flex_free( (void *) b );
+       }
+
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+       {
+       yy_flush_buffer( b );
+
+       b->yy_input_file = file;
+       b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+       b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+       b->yy_is_interactive = 0;
+#else
+       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+       {
+       if ( ! b )
+               return;
+
+       b->yy_n_chars = 0;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[0];
+
+       b->yy_at_bol = 1;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       if ( b == yy_current_buffer )
+               yy_load_buffer_state();
+       }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       if ( size < 2 ||
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||
+            base[size-1] != YY_END_OF_BUFFER_CHAR )
+               /* They forgot to leave room for the EOB's. */
+               return 0;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+       b->yy_buf_pos = b->yy_ch_buf = base;
+       b->yy_is_our_buffer = 0;
+       b->yy_input_file = 0;
+       b->yy_n_chars = b->yy_buf_size;
+       b->yy_is_interactive = 0;
+       b->yy_at_bol = 1;
+       b->yy_fill_buffer = 0;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       yy_switch_to_buffer( b );
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+       {
+       int len;
+       for ( len = 0; yy_str[len]; ++len )
+               ;
+
+       return yy_scan_bytes( yy_str, len );
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+       {
+       YY_BUFFER_STATE b;
+       char *buf;
+       yy_size_t n;
+       int i;
+
+       /* Get memory for full buffer, including space for trailing EOB's. */
+       n = len + 2;
+       buf = (char *) yy_flex_alloc( n );
+       if ( ! buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+       for ( i = 0; i < len; ++i )
+               buf[i] = bytes[i];
+
+       buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+       b = yy_scan_buffer( buf, n );
+       if ( ! b )
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+       /* It's okay to grow etc. this buffer, and we should throw it
+        * away when we're done.
+        */
+       b->yy_is_our_buffer = 1;
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+       {
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )
+               {
+               yy_size_t new_size;
+
+               yy_start_stack_depth += YY_START_STACK_INCR;
+               new_size = yy_start_stack_depth * sizeof( int );
+
+               if ( ! yy_start_stack )
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+               else
+                       yy_start_stack = (int *) yy_flex_realloc(
+                                       (void *) yy_start_stack, new_size );
+
+               if ( ! yy_start_stack )
+                       YY_FATAL_ERROR(
+                       "out of memory expanding start-condition stack" );
+               }
+
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+       BEGIN(new_state);
+       }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+       {
+       if ( --yy_start_stack_ptr < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);
+       }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+       {
+       return yy_start_stack[yy_start_stack_ptr - 1];
+       }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+       {
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+       }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               yytext[yyleng] = yy_hold_char; \
+               yy_c_buf_p = yytext + n; \
+               yy_hold_char = *yy_c_buf_p; \
+               *yy_c_buf_p = '\0'; \
+               yyleng = n; \
+               } \
+       while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+       {
+       register int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+       }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+       {
+       register int n;
+       for ( n = 0; s[n]; ++n )
+               ;
+
+       return n;
+       }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+       {
+       return (void *) malloc( size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+       {
+       /* The cast to (char *) in the following accommodates both
+        * implementations that use char* generic pointers, and those
+        * that use void* generic pointers.  It works with the latter
+        * because both ANSI C and C++ allow castless assignment from
+        * any pointer type to void*, and deal with argument conversions
+        * as though doing an assignment.
+        */
+       return (void *) realloc( (char *) ptr, size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+       {
+       free( ptr );
+       }
+
+#if YY_MAIN
+int main()
+       {
+       yylex();
+       return 0;
+       }
+#endif
+#line 153 "ext_fcns.l"
+
+
+
diff --git a/src/ftacmp/field_list.cc b/src/ftacmp/field_list.cc
new file mode 100644 (file)
index 0000000..2d71e28
--- /dev/null
@@ -0,0 +1,139 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#include<stdio.h>
+#include<stdlib.h>
+
+#include<vector>
+#include<string>
+#include<map>
+
+#include"xml_t.h"
+#include"field_list.h"
+
+using namespace std;
+
+struct type_map_t{
+       std::string from;
+       std::string to;
+};
+
+static struct type_map_t type_map[] = {
+       "BOOL",                         "BOOLEAN",
+       "Bool",                         "BOOLEAN",
+       "bool",                         "BOOLEAN",
+       "BOOLEAN",                      "BOOLEAN",
+       "INT",                          "INT",
+       "Int",                          "INT",
+       "int",                          "INT",
+       "INTEGER",                      "INT",
+       "INT(_huge_)",          "INT(_huge_)",
+       "LLONG",                        "INT(_huge_)",
+       "Llong",                        "INT(_huge_)",
+       "llong",                        "INT(_huge_)",
+       "INTEGER(_huge_)",      "INT(_huge_)",
+       "UINT",                         "UINT",
+       "Uint",                         "UINT",
+       "uint",                         "UINT",
+       "USHORT",                       "UINT",
+       "Ushort",                       "UINT",
+       "ushort",                       "UINT",
+       "UINT(_huge_)",         "UINT(_huge_)",
+       "ULLONG",                       "UINT(_huge_)",
+       "Ullong",                       "UINT(_huge_)",
+       "ullong",                       "UINT(_huge_)",
+       "STR",                          "STRING",
+       "STRING",                       "STRING",
+       "FLT",                          "FLOAT",
+       "FLOAT",                        "FLOAT",
+       "Float",                        "FLOAT",
+       "float",                        "FLOAT",
+       "DATE",                         "DATE",
+       "CLOCK",                        "CLOCK",
+       "DATE_CLOCK",           "DATE_CLOCK",
+       "TIME",                         "TIME",
+       "IP",                           "IP2",
+       "IP2",                          "IP2",
+       "STRING",                       "STRING",
+       "STR",                          "STRING",
+       "String",                       "STRING",
+       "string",                       "STRING",
+       "V_STR",                        "STRING",
+       "V_str",                        "STRING",
+       "v_str",                        "STRING",
+       "IPV6",                         "IP6z",
+       "IP6",                          "IP6z",
+       "IP6z",                         "IP6z",
+       "",                                     ""
+};
+
+
+       
+field_list::field_list(xml_t *x){
+       int i,j,pos;
+       for(i=0;type_map[i].from != ""; i++){
+               type_verifier[type_map[i].from] = type_map[i].to;
+       }
+       type_verifier[""] = "";
+
+       for(i=0;i<x->leaves.size();i++){
+               if(x->leaves[i]->name != "field"){
+                       fprintf(stderr,"WARNING, unrecognized leaf element %s in field list file, ignoring.\n",x->leaves[i]->name.c_str());
+                       continue;
+               }
+
+               std::string fname, ftype;
+               for(j=0;j<x->leaves[i]->attrs.size();j++){
+                       if(x->leaves[i]->attrs[j] == "name"){
+                               if(fname != ""){
+                                       fprintf(stderr,"WARNING, found duplicate name property for a field (#%d, %s) in the field list, ignoring second name %s.\n",i,fname.c_str(), x->leaves[i]->vals[j].c_str());
+                               }else{
+                                       fname = x->leaves[i]->vals[j];
+                               }
+                       }
+               }
+               if(fname == ""){
+                       fprintf(stderr,"WARNING, field %d has an empty name, ignoring\n",i);
+                       continue;
+               }
+
+               for(j=0;j<x->leaves[i]->attrs.size();j++){
+                       if(x->leaves[i]->attrs[j] == "type"){
+                               if(ftype != ""){
+                                       fprintf(stderr,"WARNING, found duplicate type property for field %s in the field list, ignoring.\n",fname.c_str());
+                               }else{
+                                       ftype = x->leaves[i]->vals[j];
+                               }
+                       }
+               }
+
+               if(fields.count(fname)){
+                       fprintf(stderr,"WARNING, duplicate field list name %s, ignoring repeat entry.\n",fname.c_str());
+                       continue;
+               }
+               if(type_verifier.count(ftype) == 0){
+                       fprintf(stderr,"WARNING, field %s in the field list has unrecognized type %s, ignoring the type.\n",fname.c_str(),ftype.c_str());
+                       ftype = "";
+               }
+
+               string::size_type ix = fname.rfind("/");
+               if(ix != string::npos){
+                       fname = fname.substr(ix+1);
+               }
+
+               fields[fname] = ftype;
+       }
+}
+
+
diff --git a/src/ftacmp/field_list.h b/src/ftacmp/field_list.h
new file mode 100644 (file)
index 0000000..9b0e1d6
--- /dev/null
@@ -0,0 +1,49 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef __FIELD_LIST_H_
+#define __FIELD_LIST_H_
+
+#include<string>
+#include<map>
+#include"xml_t.h"
+
+
+class field_list{
+public:
+       std::map<std::string, std::string> type_verifier;
+       std::map<std::string, std::string> fields;
+
+       field_list(xml_t *x);
+
+       int verify_field(std::string name, std::string type, std::string &err){
+               if(fields.count(name) == 0){
+                       err += "\tCould not find field "+name+" in the field list\n";
+                       return 1;
+               }
+               if(fields[name] == "")
+                       return 0;
+               if(type_verifier[fields[name]] != type_verifier[type]){
+                       err += "\tfield "+name+" has type "+type+", which isn't compatible with field list type "+fields[name]+"\n";
+                       return 2;
+               }
+               return 0;
+       }
+
+}; 
+
+
+#endif
+
diff --git a/src/ftacmp/fta.l b/src/ftacmp/fta.l
new file mode 100644 (file)
index 0000000..062fd6d
--- /dev/null
@@ -0,0 +1,313 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+/*
+       MUST COMPILE WITH
+               flex -PFtaParser -oftalexer.cc fta.l
+       (or equivalent).
+*/     
+
+%{
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_fta.h"
+ #include "parse_schema.h"
+ #include <string.h>
+
+
+
+#include "fta.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int FtaParserwrap(){return(1);}
+
+extern int FtaParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_fta_lineno : the line currently being parsed when the error occurs.
+               flex_fta_ch : the character on the line where the error occurs
+               flex_fta_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_fta_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_fta_lineno = 1;
+int flex_fta_ch = 0;
+char flex_fta_linebuf[200000];
+
+char *flex_fta_stringinput = NULL;
+int flex_fta_stringinput_ptr = 0;
+FILE *flex_fta_fileinput = NULL;
+int my_FtaParser_yyinput(char *buf, int max_size);
+
+
+
+void FtaParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_fta_lineno, flex_fta_ch, s, FtaParsertext, flex_fta_linebuf );
+    for(i=0;i<flex_fta_ch;i++){
+               if(flex_fta_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_fta_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_FtaParser_yyinput(b,ms))
+
+%}
+       /* MKS needs the next line to increase the NFA table */
+%e 1200
+%option noyywrap
+
+%%
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+AND|And|and            { flex_fta_ch+=FtaParserleng; return AND; }
+AND_AGGR|And_Aggr|and_aggr             { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("AND_AGGR"); return AGGR; }
+OR_AGGR|Or_Aggr|or_aggr                { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("OR_AGGR"); return AGGR; }
+XOR_AGGR|Xor_Aggr|xor_aggr             { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("XOR_AGGR"); return AGGR; }
+AVG|Avg|avg            { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("AVG"); return AGGR; }
+MIN|Min|min            { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("MIN"); return AGGR; }
+MAX|Max|max            { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("MAX"); return AGGR; }
+SUM|Sum|sum            { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("SUM"); return AGGR; }
+COUNT|Count|count      { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("COUNT"); return AGGR; }
+BY|By|by               { flex_fta_ch+=FtaParserleng; return BY; }
+FROM|From|from         { flex_fta_ch+=FtaParserleng; return FROM; }
+INNER_JOIN|Inner_Join|inner_join       { flex_fta_ch+=FtaParserleng; return INNER_JOIN; }
+OUTER_JOIN|Outer_Join|outer_join       { flex_fta_ch+=FtaParserleng; return OUTER_JOIN; }
+RIGHT_OUTER_JOIN|Right_Outer_Join|right_outer_join     { flex_fta_ch+=FtaParserleng; return RIGHT_OUTER_JOIN; }
+LEFT_OUTER_JOIN|Left_Outer_Join|left_outer_join        { flex_fta_ch+=FtaParserleng; return LEFT_OUTER_JOIN; }
+FILTER_JOIN|Filter_Join|filter_join    { flex_fta_ch+=FtaParserleng; return FILTER_JOIN; }
+GROUP|Group|group      { flex_fta_ch+=FtaParserleng; return GROUP; }
+ROLLUP|Rollup|rollup   { flex_fta_ch+=FtaParserleng; return ROLLUP; }
+CUBE|Cube|cube { flex_fta_ch+=FtaParserleng; return CUBE; }
+GROUPING_SETS|Grouping_Sets|grouping_sets      { flex_fta_ch+=FtaParserleng; return GROUPING_SETS; }
+SUPERGROUP|Supergroup|supergroup       { flex_fta_ch+=FtaParserleng; return SUPERGROUP; }
+CLEANING_WHEN|Cleaning_When|cleaning_when      { flex_fta_ch+=FtaParserleng; return CLEANING_WHEN; }
+CLEANING_BY|Cleaning_By|cleaning_by    { flex_fta_ch+=FtaParserleng; return CLEANING_BY; }
+CLOSING_WHEN|Closing_When|closing_when { flex_fta_ch+=FtaParserleng; return CLOSING_WHEN; }
+HAVING|Having|having   { flex_fta_ch+=FtaParserleng; return HAVING; }
+AS|As|as               { flex_fta_ch+=FtaParserleng; return AS; }
+IN|In|in               { flex_fta_ch+=FtaParserleng; return IN; }
+NOT|Not|not            { flex_fta_ch+=FtaParserleng; return NOT; }
+OR|Or|or       { flex_fta_ch+=FtaParserleng; return OR; }
+
+SELECT|Select|select           { flex_fta_ch+=FtaParserleng; return SELECT; }
+WHERE|Where|where              { flex_fta_ch+=FtaParserleng; return WHERE; }
+SUCH|Such|such { flex_fta_ch+=FtaParserleng; return SUCH;}
+THAT|That|that { flex_fta_ch+=FtaParserleng; return THAT;}
+MERGE|Merge|merge       {flex_fta_ch+=FtaParserleng; return MERGE;}
+SLACK   {flex_fta_ch+=FtaParserleng; return SLACK;}
+
+TRUE   { flex_fta_ch+=FtaParserleng; return TRUE_V;}
+FALSE  { flex_fta_ch+=FtaParserleng; return FALSE_V;}
+TIMEVAL        { flex_fta_ch+=FtaParserleng; return TIMEVAL_L;}
+HEX    { flex_fta_ch+=FtaParserleng; return HEX_L;}
+LHEX   { flex_fta_ch+=FtaParserleng; return LHEX_L;}
+IP_VAL { flex_fta_ch+=FtaParserleng; return IP_L;}
+IPV6_VAL|IPv6_VAL      { flex_fta_ch+=FtaParserleng; return IPV6_L;}
+
+DEFINE { flex_fta_ch+=FtaParserleng; return DEFINE_SEC;}
+PARAM  { flex_fta_ch+=FtaParserleng; return PARAM_SEC;}
+
+[\{]   {flex_fta_ch+=FtaParserleng; return LEFTBRACE;}
+[\}]   {flex_fta_ch+=FtaParserleng; return RIGHTBRACE;}
+
+ /*
+               Table definition keywords
+ */            
+TABLE          { flex_fta_ch+=FtaParserleng; return TABLE; }
+PROTOCOL               { flex_fta_ch+=FtaParserleng; return PROTOCOL; }
+STREAM         { flex_fta_ch+=FtaParserleng; return STREAM; }
+FTA                    { flex_fta_ch+=FtaParserleng; return FTA; }
+UNPACK_FCNS                    { flex_fta_ch+=FtaParserleng; return UNPACK_FCNS; }
+
+OPERATOR                       { flex_fta_ch+=FtaParserleng; return OPERATOR; }
+OPERATOR_VIEW                  { flex_fta_ch+=FtaParserleng; return OPERATOR_VIEW; }
+FIELDS                 { flex_fta_ch+=FtaParserleng; return FIELDS; }
+SUBQUERIES                     { flex_fta_ch+=FtaParserleng; return SUBQUERIES; }
+SELECTION_PUSHDOWN                     { flex_fta_ch+=FtaParserleng; return SELECTION_PUSHDOWN; }
+;      {flex_fta_ch+=FtaParserleng; return SEMICOLON;}
+
+
+       /* punctuation */
+"<<"   |
+">>"                   { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext); return SHIFT_OP; }
+
+"="    |
+"<>"   |
+"<"    |
+">"    |
+"<="   |
+">="           { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext); return COMPARISON; }
+
+[%&|!+*/:(),.\[\]$@#]  { flex_fta_ch+=FtaParserleng; return yytext[0]; }
+"-"    { flex_fta_ch+=FtaParserleng; return yytext[0]; }
+"~"    { flex_fta_ch+=FtaParserleng; return yytext[0]; }
+
+       /* names */
+
+[A-Za-z_][A-Za-z0-9_]* { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext); return NAME; }
+
+       /* numbers */
+
+[0-9]+ |
+[0-9]+UL       { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext);  return INTNUM; }
+
+[0-9]+ULL      { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext);  return LONGINTNUM; }
+
+[0-9]+"."[0-9]* |
+"."[0-9]*      |
+[0-9]+[eE][+-]?[0-9]+  |
+[0-9]+"."[0-9]*[eE][+-]?[0-9]+ |
+"."[0-9]*[eE][+-]?[0-9]+       { flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext); return APPROXNUM; }
+
+       /* strings */
+
+'[^'\n]*'      {
+               
+               int c;
+               
+               FtaParserlval.strval = strdup(FtaParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_fta_ch+=FtaParserleng; 
+                       FtaParserlval.strval[FtaParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+               
+'[^'\n]*$      { flex_fta_ch+=FtaParserleng; FtaParsererror("Unterminated string"); }
+
+ /*                                                                                                                    */
+ /*            Newline : advance the error reporting line number       */
+ /*            and grab the next line into flex_fta_linebuf                    */
+ /*                                                                                                                    */
+
+\n.*           {flex_fta_ch=0; flex_fta_lineno++;
+                          strcpy(flex_fta_linebuf,FtaParsertext+1);
+                          yyless(1);
+                          }
+
+[ \t\r]+       {flex_fta_ch+=FtaParserleng; }  /* white space */
+
+"--".*$                {flex_fta_ch+=FtaParserleng; }; /* comment */
+"//".*$                {flex_fta_ch+=FtaParserleng; }; /* comment */
+
+.|\n            {flex_fta_ch+=FtaParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  FtaParsererror(yytext);}
+
+%%
+
+int my_FtaParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_fta_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_fta_stringinput[flex_fta_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_fta_stringinput[flex_fta_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_fta_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_fta_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void FtaParser_setfileinput(FILE *f){
+       FtaParserrestart(NULL);
+
+       flex_fta_fileinput = f;
+       flex_fta_stringinput = NULL;
+       flex_fta_lineno = 1;
+       flex_fta_ch = 0;
+}
+
+void FtaParser_setstringinput(char *s){
+       FtaParserrestart(NULL);
+
+       flex_fta_fileinput = NULL;
+       flex_fta_stringinput = s;
+       flex_fta_stringinput_ptr = 0;
+       flex_fta_lineno = 1;
+       flex_fta_ch = 0;
+}
+       
+               
+
+
diff --git a/src/ftacmp/fta.tab.cc b/src/ftacmp/fta.tab.cc
new file mode 100644 (file)
index 0000000..1a32671
--- /dev/null
@@ -0,0 +1,3059 @@
+/* A Bison parser, made by GNU Bison 2.3.  */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   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., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "2.3"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* Substitute the variable and function names.  */
+#define yyparse FtaParserparse
+#define yylex   FtaParserlex
+#define yyerror FtaParsererror
+#define yylval  FtaParserlval
+#define yychar  FtaParserchar
+#define yydebug FtaParserdebug
+#define yynerrs FtaParsernerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259,
+     INTNUM = 260,
+     LONGINTNUM = 261,
+     APPROXNUM = 262,
+     OR = 263,
+     AND = 264,
+     NOT = 265,
+     COMPARISON = 266,
+     SHIFT_OP = 267,
+     UMINUS = 268,
+     SEMICOLON = 269,
+     LEFTBRACE = 270,
+     RIGHTBRACE = 271,
+     BY = 272,
+     AS = 273,
+     AGGR = 274,
+     FROM = 275,
+     INNER_JOIN = 276,
+     FILTER_JOIN = 277,
+     OUTER_JOIN = 278,
+     LEFT_OUTER_JOIN = 279,
+     RIGHT_OUTER_JOIN = 280,
+     GROUP = 281,
+     HAVING = 282,
+     IN = 283,
+     SELECT = 284,
+     WHERE = 285,
+     SUPERGROUP = 286,
+     CLEANING_WHEN = 287,
+     CLEANING_BY = 288,
+     CLOSING_WHEN = 289,
+     SUCH = 290,
+     THAT = 291,
+     CUBE = 292,
+     ROLLUP = 293,
+     GROUPING_SETS = 294,
+     TRUE_V = 295,
+     FALSE_V = 296,
+     TIMEVAL_L = 297,
+     HEX_L = 298,
+     LHEX_L = 299,
+     IP_L = 300,
+     IPV6_L = 301,
+     MERGE = 302,
+     SLACK = 303,
+     DEFINE_SEC = 304,
+     PARAM_SEC = 305,
+     PROTOCOL = 306,
+     TABLE = 307,
+     STREAM = 308,
+     FTA = 309,
+     UNPACK_FCNS = 310,
+     OPERATOR = 311,
+     OPERATOR_VIEW = 312,
+     FIELDS = 313,
+     SUBQUERIES = 314,
+     SELECTION_PUSHDOWN = 315
+   };
+#endif
+/* Tokens.  */
+#define NAME 258
+#define STRING_TOKEN 259
+#define INTNUM 260
+#define LONGINTNUM 261
+#define APPROXNUM 262
+#define OR 263
+#define AND 264
+#define NOT 265
+#define COMPARISON 266
+#define SHIFT_OP 267
+#define UMINUS 268
+#define SEMICOLON 269
+#define LEFTBRACE 270
+#define RIGHTBRACE 271
+#define BY 272
+#define AS 273
+#define AGGR 274
+#define FROM 275
+#define INNER_JOIN 276
+#define FILTER_JOIN 277
+#define OUTER_JOIN 278
+#define LEFT_OUTER_JOIN 279
+#define RIGHT_OUTER_JOIN 280
+#define GROUP 281
+#define HAVING 282
+#define IN 283
+#define SELECT 284
+#define WHERE 285
+#define SUPERGROUP 286
+#define CLEANING_WHEN 287
+#define CLEANING_BY 288
+#define CLOSING_WHEN 289
+#define SUCH 290
+#define THAT 291
+#define CUBE 292
+#define ROLLUP 293
+#define GROUPING_SETS 294
+#define TRUE_V 295
+#define FALSE_V 296
+#define TIMEVAL_L 297
+#define HEX_L 298
+#define LHEX_L 299
+#define IP_L 300
+#define IPV6_L 301
+#define MERGE 302
+#define SLACK 303
+#define DEFINE_SEC 304
+#define PARAM_SEC 305
+#define PROTOCOL 306
+#define TABLE 307
+#define STREAM 308
+#define FTA 309
+#define UNPACK_FCNS 310
+#define OPERATOR 311
+#define OPERATOR_VIEW 312
+#define FIELDS 313
+#define SUBQUERIES 314
+#define SELECTION_PUSHDOWN 315
+
+
+
+
+/* Copy the first part of user declarations.  */
+#line 8 "fta.y"
+
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "parse_fta.h"
+#include "parse_schema.h"
+
+
+extern fta_parse_t *fta_parse_result;
+extern var_defs_t *fta_parse_defines;
+
+
+#define YYDEBUG 1
+
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+#line 37 "fta.y"
+{
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       string_t *stringval;
+
+/*                     for FTA definition.     */
+       literal_t *litval;
+       scalarexp_t *scalarval;
+       se_list_t *se_listval;
+       select_list_t *select_listval;
+       table_exp_t *tblp;
+       predicate_t *predp;
+       literal_list_t *lit_l;
+       tablevar_t *table;
+       tablevar_list_t *tbl_list;
+       colref_t *colref;
+       ifpref_t *ifpref;
+       colref_list_t *clist;
+       var_defs_t *var_defs;
+       var_pair_t *var_pair;
+       gb_t *gb_val;
+       gb_list_t *gb_list;
+       list_of_gb_list_t *list_of_gb_list;
+       extended_gb_t *extended_gb;
+       extended_gb_list_t *extended_gb_list;
+
+       query_list_t *q_list;
+
+/*             For table definition    */
+       field_entry *field_t;
+       field_entry_list *field_list_t;
+       table_def *table_def_t;
+       table_list *table_list_schema;
+       param_list *plist_t;
+       name_vec  *namevec_t;
+       subquery_spec *subq_spec_t;
+       subqueryspec_list *subqueryspec_list_t;
+       unpack_fcn      *ufcn;
+       unpack_fcn_list *ufcnl;
+
+}
+/* Line 193 of yacc.c.  */
+#line 295 "fta.tab.cc"
+       YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 216 of yacc.c.  */
+#line 308 "fta.tab.cc"
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int i)
+#else
+static int
+YYID (i)
+    int i;
+#endif
+{
+  return i;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#     ifndef _STDLIB_H
+#      define _STDLIB_H 1
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+#  endif
+#  if (defined __cplusplus && ! defined _STDLIB_H \
+       && ! ((defined YYMALLOC || defined malloc) \
+            && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef _STDLIB_H
+#    define _STDLIB_H 1
+#   endif
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+        || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  yytype_int16 yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         YYSIZE_T yyi;                         \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];            \
+       }                                       \
+      while (YYID (0))
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (YYID (0))
+
+#endif
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  57
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   708
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  80
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  59
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  176
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  377
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   315
+
+#define YYTRANSLATE(YYX)                                               \
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const yytype_uint8 yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,    74,     2,    77,    76,    19,    13,     2,
+      68,    70,    17,    15,    69,    16,    71,    18,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    79,     2,
+       2,     2,     2,     2,    78,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,    72,     2,    73,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,    12,     2,    75,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    14,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
+      52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+      62,    63,    64,    65,    66,    67
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const yytype_uint16 yyprhs[] =
+{
+       0,     0,     3,     5,     7,    13,    17,    21,    24,    27,
+      29,    33,    37,    40,    43,    45,    47,    51,    56,    60,
+      65,    69,    71,    74,    78,    82,    86,    90,    96,    98,
+     107,   110,   114,   118,   122,   126,   135,   137,   141,   143,
+     146,   148,   152,   158,   164,   170,   172,   176,   177,   179,
+     182,   183,   186,   187,   190,   191,   194,   195,   197,   200,
+     204,   208,   211,   215,   217,   219,   221,   225,   230,   234,
+     240,   242,   246,   250,   254,   258,   262,   266,   270,   274,
+     278,   281,   284,   287,   290,   292,   295,   297,   299,   303,
+     308,   313,   318,   322,   328,   334,   340,   345,   347,   351,
+     355,   361,   363,   367,   369,   371,   373,   375,   377,   379,
+     382,   385,   388,   391,   394,   397,   398,   402,   403,   406,
+     410,   416,   418,   423,   428,   433,   435,   439,   441,   445,
+     447,   451,   457,   461,   464,   469,   471,   475,   481,   485,
+     489,   491,   495,   499,   501,   504,   512,   519,   536,   541,
+     543,   547,   551,   553,   557,   562,   564,   567,   574,   579,
+     580,   584,   586,   589,   592,   595,   599,   604,   609,   614,
+     615,   619,   620,   624,   626,   630,   634
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int16 yyrhs[] =
+{
+      81,     0,    -1,    83,    -1,   125,    -1,    61,    22,   125,
+      82,    23,    -1,    85,    84,    88,    -1,    84,    85,    88,
+      -1,    84,    88,    -1,    85,    88,    -1,    88,    -1,    85,
+      84,    89,    -1,    84,    85,    89,    -1,    84,    89,    -1,
+      85,    89,    -1,    89,    -1,    82,    -1,    83,    21,    82,
+      -1,    57,    22,    86,    23,    -1,    57,    22,    23,    -1,
+      56,    22,    86,    23,    -1,    56,    22,    23,    -1,    87,
+      -1,    86,    87,    -1,     3,     4,    21,    -1,     3,     3,
+      21,    -1,    36,    90,    91,    -1,    54,   122,    92,    -1,
+      54,   122,    55,   109,    92,    -1,   110,    -1,    92,    97,
+     113,   114,   102,    99,   100,   101,    -1,    27,    93,    -1,
+      28,    27,    93,    -1,    30,    27,    93,    -1,    32,    27,
+      93,    -1,    31,    27,    93,    -1,    29,    68,   121,    69,
+       5,    70,    27,    93,    -1,    94,    -1,    93,    69,    94,
+      -1,    95,    -1,    95,     3,    -1,    96,    -1,     3,    71,
+      96,    -1,     3,    71,     3,    71,    96,    -1,     4,    71,
+       3,    71,    96,    -1,    72,     3,    73,    71,    96,    -1,
+       3,    -1,    96,    18,     3,    -1,    -1,    98,    -1,    37,
+     104,    -1,    -1,    39,   104,    -1,    -1,    40,   104,    -1,
+      -1,    41,   104,    -1,    -1,   103,    -1,    34,   104,    -1,
+     104,     8,   104,    -1,   104,     9,   104,    -1,    10,   104,
+      -1,    68,   104,    70,    -1,   105,    -1,   106,    -1,   107,
+      -1,     3,    72,    73,    -1,     3,    72,   111,    73,    -1,
+     109,    11,   109,    -1,   109,    35,    72,   108,    73,    -1,
+     112,    -1,   108,    69,   112,    -1,   109,    15,   109,    -1,
+     109,    16,   109,    -1,   109,    12,   109,    -1,   109,    17,
+     109,    -1,   109,    18,   109,    -1,   109,    13,   109,    -1,
+     109,    19,   109,    -1,   109,    14,   109,    -1,    15,   109,
+      -1,    16,   109,    -1,    74,   109,    -1,    75,   109,    -1,
+     112,    -1,    76,     3,    -1,   120,    -1,   121,    -1,    68,
+     109,    70,    -1,    26,    68,    17,    70,    -1,    26,    68,
+     109,    70,    -1,     3,    68,   111,    70,    -1,     3,    68,
+      70,    -1,    26,    76,    68,    17,    70,    -1,    26,    76,
+      68,   109,    70,    -1,     3,    76,    68,   111,    70,    -1,
+       3,    76,    68,    70,    -1,   109,    -1,   109,    25,     3,
+      -1,   110,    69,   109,    -1,   110,    69,   109,    25,     3,
+      -1,   109,    -1,   111,    69,   109,    -1,     4,    -1,     5,
+      -1,     6,    -1,     7,    -1,    47,    -1,    48,    -1,    49,
+       4,    -1,    50,     4,    -1,    51,     4,    -1,    52,     4,
+      -1,    53,     4,    -1,    77,     3,    -1,    -1,    33,    24,
+     117,    -1,    -1,    38,   124,    -1,    68,   118,    70,    -1,
+     115,    69,    68,   118,    70,    -1,   119,    -1,    45,    68,
+     118,    70,    -1,    44,    68,   118,    70,    -1,    46,    68,
+     115,    70,    -1,   116,    -1,   117,    69,   116,    -1,   119,
+      -1,   118,    69,   119,    -1,     3,    -1,     3,    71,     3,
+      -1,     3,    71,     3,    71,     3,    -1,   109,    25,     3,
+      -1,    78,     3,    -1,     3,    71,    78,     3,    -1,     3,
+      -1,     3,    71,     3,    -1,     3,    71,     3,    71,     3,
+      -1,   121,    79,   121,    -1,   122,    79,   121,    -1,     3,
+      -1,   123,    69,   123,    -1,   124,    69,   123,    -1,   126,
+      -1,   125,   126,    -1,    58,     3,   136,   135,    22,   131,
+      23,    -1,    60,    96,   136,    22,   131,    23,    -1,    64,
+       3,    22,    63,   133,    65,    22,   131,    23,    66,    22,
+     129,    23,    67,   133,    23,    -1,    62,    22,   127,    23,
+      -1,   128,    -1,   127,    21,   128,    -1,     3,     3,     5,
+      -1,   130,    -1,   129,    21,   130,    -1,     3,    68,   138,
+      70,    -1,   132,    -1,   131,   132,    -1,     3,     3,     3,
+     133,   135,    21,    -1,     3,     3,   133,    21,    -1,    -1,
+      68,   134,    70,    -1,     3,    -1,     3,     3,    -1,     3,
+       4,    -1,     3,     5,    -1,   134,    69,     3,    -1,   134,
+      69,     3,     3,    -1,   134,    69,     3,     4,    -1,   134,
+      69,     3,     5,    -1,    -1,    72,   137,    73,    -1,    -1,
+      68,   137,    70,    -1,     3,    -1,   137,    69,     3,    -1,
+       3,     3,   133,    -1,   138,    69,     3,     3,   133,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const yytype_uint16 yyrline[] =
+{
+       0,   189,   189,   194,   201,   215,   220,   225,   230,   234,
+     237,   242,   247,   251,   255,   260,   261,   265,   266,   270,
+     271,   275,   276,   280,   281,   285,   289,   291,   299,   303,
+     315,   316,   317,   318,   319,   320,   324,   325,   329,   330,
+     334,   335,   336,   337,   338,   342,   343,   348,   349,   353,
+     357,   358,   362,   363,   367,   368,   372,   373,   377,   384,
+     385,   386,   387,   388,   392,   393,   394,   395,   399,   403,
+     407,   408,   414,   415,   416,   417,   418,   419,   420,   421,
+     422,   423,   424,   425,   426,   427,   428,   429,   430,   431,
+     432,   433,   434,   435,   436,   437,   438,   443,   444,   445,
+     446,   450,   451,   455,   456,   457,   458,   459,   460,   461,
+     462,   463,   464,   465,   466,   472,   473,   477,   478,   482,
+     483,   487,   488,   489,   490,   494,   495,   499,   500,   504,
+     505,   506,   507,   518,   519,   523,   524,   525,   529,   530,
+     534,   538,   539,   554,   555,   558,   560,   562,   564,   568,
+     569,   573,   577,   578,   582,   585,   586,   590,   591,   595,
+     596,   600,   601,   602,   603,   604,   605,   606,   607,   611,
+     612,   616,   617,   621,   622,   626,   627
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "NAME", "STRING_TOKEN", "INTNUM",
+  "LONGINTNUM", "APPROXNUM", "OR", "AND", "NOT", "COMPARISON", "'|'",
+  "'&'", "SHIFT_OP", "'+'", "'-'", "'*'", "'/'", "'%'", "UMINUS",
+  "SEMICOLON", "LEFTBRACE", "RIGHTBRACE", "BY", "AS", "AGGR", "FROM",
+  "INNER_JOIN", "FILTER_JOIN", "OUTER_JOIN", "LEFT_OUTER_JOIN",
+  "RIGHT_OUTER_JOIN", "GROUP", "HAVING", "IN", "SELECT", "WHERE",
+  "SUPERGROUP", "CLEANING_WHEN", "CLEANING_BY", "CLOSING_WHEN", "SUCH",
+  "THAT", "CUBE", "ROLLUP", "GROUPING_SETS", "TRUE_V", "FALSE_V",
+  "TIMEVAL_L", "HEX_L", "LHEX_L", "IP_L", "IPV6_L", "MERGE", "SLACK",
+  "DEFINE_SEC", "PARAM_SEC", "PROTOCOL", "TABLE", "STREAM", "FTA",
+  "UNPACK_FCNS", "OPERATOR", "OPERATOR_VIEW", "FIELDS", "SUBQUERIES",
+  "SELECTION_PUSHDOWN", "'('", "','", "')'", "'.'", "'['", "']'", "'!'",
+  "'~'", "'$'", "'#'", "'@'", "':'", "$accept", "parse_result", "gsql",
+  "query_list", "params_def", "variable_def", "variable_list",
+  "variable_assign", "select_statement", "merge_statement", "selection",
+  "table_exp", "from_clause", "table_ref_commalist", "table_ref", "table",
+  "qname", "opt_where_clause", "where_clause", "opt_cleaning_when_clause",
+  "opt_cleaning_by_clause", "opt_closing_when_clause", "opt_having_clause",
+  "having_clause", "search_condition", "predicate", "comparison_predicate",
+  "in_predicate", "literal_commalist", "scalar_exp", "select_commalist",
+  "scalar_exp_commalist", "literal", "opt_group_by_clause",
+  "opt_supergroup_clause", "list_of_gb_commalist", "extended_gb",
+  "extended_gb_commalist", "gb_commalist", "gb", "ifparam", "column_ref",
+  "column_ref_list", "gb_ref", "gb_ref_list", "table_list", "table_def",
+  "unpack_func_list", "unpack_func", "subqueryspec_list", "subq_spec",
+  "field_list", "field", "opt_param_commalist", "param_commalist",
+  "opt_singleparam_commalist_bkt", "opt_singleparam_commalist",
+  "singleparam_commalist", "namevec_commalist", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const yytype_uint16 yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   124,    38,   267,    43,    45,    42,    47,    37,
+     268,   269,   270,   271,   272,   273,   274,   275,   276,   277,
+     278,   279,   280,   281,   282,   283,   284,   285,   286,   287,
+     288,   289,   290,   291,   292,   293,   294,   295,   296,   297,
+     298,   299,   300,   301,   302,   303,   304,   305,   306,   307,
+     308,   309,   310,   311,   312,   313,   314,   315,    40,    44,
+      41,    46,    91,    93,    33,   126,    36,    35,    64,    58
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    80,    81,    81,    81,    82,    82,    82,    82,    82,
+      82,    82,    82,    82,    82,    83,    83,    84,    84,    85,
+      85,    86,    86,    87,    87,    88,    89,    89,    90,    91,
+      92,    92,    92,    92,    92,    92,    93,    93,    94,    94,
+      95,    95,    95,    95,    95,    96,    96,    97,    97,    98,
+      99,    99,   100,   100,   101,   101,   102,   102,   103,   104,
+     104,   104,   104,   104,   105,   105,   105,   105,   106,   107,
+     108,   108,   109,   109,   109,   109,   109,   109,   109,   109,
+     109,   109,   109,   109,   109,   109,   109,   109,   109,   109,
+     109,   109,   109,   109,   109,   109,   109,   110,   110,   110,
+     110,   111,   111,   112,   112,   112,   112,   112,   112,   112,
+     112,   112,   112,   112,   112,   113,   113,   114,   114,   115,
+     115,   116,   116,   116,   116,   117,   117,   118,   118,   119,
+     119,   119,   119,   120,   120,   121,   121,   121,   122,   122,
+     123,   124,   124,   125,   125,   126,   126,   126,   126,   127,
+     127,   128,   129,   129,   130,   131,   131,   132,   132,   133,
+     133,   134,   134,   134,   134,   134,   134,   134,   134,   135,
+     135,   136,   136,   137,   137,   138,   138
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     1,     1,     5,     3,     3,     2,     2,     1,
+       3,     3,     2,     2,     1,     1,     3,     4,     3,     4,
+       3,     1,     2,     3,     3,     3,     3,     5,     1,     8,
+       2,     3,     3,     3,     3,     8,     1,     3,     1,     2,
+       1,     3,     5,     5,     5,     1,     3,     0,     1,     2,
+       0,     2,     0,     2,     0,     2,     0,     1,     2,     3,
+       3,     2,     3,     1,     1,     1,     3,     4,     3,     5,
+       1,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       2,     2,     2,     2,     1,     2,     1,     1,     3,     4,
+       4,     4,     3,     5,     5,     5,     4,     1,     3,     3,
+       5,     1,     3,     1,     1,     1,     1,     1,     1,     2,
+       2,     2,     2,     2,     2,     0,     3,     0,     2,     3,
+       5,     1,     4,     4,     4,     1,     3,     1,     3,     1,
+       3,     5,     3,     2,     4,     1,     3,     5,     3,     3,
+       1,     3,     3,     1,     2,     7,     6,    16,     4,     1,
+       3,     3,     1,     3,     4,     1,     2,     6,     4,     0,
+       3,     1,     2,     2,     2,     3,     4,     4,     4,     0,
+       3,     0,     3,     1,     3,     3,     5
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const yytype_uint8 yydefact[] =
+{
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    15,     2,     0,     0,     9,    14,     3,   143,   135,
+     103,   104,   105,   106,     0,     0,     0,   107,   108,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,    97,    28,    84,    86,    87,   135,     0,     0,     0,
+       0,   171,    45,   171,     0,     0,     0,     1,     0,     0,
+       7,    12,     0,     8,    13,   144,     0,     0,     0,    80,
+      81,     0,     0,   109,   110,   111,   112,   113,     0,    82,
+      83,    85,   114,   133,     0,     0,     0,     0,     0,     0,
+      25,    47,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    26,     0,    20,     0,
+      21,    18,     0,     0,   169,     0,     0,     0,     0,     0,
+     149,     0,    16,     6,    11,     5,    10,    92,   101,     0,
+     136,     0,     0,     0,     0,     0,    88,    45,     0,     0,
+      30,    36,    38,    40,     0,     0,     0,     0,     0,     0,
+     115,    48,    74,    77,    79,    72,    73,    75,    76,    78,
+      98,    99,   138,     0,   139,     0,     0,    19,    22,    17,
+     173,     0,     0,     0,    46,     0,     0,     0,     0,   148,
+     159,     0,    91,     0,   134,    96,     0,    89,    90,     0,
+       0,     0,     0,     0,     0,    39,    31,     0,    32,    34,
+      33,   135,     0,     0,    49,    63,    64,    65,     0,     0,
+     117,     0,    27,    24,    23,     0,   172,     0,     0,     0,
+       0,   155,     4,   151,   150,     0,     0,   102,   137,    95,
+      93,    94,    45,    41,     0,     0,    37,     0,     0,    61,
+       0,     0,     0,     0,     0,     0,     0,     0,    56,   100,
+     174,   170,     0,   159,   146,   156,   161,     0,     0,     0,
+       0,     0,     0,    66,     0,    62,    59,    60,    68,     0,
+     129,     0,     0,     0,     0,   125,   116,   121,   140,     0,
+     118,     0,    50,    57,   145,   159,     0,   162,   163,   164,
+       0,   160,     0,    42,    43,    44,     0,    67,     0,    70,
+       0,     0,     0,     0,     0,     0,     0,     0,    58,     0,
+      52,   169,   158,   165,     0,     0,     0,    69,   130,     0,
+     127,     0,     0,     0,   132,   126,   141,   142,    51,     0,
+      54,     0,   166,   167,   168,     0,    35,    71,     0,     0,
+     123,   122,     0,     0,   124,    53,     0,    29,   157,     0,
+     131,   128,   119,     0,    55,     0,     0,     0,     0,   152,
+     120,     0,     0,     0,     0,     0,   153,   159,   159,     0,
+     154,     0,   175,     0,   147,   159,   176
+};
+
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
+{
+      -1,    10,    11,    12,    13,    14,   109,   110,    15,    16,
+      40,    90,    91,   140,   141,   142,   143,   150,   151,   310,
+     330,   347,   282,   283,   204,   205,   206,   207,   298,   208,
+      42,   129,    43,   210,   248,   323,   275,   276,   319,   320,
+      44,    45,    48,   279,   280,    17,    18,   119,   120,   358,
+     359,   220,   221,   226,   257,   173,   114,   171,   365
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -247
+static const yytype_int16 yypact[] =
+{
+     121,   535,    76,     6,    60,    85,   115,   111,   132,   123,
+     165,  -247,   147,    -9,   117,  -247,  -247,   178,  -247,    87,
+    -247,  -247,  -247,  -247,   535,   535,   -24,  -247,  -247,   207,
+     219,   223,   235,   242,   535,   535,   535,   198,   222,   266,
+     261,   554,   230,  -247,  -247,  -247,   243,   238,   360,   104,
+     107,   252,  -247,    18,   178,   319,   329,  -247,   -14,   163,
+    -247,  -247,   163,  -247,  -247,  -247,   200,    12,   295,  -247,
+    -247,   279,   301,  -247,  -247,  -247,  -247,  -247,   294,  -247,
+    -247,  -247,  -247,  -247,    13,   366,   326,   373,   374,   397,
+    -247,   359,   535,   535,   535,   535,   535,   535,   535,   535,
+     423,   535,   424,    76,   535,    76,  -247,    63,  -247,   113,
+    -247,  -247,   153,   425,   362,   432,   414,   422,   435,    30,
+    -247,   377,  -247,  -247,  -247,  -247,  -247,  -247,   689,   197,
+     370,   439,   355,   383,   327,   369,  -247,   385,   386,   451,
+     390,  -247,   464,   450,    13,    76,    13,    13,    13,   445,
+     436,  -247,   486,   395,   318,   191,   191,  -247,  -247,  -247,
+    -247,   645,  -247,   624,  -247,   449,   452,  -247,  -247,  -247,
+    -247,   210,   425,   455,  -247,   469,   458,   478,   319,  -247,
+     419,   535,  -247,   485,  -247,  -247,   228,  -247,  -247,   420,
+     616,   488,   511,   416,    13,  -247,   390,   446,   390,   390,
+     390,   247,   445,   445,   205,  -247,  -247,  -247,   126,   492,
+     479,   515,  -247,  -247,  -247,   521,  -247,   -19,   469,   522,
+     161,  -247,  -247,  -247,  -247,   523,   463,   689,  -247,  -247,
+    -247,  -247,   460,   450,   472,   473,  -247,   524,   459,  -247,
+      11,   246,   445,   445,   535,   474,   144,   527,   513,  -247,
+    -247,  -247,   164,    15,  -247,  -247,   268,   233,   526,   115,
+     115,   115,   475,  -247,    59,  -247,   540,  -247,   689,    25,
+      43,   489,   490,   491,   659,  -247,   493,  -247,  -247,   494,
+     505,   445,   537,  -247,  -247,   419,   539,  -247,  -247,  -247,
+     574,  -247,   469,   450,   450,   450,   551,  -247,    93,  -247,
+      23,   549,   549,   512,   578,   144,   527,   527,   205,   445,
+     550,   362,  -247,   345,   221,    13,    25,  -247,   216,   255,
+    -247,   296,   549,   298,  -247,  -247,  -247,  -247,   205,   445,
+     548,   570,  -247,  -247,  -247,   528,   390,  -247,   589,   549,
+    -247,  -247,   308,   525,  -247,   205,   445,  -247,  -247,   573,
+     675,  -247,  -247,   549,   205,   601,   310,   538,   177,  -247,
+    -247,   602,   601,   541,   604,   313,  -247,   419,   419,   611,
+    -247,   592,  -247,   613,  -247,   419,  -247
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yytype_int16 yypgoto[] =
+{
+    -247,  -247,   -37,  -247,   605,   607,   568,   -71,    50,   110,
+    -247,  -247,   -38,  -142,   427,  -247,    -5,  -247,  -247,  -247,
+    -247,  -247,  -247,  -247,  -194,  -247,  -247,  -247,  -247,    -1,
+    -247,  -121,  -232,  -247,  -247,  -247,   317,  -247,  -233,  -234,
+    -247,     1,  -247,    92,  -247,   590,    -4,  -247,   467,  -247,
+     284,  -193,  -206,  -246,  -247,   336,   595,   477,  -247
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -138
+static const yytype_int16 yytable[] =
+{
+      41,    53,   196,    47,   198,   199,   200,   286,   239,   240,
+     106,   186,   277,    65,   255,   130,   137,   138,   285,   242,
+     243,   122,     1,    69,    70,   252,   318,     1,    49,    20,
+      21,    22,    23,    78,    79,    80,   115,   299,   168,   311,
+       2,   168,     3,     4,    71,     2,   255,     3,   266,   267,
+     215,   178,    72,   179,   251,  -135,  -135,  -135,  -135,  -135,
+    -135,  -135,  -135,    60,    63,   128,   165,   166,  -135,   321,
+     134,   277,    27,    28,    29,    30,    31,    32,    33,    46,
+     176,   265,    50,   225,   337,   139,   113,   308,    51,   342,
+     131,   152,   153,   154,   155,   156,   157,   158,   159,   314,
+     161,   131,    38,   163,   162,   351,   164,   107,   255,   123,
+     107,    66,   125,    65,   300,   328,   107,   264,    52,    68,
+     356,   371,   372,    61,    64,   212,    56,   108,   181,   376,
+     111,   128,   297,    54,   190,   345,   167,   244,    92,    93,
+      94,    95,    96,    97,    98,    99,   197,   270,    20,    21,
+      22,    23,   354,     1,    55,    66,   107,     1,    67,    24,
+      25,   245,   316,    68,   219,    57,   317,   219,    58,   124,
+      26,     2,   126,   336,     4,     2,   169,     3,     4,     5,
+     227,     6,     7,     8,   254,     9,   233,   284,   271,   272,
+     273,    27,    28,    29,    30,    31,    32,    33,   362,     1,
+     363,    81,   241,    19,    20,    21,    22,    23,    97,    98,
+      99,    73,    34,   242,   243,    24,    25,     2,    35,    36,
+      37,    38,    39,    74,   219,    82,    26,    75,  -136,  -136,
+    -136,  -136,  -136,  -136,  -136,  -136,     5,   128,     6,    76,
+       8,  -136,     9,   268,   335,   274,    77,    27,    28,    29,
+      30,    31,    32,    33,   293,   294,   295,   244,    92,    93,
+      94,    95,    96,    97,    98,    99,   181,   182,    34,    83,
+     127,   287,   288,   289,    35,    36,    37,    38,    39,   215,
+     216,   245,    19,    20,    21,    22,    23,   338,    84,    85,
+      86,    87,    88,    89,    24,    25,   133,   181,   229,   101,
+     274,   274,   290,   291,   274,    26,    92,    93,    94,    95,
+      96,    97,    98,    99,   102,    66,   136,   103,    67,   238,
+     113,   274,   118,    68,   339,   340,    27,    28,    29,    30,
+      31,    32,    33,    95,    96,    97,    98,    99,   274,    92,
+      93,    94,    95,    96,    97,    98,    99,    34,   332,   333,
+     334,   121,   274,    35,    36,    37,    38,    39,    19,    20,
+      21,    22,    23,   132,   136,   339,   341,   343,   344,   135,
+      24,    25,    19,    20,    21,    22,    23,   339,   352,   339,
+     360,    26,   369,   370,    24,    25,   189,    84,    85,    86,
+      87,    88,    89,   144,   145,    26,   149,   188,   326,   327,
+     146,   147,    27,    28,    29,    30,    31,    32,    33,    94,
+      95,    96,    97,    98,    99,   104,    27,    28,    29,    30,
+      31,    32,    33,    34,   148,   185,   160,   130,   170,    35,
+      36,    37,    38,    39,   172,   174,   175,    34,   177,   105,
+     180,   183,   184,    35,    36,    37,    38,    39,   201,    20,
+      21,    22,    23,   187,   193,   202,   191,   192,     1,   194,
+      24,    25,    19,    20,    21,    22,    23,   195,   115,   209,
+     213,    26,   219,   214,    24,    25,     2,   218,     3,     4,
+       5,   222,     6,   223,     8,    26,     9,   225,   228,   235,
+     230,   232,    27,    28,    29,    30,    31,    32,    33,    93,
+      94,    95,    96,    97,    98,    99,    27,    28,    29,    30,
+      31,    32,    33,   203,   234,   237,   246,   247,   249,    35,
+      36,    37,    38,    39,   250,   253,   256,    34,   258,   262,
+     278,   259,   263,    35,    36,    37,    38,    39,    19,    20,
+      21,    22,    23,   260,   261,   296,   269,   281,   292,   243,
+      24,    25,   270,    20,    21,    22,    23,   301,   302,   303,
+     312,    26,   305,   306,    24,    25,    92,    93,    94,    95,
+      96,    97,    98,    99,   307,    26,   309,   313,   315,   100,
+     322,   324,    27,    28,    29,    30,    31,    32,    33,   346,
+     329,   348,   350,   353,   349,   355,    27,    28,    29,    30,
+      31,    32,    33,    34,   357,   364,   361,   368,   367,    35,
+      36,    37,    38,    39,   373,   374,   375,    34,   112,    62,
+      59,   236,   325,    35,    36,    37,    38,    39,    92,    93,
+      94,    95,    96,    97,    98,    99,    92,    93,    94,    95,
+      96,    97,    98,    99,   117,   224,   366,   331,   116,   217,
+       0,    84,    85,    86,    87,    88,    89,    92,    93,    94,
+      95,    96,    97,    98,    99,     0,     0,     0,     0,     0,
+     211,    92,    93,    94,    95,    96,    97,    98,    99,     0,
+       0,     0,     0,     0,   304,     0,   231,  -137,  -137,  -137,
+    -137,  -137,  -137,  -137,  -137,     0,     0,     0,     0,     0,
+    -137,    92,    93,    94,    95,    96,    97,    98,    99
+};
+
+static const yytype_int16 yycheck[] =
+{
+       1,     6,   144,     2,   146,   147,   148,   253,   202,   203,
+      48,   132,   246,    17,   220,     3,     3,     4,     3,     8,
+       9,    58,    36,    24,    25,   218,     3,    36,    22,     4,
+       5,     6,     7,    34,    35,    36,    18,   269,   109,   285,
+      54,   112,    56,    57,    68,    54,   252,    56,   242,   243,
+      69,    21,    76,    23,    73,    12,    13,    14,    15,    16,
+      17,    18,    19,    13,    14,    66,     3,     4,    25,   302,
+      71,   305,    47,    48,    49,    50,    51,    52,    53,     3,
+     117,    70,    22,    68,   316,    72,    68,   281,     3,   322,
+      78,    92,    93,    94,    95,    96,    97,    98,    99,   292,
+     101,    78,    77,   104,   103,   339,   105,     3,   314,    59,
+       3,    68,    62,   117,    71,   309,     3,   238,     3,    76,
+     353,   367,   368,    13,    14,   163,     3,    23,    69,   375,
+      23,   132,    73,    22,   135,   329,    23,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,   145,     3,     4,     5,
+       6,     7,   346,    36,    22,    68,     3,    36,    71,    15,
+      16,    35,    69,    76,     3,     0,    73,     3,    21,    59,
+      26,    54,    62,   315,    57,    54,    23,    56,    57,    58,
+     181,    60,    61,    62,    23,    64,   191,    23,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    21,    36,
+      23,     3,   203,     3,     4,     5,     6,     7,    17,    18,
+      19,     4,    68,     8,     9,    15,    16,    54,    74,    75,
+      76,    77,    78,     4,     3,     3,    26,     4,    12,    13,
+      14,    15,    16,    17,    18,    19,    58,   238,    60,     4,
+      62,    25,    64,   244,    23,   246,     4,    47,    48,    49,
+      50,    51,    52,    53,   259,   260,   261,    11,    12,    13,
+      14,    15,    16,    17,    18,    19,    69,    70,    68,     3,
+      70,     3,     4,     5,    74,    75,    76,    77,    78,    69,
+      70,    35,     3,     4,     5,     6,     7,    71,    27,    28,
+      29,    30,    31,    32,    15,    16,    17,    69,    70,    69,
+     301,   302,    69,    70,   305,    26,    12,    13,    14,    15,
+      16,    17,    18,    19,    71,    68,    70,    79,    71,    72,
+      68,   322,     3,    76,    69,    70,    47,    48,    49,    50,
+      51,    52,    53,    15,    16,    17,    18,    19,   339,    12,
+      13,    14,    15,    16,    17,    18,    19,    68,     3,     4,
+       5,    22,   353,    74,    75,    76,    77,    78,     3,     4,
+       5,     6,     7,    68,    70,    69,    70,    69,    70,    68,
+      15,    16,     3,     4,     5,     6,     7,    69,    70,    69,
+      70,    26,    69,    70,    15,    16,    17,    27,    28,    29,
+      30,    31,    32,    27,    68,    26,    37,    70,   306,   307,
+      27,    27,    47,    48,    49,    50,    51,    52,    53,    14,
+      15,    16,    17,    18,    19,    55,    47,    48,    49,    50,
+      51,    52,    53,    68,    27,    70,     3,     3,     3,    74,
+      75,    76,    77,    78,    72,     3,    22,    68,     3,    79,
+      63,    71,     3,    74,    75,    76,    77,    78,     3,     4,
+       5,     6,     7,    70,     3,    10,    71,    71,    36,    69,
+      15,    16,     3,     4,     5,     6,     7,     3,    18,    33,
+      21,    26,     3,    21,    15,    16,    54,    22,    56,    57,
+      58,    23,    60,     5,    62,    26,    64,    68,     3,    73,
+      70,     3,    47,    48,    49,    50,    51,    52,    53,    13,
+      14,    15,    16,    17,    18,    19,    47,    48,    49,    50,
+      51,    52,    53,    68,     3,    69,    24,    38,     3,    74,
+      75,    76,    77,    78,     3,     3,     3,    68,    65,     5,
+       3,    71,    73,    74,    75,    76,    77,    78,     3,     4,
+       5,     6,     7,    71,    71,    70,    72,    34,    22,     9,
+      15,    16,     3,     4,     5,     6,     7,    68,    68,    68,
+      21,    26,    69,    69,    15,    16,    12,    13,    14,    15,
+      16,    17,    18,    19,    69,    26,    39,     3,    27,    25,
+      68,     3,    47,    48,    49,    50,    51,    52,    53,    41,
+      40,    21,     3,    68,    66,    22,    47,    48,    49,    50,
+      51,    52,    53,    68,     3,     3,    68,     3,    67,    74,
+      75,    76,    77,    78,     3,    23,     3,    68,    50,    14,
+      13,   194,   305,    74,    75,    76,    77,    78,    12,    13,
+      14,    15,    16,    17,    18,    19,    12,    13,    14,    15,
+      16,    17,    18,    19,    54,   178,   362,   311,    53,   172,
+      -1,    27,    28,    29,    30,    31,    32,    12,    13,    14,
+      15,    16,    17,    18,    19,    -1,    -1,    -1,    -1,    -1,
+      25,    12,    13,    14,    15,    16,    17,    18,    19,    -1,
+      -1,    -1,    -1,    -1,    25,    -1,    70,    12,    13,    14,
+      15,    16,    17,    18,    19,    -1,    -1,    -1,    -1,    -1,
+      25,    12,    13,    14,    15,    16,    17,    18,    19
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const yytype_uint8 yystos[] =
+{
+       0,    36,    54,    56,    57,    58,    60,    61,    62,    64,
+      81,    82,    83,    84,    85,    88,    89,   125,   126,     3,
+       4,     5,     6,     7,    15,    16,    26,    47,    48,    49,
+      50,    51,    52,    53,    68,    74,    75,    76,    77,    78,
+      90,   109,   110,   112,   120,   121,     3,   121,   122,    22,
+      22,     3,     3,    96,    22,    22,     3,     0,    21,    85,
+      88,    89,    84,    88,    89,   126,    68,    71,    76,   109,
+     109,    68,    76,     4,     4,     4,     4,     4,   109,   109,
+     109,     3,     3,     3,    27,    28,    29,    30,    31,    32,
+      91,    92,    12,    13,    14,    15,    16,    17,    18,    19,
+      25,    69,    71,    79,    55,    79,    92,     3,    23,    86,
+      87,    23,    86,    68,   136,    18,   136,   125,     3,   127,
+     128,    22,    82,    88,    89,    88,    89,    70,   109,   111,
+       3,    78,    68,    17,   109,    68,    70,     3,     4,    72,
+      93,    94,    95,    96,    27,    68,    27,    27,    27,    37,
+      97,    98,   109,   109,   109,   109,   109,   109,   109,   109,
+       3,   109,   121,   109,   121,     3,     4,    23,    87,    23,
+       3,   137,    72,   135,     3,    22,    82,     3,    21,    23,
+      63,    69,    70,    71,     3,    70,   111,    70,    70,    17,
+     109,    71,    71,     3,    69,     3,    93,   121,    93,    93,
+      93,     3,    10,    68,   104,   105,   106,   107,   109,    33,
+     113,    25,    92,    21,    21,    69,    70,   137,    22,     3,
+     131,   132,    23,     5,   128,    68,   133,   109,     3,    70,
+      70,    70,     3,    96,     3,    73,    94,    69,    72,   104,
+     104,   109,     8,     9,    11,    35,    24,    38,   114,     3,
+       3,    73,   131,     3,    23,   132,     3,   134,    65,    71,
+      71,    71,     5,    73,   111,    70,   104,   104,   109,    72,
+       3,    44,    45,    46,   109,   116,   117,   119,     3,   123,
+     124,    34,   102,   103,    23,     3,   133,     3,     4,     5,
+      69,    70,    22,    96,    96,    96,    70,    73,   108,   112,
+      71,    68,    68,    68,    25,    69,    69,    69,   104,    39,
+      99,   133,    21,     3,   131,    27,    69,    73,     3,   118,
+     119,   118,    68,   115,     3,   116,   123,   123,   104,    40,
+     100,   135,     3,     4,     5,    23,    93,   112,    71,    69,
+      70,    70,   118,    69,    70,   104,    41,   101,    21,    66,
+       3,   119,    70,    68,   104,    22,   118,     3,   129,   130,
+      70,    68,    21,    23,     3,   138,   130,    67,     3,    69,
+      70,   133,   133,     3,    23,     3,   133
+};
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                (-2)
+#define YYEOF          0
+
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT                goto yyabortlab
+#define YYERROR                goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL         goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yytoken = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK (1);                                          \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror (YY_("syntax error: cannot back up")); \
+      YYERROR;                                                 \
+    }                                                          \
+while (YYID (0))
+
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)                               \
+    do                                                                 \
+      if (YYID (N))                                                    \
+       {                                                               \
+         (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
+         (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
+         (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
+         (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
+       }                                                               \
+      else                                                             \
+       {                                                               \
+         (Current).first_line   = (Current).last_line   =              \
+           YYRHSLOC (Rhs, 0).last_line;                                \
+         (Current).first_column = (Current).last_column =              \
+           YYRHSLOC (Rhs, 0).last_column;                              \
+       }                                                               \
+    while (YYID (0))
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+   This macro was not mandated originally: define only if we know
+   we won't break user code: when these are the locations we know.  */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)                 \
+     fprintf (File, "%d.%d-%d.%d",                     \
+             (Loc).first_line, (Loc).first_column,     \
+             (Loc).last_line,  (Loc).last_column)
+# else
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                   \
+do {                                                                     \
+  if (yydebug)                                                           \
+    {                                                                    \
+      YYFPRINTF (stderr, "%s ", Title);                                          \
+      yy_symbol_print (stderr,                                           \
+                 Type, Value); \
+      YYFPRINTF (stderr, "\n");                                                  \
+    }                                                                    \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+       break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+  YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    yytype_int16 *bottom;
+    yytype_int16 *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)                           \
+do {                                                           \
+  if (yydebug)                                                 \
+    yy_stack_print ((Bottom), (Top));                          \
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
+    int yyrule;
+#endif
+{
+  int yynrhs = yyr2[yyrule];
+  int yyi;
+  unsigned long int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+            yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      fprintf (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+                      &(yyvsp[(yyi + 1) - (yynrhs)])
+                                      );
+      fprintf (stderr, "\n");
+    }
+}
+
+# define YY_REDUCE_PRINT(Rule)         \
+do {                                   \
+  if (yydebug)                         \
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+\f
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined __GLIBC__ && defined _STRING_H
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+    const char *yystr;
+#endif
+{
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
+    continue;
+  return yylen;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+    char *yydest;
+    const char *yysrc;
+#endif
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYSIZE_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+       switch (*++yyp)
+         {
+         case '\'':
+         case ',':
+           goto do_not_strip_quotes;
+
+         case '\\':
+           if (*++yyp != '\\')
+             goto do_not_strip_quotes;
+           /* Fall through.  */
+         default:
+           if (yyres)
+             yyres[yyn] = *yyp;
+           yyn++;
+           break;
+
+         case '"':
+           if (yyres)
+             yyres[yyn] = '\0';
+           return yyn;
+         }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into YYRESULT an error message about the unexpected token
+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+   including the terminating null byte.  If YYRESULT is null, do not
+   copy anything; just return the number of bytes that would be
+   copied.  As a special case, return 0 if an ordinary "syntax error"
+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+   size calculation.  */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+  int yyn = yypact[yystate];
+
+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+    return 0;
+  else
+    {
+      int yytype = YYTRANSLATE (yychar);
+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+      YYSIZE_T yysize = yysize0;
+      YYSIZE_T yysize1;
+      int yysize_overflow = 0;
+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+      int yyx;
+
+# if 0
+      /* This is so xgettext sees the translatable formats that are
+        constructed on the fly.  */
+      YY_("syntax error, unexpected %s");
+      YY_("syntax error, unexpected %s, expecting %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+      char *yyfmt;
+      char const *yyf;
+      static char const yyunexpected[] = "syntax error, unexpected %s";
+      static char const yyexpecting[] = ", expecting %s";
+      static char const yyor[] = " or %s";
+      char yyformat[sizeof yyunexpected
+                   + sizeof yyexpecting - 1
+                   + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+                      * (sizeof yyor - 1))];
+      char const *yyprefix = yyexpecting;
+
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+        YYCHECK.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yycount = 1;
+
+      yyarg[0] = yytname[yytype];
+      yyfmt = yystpcpy (yyformat, yyunexpected);
+
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+       if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+         {
+           if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+             {
+               yycount = 1;
+               yysize = yysize0;
+               yyformat[sizeof yyunexpected - 1] = '\0';
+               break;
+             }
+           yyarg[yycount++] = yytname[yyx];
+           yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+           yysize_overflow |= (yysize1 < yysize);
+           yysize = yysize1;
+           yyfmt = yystpcpy (yyfmt, yyprefix);
+           yyprefix = yyor;
+         }
+
+      yyf = YY_(yyformat);
+      yysize1 = yysize + yystrlen (yyf);
+      yysize_overflow |= (yysize1 < yysize);
+      yysize = yysize1;
+
+      if (yysize_overflow)
+       return YYSIZE_MAXIMUM;
+
+      if (yyresult)
+       {
+         /* Avoid sprintf, as that infringes on the user's name space.
+            Don't have undefined behavior even if the translation
+            produced a string with the wrong number of "%s"s.  */
+         char *yyp = yyresult;
+         int yyi = 0;
+         while ((*yyp = *yyf) != '\0')
+           {
+             if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+               {
+                 yyp += yytnamerr (yyp, yyarg[yyi++]);
+                 yyf += 2;
+               }
+             else
+               {
+                 yyp++;
+                 yyf++;
+               }
+           }
+       }
+      return yysize;
+    }
+}
+#endif /* YYERROR_VERBOSE */
+\f
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  YYUSE (yyvaluep);
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  switch (yytype)
+    {
+
+      default:
+       break;
+    }
+}
+\f
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The look-ahead symbol.  */
+int yychar;
+
+/* The semantic value of the look-ahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+  
+  int yystate;
+  int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Look-ahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  yytype_int16 yyssa[YYINITDEPTH];
+  yytype_int16 *yyss = yyssa;
+  yytype_int16 *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed.  So pushing a state here evens the stacks.  */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack.  Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       yytype_int16 *yyss1 = yyss;
+
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
+       yyoverflow (YY_("memory exhausted"),
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+
+                   &yystacksize);
+
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyexhaustedlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+       goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       yytype_int16 *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyexhaustedlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+  /* Do appropriate processing given the current state.  Read a
+     look-ahead token if we need one and don't already have one.  */
+
+  /* First try to decide what to do without reference to look-ahead token.  */
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a look-ahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  /* Shift the look-ahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  yystate = yyn;
+  *++yyvsp = yylval;
+
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 2:
+#line 189 "fta.y"
+    {
+               fta_parse_result->parse_tree_list = (yyvsp[(1) - (1)].q_list);
+               fta_parse_result->tables = NULL;
+               fta_parse_result->parse_type = QUERY_PARSE;
+       ;}
+    break;
+
+  case 3:
+#line 194 "fta.y"
+    {
+               fta_parse_result->parse_tree_list = NULL;
+               fta_parse_result->fta_parse_tree = NULL;
+               fta_parse_result->tables = (yyvsp[(1) - (1)].table_list_schema);
+               fta_parse_result->parse_type = TABLE_PARSE;
+       ;}
+    break;
+
+  case 4:
+#line 201 "fta.y"
+    {
+               fta_parse_result->parse_tree_list = NULL;
+               fta_parse_result->fta_parse_tree = (yyvsp[(4) - (5)].tblp);
+               fta_parse_result->tables = (yyvsp[(3) - (5)].table_list_schema);
+               fta_parse_result->parse_type = STREAM_PARSE;
+       ;}
+    break;
+
+  case 5:
+#line 215 "fta.y"
+    {
+                               (yyvsp[(3) - (3)].tblp)->add_nmap((yyvsp[(1) - (3)].var_defs));                 // Memory leak : plug it.
+                               (yyvsp[(3) - (3)].tblp)->add_param_list((yyvsp[(2) - (3)].var_defs));           // Memory leak : plug it.
+                               (yyval.tblp) = (yyvsp[(3) - (3)].tblp);
+                       ;}
+    break;
+
+  case 6:
+#line 220 "fta.y"
+    {
+                               (yyvsp[(3) - (3)].tblp)->add_nmap((yyvsp[(2) - (3)].var_defs));                 // Memory leak : plug it.
+                               (yyvsp[(3) - (3)].tblp)->add_param_list((yyvsp[(1) - (3)].var_defs));           // Memory leak : plug it.
+                               (yyval.tblp) = (yyvsp[(3) - (3)].tblp);
+                       ;}
+    break;
+
+  case 7:
+#line 225 "fta.y"
+    {
+                               (yyvsp[(2) - (2)].tblp)->add_nmap(NULL);                        // Memory leak : plug it.
+                               (yyvsp[(2) - (2)].tblp)->add_param_list((yyvsp[(1) - (2)].var_defs));           // Memory leak : plug it.
+                               (yyval.tblp) = (yyvsp[(2) - (2)].tblp);
+                       ;}
+    break;
+
+  case 8:
+#line 230 "fta.y"
+    {
+                               (yyvsp[(2) - (2)].tblp)->add_nmap((yyvsp[(1) - (2)].var_defs));                 // Memory leak : plug it.
+                               (yyval.tblp) = (yyvsp[(2) - (2)].tblp);
+                       ;}
+    break;
+
+  case 9:
+#line 234 "fta.y"
+    {
+                               (yyval.tblp) = (yyvsp[(1) - (1)].tblp);
+                       ;}
+    break;
+
+  case 10:
+#line 237 "fta.y"
+    {
+                               (yyvsp[(3) - (3)].tblp)->add_nmap((yyvsp[(1) - (3)].var_defs));                 // Memory leak : plug it.
+                               (yyvsp[(3) - (3)].tblp)->add_param_list((yyvsp[(2) - (3)].var_defs));           // Memory leak : plug it.
+                               (yyval.tblp) = (yyvsp[(3) - (3)].tblp);
+                       ;}
+    break;
+
+  case 11:
+#line 242 "fta.y"
+    {
+                               (yyvsp[(3) - (3)].tblp)->add_nmap((yyvsp[(2) - (3)].var_defs));                 // Memory leak : plug it.
+                               (yyvsp[(3) - (3)].tblp)->add_param_list((yyvsp[(1) - (3)].var_defs));           // Memory leak : plug it.
+                               (yyval.tblp) = (yyvsp[(3) - (3)].tblp);
+                       ;}
+    break;
+
+  case 12:
+#line 247 "fta.y"
+    {
+                               (yyvsp[(2) - (2)].tblp)->add_param_list((yyvsp[(1) - (2)].var_defs));           // Memory leak : plug it.
+                               (yyval.tblp) = (yyvsp[(2) - (2)].tblp);
+                       ;}
+    break;
+
+  case 13:
+#line 251 "fta.y"
+    {
+                               (yyvsp[(2) - (2)].tblp)->add_nmap((yyvsp[(1) - (2)].var_defs));                 // Memory leak : plug it.
+                               (yyval.tblp) = (yyvsp[(2) - (2)].tblp);
+                       ;}
+    break;
+
+  case 14:
+#line 255 "fta.y"
+    {
+                               (yyval.tblp) = (yyvsp[(1) - (1)].tblp);
+                       ;}
+    break;
+
+  case 15:
+#line 260 "fta.y"
+    {(yyval.q_list) = new query_list_t((yyvsp[(1) - (1)].tblp));;}
+    break;
+
+  case 16:
+#line 261 "fta.y"
+    {(yyval.q_list) = (yyvsp[(1) - (3)].q_list)->append((yyvsp[(3) - (3)].tblp));;}
+    break;
+
+  case 17:
+#line 265 "fta.y"
+    {(yyval.var_defs)=(yyvsp[(3) - (4)].var_defs);;}
+    break;
+
+  case 18:
+#line 266 "fta.y"
+    {(yyval.var_defs)=NULL;;}
+    break;
+
+  case 19:
+#line 270 "fta.y"
+    {(yyval.var_defs)=(yyvsp[(3) - (4)].var_defs);fta_parse_defines=(yyvsp[(3) - (4)].var_defs);;}
+    break;
+
+  case 20:
+#line 271 "fta.y"
+    {(yyval.var_defs)=NULL;fta_parse_defines = NULL;;}
+    break;
+
+  case 21:
+#line 275 "fta.y"
+    {(yyval.var_defs) = new var_defs_t((yyvsp[(1) - (1)].var_pair));;}
+    break;
+
+  case 22:
+#line 276 "fta.y"
+    {(yyval.var_defs) = (yyvsp[(1) - (2)].var_defs)->add_var_pair((yyvsp[(2) - (2)].var_pair));;}
+    break;
+
+  case 23:
+#line 280 "fta.y"
+    {(yyval.var_pair) = new var_pair_t((yyvsp[(1) - (3)].strval),(yyvsp[(2) - (3)].strval));;}
+    break;
+
+  case 24:
+#line 281 "fta.y"
+    {(yyval.var_pair) = new var_pair_t((yyvsp[(1) - (3)].strval),(yyvsp[(2) - (3)].strval));;}
+    break;
+
+  case 25:
+#line 285 "fta.y"
+    {(yyval.tblp) = (yyvsp[(3) - (3)].tblp)->add_selection((yyvsp[(2) - (3)].select_listval));;}
+    break;
+
+  case 26:
+#line 290 "fta.y"
+    {(yyval.tblp) = new table_exp_t((yyvsp[(2) - (3)].clist),(yyvsp[(3) - (3)].tbl_list));;}
+    break;
+
+  case 27:
+#line 292 "fta.y"
+    {(yyval.tblp) = new table_exp_t((yyvsp[(2) - (5)].clist),(yyvsp[(4) - (5)].scalarval),(yyvsp[(5) - (5)].tbl_list));;}
+    break;
+
+  case 28:
+#line 299 "fta.y"
+    { (yyval.select_listval) = (yyvsp[(1) - (1)].select_listval);;}
+    break;
+
+  case 29:
+#line 311 "fta.y"
+    {(yyval.tblp)=new table_exp_t((yyvsp[(1) - (8)].tbl_list),(yyvsp[(2) - (8)].predp),(yyvsp[(3) - (8)].extended_gb_list),(yyvsp[(4) - (8)].clist),(yyvsp[(5) - (8)].predp),(yyvsp[(6) - (8)].predp),(yyvsp[(7) - (8)].predp), (yyvsp[(8) - (8)].predp));;}
+    break;
+
+  case 30:
+#line 315 "fta.y"
+    {(yyval.tbl_list) = (yyvsp[(2) - (2)].tbl_list); (yyval.tbl_list)->set_properties(-1);;}
+    break;
+
+  case 31:
+#line 316 "fta.y"
+    {(yyval.tbl_list) = (yyvsp[(3) - (3)].tbl_list); (yyval.tbl_list)->set_properties(INNER_JOIN_PROPERTY);;}
+    break;
+
+  case 32:
+#line 317 "fta.y"
+    {(yyval.tbl_list) = (yyvsp[(3) - (3)].tbl_list); (yyval.tbl_list)->set_properties(OUTER_JOIN_PROPERTY);;}
+    break;
+
+  case 33:
+#line 318 "fta.y"
+    {(yyval.tbl_list) = (yyvsp[(3) - (3)].tbl_list); (yyval.tbl_list)->set_properties(RIGHT_OUTER_JOIN_PROPERTY);;}
+    break;
+
+  case 34:
+#line 319 "fta.y"
+    {(yyval.tbl_list) = (yyvsp[(3) - (3)].tbl_list); (yyval.tbl_list)->set_properties(LEFT_OUTER_JOIN_PROPERTY);;}
+    break;
+
+  case 35:
+#line 320 "fta.y"
+    {(yyval.tbl_list) = (yyvsp[(8) - (8)].tbl_list); (yyval.tbl_list)->set_properties(FILTER_JOIN_PROPERTY); (yyval.tbl_list)->set_colref((yyvsp[(3) - (8)].colref)); (yyval.tbl_list)->set_temporal_range((yyvsp[(5) - (8)].strval));;}
+    break;
+
+  case 36:
+#line 324 "fta.y"
+    {(yyval.tbl_list) = new tablevar_list_t((yyvsp[(1) - (1)].table));;}
+    break;
+
+  case 37:
+#line 325 "fta.y"
+    {(yyval.tbl_list)= (yyvsp[(1) - (3)].tbl_list)->append_table((yyvsp[(3) - (3)].table));;}
+    break;
+
+  case 38:
+#line 329 "fta.y"
+    { (yyval.table) = (yyvsp[(1) - (1)].table);;}
+    break;
+
+  case 39:
+#line 330 "fta.y"
+    { (yyval.table)= (yyvsp[(1) - (2)].table)->set_range_var((yyvsp[(2) - (2)].strval));;}
+    break;
+
+  case 40:
+#line 334 "fta.y"
+    {(yyval.table) = new tablevar_t((yyvsp[(1) - (1)].stringval)->c_str());;}
+    break;
+
+  case 41:
+#line 335 "fta.y"
+    {(yyval.table) = new tablevar_t((yyvsp[(1) - (3)].strval),(yyvsp[(3) - (3)].stringval)->c_str(),0);;}
+    break;
+
+  case 42:
+#line 336 "fta.y"
+    {(yyval.table) = new tablevar_t((yyvsp[(1) - (5)].strval),(yyvsp[(3) - (5)].strval),(yyvsp[(5) - (5)].stringval)->c_str());;}
+    break;
+
+  case 43:
+#line 337 "fta.y"
+    {(yyval.table) = new tablevar_t((yyvsp[(1) - (5)].strval),(yyvsp[(3) - (5)].strval),(yyvsp[(5) - (5)].stringval)->c_str());;}
+    break;
+
+  case 44:
+#line 338 "fta.y"
+    {(yyval.table) = new tablevar_t((yyvsp[(2) - (5)].strval),(yyvsp[(5) - (5)].stringval)->c_str(),1);;}
+    break;
+
+  case 45:
+#line 342 "fta.y"
+    {(yyval.stringval) = new string_t((yyvsp[(1) - (1)].strval));;}
+    break;
+
+  case 46:
+#line 343 "fta.y"
+    {(yyval.stringval) = (yyval.stringval)->append("/",(yyvsp[(3) - (3)].strval));;}
+    break;
+
+  case 47:
+#line 348 "fta.y"
+    {(yyval.predp)=NULL;;}
+    break;
+
+  case 48:
+#line 349 "fta.y"
+    {(yyval.predp)=(yyvsp[(1) - (1)].predp);;}
+    break;
+
+  case 49:
+#line 353 "fta.y"
+    {(yyval.predp) = (yyvsp[(2) - (2)].predp);;}
+    break;
+
+  case 50:
+#line 357 "fta.y"
+    {(yyval.predp)=NULL;;}
+    break;
+
+  case 51:
+#line 358 "fta.y"
+    {(yyval.predp)=(yyvsp[(2) - (2)].predp); ;}
+    break;
+
+  case 52:
+#line 362 "fta.y"
+    {(yyval.predp)=NULL;;}
+    break;
+
+  case 53:
+#line 363 "fta.y"
+    {(yyval.predp)=(yyvsp[(2) - (2)].predp); ;}
+    break;
+
+  case 54:
+#line 367 "fta.y"
+    {(yyval.predp)=NULL;;}
+    break;
+
+  case 55:
+#line 368 "fta.y"
+    {(yyval.predp)=(yyvsp[(2) - (2)].predp); ;}
+    break;
+
+  case 56:
+#line 372 "fta.y"
+    {(yyval.predp)=NULL;;}
+    break;
+
+  case 57:
+#line 373 "fta.y"
+    {(yyval.predp)=(yyvsp[(1) - (1)].predp);;}
+    break;
+
+  case 58:
+#line 377 "fta.y"
+    {(yyval.predp) = (yyvsp[(2) - (2)].predp);;}
+    break;
+
+  case 59:
+#line 384 "fta.y"
+    {(yyval.predp)=new predicate_t("OR",(yyvsp[(1) - (3)].predp),(yyvsp[(3) - (3)].predp));;}
+    break;
+
+  case 60:
+#line 385 "fta.y"
+    {(yyval.predp)=new predicate_t("AND",(yyvsp[(1) - (3)].predp),(yyvsp[(3) - (3)].predp));;}
+    break;
+
+  case 61:
+#line 386 "fta.y"
+    {(yyval.predp) = new predicate_t("NOT", (yyvsp[(2) - (2)].predp) );;}
+    break;
+
+  case 62:
+#line 387 "fta.y"
+    {(yyval.predp) = (yyvsp[(2) - (3)].predp);;}
+    break;
+
+  case 63:
+#line 388 "fta.y"
+    {(yyval.predp) = (yyvsp[(1) - (1)].predp);;}
+    break;
+
+  case 64:
+#line 392 "fta.y"
+    { (yyval.predp)=(yyvsp[(1) - (1)].predp);;}
+    break;
+
+  case 65:
+#line 393 "fta.y"
+    { (yyval.predp) = (yyvsp[(1) - (1)].predp);;}
+    break;
+
+  case 66:
+#line 394 "fta.y"
+    {(yyval.predp) = predicate_t::make_paramless_fcn_predicate((yyvsp[(1) - (3)].strval)); ;}
+    break;
+
+  case 67:
+#line 395 "fta.y"
+    {(yyval.predp) = new predicate_t((yyvsp[(1) - (4)].strval), (yyvsp[(3) - (4)].se_listval)->get_se_list()); ;}
+    break;
+
+  case 68:
+#line 399 "fta.y"
+    {(yyval.predp) = new predicate_t((yyvsp[(1) - (3)].scalarval),(yyvsp[(2) - (3)].strval),(yyvsp[(3) - (3)].scalarval));;}
+    break;
+
+  case 69:
+#line 403 "fta.y"
+    { (yyval.predp) = new predicate_t((yyvsp[(1) - (5)].scalarval),(yyvsp[(4) - (5)].lit_l)); ;}
+    break;
+
+  case 70:
+#line 407 "fta.y"
+    {(yyval.lit_l) = new literal_list_t((yyvsp[(1) - (1)].litval));;}
+    break;
+
+  case 71:
+#line 408 "fta.y"
+    {(yyval.lit_l) = (yyvsp[(1) - (3)].lit_l)->append_literal((yyvsp[(3) - (3)].litval));;}
+    break;
+
+  case 72:
+#line 414 "fta.y"
+    { (yyval.scalarval)=new scalarexp_t("+",(yyvsp[(1) - (3)].scalarval),(yyvsp[(3) - (3)].scalarval));;}
+    break;
+
+  case 73:
+#line 415 "fta.y"
+    { (yyval.scalarval)=new scalarexp_t("-",(yyvsp[(1) - (3)].scalarval),(yyvsp[(3) - (3)].scalarval));;}
+    break;
+
+  case 74:
+#line 416 "fta.y"
+    { (yyval.scalarval)=new scalarexp_t("|",(yyvsp[(1) - (3)].scalarval),(yyvsp[(3) - (3)].scalarval));;}
+    break;
+
+  case 75:
+#line 417 "fta.y"
+    { (yyval.scalarval)=new scalarexp_t("*",(yyvsp[(1) - (3)].scalarval),(yyvsp[(3) - (3)].scalarval));;}
+    break;
+
+  case 76:
+#line 418 "fta.y"
+    { (yyval.scalarval)=new scalarexp_t("/",(yyvsp[(1) - (3)].scalarval),(yyvsp[(3) - (3)].scalarval));;}
+    break;
+
+  case 77:
+#line 419 "fta.y"
+    { (yyval.scalarval)=new scalarexp_t("&",(yyvsp[(1) - (3)].scalarval),(yyvsp[(3) - (3)].scalarval));;}
+    break;
+
+  case 78:
+#line 420 "fta.y"
+    { (yyval.scalarval)=new scalarexp_t("%",(yyvsp[(1) - (3)].scalarval),(yyvsp[(3) - (3)].scalarval));;}
+    break;
+
+  case 79:
+#line 421 "fta.y"
+    { (yyval.scalarval)=new scalarexp_t((yyvsp[(2) - (3)].strval),(yyvsp[(1) - (3)].scalarval),(yyvsp[(3) - (3)].scalarval));;}
+    break;
+
+  case 80:
+#line 422 "fta.y"
+    { (yyval.scalarval) = new scalarexp_t("+",(yyvsp[(2) - (2)].scalarval));;}
+    break;
+
+  case 81:
+#line 423 "fta.y"
+    { (yyval.scalarval) = new scalarexp_t("-",(yyvsp[(2) - (2)].scalarval));;}
+    break;
+
+  case 82:
+#line 424 "fta.y"
+    { (yyval.scalarval) = new scalarexp_t("!",(yyvsp[(2) - (2)].scalarval));;}
+    break;
+
+  case 83:
+#line 425 "fta.y"
+    { (yyval.scalarval) = new scalarexp_t("~",(yyvsp[(2) - (2)].scalarval));;}
+    break;
+
+  case 84:
+#line 426 "fta.y"
+    { (yyval.scalarval)= new scalarexp_t((yyvsp[(1) - (1)].litval));;}
+    break;
+
+  case 85:
+#line 427 "fta.y"
+    {(yyval.scalarval) = scalarexp_t::make_param_reference((yyvsp[(2) - (2)].strval));;}
+    break;
+
+  case 86:
+#line 428 "fta.y"
+    {(yyval.scalarval) = scalarexp_t::make_iface_param_reference((yyvsp[(1) - (1)].ifpref));;}
+    break;
+
+  case 87:
+#line 429 "fta.y"
+    { (yyval.scalarval) = new scalarexp_t((yyvsp[(1) - (1)].colref));;}
+    break;
+
+  case 88:
+#line 430 "fta.y"
+    {(yyval.scalarval) = (yyvsp[(2) - (3)].scalarval);;}
+    break;
+
+  case 89:
+#line 431 "fta.y"
+    { (yyval.scalarval) = scalarexp_t::make_star_aggr((yyvsp[(1) - (4)].strval)); ;}
+    break;
+
+  case 90:
+#line 432 "fta.y"
+    { (yyval.scalarval) = scalarexp_t::make_se_aggr((yyvsp[(1) - (4)].strval),(yyvsp[(3) - (4)].scalarval)); ;}
+    break;
+
+  case 91:
+#line 433 "fta.y"
+    {(yyval.scalarval) = new scalarexp_t((yyvsp[(1) - (4)].strval), (yyvsp[(3) - (4)].se_listval)->get_se_list()); ;}
+    break;
+
+  case 92:
+#line 434 "fta.y"
+    {(yyval.scalarval) = scalarexp_t::make_paramless_fcn((yyvsp[(1) - (3)].strval)); ;}
+    break;
+
+  case 93:
+#line 435 "fta.y"
+    { (yyval.scalarval) = scalarexp_t::make_star_aggr((yyvsp[(1) - (5)].strval)); (yyval.scalarval)->set_superaggr(true); ;}
+    break;
+
+  case 94:
+#line 436 "fta.y"
+    { (yyval.scalarval) = scalarexp_t::make_se_aggr((yyvsp[(1) - (5)].strval),(yyvsp[(4) - (5)].scalarval)); (yyval.scalarval)->set_superaggr(true); ;}
+    break;
+
+  case 95:
+#line 437 "fta.y"
+    {(yyval.scalarval) = new scalarexp_t((yyvsp[(1) - (5)].strval), (yyvsp[(4) - (5)].se_listval)->get_se_list()); (yyval.scalarval)->set_superaggr(true); ;}
+    break;
+
+  case 96:
+#line 438 "fta.y"
+    {(yyval.scalarval) = scalarexp_t::make_paramless_fcn((yyvsp[(1) - (4)].strval)); (yyval.scalarval)->set_superaggr(true); ;}
+    break;
+
+  case 97:
+#line 443 "fta.y"
+    {  (yyval.select_listval)= new select_list_t((yyvsp[(1) - (1)].scalarval)); ;}
+    break;
+
+  case 98:
+#line 444 "fta.y"
+    {  (yyval.select_listval)= new select_list_t((yyvsp[(1) - (3)].scalarval),(yyvsp[(3) - (3)].strval)); ;}
+    break;
+
+  case 99:
+#line 445 "fta.y"
+    { (yyval.select_listval)=(yyvsp[(1) - (3)].select_listval)->append((yyvsp[(3) - (3)].scalarval)); ;}
+    break;
+
+  case 100:
+#line 446 "fta.y"
+    { (yyval.select_listval)=(yyvsp[(1) - (5)].select_listval)->append((yyvsp[(3) - (5)].scalarval),(yyvsp[(5) - (5)].strval)); ;}
+    break;
+
+  case 101:
+#line 450 "fta.y"
+    {  (yyval.se_listval)= new se_list_t((yyvsp[(1) - (1)].scalarval)); ;}
+    break;
+
+  case 102:
+#line 451 "fta.y"
+    { (yyval.se_listval)=(yyvsp[(1) - (3)].se_listval)->append((yyvsp[(3) - (3)].scalarval)); ;}
+    break;
+
+  case 103:
+#line 455 "fta.y"
+    {(yyval.litval) = new literal_t((yyvsp[(1) - (1)].strval),LITERAL_STRING);;}
+    break;
+
+  case 104:
+#line 456 "fta.y"
+    {(yyval.litval) = new literal_t((yyvsp[(1) - (1)].strval),LITERAL_INT);;}
+    break;
+
+  case 105:
+#line 457 "fta.y"
+    {(yyval.litval) = new literal_t((yyvsp[(1) - (1)].strval),LITERAL_LONGINT);;}
+    break;
+
+  case 106:
+#line 458 "fta.y"
+    {(yyval.litval) = new literal_t((yyvsp[(1) - (1)].strval),LITERAL_FLOAT);;}
+    break;
+
+  case 107:
+#line 459 "fta.y"
+    {(yyval.litval) = new literal_t("TRUE",LITERAL_BOOL);;}
+    break;
+
+  case 108:
+#line 460 "fta.y"
+    {(yyval.litval) = new literal_t("FALSE",LITERAL_BOOL);;}
+    break;
+
+  case 109:
+#line 461 "fta.y"
+    {(yyval.litval) = new literal_t((yyvsp[(2) - (2)].strval),LITERAL_TIMEVAL);;}
+    break;
+
+  case 110:
+#line 462 "fta.y"
+    {(yyval.litval) = new literal_t((yyvsp[(2) - (2)].strval),LITERAL_HEX);;}
+    break;
+
+  case 111:
+#line 463 "fta.y"
+    {(yyval.litval) = new literal_t((yyvsp[(2) - (2)].strval),LITERAL_LONGHEX);;}
+    break;
+
+  case 112:
+#line 464 "fta.y"
+    {(yyval.litval) = new literal_t((yyvsp[(2) - (2)].strval),LITERAL_IP);;}
+    break;
+
+  case 113:
+#line 465 "fta.y"
+    {(yyval.litval) = new literal_t((yyvsp[(2) - (2)].strval),LITERAL_IPV6);;}
+    break;
+
+  case 114:
+#line 466 "fta.y"
+    {(yyval.litval) = literal_t::make_define_literal((yyvsp[(2) - (2)].strval),fta_parse_defines);;}
+    break;
+
+  case 115:
+#line 472 "fta.y"
+    {(yyval.extended_gb_list) = NULL;;}
+    break;
+
+  case 116:
+#line 473 "fta.y"
+    {(yyval.extended_gb_list) = (yyvsp[(3) - (3)].extended_gb_list);;}
+    break;
+
+  case 117:
+#line 477 "fta.y"
+    {(yyval.clist) = NULL;;}
+    break;
+
+  case 118:
+#line 478 "fta.y"
+    {(yyval.clist) = (yyvsp[(2) - (2)].clist);;}
+    break;
+
+  case 119:
+#line 482 "fta.y"
+    { (yyval.list_of_gb_list) = new list_of_gb_list_t((yyvsp[(2) - (3)].gb_list));;}
+    break;
+
+  case 120:
+#line 483 "fta.y"
+    {(yyval.list_of_gb_list) = (yyvsp[(1) - (5)].list_of_gb_list)->append((yyvsp[(4) - (5)].gb_list));;}
+    break;
+
+  case 121:
+#line 487 "fta.y"
+    {(yyval.extended_gb) = extended_gb_t::create_from_gb((yyvsp[(1) - (1)].gb_val));;}
+    break;
+
+  case 122:
+#line 488 "fta.y"
+    {(yyval.extended_gb) = extended_gb_t::extended_create_from_rollup((yyvsp[(3) - (4)].gb_list));;}
+    break;
+
+  case 123:
+#line 489 "fta.y"
+    {(yyval.extended_gb) = extended_gb_t::extended_create_from_cube((yyvsp[(3) - (4)].gb_list));;}
+    break;
+
+  case 124:
+#line 490 "fta.y"
+    {(yyval.extended_gb) = extended_gb_t::extended_create_from_gsets((yyvsp[(3) - (4)].list_of_gb_list));;}
+    break;
+
+  case 125:
+#line 494 "fta.y"
+    { (yyval.extended_gb_list) = new extended_gb_list_t((yyvsp[(1) - (1)].extended_gb));;}
+    break;
+
+  case 126:
+#line 495 "fta.y"
+    { (yyval.extended_gb_list)=(yyvsp[(1) - (3)].extended_gb_list)->append((yyvsp[(3) - (3)].extended_gb));;}
+    break;
+
+  case 127:
+#line 499 "fta.y"
+    { (yyval.gb_list) = new gb_list_t((yyvsp[(1) - (1)].gb_val));;}
+    break;
+
+  case 128:
+#line 500 "fta.y"
+    { (yyval.gb_list)=(yyvsp[(1) - (3)].gb_list)->append((yyvsp[(3) - (3)].gb_val));;}
+    break;
+
+  case 129:
+#line 504 "fta.y"
+    {(yyval.gb_val) = new gb_t((yyvsp[(1) - (1)].strval)); ;}
+    break;
+
+  case 130:
+#line 505 "fta.y"
+    {(yyval.gb_val) = new gb_t((yyvsp[(1) - (3)].strval),(yyvsp[(3) - (3)].strval)); ;}
+    break;
+
+  case 131:
+#line 506 "fta.y"
+    {(yyval.gb_val) = new gb_t((yyvsp[(1) - (5)].strval),(yyvsp[(3) - (5)].strval),(yyvsp[(5) - (5)].strval)); ;}
+    break;
+
+  case 132:
+#line 507 "fta.y"
+    {(yyval.gb_val) = new gb_t((yyvsp[(1) - (3)].scalarval),(yyvsp[(3) - (3)].strval)); ;}
+    break;
+
+  case 133:
+#line 518 "fta.y"
+    {(yyval.ifpref) = new ifpref_t((yyvsp[(2) - (2)].strval));;}
+    break;
+
+  case 134:
+#line 519 "fta.y"
+    {(yyval.ifpref) = new ifpref_t((yyvsp[(1) - (4)].strval), (yyvsp[(4) - (4)].strval));;}
+    break;
+
+  case 135:
+#line 523 "fta.y"
+    {(yyval.colref) = new colref_t((yyvsp[(1) - (1)].strval)); ;}
+    break;
+
+  case 136:
+#line 524 "fta.y"
+    {(yyval.colref) = new colref_t((yyvsp[(1) - (3)].strval),(yyvsp[(3) - (3)].strval)); ;}
+    break;
+
+  case 137:
+#line 525 "fta.y"
+    {(yyval.colref) = new colref_t((yyvsp[(1) - (5)].strval),(yyvsp[(3) - (5)].strval),(yyvsp[(5) - (5)].strval)); ;}
+    break;
+
+  case 138:
+#line 529 "fta.y"
+    {(yyval.clist)=new colref_list_t((yyvsp[(1) - (3)].colref)); (yyval.clist)->append((yyvsp[(3) - (3)].colref));;}
+    break;
+
+  case 139:
+#line 530 "fta.y"
+    {(yyval.clist) = (yyvsp[(1) - (3)].clist)->append((yyvsp[(3) - (3)].colref));;}
+    break;
+
+  case 140:
+#line 534 "fta.y"
+    {(yyval.colref) = new colref_t((yyvsp[(1) - (1)].strval)); ;}
+    break;
+
+  case 141:
+#line 538 "fta.y"
+    {(yyval.clist)=new colref_list_t((yyvsp[(1) - (3)].colref)); (yyval.clist)->append((yyvsp[(3) - (3)].colref));;}
+    break;
+
+  case 142:
+#line 539 "fta.y"
+    {(yyval.clist) = (yyvsp[(1) - (3)].clist)->append((yyvsp[(3) - (3)].colref));;}
+    break;
+
+  case 143:
+#line 554 "fta.y"
+    {(yyval.table_list_schema) = new table_list((yyvsp[(1) - (1)].table_def_t));;}
+    break;
+
+  case 144:
+#line 555 "fta.y"
+    {(yyval.table_list_schema) = (yyvsp[(1) - (2)].table_list_schema)->append_table((yyvsp[(2) - (2)].table_def_t));;}
+    break;
+
+  case 145:
+#line 558 "fta.y"
+    {
+                                       (yyval.table_def_t)=new table_def((yyvsp[(2) - (7)].strval),(yyvsp[(3) - (7)].plist_t),(yyvsp[(4) - (7)].plist_t), (yyvsp[(6) - (7)].field_list_t), PROTOCOL_SCHEMA); delete (yyvsp[(6) - (7)].field_list_t);;}
+    break;
+
+  case 146:
+#line 560 "fta.y"
+    {
+                                       (yyval.table_def_t)=new table_def((yyvsp[(2) - (6)].stringval)->c_str(),(yyvsp[(3) - (6)].plist_t),NULL,(yyvsp[(5) - (6)].field_list_t), STREAM_SCHEMA); delete (yyvsp[(5) - (6)].field_list_t);;}
+    break;
+
+  case 147:
+#line 562 "fta.y"
+    {
+                               (yyval.table_def_t) = new table_def((yyvsp[(2) - (16)].strval), (yyvsp[(5) - (16)].plist_t), (yyvsp[(8) - (16)].field_list_t), (yyvsp[(12) - (16)].subqueryspec_list_t), (yyvsp[(15) - (16)].plist_t)); ;}
+    break;
+
+  case 148:
+#line 564 "fta.y"
+    { (yyval.table_def_t) = new table_def((yyvsp[(3) - (4)].ufcnl)); ;}
+    break;
+
+  case 149:
+#line 568 "fta.y"
+    {(yyval.ufcnl) = new unpack_fcn_list((yyvsp[(1) - (1)].ufcn));;}
+    break;
+
+  case 150:
+#line 569 "fta.y"
+    {(yyval.ufcnl) = (yyvsp[(1) - (3)].ufcnl) -> append((yyvsp[(3) - (3)].ufcn));;}
+    break;
+
+  case 151:
+#line 573 "fta.y"
+    {(yyval.ufcn) = new unpack_fcn((yyvsp[(1) - (3)].strval),(yyvsp[(2) - (3)].strval),(yyvsp[(3) - (3)].strval));;}
+    break;
+
+  case 152:
+#line 577 "fta.y"
+    {(yyval.subqueryspec_list_t) = new subqueryspec_list((yyvsp[(1) - (1)].subq_spec_t));;}
+    break;
+
+  case 153:
+#line 578 "fta.y"
+    {(yyval.subqueryspec_list_t) = (yyvsp[(1) - (3)].subqueryspec_list_t)->append((yyvsp[(3) - (3)].subq_spec_t));;}
+    break;
+
+  case 154:
+#line 582 "fta.y"
+    {(yyval.subq_spec_t)=new subquery_spec((yyvsp[(1) - (4)].strval), (yyvsp[(3) - (4)].namevec_t)); delete (yyvsp[(3) - (4)].namevec_t);;}
+    break;
+
+  case 155:
+#line 585 "fta.y"
+    {(yyval.field_list_t) = new field_entry_list((yyvsp[(1) - (1)].field_t));;}
+    break;
+
+  case 156:
+#line 586 "fta.y"
+    {(yyval.field_list_t) = (yyvsp[(1) - (2)].field_list_t)->append_field((yyvsp[(2) - (2)].field_t));;}
+    break;
+
+  case 157:
+#line 590 "fta.y"
+    {(yyval.field_t) = new field_entry((yyvsp[(1) - (6)].strval),(yyvsp[(2) - (6)].strval),(yyvsp[(3) - (6)].strval),(yyvsp[(4) - (6)].plist_t),(yyvsp[(5) - (6)].plist_t));;}
+    break;
+
+  case 158:
+#line 591 "fta.y"
+    {(yyval.field_t) = new field_entry((yyvsp[(1) - (4)].strval),(yyvsp[(2) - (4)].strval),"",(yyvsp[(3) - (4)].plist_t),NULL);;}
+    break;
+
+  case 159:
+#line 595 "fta.y"
+    {(yyval.plist_t) = NULL;;}
+    break;
+
+  case 160:
+#line 596 "fta.y"
+    {(yyval.plist_t) = (yyvsp[(2) - (3)].plist_t);;}
+    break;
+
+  case 161:
+#line 600 "fta.y"
+    {(yyval.plist_t) = new param_list((yyvsp[(1) - (1)].strval));;}
+    break;
+
+  case 162:
+#line 601 "fta.y"
+    {(yyval.plist_t) = new param_list((yyvsp[(1) - (2)].strval),(yyvsp[(2) - (2)].strval));;}
+    break;
+
+  case 163:
+#line 602 "fta.y"
+    {(yyval.plist_t) = new param_list((yyvsp[(1) - (2)].strval),(yyvsp[(2) - (2)].strval));;}
+    break;
+
+  case 164:
+#line 603 "fta.y"
+    {(yyval.plist_t) = new param_list((yyvsp[(1) - (2)].strval),(yyvsp[(2) - (2)].strval));;}
+    break;
+
+  case 165:
+#line 604 "fta.y"
+    {(yyval.plist_t) = (yyvsp[(1) - (3)].plist_t)->append((yyvsp[(3) - (3)].strval));;}
+    break;
+
+  case 166:
+#line 605 "fta.y"
+    {(yyval.plist_t) = (yyvsp[(1) - (4)].plist_t)->append((yyvsp[(3) - (4)].strval),(yyvsp[(4) - (4)].strval));;}
+    break;
+
+  case 167:
+#line 606 "fta.y"
+    {(yyval.plist_t) = (yyvsp[(1) - (4)].plist_t)->append((yyvsp[(3) - (4)].strval),(yyvsp[(4) - (4)].strval));;}
+    break;
+
+  case 168:
+#line 607 "fta.y"
+    {(yyval.plist_t) = (yyvsp[(1) - (4)].plist_t)->append((yyvsp[(3) - (4)].strval),(yyvsp[(4) - (4)].strval));;}
+    break;
+
+  case 169:
+#line 611 "fta.y"
+    {(yyval.plist_t) = NULL;;}
+    break;
+
+  case 170:
+#line 612 "fta.y"
+    {(yyval.plist_t) = (yyvsp[(2) - (3)].plist_t);;}
+    break;
+
+  case 171:
+#line 616 "fta.y"
+    {(yyval.plist_t) = NULL;;}
+    break;
+
+  case 172:
+#line 617 "fta.y"
+    {(yyval.plist_t) = (yyvsp[(2) - (3)].plist_t);;}
+    break;
+
+  case 173:
+#line 621 "fta.y"
+    {(yyval.plist_t) = new param_list((yyvsp[(1) - (1)].strval));;}
+    break;
+
+  case 174:
+#line 622 "fta.y"
+    {(yyval.plist_t) = (yyvsp[(1) - (3)].plist_t)->append((yyvsp[(3) - (3)].strval));;}
+    break;
+
+  case 175:
+#line 626 "fta.y"
+    {(yyval.namevec_t) = new name_vec((yyvsp[(1) - (3)].strval),(yyvsp[(2) - (3)].strval),(yyvsp[(3) - (3)].plist_t));;}
+    break;
+
+  case 176:
+#line 627 "fta.y"
+    {(yyval.namevec_t) = (yyvsp[(1) - (5)].namevec_t)->append((yyvsp[(3) - (5)].strval),(yyvsp[(4) - (5)].strval), (yyvsp[(5) - (5)].plist_t));;}
+    break;
+
+
+/* Line 1267 of yacc.c.  */
+#line 2843 "fta.tab.cc"
+      default: break;
+    }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+      {
+       YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+       if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+         {
+           YYSIZE_T yyalloc = 2 * yysize;
+           if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+             yyalloc = YYSTACK_ALLOC_MAXIMUM;
+           if (yymsg != yymsgbuf)
+             YYSTACK_FREE (yymsg);
+           yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+           if (yymsg)
+             yymsg_alloc = yyalloc;
+           else
+             {
+               yymsg = yymsgbuf;
+               yymsg_alloc = sizeof yymsgbuf;
+             }
+         }
+
+       if (0 < yysize && yysize <= yymsg_alloc)
+         {
+           (void) yysyntax_error (yymsg, yystate, yychar);
+           yyerror (yymsg);
+         }
+       else
+         {
+           yyerror (YY_("syntax error"));
+           if (yysize != 0)
+             goto yyexhaustedlab;
+         }
+      }
+#endif
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse look-ahead token after an
+        error, discard it.  */
+
+      if (yychar <= YYEOF)
+       {
+         /* Return failure if at end of input.  */
+         if (yychar == YYEOF)
+           YYABORT;
+       }
+      else
+       {
+         yydestruct ("Error: discarding",
+                     yytoken, &yylval);
+         yychar = YYEMPTY;
+       }
+    }
+
+  /* Else will try to reuse look-ahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+  /* Pacify compilers like GCC when the user code never invokes
+     YYERROR and the label yyerrorlab therefore never appears in user
+     code.  */
+  if (/*CONSTCOND*/ 0)
+     goto yyerrorlab;
+
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+       {
+         yyn += YYTERROR;
+         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+           {
+             yyn = yytable[yyn];
+             if (0 < yyn)
+               break;
+           }
+       }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+       YYABORT;
+
+
+      yydestruct ("Error: popping",
+                 yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  *++yyvsp = yylval;
+
+
+  /* Shift the error token.  */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+  if (yychar != YYEOF && yychar != YYEMPTY)
+     yydestruct ("Cleanup: discarding lookahead",
+                yytoken, &yylval);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+                 yystos[*yyssp], yyvsp);
+      YYPOPSTACK (1);
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
+}
+
+
+#line 630 "fta.y"
+
+
+
diff --git a/src/ftacmp/fta.tab.cc.h b/src/ftacmp/fta.tab.cc.h
new file mode 100644 (file)
index 0000000..f75c6b1
--- /dev/null
@@ -0,0 +1,221 @@
+/* A Bison parser, made by GNU Bison 2.3.  */
+
+/* Skeleton interface for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   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., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259,
+     INTNUM = 260,
+     LONGINTNUM = 261,
+     APPROXNUM = 262,
+     OR = 263,
+     AND = 264,
+     NOT = 265,
+     COMPARISON = 266,
+     SHIFT_OP = 267,
+     UMINUS = 268,
+     SEMICOLON = 269,
+     LEFTBRACE = 270,
+     RIGHTBRACE = 271,
+     BY = 272,
+     AS = 273,
+     AGGR = 274,
+     FROM = 275,
+     INNER_JOIN = 276,
+     FILTER_JOIN = 277,
+     OUTER_JOIN = 278,
+     LEFT_OUTER_JOIN = 279,
+     RIGHT_OUTER_JOIN = 280,
+     GROUP = 281,
+     HAVING = 282,
+     IN = 283,
+     SELECT = 284,
+     WHERE = 285,
+     SUPERGROUP = 286,
+     CLEANING_WHEN = 287,
+     CLEANING_BY = 288,
+     CLOSING_WHEN = 289,
+     SUCH = 290,
+     THAT = 291,
+     CUBE = 292,
+     ROLLUP = 293,
+     GROUPING_SETS = 294,
+     TRUE_V = 295,
+     FALSE_V = 296,
+     TIMEVAL_L = 297,
+     HEX_L = 298,
+     LHEX_L = 299,
+     IP_L = 300,
+     IPV6_L = 301,
+     MERGE = 302,
+     SLACK = 303,
+     DEFINE_SEC = 304,
+     PARAM_SEC = 305,
+     PROTOCOL = 306,
+     TABLE = 307,
+     STREAM = 308,
+     FTA = 309,
+     UNPACK_FCNS = 310,
+     OPERATOR = 311,
+     OPERATOR_VIEW = 312,
+     FIELDS = 313,
+     SUBQUERIES = 314,
+     SELECTION_PUSHDOWN = 315
+   };
+#endif
+/* Tokens.  */
+#define NAME 258
+#define STRING_TOKEN 259
+#define INTNUM 260
+#define LONGINTNUM 261
+#define APPROXNUM 262
+#define OR 263
+#define AND 264
+#define NOT 265
+#define COMPARISON 266
+#define SHIFT_OP 267
+#define UMINUS 268
+#define SEMICOLON 269
+#define LEFTBRACE 270
+#define RIGHTBRACE 271
+#define BY 272
+#define AS 273
+#define AGGR 274
+#define FROM 275
+#define INNER_JOIN 276
+#define FILTER_JOIN 277
+#define OUTER_JOIN 278
+#define LEFT_OUTER_JOIN 279
+#define RIGHT_OUTER_JOIN 280
+#define GROUP 281
+#define HAVING 282
+#define IN 283
+#define SELECT 284
+#define WHERE 285
+#define SUPERGROUP 286
+#define CLEANING_WHEN 287
+#define CLEANING_BY 288
+#define CLOSING_WHEN 289
+#define SUCH 290
+#define THAT 291
+#define CUBE 292
+#define ROLLUP 293
+#define GROUPING_SETS 294
+#define TRUE_V 295
+#define FALSE_V 296
+#define TIMEVAL_L 297
+#define HEX_L 298
+#define LHEX_L 299
+#define IP_L 300
+#define IPV6_L 301
+#define MERGE 302
+#define SLACK 303
+#define DEFINE_SEC 304
+#define PARAM_SEC 305
+#define PROTOCOL 306
+#define TABLE 307
+#define STREAM 308
+#define FTA 309
+#define UNPACK_FCNS 310
+#define OPERATOR 311
+#define OPERATOR_VIEW 312
+#define FIELDS 313
+#define SUBQUERIES 314
+#define SELECTION_PUSHDOWN 315
+
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+#line 37 "fta.y"
+{
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       string_t *stringval;
+
+/*                     for FTA definition.     */
+       literal_t *litval;
+       scalarexp_t *scalarval;
+       se_list_t *se_listval;
+       select_list_t *select_listval;
+       table_exp_t *tblp;
+       predicate_t *predp;
+       literal_list_t *lit_l;
+       tablevar_t *table;
+       tablevar_list_t *tbl_list;
+       colref_t *colref;
+       ifpref_t *ifpref;
+       colref_list_t *clist;
+       var_defs_t *var_defs;
+       var_pair_t *var_pair;
+       gb_t *gb_val;
+       gb_list_t *gb_list;
+       list_of_gb_list_t *list_of_gb_list;
+       extended_gb_t *extended_gb;
+       extended_gb_list_t *extended_gb_list;
+
+       query_list_t *q_list;
+
+/*             For table definition    */
+       field_entry *field_t;
+       field_entry_list *field_list_t;
+       table_def *table_def_t;
+       table_list *table_list_schema;
+       param_list *plist_t;
+       name_vec  *namevec_t;
+       subquery_spec *subq_spec_t;
+       subqueryspec_list *subqueryspec_list_t;
+       unpack_fcn      *ufcn;
+       unpack_fcn_list *ufcnl;
+
+}
+/* Line 1529 of yacc.c.  */
+#line 214 "fta.tab.cc.h"
+       YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+extern YYSTYPE FtaParserlval;
+
diff --git a/src/ftacmp/fta.y b/src/ftacmp/fta.y
new file mode 100644 (file)
index 0000000..cab9546
--- /dev/null
@@ -0,0 +1,646 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+       MUST COMPILE WITH
+   bison --verbose --defines=fta.tab.cc.h -p FtaParser  -o fta.tab.cc fta.y
+
+        (or equivalent).
+*/
+
+%{
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "parse_fta.h"
+#include "parse_schema.h"
+
+
+extern fta_parse_t *fta_parse_result;
+extern var_defs_t *fta_parse_defines;
+
+
+#define YYDEBUG 1
+
+%}
+
+
+       /* symbolic tokens */
+
+%union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       string_t *stringval;
+
+/*                     for FTA definition.     */
+       literal_t *litval;
+       scalarexp_t *scalarval;
+       se_list_t *se_listval;
+       select_list_t *select_listval;
+       table_exp_t *tblp;
+       predicate_t *predp;
+       literal_list_t *lit_l;
+       tablevar_t *table;
+       tablevar_list_t *tbl_list;
+       colref_t *colref;
+       ifpref_t *ifpref;
+       colref_list_t *clist;
+       var_defs_t *var_defs;
+       var_pair_t *var_pair;
+       gb_t *gb_val;
+       gb_list_t *gb_list;
+       list_of_gb_list_t *list_of_gb_list;
+       extended_gb_t *extended_gb;
+       extended_gb_list_t *extended_gb_list;
+
+       query_list_t *q_list;
+
+/*             For table definition    */
+       field_entry *field_t;
+       field_entry_list *field_list_t;
+       table_def *table_def_t;
+       table_list *table_list_schema;
+       param_list *plist_t;
+       name_vec  *namevec_t;
+       subquery_spec *subq_spec_t;
+       subqueryspec_list *subqueryspec_list_t;
+       unpack_fcn      *ufcn;
+       unpack_fcn_list *ufcnl;
+
+}
+
+%token <strval> NAME
+%token <strval> STRING_TOKEN
+%token <strval> INTNUM
+%token <strval> LONGINTNUM
+%token <strval> APPROXNUM
+
+/*                     for FTA definition.     */
+%type <q_list> query_list
+%type <tblp> gsql
+%type <tblp> select_statement
+%type <tblp> merge_statement
+%type <predp> opt_where_clause
+%type <predp> opt_having_clause
+%type <select_listval> selection
+%type <tblp> table_exp
+%type <tbl_list> from_clause
+%type <tbl_list> table_ref_commalist
+%type <table> table_ref
+%type <stringval> qname
+%type <predp> where_clause
+%type <predp> having_clause
+%type <predp> search_condition
+%type <predp> predicate
+%type <predp> comparison_predicate
+%type <predp> in_predicate
+%type <predp> opt_cleaning_when_clause
+%type <predp> opt_cleaning_by_clause
+%type <predp> opt_closing_when_clause
+%type <litval> literal
+%type <colref> column_ref
+%type <colref> gb_ref
+%type <ifpref> ifparam
+%type <clist> column_ref_list
+%type <clist> gb_ref_list
+%type <table> table
+%type <scalarval> scalar_exp
+%type <se_listval> scalar_exp_commalist
+%type <select_listval> select_commalist
+%type <lit_l> literal_commalist
+%type <extended_gb_list> opt_group_by_clause
+%type <clist> opt_supergroup_clause
+%type <gb_list> gb_commalist
+%type <extended_gb> extended_gb
+%type <extended_gb_list> extended_gb_commalist
+%type <list_of_gb_list> list_of_gb_commalist
+%type <gb_val> gb
+/*                     for PARAM, DEFINE block */
+%type <var_defs> variable_def
+%type <var_defs> params_def
+%type <var_defs> variable_list
+%type <var_pair> variable_assign
+
+/*             For table definition    */
+%type <field_t> field
+%type <field_list_t> field_list
+%type <table_def_t> table_def
+%type <table_list_schema> table_list
+%type <plist_t> param_commalist
+%type <plist_t> opt_param_commalist
+%type <plist_t> singleparam_commalist
+%type <plist_t> opt_singleparam_commalist
+%type <plist_t> opt_singleparam_commalist_bkt
+%type <namevec_t> namevec_commalist
+%type <subq_spec_t> subq_spec
+%type <subqueryspec_list_t> subqueryspec_list
+%type <ufcn> unpack_func 
+%type <ufcnl> unpack_func_list 
+
+       /* operators */
+
+%left OR
+%left AND
+%left NOT
+%left <strval> COMPARISON /* = <> < > <= >= */
+%left '|'
+%left '&'
+%left <strval> SHIFT_OP /* << >> */
+%left '+' '-'
+%left '*' '/' '%'
+%nonassoc UMINUS
+
+       /* literal keyword tokens */
+%token  SEMICOLON LEFTBRACE RIGHTBRACE
+/*             For query definition    */
+%token BY AS
+%token <strval> AGGR
+%token FROM INNER_JOIN FILTER_JOIN OUTER_JOIN LEFT_OUTER_JOIN RIGHT_OUTER_JOIN
+%token GROUP HAVING IN
+%token SELECT
+%token WHERE SUPERGROUP CLEANING_WHEN CLEANING_BY CLOSING_WHEN
+%token SUCH THAT
+%token CUBE ROLLUP GROUPING_SETS
+
+%token TRUE_V FALSE_V
+%token TIMEVAL_L HEX_L LHEX_L IP_L IPV6_L
+%token MERGE SLACK
+
+%token DEFINE_SEC PARAM_SEC
+
+/*             For table definition    */
+%token PROTOCOL TABLE STREAM FTA UNPACK_FCNS
+%token OPERATOR OPERATOR_VIEW FIELDS SUBQUERIES SELECTION_PUSHDOWN
+
+
+%%
+
+/*                     Union of possible results       */
+parse_result:  query_list      {
+               fta_parse_result->parse_tree_list = $1;
+               fta_parse_result->tables = NULL;
+               fta_parse_result->parse_type = QUERY_PARSE;
+       }
+       | table_list    {
+               fta_parse_result->parse_tree_list = NULL;
+               fta_parse_result->fta_parse_tree = NULL;
+               fta_parse_result->tables = $1;
+               fta_parse_result->parse_type = TABLE_PARSE;
+       }
+//                             table_list should contain a single STREAM_SCHEMA table.
+       | FTA LEFTBRACE table_list gsql RIGHTBRACE      {
+               fta_parse_result->parse_tree_list = NULL;
+               fta_parse_result->fta_parse_tree = $4;
+               fta_parse_result->tables = $3;
+               fta_parse_result->parse_type = STREAM_PARSE;
+       }
+       ;
+
+
+
+/*             Query definition.
+               WARNING: there might be some relics.
+*/
+
+gsql:          variable_def params_def select_statement {
+                               $3->add_nmap($1);                       // Memory leak : plug it.
+                               $3->add_param_list($2);         // Memory leak : plug it.
+                               $$ = $3;
+                       }
+               |       params_def variable_def select_statement {
+                               $3->add_nmap($2);                       // Memory leak : plug it.
+                               $3->add_param_list($1);         // Memory leak : plug it.
+                               $$ = $3;
+                       }
+               |       params_def select_statement {
+                               $2->add_nmap(NULL);                     // Memory leak : plug it.
+                               $2->add_param_list($1);         // Memory leak : plug it.
+                               $$ = $2;
+                       }
+               |       variable_def select_statement {
+                               $2->add_nmap($1);                       // Memory leak : plug it.
+                               $$ = $2;
+                       }
+               |       select_statement {
+                               $$ = $1;
+                       }
+               |       variable_def params_def merge_statement{
+                               $3->add_nmap($1);                       // Memory leak : plug it.
+                               $3->add_param_list($2);         // Memory leak : plug it.
+                               $$ = $3;
+                       }
+               |       params_def variable_def merge_statement{
+                               $3->add_nmap($2);                       // Memory leak : plug it.
+                               $3->add_param_list($1);         // Memory leak : plug it.
+                               $$ = $3;
+                       }
+               |       params_def merge_statement{
+                               $2->add_param_list($1);         // Memory leak : plug it.
+                               $$ = $2;
+                       }
+               |       variable_def merge_statement{
+                               $2->add_nmap($1);                       // Memory leak : plug it.
+                               $$ = $2;
+                       }
+               |       merge_statement{
+                               $$ = $1;
+                       }
+       ;
+
+query_list:    gsql    {$$ = new query_list_t($1);}
+       |       query_list SEMICOLON gsql       {$$ = $1->append($3);}
+       ;
+
+params_def:
+        PARAM_SEC LEFTBRACE variable_list RIGHTBRACE   {$$=$3;}
+       | PARAM_SEC LEFTBRACE  RIGHTBRACE       {$$=NULL;}
+       ;
+
+variable_def:
+        DEFINE_SEC LEFTBRACE variable_list RIGHTBRACE {$$=$3;fta_parse_defines=$3;}
+       | DEFINE_SEC LEFTBRACE RIGHTBRACE       {$$=NULL;fta_parse_defines = NULL;}     
+       ;
+
+variable_list:
+       variable_assign                 {$$ = new var_defs_t($1);}
+       | variable_list variable_assign {$$ = $1->add_var_pair($2);}
+       ;
+
+variable_assign:
+       NAME STRING_TOKEN SEMICOLON     {$$ = new var_pair_t($1,$2);}
+       | NAME NAME SEMICOLON   {$$ = new var_pair_t($1,$2);}
+       ;
+
+select_statement:
+               SELECT  selection table_exp     {$$ = $3->add_selection($2);}
+       ;
+
+merge_statement:
+               MERGE column_ref_list
+               from_clause             {$$ = new table_exp_t($2,$3);}
+       |       MERGE column_ref_list SLACK  scalar_exp
+               from_clause             {$$ = new table_exp_t($2,$4,$5);}
+       ;
+
+       /* query expressions */
+
+
+selection:
+               select_commalist        { $$ = $1;}
+       ;
+
+table_exp:
+               from_clause
+               opt_where_clause
+               opt_group_by_clause
+               opt_supergroup_clause
+               opt_having_clause       
+               opt_cleaning_when_clause        
+               opt_cleaning_by_clause  
+               opt_closing_when_clause 
+                       {$$=new table_exp_t($1,$2,$3,$4,$5,$6,$7, $8);}
+       ;
+
+from_clause:
+               FROM table_ref_commalist        {$$ = $2; $$->set_properties(-1);}
+       |       INNER_JOIN FROM table_ref_commalist     {$$ = $3; $$->set_properties(INNER_JOIN_PROPERTY);}
+       |       OUTER_JOIN FROM table_ref_commalist     {$$ = $3; $$->set_properties(OUTER_JOIN_PROPERTY);}
+       |       RIGHT_OUTER_JOIN FROM table_ref_commalist       {$$ = $3; $$->set_properties(RIGHT_OUTER_JOIN_PROPERTY);}
+       |       LEFT_OUTER_JOIN FROM table_ref_commalist        {$$ = $3; $$->set_properties(LEFT_OUTER_JOIN_PROPERTY);}
+       |       FILTER_JOIN '(' column_ref ',' INTNUM ')' FROM table_ref_commalist      {$$ = $8; $$->set_properties(FILTER_JOIN_PROPERTY); $$->set_colref($3); $$->set_temporal_range($5);}
+       ;
+
+table_ref_commalist:
+               table_ref       {$$ = new tablevar_list_t($1);}
+       |       table_ref_commalist ',' table_ref       {$$= $1->append_table($3);}
+       ;
+
+table_ref:
+               table { $$ = $1;}
+       |       table NAME { $$= $1->set_range_var($2);}
+       ;
+
+table:
+               qname   {$$ = new tablevar_t($1->c_str());}
+       |       NAME '.' qname  {$$ = new tablevar_t($1,$3->c_str(),0);}
+       |       NAME '.' NAME '.' qname {$$ = new tablevar_t($1,$3,$5->c_str());}
+       |       STRING_TOKEN '.' NAME '.' qname {$$ = new tablevar_t($1,$3,$5->c_str());}
+       |       '[' NAME ']' '.' qname  {$$ = new tablevar_t($2,$5->c_str(),1);}
+       ;
+
+qname:
+               NAME    {$$ = new string_t($1);}
+       |       qname '/' NAME  {$$ = $$->append("/",$3);}
+       ;
+
+
+opt_where_clause:
+               /* empty */     {$$=NULL;}
+       |       where_clause    {$$=$1;}
+       ;
+
+where_clause:
+               WHERE search_condition  {$$ = $2;}
+       ;
+
+opt_cleaning_when_clause:
+               /* empty */     {$$=NULL;}
+       |       CLEANING_WHEN search_condition {$$=$2; }
+       ;
+
+opt_cleaning_by_clause:
+               /* empty */     {$$=NULL;}
+       |       CLEANING_BY search_condition {$$=$2; }
+       ;
+
+opt_closing_when_clause:
+               /* empty */     {$$=NULL;}
+       |       CLOSING_WHEN search_condition {$$=$2; }
+       ;
+
+opt_having_clause:
+               /* empty */     {$$=NULL;}
+       |       having_clause   {$$=$1;}
+       ;
+
+having_clause:
+               HAVING search_condition {$$ = $2;}
+       ;
+
+
+       /* search conditions */
+
+search_condition:
+               search_condition OR search_condition  {$$=new predicate_t("OR",$1,$3);}
+       |       search_condition AND search_condition {$$=new predicate_t("AND",$1,$3);}
+       |       NOT search_condition    {$$ = new predicate_t("NOT", $2 );}
+       |       '(' search_condition ')' {$$ = $2;}
+       |       predicate {$$ = $1;}
+       ;
+
+predicate:
+               comparison_predicate { $$=$1;}
+       |       in_predicate    { $$ = $1;}
+       |       NAME '[' ']' {$$ = predicate_t::make_paramless_fcn_predicate($1); }     
+       |       NAME '[' scalar_exp_commalist ']' {$$ = new predicate_t($1, $3->get_se_list()); }
+       ;
+
+comparison_predicate:
+               scalar_exp COMPARISON scalar_exp        {$$ = new predicate_t($1,$2,$3);}
+       ;
+
+in_predicate:
+               scalar_exp IN '[' literal_commalist ']' { $$ = new predicate_t($1,$4); }
+       ;
+
+literal_commalist:
+               literal {$$ = new literal_list_t($1);}
+       |       literal_commalist ',' literal   {$$ = $1->append_literal($3);}
+       ;
+
+       /* scalar expressions */
+
+scalar_exp:
+               scalar_exp '+' scalar_exp       { $$=new scalarexp_t("+",$1,$3);}
+       |       scalar_exp '-' scalar_exp       { $$=new scalarexp_t("-",$1,$3);}
+       |       scalar_exp '|' scalar_exp       { $$=new scalarexp_t("|",$1,$3);}
+       |       scalar_exp '*' scalar_exp       { $$=new scalarexp_t("*",$1,$3);}
+       |       scalar_exp '/' scalar_exp       { $$=new scalarexp_t("/",$1,$3);}
+       |       scalar_exp '&' scalar_exp       { $$=new scalarexp_t("&",$1,$3);}
+       |       scalar_exp '%' scalar_exp       { $$=new scalarexp_t("%",$1,$3);}
+       |       scalar_exp SHIFT_OP scalar_exp  { $$=new scalarexp_t($2,$1,$3);}
+       |       '+' scalar_exp %prec UMINUS     { $$ = new scalarexp_t("+",$2);}
+       |       '-' scalar_exp %prec UMINUS     { $$ = new scalarexp_t("-",$2);}
+       |       '!' scalar_exp %prec UMINUS     { $$ = new scalarexp_t("!",$2);}
+       |       '~' scalar_exp %prec UMINUS     { $$ = new scalarexp_t("~",$2);}
+       |       literal { $$= new scalarexp_t($1);}
+       |       '$' NAME {$$ = scalarexp_t::make_param_reference($2);}
+       |       ifparam {$$ = scalarexp_t::make_iface_param_reference($1);}
+       |       column_ref { $$ = new scalarexp_t($1);}
+       |       '(' scalar_exp ')'      {$$ = $2;}
+       |       AGGR '(' '*' ')'        { $$ = scalarexp_t::make_star_aggr($1); }
+       |       AGGR '(' scalar_exp ')' { $$ = scalarexp_t::make_se_aggr($1,$3); }
+       |       NAME '(' scalar_exp_commalist ')' {$$ = new scalarexp_t($1, $3->get_se_list()); }
+       |       NAME '(' ')' {$$ = scalarexp_t::make_paramless_fcn($1); }
+       |       AGGR '$' '(' '*' ')'    { $$ = scalarexp_t::make_star_aggr($1); $$->set_superaggr(true); }
+       |       AGGR '$' '(' scalar_exp ')'     { $$ = scalarexp_t::make_se_aggr($1,$4); $$->set_superaggr(true); }
+       |       NAME '$' '(' scalar_exp_commalist ')' {$$ = new scalarexp_t($1, $4->get_se_list()); $$->set_superaggr(true); }
+       |       NAME '$' '(' ')' {$$ = scalarexp_t::make_paramless_fcn($1); $$->set_superaggr(true); }
+       ;
+
+
+select_commalist:
+               scalar_exp      {       $$= new select_list_t($1); }
+       |       scalar_exp AS NAME      {       $$= new select_list_t($1,$3); }
+       |       select_commalist ',' scalar_exp { $$=$1->append($3); }
+       |       select_commalist ',' scalar_exp AS NAME { $$=$1->append($3,$5); }
+       ;
+
+scalar_exp_commalist:
+               scalar_exp      {       $$= new se_list_t($1); }
+       |       scalar_exp_commalist ',' scalar_exp     { $$=$1->append($3); }
+       ;
+
+literal:
+               STRING_TOKEN    {$$ = new literal_t($1,LITERAL_STRING);}
+       |       INTNUM          {$$ = new literal_t($1,LITERAL_INT);}
+       |       LONGINTNUM              {$$ = new literal_t($1,LITERAL_LONGINT);}
+       |       APPROXNUM       {$$ = new literal_t($1,LITERAL_FLOAT);}
+       |       TRUE_V          {$$ = new literal_t("TRUE",LITERAL_BOOL);}
+       |       FALSE_V         {$$ = new literal_t("FALSE",LITERAL_BOOL);}
+       |       TIMEVAL_L STRING_TOKEN  {$$ = new literal_t($2,LITERAL_TIMEVAL);}
+       |       HEX_L  STRING_TOKEN     {$$ = new literal_t($2,LITERAL_HEX);}
+       |       LHEX_L  STRING_TOKEN    {$$ = new literal_t($2,LITERAL_LONGHEX);}
+       |       IP_L  STRING_TOKEN      {$$ = new literal_t($2,LITERAL_IP);}
+       |       IPV6_L  STRING_TOKEN    {$$ = new literal_t($2,LITERAL_IPV6);}
+       |       '#' NAME        {$$ = literal_t::make_define_literal($2,fta_parse_defines);}
+       ;
+
+
+
+opt_group_by_clause:
+               /* empty */    {$$ = NULL;}
+       |       GROUP BY extended_gb_commalist  {$$ = $3;}
+       ;
+
+opt_supergroup_clause:
+               /* empty */    {$$ = NULL;}
+       |       SUPERGROUP gb_ref_list  {$$ = $2;}
+       ;
+
+list_of_gb_commalist:
+               '(' gb_commalist ')' { $$ = new list_of_gb_list_t($2);}
+       |       list_of_gb_commalist ',' '(' gb_commalist ')' {$$ = $1->append($4);}
+       ;
+
+extended_gb:
+               gb      {$$ = extended_gb_t::create_from_gb($1);}
+       |       ROLLUP '(' gb_commalist ')' {$$ = extended_gb_t::extended_create_from_rollup($3);}
+       |       CUBE '(' gb_commalist ')' {$$ = extended_gb_t::extended_create_from_cube($3);}
+       |       GROUPING_SETS '(' list_of_gb_commalist ')' {$$ = extended_gb_t::extended_create_from_gsets($3);}
+       ;
+
+extended_gb_commalist:
+               extended_gb { $$ = new extended_gb_list_t($1);}
+       |       extended_gb_commalist ',' extended_gb { $$=$1->append($3);}
+    ;
+
+gb_commalist:
+               gb { $$ = new gb_list_t($1);}
+       |       gb_commalist ',' gb { $$=$1->append($3);}
+    ;
+
+gb:
+               NAME    {$$ = new gb_t($1); }
+       |       NAME '.' NAME   {$$ = new gb_t($1,$3); }
+       |       NAME '.' NAME '.' NAME  {$$ = new gb_t($1,$3,$5); }
+       |       scalar_exp AS NAME {$$ = new gb_t($1,$3); }
+       ;
+
+       /* miscellaneous */
+
+
+/*
+               I do not currently use 3 part column refs
+*/
+
+ifparam:
+               '@' NAME        {$$ = new ifpref_t($2);}
+       |       NAME '.' '@' NAME       {$$ = new ifpref_t($1, $4);}
+       ;
+
+column_ref:
+               NAME    {$$ = new colref_t($1); }
+       |       NAME '.' NAME   {$$ = new colref_t($1,$3); }
+       |       NAME '.' NAME '.' NAME  {$$ = new colref_t($1,$3,$5); }
+       ;
+
+column_ref_list:
+               column_ref ':' column_ref       {$$=new colref_list_t($1); $$->append($3);}
+       |       column_ref_list ':' column_ref  {$$ = $1->append($3);}
+       ;
+
+gb_ref:
+       NAME    {$$ = new colref_t($1); }
+       ;
+
+gb_ref_list:
+               gb_ref ',' gb_ref       {$$=new colref_list_t($1); $$->append($3);}
+       |       gb_ref_list ',' gb_ref  {$$ = $1->append($3);}
+       ;
+
+               /* data types */
+
+
+       /* the various things you can name */
+
+
+
+
+
+/*                     Table definition section                */
+
+
+table_list:    table_def       {$$ = new table_list($1);}
+       |       table_list table_def    {$$ = $1->append_table($2);}
+       ;
+
+table_def:     PROTOCOL NAME  opt_singleparam_commalist opt_singleparam_commalist_bkt LEFTBRACE field_list RIGHTBRACE {
+                                       $$=new table_def($2,$3,$4, $6, PROTOCOL_SCHEMA); delete $6;}
+       |               STREAM qname  opt_singleparam_commalist LEFTBRACE field_list RIGHTBRACE {
+                                       $$=new table_def($2->c_str(),$3,NULL,$5, STREAM_SCHEMA); delete $5;}
+       |               OPERATOR_VIEW NAME LEFTBRACE OPERATOR opt_param_commalist FIELDS LEFTBRACE field_list RIGHTBRACE SUBQUERIES LEFTBRACE subqueryspec_list RIGHTBRACE SELECTION_PUSHDOWN opt_param_commalist RIGHTBRACE {
+                               $$ = new table_def($2, $5, $8, $12, $15); }
+       |               UNPACK_FCNS LEFTBRACE unpack_func_list RIGHTBRACE { $$ = new table_def($3); }
+       ;
+
+unpack_func_list:
+       unpack_func     {$$ = new unpack_fcn_list($1);}
+       |       unpack_func_list SEMICOLON unpack_func  {$$ = $1 -> append($3);}
+       ;
+
+unpack_func:
+       NAME NAME INTNUM {$$ = new unpack_fcn($1,$2,$3);}
+       ;
+
+subqueryspec_list:
+       subq_spec       {$$ = new subqueryspec_list($1);}
+       |       subqueryspec_list SEMICOLON subq_spec {$$ = $1->append($3);}
+       ;
+
+subq_spec:
+       NAME '(' namevec_commalist ')' {$$=new subquery_spec($1, $3); delete $3;}
+       ;
+
+field_list:    field   {$$ = new field_entry_list($1);}
+       |       field_list field        {$$ = $1->append_field($2);}
+       ;
+
+field:
+               NAME NAME NAME opt_param_commalist opt_singleparam_commalist_bkt SEMICOLON {$$ = new field_entry($1,$2,$3,$4,$5);}
+       |       NAME NAME opt_param_commalist SEMICOLON {$$ = new field_entry($1,$2,"",$3,NULL);}
+       ;
+
+opt_param_commalist:
+               /* empty */    {$$ = NULL;}
+       |       '(' param_commalist ')' {$$ = $2;}
+       ;
+
+param_commalist:
+               NAME    {$$ = new param_list($1);}
+       |       NAME NAME       {$$ = new param_list($1,$2);}
+       |       NAME STRING_TOKEN       {$$ = new param_list($1,$2);}
+       |       NAME INTNUM     {$$ = new param_list($1,$2);}
+       |       param_commalist ',' NAME {$$ = $1->append($3);}
+       |       param_commalist ',' NAME NAME {$$ = $1->append($3,$4);}
+       |       param_commalist ',' NAME STRING_TOKEN {$$ = $1->append($3,$4);}
+       |       param_commalist ',' NAME INTNUM {$$ = $1->append($3,$4);}
+       ;
+
+opt_singleparam_commalist_bkt:
+               /* empty */    {$$ = NULL;}
+       |       '[' singleparam_commalist ']' {$$ = $2;}
+       ;
+
+opt_singleparam_commalist:
+               /* empty */    {$$ = NULL;}
+       |       '(' singleparam_commalist ')' {$$ = $2;}
+       ;
+
+singleparam_commalist:
+               NAME    {$$ = new param_list($1);}
+       |       singleparam_commalist ',' NAME {$$ = $1->append($3);}
+       ;
+
+namevec_commalist:
+               NAME NAME opt_param_commalist   {$$ = new name_vec($1,$2,$3);}
+       |       namevec_commalist ',' NAME NAME opt_param_commalist {$$ = $1->append($3,$4, $5);}
+       ;
+
+%%
+
diff --git a/src/ftacmp/ftalexer.cc b/src/ftacmp/ftalexer.cc
new file mode 100644 (file)
index 0000000..0b40c39
--- /dev/null
@@ -0,0 +1,2505 @@
+#define yy_create_buffer FtaParser_create_buffer
+#define yy_delete_buffer FtaParser_delete_buffer
+#define yy_scan_buffer FtaParser_scan_buffer
+#define yy_scan_string FtaParser_scan_string
+#define yy_scan_bytes FtaParser_scan_bytes
+#define yy_flex_debug FtaParser_flex_debug
+#define yy_init_buffer FtaParser_init_buffer
+#define yy_flush_buffer FtaParser_flush_buffer
+#define yy_load_buffer_state FtaParser_load_buffer_state
+#define yy_switch_to_buffer FtaParser_switch_to_buffer
+#define yyin FtaParserin
+#define yyleng FtaParserleng
+#define yylex FtaParserlex
+#define yyout FtaParserout
+#define yyrestart FtaParserrestart
+#define yytext FtaParsertext
+
+#line 19 "ftalexer.cc"
+/* A lexical scanner generated by flex*/
+
+/* Scanner skeleton version:
+ * $Header: /home/daffy/u0/vern/flex/RCS/flex.skl,v 2.91 96/09/10 16:58:48 vern Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <unistd.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* Some routines like yy_flex_realloc() are emitted as static but are
+   not called by all lexers. This generates warnings in some compilers,
+   notably GCC. Arrange to suppress these. */
+#ifdef __GNUC__
+#define YY_MAY_BE_UNUSED __attribute__((unused))
+#else
+#define YY_MAY_BE_UNUSED
+#endif
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )) YY_MAY_BE_UNUSED;
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yytext_ptr -= yy_more_len; \
+       yyleng = (int) (yy_cp - yytext_ptr); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 85
+#define YY_END_OF_BUFFER 86
+static yyconst short int yy_accept[655] =
+    {   0,
+        0,    0,   86,   84,   81,   80,   66,   84,   67,   66,
+       66,   70,   57,   62,   60,   63,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   45,   46,   68,   81,   80,    0,   79,   78,
+        0,   74,    0,    0,   73,   70,    0,    0,   58,   64,
+       61,   65,   59,   69,   69,   26,   69,   69,   69,   10,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   27,   69,
+
+       27,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   29,   69,   29,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   27,   69,
+       69,   69,   69,   69,   29,   69,   69,   69,   69,   69,
+       69,   69,   69,    0,   82,    0,   77,    0,   83,   73,
+        0,    0,   75,   71,    1,    5,    1,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       50,   69,   69,   69,   69,   69,   39,   69,   69,   69,
+
+       69,   69,   69,   69,   69,   69,    7,   69,    6,   69,
+       28,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,    8,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,    1,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,    0,   76,   72,   69,   69,   69,
+       69,   69,   19,   69,   69,   69,   69,   69,   69,   69,
+       11,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   40,   69,   69,   69,   69,   69,   69,   69,
+
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   32,   69,   69,   69,   69,   33,   69,   36,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,    9,   69,   69,   69,
+       37,   69,   69,   69,   17,   17,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   34,   69,   69,   69,   69,
+       69,   44,   69,   69,   69,   69,   69,   69,   35,   69,
+       69,   69,   69,   69,   47,   69,   69,   31,   69,   69,
+       69,   69,   69,   69,   17,   69,   69,   69,   69,   69,
+
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   43,   54,   69,   69,   69,   69,   25,   69,   69,
+       41,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   18,   69,   30,   49,   69,   69,   30,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,    3,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   38,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,    2,   69,
+
+       69,   69,   69,   69,   69,   69,   69,   69,   42,   69,
+       69,   69,   52,   69,   69,   48,   69,   69,   69,   69,
+       69,   69,   69,    4,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   12,   69,   69,   69,   13,   69,
+       69,   69,   55,   21,   69,   69,   69,   69,   69,   69,
+       69,   69,   23,   69,   69,   69,   69,   16,   69,   69,
+
+       69,   69,   69,   69,   69,   69,   51,   69,   69,   69,
+       69,   69,   69,   24,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   69,   69,   69,   22,   20,   69,
+       69,   53,   69,   69,   69,   69,   69,   69,   69,   69,
+       69,   69,   69,   69,   15,   69,   69,   69,   69,   14,
+       69,   69,   56,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    4,    1,    4,    4,    4,    4,    5,    4,
+        4,    4,    6,    4,    7,    8,    9,   10,   10,   10,
+       10,   10,   10,   11,   10,   10,   10,    4,   12,   13,
+       14,   15,    1,    4,   16,   17,   18,   19,   20,   21,
+       22,   23,   24,   25,   26,   27,   28,   29,   30,   31,
+       32,   33,   34,   35,   36,   37,   38,   39,   40,   41,
+        4,    1,    4,    1,   42,    1,   43,   44,   45,   46,
+
+       47,   48,   49,   50,   51,   52,   41,   53,   54,   55,
+       56,   57,   41,   58,   59,   60,   61,   62,   63,   64,
+       65,   41,   66,    4,   67,   68,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[69] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    3,
+        3,    1,    1,    1,    1,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    1,    1,    1
+    } ;
+
+static yyconst short int yy_base[660] =
+    {   0,
+        0,    0,  777,  778,  774,    0,  778,   66,  768,   62,
+      765,   66,  778,   65,  778,   69,   56,   30,   61,  753,
+        0,   65,   54,   76,   70,   83,  104,   75,   96,   88,
+      109,  114,  119,  743,   87,  106,  104,  706,   92,  113,
+      712,  726,  713,  720,  125,  710,  109,  122,   47,  715,
+      714,  707,  778,  778,  778,  760,    0,  135,  778,  778,
+      758,  169,  175,  757,  173,  186,  181,  732,  778,  778,
+      778,  778,  778,    0,  739,    0,  735,  710,  706,    0,
+      126,  718,  736,  143,  691,  707,  729,  722,  175,  718,
+      731,  693,  689,  714,  687,  705,  702,  678,  710,  161,
+
+      683,  716,  716,  687,  695,  700,  703,  667,  672,  674,
+      693,  667,  706,  683,  689,  681,  662,  688,  690,  697,
+      691,  668,  663,  688,  698,  680,  183,  659,  164,  694,
+      694,  681,  672,  664,  675,  685,  657,  670,  644,  655,
+      651,  157,  638,  654,  644,  640,  639,  632,  638,  644,
+      627,  632,  634,  628,  645,  626,  636,  631,  630,  170,
+      639,  634,  622,  676,  778,  197,  215,  675,  778,  218,
+      224,  226,  229,  650,  634,    0,  633,  658,  639,  643,
+      651,  627,  610,  613,  620,  642,  631,  637,  628,  634,
+        0,  601,  606,  623,  597,  633,    0,  605,  635,  643,
+
+      616,  641,  604,  615,  610,  588,    0,  625,    0,  597,
+        0,  612,  628,  623,  626,  594,  624,  604,  615,  610,
+      586,  582,  614,  615,  612,  599,  607,    0,  609,  581,
+      577,  579,  598,  589,  603,  602,  561,  604,  586,  560,
+      575,  574,  573,  571,  554,  557,  564,  550,  555,  547,
+      556,  559,  545,  555,  560,  555,  551,  547,  552,  548,
+      550,  536,  537,  552,  231,  233,  778,  577,  576,  562,
+      566,  554,    0,  533,  536,  526,  556,  564,  564,  562,
+        0,  534,  549,  522,  549,  522,  543,  533,  558,  531,
+      514,  529,    0,  528,  549,  521,  551,  544,  532,  515,
+
+      505,  534,  531,  525,  523,  498,  496,  538,  529,  538,
+      517,    0,  519,  506,  492,  529,    0,  511,    0,  529,
+      526,  498,  528,  527,  499,  486,  489,  479,  491,  480,
+      481,  477,  492,  486,  483,  473,  470,  468,  483,  469,
+      479,  482,  502,  474,  498,  492,    0,  469,  464,  498,
+        0,  483,  483,  457,  490,  462,  490,  462,  468,  472,
+      481,  470,  464,  475,  474,    0,  468,  480,  459,  451,
+      457,    0,  480,  455,  465,  453,  437,  458,    0,  464,
+      471,  468,  429,  439,    0,  471,  460,    0,  463,  435,
+      434,  431,  426,  422,  428,  429,  435,  420,  426,  432,
+
+      431,  415,  411,  421,  420,  446,  418,  437,  443,  409,
+      414,    0,    0,  420,  419,  431,  404,    0,  433,  441,
+        0,  440,  430,  418,  392,  422,  418,  425,  391,  423,
+      417,  416,    0,  415,  420,    0,  410,  409,    0,  383,
+      413,  397,  416,  388,  387,  380,  385,  391,  377,  379,
+      369,  371,  376,  371,  368,  376,  391,  365,  400,  379,
+      371,  377,  393,  392,  394,  366,  384,  386,  385,  355,
+      375,  349,  375,    0,  377,  350,  378,  368,  342,  372,
+      377,  370,  343,    0,  377,  364,  338,  337,  345,  351,
+      340,  342,  334,  329,  332,  326,  330,  327,    0,  342,
+
+      345,  340,  343,  350,  323,  336,  335,  352,    0,  324,
+      354,  326,  330,  347,  319,    0,  334,  308,  338,  346,
+      329,  303,  345,    0,  320,  298,  304,  317,  307,  310,
+      305,  295,  293,  215,  330,  228,  302,  327,  299,  315,
+      314,  318,  291,  312,  286,  306,  313,  286,  320,  292,
+      296,  303,  305,  278,  305,   63,  283,  281,  272,  275,
+      271,  273,  280,  269,  285,  301,  303,  257,  271,  273,
+      290,  263,  297,  269,    0,  273,  272,  289,    0,  279,
+      253,  279,    0,    0,  275,  243,  257,  259,  250,  257,
+      261,  244,    0,  281,  271,  252,  243,    0,  262,  236,
+
+      270,  269,  273,  250,  249,  254,    0,  242,  233,  227,
+      234,  243,  255,    0,  228,  248,  222,  250,  223,   37,
+      119,  133,  140,  122,  146,  154,  160,    0,    0,  193,
+      168,    0,  216,  191,  225,  198,  194,  222,  197,  230,
+      204,  237,  202,  207,    0,  230,  205,  231,  207,    0,
+      225,  235,    0,  778,  266,  269,  265,  272,  275
+    } ;
+
+static yyconst short int yy_def[660] =
+    {   0,
+      654,    1,  654,  654,  654,  655,  654,  656,  654,  654,
+      654,  654,  654,  654,  654,  654,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  654,  654,  654,  654,  655,  656,  654,  654,
+      658,  654,  654,  659,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  658,  654,  654,  654,  659,  654,  654,
+      654,  654,  654,  654,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  654,  654,  654,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,  657,  657,  657,  657,  657,  657,  657,
+      657,  657,  657,    0,  654,  654,  654,  654,  654
+    } ;
+
+static yyconst short int yy_nxt[847] =
+    {   0,
+        4,    5,    6,    7,    8,    7,    9,   10,   11,   12,
+       12,   13,   14,   15,   16,   17,   18,   19,   20,   21,
+       22,   23,   24,   25,   21,   21,   26,   27,   28,   29,
+       30,   21,   31,   32,   33,   34,   21,   35,   36,   21,
+       21,   21,   37,   38,   39,   21,   21,   40,   41,   42,
+       43,   21,   44,   45,   46,   47,   21,   48,   49,   50,
+       21,   21,   51,   52,   21,   53,   54,   55,   59,   80,
+       60,   62,   62,   65,  632,   66,   66,   69,   70,   71,
+       88,   63,   72,   73,   75,   67,   94,   81,   89,   76,
+       82,   96,   77,  159,   80,   97,   83,   90,   99,   91,
+
+      100,   68,  102,  118,  111,  103,  586,  160,   63,  136,
+       78,   95,   67,   84,   76,   92,   85,   79,   98,  105,
+      119,   86,   93,  106,  101,  587,  113,  107,  114,  104,
+      112,  115,  120,  124,  130,  138,  137,   59,  121,   60,
+      125,  131,  132,  633,  142,  178,  108,  143,  126,  127,
+      109,  133,  144,  116,  110,  179,  117,  634,  140,  122,
+      128,  139,   76,  145,  123,  141,  155,  151,  134,  156,
+      146,  152,  157,  635,  129,  153,  628,  158,   62,   62,
+      166,  166,  170,  170,  167,  167,  172,  172,   63,  182,
+      173,  173,  171,   65,  188,   66,   66,  200,  183,  226,
+
+      227,  189,  201,  244,  629,   67,  167,  167,  231,  636,
+      228,  637,  245,  229,  260,   63,  638,  228,  639,  171,
+      232,   68,  202,  228,  167,  167,  261,  170,  170,  265,
+      265,  565,   67,  266,  266,  173,  173,  171,  173,  173,
+      266,  266,  266,  266,  568,  640,  641,  642,  643,  644,
+      645,  645,  566,  646,  647,  648,  645,  649,  650,  650,
+      651,  650,  652,  653,  171,  569,   57,   74,   57,   58,
+       58,   58,  164,  164,  164,  168,  168,  168,  631,  630,
+      629,  629,  628,  628,  627,  626,  625,  614,  624,  623,
+      622,  621,  620,  619,  618,  617,  616,  614,  615,  614,
+
+      613,  612,  611,  610,  598,  609,  608,  593,  607,  606,
+      605,  604,  603,  602,  601,  600,  599,  598,  598,  597,
+      596,  593,  595,  594,  593,  584,  592,  579,  591,  575,
+      590,  589,  588,  585,  584,  584,  583,  582,  581,  580,
+      579,  579,  578,  577,  576,  575,  575,  574,  573,  572,
+      571,  570,  567,  564,  563,  562,  561,  560,  559,  558,
+      557,  556,  555,  554,  553,  552,  551,  550,  549,  548,
+      547,  546,  545,  544,  543,  542,  541,  540,  539,  538,
+      537,  536,  535,  534,  524,  533,  532,  531,  530,  529,
+      528,  527,  526,  525,  499,  524,  524,  523,  522,  521,
+
+      520,  519,  518,  517,  516,  515,  514,  513,  512,  511,
+      510,  509,  509,  508,  507,  506,  505,  504,  503,  502,
+      501,  500,  499,  499,  498,  497,  496,  495,  474,  494,
+      493,  492,  491,  490,  489,  488,  487,  486,  485,  484,
+      483,  482,  481,  480,  479,  478,  477,  476,  474,  475,
+      474,  473,  472,  471,  470,  469,  468,  467,  466,  465,
+      464,  463,  462,  461,  460,  459,  458,  457,  456,  455,
+      439,  433,  454,  453,  452,  451,  450,  418,  449,  448,
+      447,  446,  445,  444,  443,  442,  441,  440,  439,  438,
+      437,  436,  435,  433,  434,  433,  432,  431,  430,  429,
+
+      428,  427,  426,  425,  424,  423,  422,  421,  420,  419,
+      418,  418,  417,  416,  415,  414,  413,  412,  411,  410,
+      409,  408,  407,  406,  405,  388,  404,  403,  402,  401,
+      400,  399,  366,  398,  397,  396,  395,  394,  347,  393,
+      392,  391,  390,  389,  388,  388,  387,  386,  385,  384,
+      383,  382,  381,  380,  379,  378,  377,  376,  375,  374,
+      373,  372,  371,  370,  369,  368,  367,  366,  366,  365,
+      364,  363,  362,  361,  360,  359,  358,  357,  356,  355,
+      354,  353,  352,  351,  350,  347,  349,  348,  347,  346,
+      345,  344,  343,  342,  341,  317,  340,  312,  339,  338,
+
+      337,  336,  335,  334,  333,  332,  331,  330,  281,  329,
+      273,  328,  327,  326,  325,  324,  323,  322,  321,  320,
+      317,  319,  318,  317,  316,  315,  312,  314,  313,  312,
+      311,  310,  309,  308,  307,  306,  305,  304,  303,  302,
+      301,  300,  299,  298,  297,  296,  295,  294,  293,  292,
+      291,  290,  289,  288,  287,  286,  285,  284,  283,  281,
+      282,  281,  280,  279,  278,  277,  273,  276,  275,  274,
+      273,  272,  271,  270,  269,  268,  267,  169,  165,  264,
+      263,  262,  259,  258,  257,  256,  255,  211,  209,  254,
+      207,  253,  252,  251,  250,  249,  248,  247,  246,  176,
+
+      243,  242,  241,  240,  239,  238,  237,  236,  235,  234,
+      233,  230,  225,  224,  223,  222,  221,  220,  219,  218,
+      217,  216,  215,  214,  213,  212,  211,  211,  209,  210,
+      207,  209,  208,  207,  206,  205,  204,  203,  199,  198,
+      197,  196,  195,  194,  193,  192,  191,  190,  187,  186,
+      185,  184,  181,  180,  176,  177,  176,  175,  174,  169,
+      165,   56,  163,  162,  161,  154,  150,  149,  148,  147,
+       80,  135,   87,   64,   61,   56,  654,    3,  654,  654,
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654
+    } ;
+
+static yyconst short int yy_chk[847] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    8,   18,
+        8,   10,   10,   12,  620,   12,   12,   14,   14,   14,
+       22,   10,   16,   16,   17,   12,   23,   19,   22,   17,
+       19,   24,   17,   49,   18,   24,   19,   22,   25,   22,
+
+       25,   12,   26,   30,   28,   26,  556,   49,   10,   35,
+       17,   23,   12,   19,   17,   22,   19,   17,   24,   27,
+       30,   19,   22,   27,   25,  556,   29,   27,   29,   26,
+       28,   29,   31,   32,   33,   36,   35,   58,   31,   58,
+       32,   33,   33,  621,   39,   81,   27,   39,   32,   32,
+       27,   33,   39,   29,   27,   81,   29,  622,   37,   31,
+       32,   36,   37,   40,   31,   37,   47,   45,   33,   47,
+       40,   45,   48,  623,   32,   45,  624,   48,   62,   62,
+       63,   63,   65,   65,   63,   63,   67,   67,   62,   84,
+       67,   67,   65,   66,   89,   66,   66,  100,   84,  127,
+
+      127,   89,  100,  142,  625,   66,  166,  166,  129,  626,
+      127,  627,  142,  127,  160,   62,  630,  129,  631,   65,
+      129,   66,  100,  160,  167,  167,  160,  170,  170,  171,
+      171,  534,   66,  171,  171,  172,  172,  170,  173,  173,
+      265,  265,  266,  266,  536,  633,  634,  635,  636,  637,
+      638,  639,  534,  640,  641,  642,  643,  644,  646,  647,
+      648,  649,  651,  652,  170,  536,  655,  657,  655,  656,
+      656,  656,  658,  658,  658,  659,  659,  659,  619,  618,
+      617,  616,  615,  613,  612,  611,  610,  609,  608,  606,
+      605,  604,  603,  602,  601,  600,  599,  597,  596,  595,
+
+      594,  592,  591,  590,  589,  588,  587,  586,  585,  582,
+      581,  580,  578,  577,  576,  574,  573,  572,  571,  570,
+      569,  568,  567,  566,  565,  564,  563,  562,  561,  560,
+      559,  558,  557,  555,  554,  553,  552,  551,  550,  549,
+      548,  547,  546,  545,  544,  543,  542,  541,  540,  539,
+      538,  537,  535,  533,  532,  531,  530,  529,  528,  527,
+      526,  525,  523,  522,  521,  520,  519,  518,  517,  515,
+      514,  513,  512,  511,  510,  508,  507,  506,  505,  504,
+      503,  502,  501,  500,  498,  497,  496,  495,  494,  493,
+      492,  491,  490,  489,  488,  487,  486,  485,  483,  482,
+
+      481,  480,  479,  478,  477,  476,  475,  473,  472,  471,
+      470,  469,  468,  467,  466,  465,  464,  463,  462,  461,
+      460,  459,  458,  457,  456,  455,  454,  453,  452,  451,
+      450,  449,  448,  447,  446,  445,  444,  443,  442,  441,
+      440,  438,  437,  435,  434,  432,  431,  430,  429,  428,
+      427,  426,  425,  424,  423,  422,  420,  419,  417,  416,
+      415,  414,  411,  410,  409,  408,  407,  406,  405,  404,
+      403,  402,  401,  400,  399,  398,  397,  396,  395,  394,
+      393,  392,  391,  390,  389,  387,  386,  384,  383,  382,
+      381,  380,  378,  377,  376,  375,  374,  373,  371,  370,
+
+      369,  368,  367,  365,  364,  363,  362,  361,  360,  359,
+      358,  357,  356,  355,  354,  353,  352,  350,  349,  348,
+      346,  345,  344,  343,  342,  341,  340,  339,  338,  337,
+      336,  335,  334,  333,  332,  331,  330,  329,  328,  327,
+      326,  325,  324,  323,  322,  321,  320,  318,  316,  315,
+      314,  313,  311,  310,  309,  308,  307,  306,  305,  304,
+      303,  302,  301,  300,  299,  298,  297,  296,  295,  294,
+      292,  291,  290,  289,  288,  287,  286,  285,  284,  283,
+      282,  280,  279,  278,  277,  276,  275,  274,  272,  271,
+      270,  269,  268,  264,  263,  262,  261,  260,  259,  258,
+
+      257,  256,  255,  254,  253,  252,  251,  250,  249,  248,
+      247,  246,  245,  244,  243,  242,  241,  240,  239,  238,
+      237,  236,  235,  234,  233,  232,  231,  230,  229,  227,
+      226,  225,  224,  223,  222,  221,  220,  219,  218,  217,
+      216,  215,  214,  213,  212,  210,  208,  206,  205,  204,
+      203,  202,  201,  200,  199,  198,  196,  195,  194,  193,
+      192,  190,  189,  188,  187,  186,  185,  184,  183,  182,
+      181,  180,  179,  178,  177,  175,  174,  168,  164,  163,
+      162,  161,  159,  158,  157,  156,  155,  154,  153,  152,
+      151,  150,  149,  148,  147,  146,  145,  144,  143,  141,
+
+      140,  139,  138,  137,  136,  135,  134,  133,  132,  131,
+      130,  128,  126,  125,  124,  123,  122,  121,  120,  119,
+      118,  117,  116,  115,  114,  113,  112,  111,  110,  109,
+      108,  107,  106,  105,  104,  103,  102,  101,   99,   98,
+       97,   96,   95,   94,   93,   92,   91,   90,   88,   87,
+       86,   85,   83,   82,   79,   78,   77,   75,   68,   64,
+       61,   56,   52,   51,   50,   46,   44,   43,   42,   41,
+       38,   34,   20,   11,    9,    5,    3,  654,  654,  654,
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654,  654,  654,  654,  654,
+      654,  654,  654,  654,  654,  654
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+static int yy_more_flag = 0;
+static int yy_more_len = 0;
+#define yymore() (yy_more_flag = 1)
+#define YY_MORE_ADJ yy_more_len
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "fta.l"
+#define INITIAL 0
+/*
+       MUST COMPILE WITH
+               flex -PFtaParser -oftalexer.cc fta.l
+       (or equivalent).
+*/     
+#line 9 "fta.l"
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_fta.h"
+ #include "parse_schema.h"
+ #include <string.h>
+
+
+
+#include "fta.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int FtaParserwrap(){return(1);}
+
+extern int FtaParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_fta_lineno : the line currently being parsed when the error occurs.
+               flex_fta_ch : the character on the line where the error occurs
+               flex_fta_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_fta_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_fta_lineno = 1;
+int flex_fta_ch = 0;
+char flex_fta_linebuf[200000];
+
+char *flex_fta_stringinput = NULL;
+int flex_fta_stringinput_ptr = 0;
+FILE *flex_fta_fileinput = NULL;
+int my_FtaParser_yyinput(char *buf, int max_size);
+
+
+
+void FtaParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_fta_lineno, flex_fta_ch, s, FtaParsertext, flex_fta_linebuf );
+    for(i=0;i<flex_fta_ch;i++){
+               if(flex_fta_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_fta_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_FtaParser_yyinput(b,ms))
+
+/* MKS needs the next line to increase the NFA table */
+#line 881 "ftalexer.cc"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( yy_current_buffer->yy_is_interactive ) \
+               { \
+               int c = '*', n; \
+               for ( n = 0; n < max_size && \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+                       buf[n] = (char) c; \
+               if ( c == '\n' ) \
+                       buf[n++] = (char) c; \
+               if ( c == EOF && ferror( yyin ) ) \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+               result = n; \
+               } \
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+                 && ferror( yyin ) ) \
+               YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+       YY_USER_ACTION
+
+YY_DECL
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp = NULL, *yy_bp = NULL;
+       register int yy_act;
+
+#line 89 "fta.l"
+
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+#line 1051 "ftalexer.cc"
+
+       if ( yy_init )
+               {
+               yy_init = 0;
+
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! yy_start )
+                       yy_start = 1;   /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( ! yy_current_buffer )
+                       yy_current_buffer =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+
+               yy_load_buffer_state();
+               }
+
+       while ( 1 )             /* loops until end-of-file is reached */
+               {
+               yy_more_len = 0;
+               if ( yy_more_flag )
+                       {
+                       yy_more_len = yy_c_buf_p - yytext_ptr;
+                       yy_more_flag = 0;
+                       }
+               yy_cp = yy_c_buf_p;
+
+               /* Support of yytext. */
+               *yy_cp = yy_hold_char;
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = yy_start;
+yy_match:
+               do
+                       {
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               yy_last_accepting_state = yy_current_state;
+                               yy_last_accepting_cpos = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 655 )
+                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 778 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+               if ( yy_act == 0 )
+                       { /* have to back up */
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       yy_act = yy_accept[yy_current_state];
+                       }
+
+               YY_DO_BEFORE_ACTION;
+
+
+do_action:     /* This label is used only to access EOF actions. */
+
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = yy_hold_char;
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 107 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return AND; }
+       YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 108 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("AND_AGGR"); return AGGR; }
+       YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 109 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("OR_AGGR"); return AGGR; }
+       YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 110 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("XOR_AGGR"); return AGGR; }
+       YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 111 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("AVG"); return AGGR; }
+       YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 112 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("MIN"); return AGGR; }
+       YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 113 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("MAX"); return AGGR; }
+       YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 114 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("SUM"); return AGGR; }
+       YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 115 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup("COUNT"); return AGGR; }
+       YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 116 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return BY; }
+       YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 117 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return FROM; }
+       YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 118 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return INNER_JOIN; }
+       YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 119 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return OUTER_JOIN; }
+       YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 120 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return RIGHT_OUTER_JOIN; }
+       YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 121 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return LEFT_OUTER_JOIN; }
+       YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 122 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return FILTER_JOIN; }
+       YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 123 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return GROUP; }
+       YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 124 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return ROLLUP; }
+       YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 125 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return CUBE; }
+       YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 126 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return GROUPING_SETS; }
+       YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 127 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return SUPERGROUP; }
+       YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 128 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return CLEANING_WHEN; }
+       YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 129 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return CLEANING_BY; }
+       YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 130 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return CLOSING_WHEN; }
+       YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 131 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return HAVING; }
+       YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 132 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return AS; }
+       YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 133 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return IN; }
+       YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 134 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return NOT; }
+       YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 135 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return OR; }
+       YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 137 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return SELECT; }
+       YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 138 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return WHERE; }
+       YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 139 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return SUCH;}
+       YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 140 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return THAT;}
+       YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 141 "fta.l"
+{flex_fta_ch+=FtaParserleng; return MERGE;}
+       YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 142 "fta.l"
+{flex_fta_ch+=FtaParserleng; return SLACK;}
+       YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 144 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return TRUE_V;}
+       YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 145 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return FALSE_V;}
+       YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 146 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return TIMEVAL_L;}
+       YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 147 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return HEX_L;}
+       YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 148 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return LHEX_L;}
+       YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 149 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return IP_L;}
+       YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 150 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return IPV6_L;}
+       YY_BREAK
+case 43:
+YY_RULE_SETUP
+#line 152 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return DEFINE_SEC;}
+       YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 153 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return PARAM_SEC;}
+       YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 155 "fta.l"
+{flex_fta_ch+=FtaParserleng; return LEFTBRACE;}
+       YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 156 "fta.l"
+{flex_fta_ch+=FtaParserleng; return RIGHTBRACE;}
+       YY_BREAK
+/*
+               Table definition keywords
+ */            
+case 47:
+YY_RULE_SETUP
+#line 161 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return TABLE; }
+       YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 162 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return PROTOCOL; }
+       YY_BREAK
+case 49:
+YY_RULE_SETUP
+#line 163 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return STREAM; }
+       YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 164 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return FTA; }
+       YY_BREAK
+case 51:
+YY_RULE_SETUP
+#line 165 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return UNPACK_FCNS; }
+       YY_BREAK
+case 52:
+YY_RULE_SETUP
+#line 167 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return OPERATOR; }
+       YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 168 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return OPERATOR_VIEW; }
+       YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 169 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return FIELDS; }
+       YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 170 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return SUBQUERIES; }
+       YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 171 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return SELECTION_PUSHDOWN; }
+       YY_BREAK
+case 57:
+YY_RULE_SETUP
+#line 172 "fta.l"
+{flex_fta_ch+=FtaParserleng; return SEMICOLON;}
+       YY_BREAK
+/* punctuation */
+case 58:
+#line 177 "fta.l"
+case 59:
+YY_RULE_SETUP
+#line 177 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext); return SHIFT_OP; }
+       YY_BREAK
+case 60:
+#line 180 "fta.l"
+case 61:
+#line 181 "fta.l"
+case 62:
+#line 182 "fta.l"
+case 63:
+#line 183 "fta.l"
+case 64:
+#line 184 "fta.l"
+case 65:
+YY_RULE_SETUP
+#line 184 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext); return COMPARISON; }
+       YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 186 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return yytext[0]; }
+       YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 187 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return yytext[0]; }
+       YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 188 "fta.l"
+{ flex_fta_ch+=FtaParserleng; return yytext[0]; }
+       YY_BREAK
+/* names */
+case 69:
+YY_RULE_SETUP
+#line 192 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext); return NAME; }
+       YY_BREAK
+/* numbers */
+case 70:
+#line 197 "fta.l"
+case 71:
+YY_RULE_SETUP
+#line 197 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext);  return INTNUM; }
+       YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 199 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext);  return LONGINTNUM; }
+       YY_BREAK
+case 73:
+#line 202 "fta.l"
+case 74:
+#line 203 "fta.l"
+case 75:
+#line 204 "fta.l"
+case 76:
+#line 205 "fta.l"
+case 77:
+YY_RULE_SETUP
+#line 205 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParserlval.strval = strdup(yytext); return APPROXNUM; }
+       YY_BREAK
+/* strings */
+case 78:
+YY_RULE_SETUP
+#line 209 "fta.l"
+{
+               
+               int c;
+               
+               FtaParserlval.strval = strdup(FtaParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_fta_ch+=FtaParserleng; 
+                       FtaParserlval.strval[FtaParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+       YY_BREAK
+case 79:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 226 "fta.l"
+{ flex_fta_ch+=FtaParserleng; FtaParsererror("Unterminated string"); }
+       YY_BREAK
+/*                                                                                                                     */
+/*             Newline : advance the error reporting line number       */
+/*             and grab the next line into flex_fta_linebuf                    */
+/*                                                                                                                     */
+case 80:
+YY_RULE_SETUP
+#line 233 "fta.l"
+{flex_fta_ch=0; flex_fta_lineno++;
+                          strcpy(flex_fta_linebuf,FtaParsertext+1);
+                          yyless(1);
+                          }
+       YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 238 "fta.l"
+{flex_fta_ch+=FtaParserleng; } /* white space */
+       YY_BREAK
+case 82:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 240 "fta.l"
+{flex_fta_ch+=FtaParserleng; };        /* comment */
+       YY_BREAK
+case 83:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 241 "fta.l"
+{flex_fta_ch+=FtaParserleng; };        /* comment */
+       YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 243 "fta.l"
+{flex_fta_ch+=FtaParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  FtaParsererror(yytext);}
+       YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 245 "fta.l"
+ECHO;
+       YY_BREAK
+#line 1570 "ftalexer.cc"
+case YY_STATE_EOF(INITIAL):
+       yyterminate();
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = yy_hold_char;
+               YY_RESTORE_YY_MORE_OFFSET
+
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between yy_current_buffer and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       yy_n_chars = yy_current_buffer->yy_n_chars;
+                       yy_current_buffer->yy_input_file = yyin;
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state();
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++yy_c_buf_p;
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                               yy_cp = yy_c_buf_p;
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer() )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               yy_did_buffer_switch_on_eof = 0;
+
+                               if ( yywrap() )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               yy_c_buf_p =
+                                       yytext_ptr + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               yy_c_buf_p =
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+       {
+       register char *dest = yy_current_buffer->yy_ch_buf;
+       register char *source = yytext_ptr;
+       register int number_to_move, i;
+       int ret_val;
+
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( yy_current_buffer->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a single character, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+       else
+               {
+               int num_to_read =
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+                       YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = yy_current_buffer;
+
+                       int yy_c_buf_p_offset =
+                               (int) (yy_c_buf_p - b->yy_ch_buf);
+
+                       if ( b->yy_is_our_buffer )
+                               {
+                               int new_size = b->yy_buf_size * 2;
+
+                               if ( new_size <= 0 )
+                                       b->yy_buf_size += b->yy_buf_size / 8;
+                               else
+                                       b->yy_buf_size *= 2;
+
+                               b->yy_ch_buf = (char *)
+                                       /* Include room in for 2 EOB chars. */
+                                       yy_flex_realloc( (void *) b->yy_ch_buf,
+                                                        b->yy_buf_size + 2 );
+                               }
+                       else
+                               /* Can't grow it, we don't own it. */
+                               b->yy_ch_buf = 0;
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = yy_current_buffer->yy_buf_size -
+                                               number_to_move - 1;
+#endif
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+                       yy_n_chars, num_to_read );
+
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       if ( yy_n_chars == 0 )
+               {
+               if ( number_to_move == YY_MORE_ADJ )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       yy_current_buffer->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       yy_n_chars += number_to_move;
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+       return ret_val;
+       }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp;
+
+       yy_current_state = yy_start;
+
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+               {
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       yy_last_accepting_state = yy_current_state;
+                       yy_last_accepting_cpos = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 655 )
+                               yy_c = yy_meta[(unsigned int) yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+               }
+
+       return yy_current_state;
+       }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+       {
+       register int yy_is_jam;
+       register char *yy_cp = yy_c_buf_p;
+
+       register YY_CHAR yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               yy_last_accepting_state = yy_current_state;
+               yy_last_accepting_cpos = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 655 )
+                       yy_c = yy_meta[(unsigned int) yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+       yy_is_jam = (yy_current_state == 654);
+
+       return yy_is_jam ? 0 : yy_current_state;
+       }
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+       {
+       register char *yy_cp = yy_c_buf_p;
+
+       /* undo effects of setting up yytext */
+       *yy_cp = yy_hold_char;
+
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               register int number_to_move = yy_n_chars + 2;
+               register char *dest = &yy_current_buffer->yy_ch_buf[
+                                       yy_current_buffer->yy_buf_size + 2];
+               register char *source =
+                               &yy_current_buffer->yy_ch_buf[number_to_move];
+
+               while ( source > yy_current_buffer->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += (int) (dest - source);
+               yy_bp += (int) (dest - source);
+               yy_current_buffer->yy_n_chars =
+                       yy_n_chars = yy_current_buffer->yy_buf_size;
+
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       *--yy_cp = (char) c;
+
+
+       yytext_ptr = yy_bp;
+       yy_hold_char = *yy_cp;
+       yy_c_buf_p = yy_cp;
+       }
+#endif /* ifndef YY_NO_UNPUT */
+
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+       {
+       int c;
+
+       *yy_c_buf_p = yy_hold_char;
+
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       /* This was really a NUL. */
+                       *yy_c_buf_p = '\0';
+
+               else
+                       { /* need more input */
+                       int offset = yy_c_buf_p - yytext_ptr;
+                       ++yy_c_buf_p;
+
+                       switch ( yy_get_next_buffer() )
+                               {
+                               case EOB_ACT_LAST_MATCH:
+                                       /* This happens because yy_g_n_b()
+                                        * sees that we've accumulated a
+                                        * token and flags that we need to
+                                        * try matching the token before
+                                        * proceeding.  But for input(),
+                                        * there's no matching to consider.
+                                        * So convert the EOB_ACT_LAST_MATCH
+                                        * to EOB_ACT_END_OF_FILE.
+                                        */
+
+                                       /* Reset buffer status. */
+                                       yyrestart( yyin );
+
+                                       /* fall through */
+
+                               case EOB_ACT_END_OF_FILE:
+                                       {
+                                       if ( yywrap() )
+                                               return EOF;
+
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+#ifdef __cplusplus
+                                       return yyinput();
+#else
+                                       return input();
+#endif
+                                       }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       yy_c_buf_p = yytext_ptr + offset;
+                                       break;
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
+       *yy_c_buf_p = '\0';     /* preserve yytext */
+       yy_hold_char = *++yy_c_buf_p;
+
+
+       return c;
+       }
+#endif /* YY_NO_INPUT */
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+       {
+       if ( ! yy_current_buffer )
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+       yy_init_buffer( yy_current_buffer, input_file );
+       yy_load_buffer_state();
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+       {
+       if ( yy_current_buffer == new_buffer )
+               return;
+
+       if ( yy_current_buffer )
+               {
+               /* Flush out information for old buffer. */
+               *yy_c_buf_p = yy_hold_char;
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       yy_current_buffer = new_buffer;
+       yy_load_buffer_state();
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       yy_did_buffer_switch_on_eof = 1;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+       {
+       yy_n_chars = yy_current_buffer->yy_n_chars;
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+       yyin = yy_current_buffer->yy_input_file;
+       yy_hold_char = *yy_c_buf_p;
+       }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_is_our_buffer = 1;
+
+       yy_init_buffer( b, file );
+
+       return b;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+       {
+       if ( ! b )
+               return;
+
+       if ( b == yy_current_buffer )
+               yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+       if ( b->yy_is_our_buffer )
+               yy_flex_free( (void *) b->yy_ch_buf );
+
+       yy_flex_free( (void *) b );
+       }
+
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+       {
+       yy_flush_buffer( b );
+
+       b->yy_input_file = file;
+       b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+       b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+       b->yy_is_interactive = 0;
+#else
+       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+       {
+       if ( ! b )
+               return;
+
+       b->yy_n_chars = 0;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[0];
+
+       b->yy_at_bol = 1;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       if ( b == yy_current_buffer )
+               yy_load_buffer_state();
+       }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       if ( size < 2 ||
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||
+            base[size-1] != YY_END_OF_BUFFER_CHAR )
+               /* They forgot to leave room for the EOB's. */
+               return 0;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+       b->yy_buf_pos = b->yy_ch_buf = base;
+       b->yy_is_our_buffer = 0;
+       b->yy_input_file = 0;
+       b->yy_n_chars = b->yy_buf_size;
+       b->yy_is_interactive = 0;
+       b->yy_at_bol = 1;
+       b->yy_fill_buffer = 0;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       yy_switch_to_buffer( b );
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+       {
+       int len;
+       for ( len = 0; yy_str[len]; ++len )
+               ;
+
+       return yy_scan_bytes( yy_str, len );
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+       {
+       YY_BUFFER_STATE b;
+       char *buf;
+       yy_size_t n;
+       int i;
+
+       /* Get memory for full buffer, including space for trailing EOB's. */
+       n = len + 2;
+       buf = (char *) yy_flex_alloc( n );
+       if ( ! buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+       for ( i = 0; i < len; ++i )
+               buf[i] = bytes[i];
+
+       buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+       b = yy_scan_buffer( buf, n );
+       if ( ! b )
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+       /* It's okay to grow etc. this buffer, and we should throw it
+        * away when we're done.
+        */
+       b->yy_is_our_buffer = 1;
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+       {
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )
+               {
+               yy_size_t new_size;
+
+               yy_start_stack_depth += YY_START_STACK_INCR;
+               new_size = yy_start_stack_depth * sizeof( int );
+
+               if ( ! yy_start_stack )
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+               else
+                       yy_start_stack = (int *) yy_flex_realloc(
+                                       (void *) yy_start_stack, new_size );
+
+               if ( ! yy_start_stack )
+                       YY_FATAL_ERROR(
+                       "out of memory expanding start-condition stack" );
+               }
+
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+       BEGIN(new_state);
+       }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+       {
+       if ( --yy_start_stack_ptr < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);
+       }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+       {
+       return yy_start_stack[yy_start_stack_ptr - 1];
+       }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+       {
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+       }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               yytext[yyleng] = yy_hold_char; \
+               yy_c_buf_p = yytext + n; \
+               yy_hold_char = *yy_c_buf_p; \
+               *yy_c_buf_p = '\0'; \
+               yyleng = n; \
+               } \
+       while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+       {
+       register int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+       }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+       {
+       register int n;
+       for ( n = 0; s[n]; ++n )
+               ;
+
+       return n;
+       }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+       {
+       return (void *) malloc( size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+       {
+       /* The cast to (char *) in the following accommodates both
+        * implementations that use char* generic pointers, and those
+        * that use void* generic pointers.  It works with the latter
+        * because both ANSI C and C++ allow castless assignment from
+        * any pointer type to void*, and deal with argument conversions
+        * as though doing an assignment.
+        */
+       return (void *) realloc( (char *) ptr, size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+       {
+       free( ptr );
+       }
+
+#if YY_MAIN
+int main()
+       {
+       yylex();
+       return 0;
+       }
+#endif
+#line 245 "fta.l"
+
+
+int my_FtaParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_fta_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_fta_stringinput[flex_fta_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_fta_stringinput[flex_fta_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_fta_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_fta_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void FtaParser_setfileinput(FILE *f){
+       FtaParserrestart(NULL);
+
+       flex_fta_fileinput = f;
+       flex_fta_stringinput = NULL;
+       flex_fta_lineno = 1;
+       flex_fta_ch = 0;
+}
+
+void FtaParser_setstringinput(char *s){
+       FtaParserrestart(NULL);
+
+       flex_fta_fileinput = NULL;
+       flex_fta_stringinput = s;
+       flex_fta_stringinput_ptr = 0;
+       flex_fta_lineno = 1;
+       flex_fta_ch = 0;
+}
+       
+               
+
+
diff --git a/src/ftacmp/gen_tuple_access.cc b/src/ftacmp/gen_tuple_access.cc
new file mode 100644 (file)
index 0000000..e843829
--- /dev/null
@@ -0,0 +1,279 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include "parse_fta.h"
+#include "parse_schema.h"
+#include"generate_utils.h"
+
+#include <string>
+#include<set>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include<errno.h>
+
+#define TMPSTRLEN 1000
+
+#ifndef PATH_DELIM
+  #define PATH_DELIM '/'
+#endif
+
+char tmp_schema_str[10000];
+
+//             Interface to FTA definition lexer and parser ...
+
+extern int FtaParserparse(void);
+extern FILE *FtaParserin;
+extern int FtaParserdebug;
+
+fta_parse_t *fta_parse_result;
+var_defs_t *fta_parse_defines;
+
+
+
+using namespace std;
+
+
+
+
+int main(int argc, char **argv){
+       int s,t,f;
+  char tmpstr[TMPSTRLEN];
+
+
+
+//                             set these to 1 to debug the parser
+  FtaParserdebug = 0;
+
+  FILE *table_schemas_in;              // source tables definition file
+
+  // -------------------------------
+  // Handling of Input Arguments
+  // -------------------------------
+    const char *optstr = "C:";
+       const char *usage_str = "Usage: %s [-C <config directory>] schema_file [operator name ...]\n"
+        "\t[-C] : use <config directory> for definition files\n";
+
+
+//             parameters gathered from command line processing
+       string config_dir_path;
+       set<string> operator_names;
+       string schema_file_name;
+
+   char chopt;
+   while((chopt = getopt(argc,argv,optstr)) != -1){
+               switch(chopt){
+               case 'C':
+                               if(optarg != NULL)
+                                config_dir_path = string(optarg) + string("/");
+                       break;
+               case '?':
+                       fprintf(stderr,"Error, argument %c not recognized.\n",optopt);
+                       fprintf(stderr,"%s\n", usage_str);
+                       exit(1);
+               default:
+                       fprintf(stderr,"Invalid arguments\n");
+                       fprintf(stderr,"%s\n", usage_str);
+                       exit(1);
+               }
+       }
+       argc -= optind;
+       argv += optind;
+       for (int i = 0; i < argc; ++i) {
+               if(schema_file_name == ""){
+                       schema_file_name = argv[i];
+               }else{
+                       operator_names.insert(argv[i]);
+               }
+       }
+
+       if(schema_file_name == ""){
+               fprintf(stderr,"%s\n", usage_str);
+               exit(1);
+       }
+
+
+//                     Open globally used file names.
+
+       // prepend config directory to schema file
+       schema_file_name = config_dir_path + schema_file_name;
+
+       if((table_schemas_in = fopen(schema_file_name.c_str(), "r")) == NULL) {
+               fprintf(stderr,"Can't open schema file %s\n%s\n",schema_file_name.c_str(),strerror(errno));
+               exit(1);
+       }
+
+
+
+
+//                     Get an initial Schema
+       table_list *Schema;
+//                     Parse the table schema definitions.
+       fta_parse_result = new fta_parse_t();
+       FtaParser_setfileinput(table_schemas_in);
+       if(FtaParserparse()){
+               fprintf(stderr,"Table schema parse failed.\n");
+               exit(1);
+       }
+       if(fta_parse_result->parse_type != TABLE_PARSE){
+               fprintf(stderr,"ERROR, file %s is not a table definition file.\n",schema_file_name.c_str());
+               exit(1);
+       }
+       Schema = fta_parse_result->tables;
+
+//                     Process schema field inheritance
+       string err_str;
+       int retval;
+       retval = Schema->unroll_tables(err_str);
+       if(retval){
+               fprintf(stderr,"Error processing schema filed inheritance:\n %s\n", err_str.c_str() );
+               exit(1);
+       }
+
+//                     Open header,  code files
+
+       FILE *hdr_fl = fopen("operator_tuple_pack.h", "w");
+       if(hdr_fl == NULL){
+               fprintf(stderr,"Can't open output header file operator_tuple_pack.h\n%s\n",strerror(errno));
+               exit(1);
+       }
+       FILE *code_fl = fopen("operator_tuple_pack.cc", "w");
+       if(code_fl == NULL){
+               fprintf(stderr,"Can't open output code file operator_tuple_pack.c\n%s\n",strerror(errno));
+               exit(1);
+       }
+
+
+
+
+
+//                     Generate code for the accessing the operator tuples.
+
+       string header =
+"#ifndef __OPERATOR_TUPLE_PACK__\n"
+"#define __OPERATOR_TUPLE_PACK__\n"
+"\n"
+"#include \"host_tuple.h\"\n"
+"#include \"vstring.h\"\n"
+"#include \"byteswap.h\""
+"\n"
+"void *unpack_operator_params(void *buf, int buflen, char **param_list, int plist_len, int *params_found);\n"
+"\n"
+"\n";
+
+       string code =
+"#include \"operator_tuple_pack.h\"\n"
+"#include <sys/param.h>\n"
+"#include \"fta.h\"\n"
+"#include \"lapp.h\"\n"
+"#include \"hfta_runtime_library.h\"\n"
+"\n"
+"void *unpack_operator_params(void *buf, int buflen, char **param_list, int plist_len, int *params_found){\n"
+"      char *c=(char *)buf;\n"
+"    int pno=0, pos=0;\n"
+"      *params_found = 0;\n"
+"\n"
+"      for(pos=0;pos<buflen;++pos){\n"
+"              if(c[pos]=='\\n' || c[pos]=='\\0') return buf;\n"
+"              if(c[pos]==':') break;\n"
+"      }\n"
+"      if(pos == buflen) return buf;\n"
+"\n"
+"      pos++; \n"
+"      param_list[pno]=c+pos;\n"
+"      pno++;\n"
+"      \n"
+"      for(;pos<buflen;++pos){\n"
+"              if(c[pos]==','){\n"
+"                      c[pos]='\\0';\n"
+"                      pos++;\n"
+"                      param_list[pno]=c+pos;\n"
+"                      pno++;\n"
+"              }\n"
+"              if(c[pos]=='\\n'){\n"
+"                      c[pos]='\\0';\n"
+"                      pos++;\n"
+"                      *params_found = pno;\n"
+"                      return c+pos;\n"
+"              }\n"
+"      }\n"
+"      return buf;\n"
+"}\n"
+"\n"
+"\n";
+
+       set<string> ufcns;
+       vector<string> tbl_names = Schema->get_table_names();
+       for(t=0;t<tbl_names.size();++t){
+               if(operator_names.size()==0 || operator_names.count(tbl_names[t])>0){
+                       int tid = Schema->find_tbl(tbl_names[t]);
+                       if(Schema->get_schema_type(tid) == OPERATOR_VIEW_SCHEMA){
+                               table_def *optbl = Schema->get_table(tid);
+                               header += generate_host_name_tuple_struct(optbl);
+                               header += "int pack_"+tbl_names[t]+"_tuple(host_tuple *tup, char *buf, int len, struct "+generate_tuple_name(tbl_names[t])+" *s, unsigned char tuple_type);\n\n";
+                               code += generate_host_tuple_pack(optbl);
+
+                               header += "extern char *"+tbl_names[t]+"_Schema_def_;\n\n";
+                               code += "\tchar *"+tbl_names[t]+"_Schema_def_ = \n";
+                               string schema_str = "FTA{\n\n";
+                               schema_str += optbl->to_stream_string();
+                               schema_str +=
+"DEFINE{\n"
+"\tquery_name '"+tbl_names[t]+"';\n"
+"}\n"
+"\n"
+"Select";
+                               vector<field_entry *> flds = optbl->get_fields();
+                               for(f=0;f<flds.size();++f){
+                                       if(f>0) schema_str+=",";
+                                       schema_str += " " + flds[f]->get_name();
+                               }
+                               schema_str += "\nFrom "+tbl_names[t]+"\n}\n\n";
+                               code += make_C_embedded_string(schema_str)+";\n\n";
+
+
+                               vector<subquery_spec *> subq = Schema->get_subqueryspecs(tid);
+                               for(s=0;s<subq.size();++s){
+                                       subquery_spec *sqs = subq[s];
+                                       field_entry_list fel;
+                                       for(f=0;f<sqs->types.size();++f){
+                                               fel.append_field(new field_entry(sqs->types[f].c_str(), sqs->names[f].c_str(), "", sqs->modifiers[f],ufcns));
+                                       }
+                                       string subq_name = tbl_names[t]+"_subq_"+sqs->name;
+                                       table_def std(subq_name.c_str(),NULL,NULL,&fel, STREAM_SCHEMA);
+                                       header += generate_host_name_tuple_struct(&std);
+                                       header += "struct "+subq_name+"_tuple *unpack_"+subq_name+"_tuple(host_tuple *tup);\n\n";
+                                       code += generate_host_tuple_unpack(&std);
+                               }
+                       }else{
+                               if(operator_names.size()>0)
+                                       fprintf(stderr,"WARNING: %s is not an operator, skipping.\n",tbl_names[t].c_str());
+                       }
+               }
+       }
+
+       header += "\n#endif\n";
+
+
+       fprintf(hdr_fl,"%s\n",header.c_str());
+       fprintf(code_fl,"%s\n",code.c_str());
+
+///////////////////////////////////////////////////////////////////////
+
+       return(0);
+}
+
diff --git a/src/ftacmp/generate_lfta_code.cc b/src/ftacmp/generate_lfta_code.cc
new file mode 100644 (file)
index 0000000..06bfc9b
--- /dev/null
@@ -0,0 +1,4505 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include <string>
+#include <stdio.h>
+#include <stdlib.h>
+//#include <algo.h>
+#include<algorithm>
+
+#include "parse_fta.h"
+#include "parse_schema.h"
+#include "analyze_fta.h"
+#include "generate_utils.h"
+#include "query_plan.h"
+#include "generate_lfta_code.h"
+#include "generate_nic_code.h"
+
+using namespace std;
+
+extern int DEFAULT_LFTA_HASH_TABLE_SIZE;
+
+// default value for correlation between the interface card and
+// the system clock
+#define DEFAULT_TIME_CORR 16
+
+
+//     For fast hashing
+//#define NRANDS 100
+extern string hash_nums[NRANDS];
+/*
+= {
+"12916008961267169387ull", "13447227858232756685ull",
+"15651770379918602919ull", "1154671861688431608ull",
+"6777078091984849858ull", "14217205709582564356ull",
+"4955408621820609982ull", "15813680319165523695ull",
+"9897969721407807129ull", "5799700135519793083ull",
+"3446529189623437397ull", "2766403683465910630ull",
+"3759321430908793328ull", "6569396511892890354ull",
+"11124853911180290924ull", "17425412145238035549ull",
+"6879931585355039943ull", "16598635011539670441ull",
+"9615975578494811651ull", "4378135509538422740ull",
+"741282195344332574ull", "17368612862906255584ull",
+"17294299200556814618ull", "518343398779663051ull",
+"3861893449302272757ull", "8951107288843549591ull",
+"15785139392894559409ull", "5917810836789601602ull",
+"16169988133001117004ull", "9792861259254509262ull",
+"5089058010244872136ull", "2130075224835397689ull",
+"844136788226150435ull", "1303298091153875333ull",
+"3579898206894361183ull", "7529542662845336496ull",
+"13151949992653382522ull", "2145333536541545660ull",
+"11258221828939586934ull", "3741808146124570279ull",
+"16272841626371307089ull", "12174572036188391283ull",
+"9749343496254107661ull", "9141275584134508830ull",
+"10134192232065698216ull", "12944268412561423018ull",
+"17499725811865666340ull", "5281482378159088661ull",
+"13254803486023572607ull", "4526762838498717025ull",
+"15990846379668494011ull", "10680949816169027468ull",
+"7116154096012931030ull", "5296740689865236632ull",
+"5222427027515795922ull", "6893215299448261251ull",
+"10164707755932877485ull", "15325979189512082255ull",
+"3713267224148573289ull", "12292682741753167354ull",
+"4098115959960163588ull", "16095675565885113990ull",
+"11391590846210510720ull", "8432889531466002673ull",
+"7146668520368482523ull", "7678169991822407997ull",
+"9882712513525031447ull", "13904414563513869160ull",
+"1080076724395768626ull", "8448147843172150388ull",
+"17633093729608185134ull", "10044622457050142303ull",
+"4128911859292425737ull", "30642269109444395ull",
+"16124215396922640581ull", "15444089895060081110ull",
+"16437006538696302944ull", "800338649777443426ull",
+"5355794945275091932ull", "11656354278827687117ull",
+"1110873718944691255ull", "10829576045617693977ull",
+"3846916616884579955ull", "17055821716837625668ull",
+"13418968402643535758ull", "11671612594828802128ull",
+"11597298928184328586ull", "13196028510862205499ull",
+"16539578557089782373ull", "3182048322921507591ull",
+"10016080431267550241ull", "148751875162592690ull",
+"10400930266590768572ull", "4023803397139127870ull",
+"17766462746879108920ull", "14807761432134600873ull",
+"13521540421053792403ull", "13980983198941385205ull",
+"16257584414193564367ull", "1760484796451765024ull"
+};
+*/
+
+
+// ----------------------------------------------
+//             Data extracted from the query plan node
+//             for use by code generation.
+
+static cplx_lit_table *complex_literals;  //Table of literals with constructors.
+static vector<handle_param_tbl_entry *> param_handle_table;
+static param_table *param_tbl;         // Table of all referenced parameters.
+
+static vector<scalarexp_t *> sl_list;
+static vector<cnf_elem *> where;
+
+static gb_table *gb_tbl;                       // Table of all group-by attributes.
+static aggregate_table *aggr_tbl;      // Table of all referenced aggregates.
+
+static bool packed_return;             // unpack using structyure, not fcns
+static nic_property *nicprop;  // nic properties for this interface.
+static int global_id;
+
+
+//             The partial_fcns vector can now refer to
+//             partial functions, or expensive functions
+//             which can be cached (if there are multiple refs).  A couple
+//             of int vectors distinguish the cases.
+static vector<scalarexp_t *> partial_fcns;
+static vector<int> fcn_ref_cnt;
+static vector<bool> is_partial_fcn;
+int sl_fcns_start = 0, sl_fcns_end = 0;
+int wh_fcns_start = 0, wh_fcns_end = 0;
+int gb_fcns_start = 0, gb_fcns_end = 0;
+int ag_fcns_start = 0, ag_fcns_end = 0;
+
+
+//             These vectors are for combinable predicates.
+static vector<int> pred_class; //      identifies the group
+static vector<int> pred_pos;   //  position in the group.
+
+
+
+static char tmpstr[1000];
+
+//////////////////////////////////////////////////////////////////////
+///                    Various utilities
+
+string generate_fta_name(string node_name){
+       string ret = normalize_name(node_name);
+       if(ret == ""){
+               ret = "default";
+       }
+       ret += "_fta";
+
+       return(ret);
+}
+
+
+string generate_aggr_struct_name(string node_name){
+       string ret = normalize_name(node_name);
+       if(ret == ""){
+               ret = "default";
+       }
+       ret += "_aggr_struct";
+
+       return(ret);
+}
+
+string generate_fj_struct_name(string node_name){
+       string ret = normalize_name(node_name);
+       if(ret == ""){
+               ret = "default";
+       }
+       ret += "_fj_struct";
+
+       return(ret);
+}
+
+string generate_unpack_code(int tblref, int schref, string field, table_list *schema, string node_name, string end_goto = string("end")){
+       string ret;
+       if(! packed_return){
+               sprintf(tmpstr,"\tretval =  %s(p, &unpack_var_%s_%d);\n",
+                       schema->get_fcn(schref,field).c_str(), field.c_str(), tblref);
+       ret += tmpstr;
+       if(!schema->get_modifier_list(schref,field)->contains_key("required"))
+               ret += "\tif(retval) goto "+end_goto+";\n";
+
+       }else{
+//                     TODO: ntoh xforms (aug 2010 : removing ntoh, hton)
+               data_type dt(schema->get_type_name(schref,field), schema->get_modifier_list(schref,field));
+               if(dt.is_buffer_type()){
+                       if(dt.get_type() != v_str_t){
+                         ret += "\tif(sizeof(struct "+node_name+"_input_struct)+"+node_name+"_input_struct_var->unpack_var_"+field+".length+int("+node_name+"_input_struct_var->unpack_var_"+field+".data) > sz)\n";
+                         ret += "\t\tgoto "+end_goto+";\n";
+                         ret+= "\t\t"+node_name+"_input_struct_var->unpack_var_"+field+".data += "+node_name+"_input_struct_var->unpack_var_"+field+".length;\n";
+                         ret += "\tunpack_var_"+field+"_"+int_to_string(tblref)+
+                               " = "+node_name+"_input_struct_var->unpack_var_"+field+";+\n";
+                       }else{
+                               fprintf(stderr,"INTERNAL ERROR buffer type not string type in generate_lfta_code.cc:generate_unpack_code\n");
+                               exit(1);
+                       }
+               }else{
+                       ret += "\tunpack_var_"+field+"_"+int_to_string(tblref)+
+                               " = "+node_name+"_input_struct_var->unpack_var_"+field+";\n";
+               }
+       }
+       return ret;
+}
+
+string generate_aggr_struct(string node_name, gb_table *gb_tbl, aggregate_table *aggr_tbl){
+  string ret = "struct " + generate_aggr_struct_name(node_name) + "{\n";
+
+  int g;
+  for(g=0;g<gb_tbl->size();g++){
+         sprintf(tmpstr,"gb_var%d",g);
+         ret += "\t"+gb_tbl->get_data_type(g)->make_cvar(tmpstr)+";\n";
+  }
+
+  int a;
+  for(a=0;a<aggr_tbl->size();a++){
+         ret += "\t";
+         sprintf(tmpstr,"aggr_var%d",a);
+         if(aggr_tbl->is_builtin(a))
+               ret+="\t"+aggr_tbl->get_data_type(a)->make_cvar(tmpstr)+";\n";
+         else
+               ret+="\t"+aggr_tbl->get_storage_type(a)->make_cvar(tmpstr)+";\n";
+  }
+
+/*
+  ret += "\tstruct "+generate_aggr_struct_name(node_name)+" *next;\n";
+*/
+
+  ret += "};\n\n";
+
+  return(ret);
+}
+
+
+string generate_fj_struct(filter_join_qpn *fs, string node_name ){
+  string ret;
+
+  if(fs->use_bloom == false){  // uses hash table instead
+       ret = "struct " + generate_fj_struct_name(node_name) + "{\n";
+       int k;
+       for(k=0;k<fs->hash_eq.size();++k){
+               sprintf(tmpstr,"key_var%d",k);
+               ret += "\t"+fs->hash_eq[k]->pr->get_left_se()->get_data_type()->make_cvar(tmpstr)+";\n";
+       }
+       ret += "\tlong long int ts;\n";
+    ret += "};\n\n";
+  }
+
+  return(ret);
+}
+
+
+
+
+string generate_fta_struct(string node_name, gb_table *gb_tbl,
+               aggregate_table *aggr_tbl, param_table *param_tbl,
+               cplx_lit_table *complex_literals,
+               vector<handle_param_tbl_entry *> &param_handle_table,
+               bool is_aggr_query, bool is_fj, bool uses_bloom,
+               table_list *schema){
+
+       string ret = "struct " + generate_fta_name(node_name) + "{\n";
+       ret += "\tstruct FTA f;\n";
+
+//-------------------------------------------------------------
+//             Aggregate-specific fields
+
+       if(is_aggr_query){
+/*
+               ret += "\tstruct "+generate_aggr_struct_name(node_name)+" *aggr_head, *flush_head;\n";
+*/
+               ret+="\tstruct "+generate_aggr_struct_name(node_name)+" *aggr_table; // the groups\n";
+               ret+="\tgs_uint32_t *aggr_table_hashmap; // hash val, plus control info.\n";
+//             ret+="\tint bitmap_size;\n";
+               ret += "\tint n_aggrs; // # of non-empty slots in aggr_table\n";
+               ret += "\tint max_aggrs; // size of aggr_table and its hashmap.\n";
+               ret += "\tint max_windows; // max number of open windows.\n";
+               ret += "\tunsigned int generation; // initially zero, increment on\n";
+               ret += "\t     // every hash table flush - whether regular or induced.\n";
+               ret += "\t     // Old groups are identified by a generation mismatch.\n";
+               ret += "\tunsigned int flush_pos; // next aggr_table entry to examine\n";
+               ret += "\tunsigned int flush_ctr; // control slow flushing\n";
+
+
+
+               int g;
+               bool uses_temporal_flush = false;
+               for(g=0;g<gb_tbl->size();g++){
+                       data_type *dt = gb_tbl->get_data_type(g);
+                       if(dt->is_temporal()){
+/*
+                               fprintf(stderr,"group by attribute %s is temporal, ",
+                                               gb_tbl->get_name(g).c_str());
+                               if(dt->is_increasing()){
+                                       fprintf(stderr,"increasing.\n");
+                               }else{
+                                       fprintf(stderr,"decreasing.\n");
+                               }
+*/
+                               data_type *gdt = gb_tbl->get_data_type(g);
+                               if(gdt->is_buffer_type()){
+                                       fprintf(stderr, "\t but temporal BUFFER types are not supported, skipping.\n");
+                               }else{
+                                       sprintf(tmpstr,"\t%s last_gb_%d;\n",gdt->get_cvar_type().c_str(),g);
+                                       ret += tmpstr;
+                                       sprintf(tmpstr,"\t%s flush_start_gb_%d;\n",gdt->get_cvar_type().c_str(),g);
+                                       ret += tmpstr;
+                                       sprintf(tmpstr,"\t%s last_flushed_gb_%d;\n",gdt->get_cvar_type().c_str(),g);
+                                       ret += tmpstr;
+                                       uses_temporal_flush = true;
+                               }
+
+                       }
+
+               }
+               if(! uses_temporal_flush){
+                       fprintf(stderr,"Warning: no temporal flush.\n");
+               }
+       }
+
+// ---------------------------------------------------------
+//                     Filter-join specific fields
+
+       if(is_fj){
+               if(uses_bloom){
+                       ret +=
+"\tunsigned char * bf_table; //array of bloom filters with layout \n"
+"\t\t// bit 0 bf 0| bit 0 bf 1| bit 0 bf 2| bit 1 bf 0| bit 1 bf 1|.....\n"
+"\tint first_exec;\n"
+"\tlong long int last_bin;\n"
+"\tint last_bloom_pos;\n"
+"\n"
+;
+               }else{          // limited hash table
+                       ret +=
+"  struct "+generate_fj_struct_name(node_name)+" *join_table;\n"
+"\n"
+;
+               }
+
+       }
+
+//--------------------------------------------------------
+//                     Common fields
+
+//                     Create places to hold the parameters.
+       int p;
+       vector<string> param_vec = param_tbl->get_param_names();
+       for(p=0;p<param_vec.size();p++){
+               data_type *dt = param_tbl->get_data_type(param_vec[p]);
+               sprintf(tmpstr,"\t%s param_%s;\n",dt->get_cvar_type().c_str(),
+                               param_vec[p].c_str());
+               ret += tmpstr;
+               if(param_tbl->handle_access(param_vec[p])){
+                       ret += "\tstruct search_handle *param_handle_"+param_vec[p]+";\n";
+               }
+       }
+
+//                     Create places to hold complex literals.
+       int cl;
+       for(cl=0;cl<complex_literals->size();cl++){
+               literal_t *l = complex_literals->get_literal(cl);
+               data_type *dtl = new data_type( l->get_type() );
+               sprintf(tmpstr,"\t%s complex_literal_%d;\n",dtl->get_cvar_type().c_str(),cl);
+               ret += tmpstr;
+       }
+
+//                     Create places to hold the pass-by-handle parameters.
+       for(p=0;p<param_handle_table.size();++p){
+               sprintf(tmpstr,"\tgs_param_handle_t handle_param_%d;\n",p);
+               ret += tmpstr;
+       }
+
+//                     Create places to hold the last values of temporal
+//                     attributes referenced in select clause
+//                     we also need to store values of the temoral attributed
+//                     of last flushed tuple in aggr queries
+//                     to make sure we generate the cirrect temporal tuple
+//                     in the presense of slow flushes
+
+
+       col_id_set temp_cids;           //      col ids of temp attributes in select clause
+
+       int s;
+       col_id_set::iterator csi;
+
+       for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if (sdt->is_temporal()) {
+                       gather_se_col_ids(sl_list[s],temp_cids, gb_tbl);
+               }
+       }
+
+       for(csi=temp_cids.begin(); csi != temp_cids.end();++csi){
+               int tblref = (*csi).tblvar_ref;
+               int schref = (*csi).schema_ref;
+               string field = (*csi).field;
+               data_type dt(schema->get_type_name(schref,field), schema->get_modifier_list(schref,field));
+               sprintf(tmpstr,"\t%s last_%s_%d;\n", dt.get_cvar_type().c_str(), field.c_str(), tblref);
+               ret += tmpstr;
+       }
+
+       ret += "\tgs_uint64_t trace_id;\n\n";
+
+//     Fields to store the runtime stats
+
+       ret += "\tgs_uint32_t in_tuple_cnt;\n";
+       ret += "\tgs_uint32_t out_tuple_cnt;\n";
+       ret += "\tgs_uint32_t out_tuple_sz;\n";
+       ret += "\tgs_uint32_t accepted_tuple_cnt;\n";
+       ret += "\tgs_uint64_t cycle_cnt;\n";
+       ret += "\tgs_uint32_t collision_cnt;\n";
+       ret += "\tgs_uint32_t eviction_cnt;\n";
+       ret += "\tgs_float_t sampling_rate;\n";
+
+
+
+       ret += "};\n\n";
+
+       return(ret);
+}
+
+//------------------------------------------------------------
+//             Set colref tblvars to 0..
+//             (special processing for join-like operators in an lfta).
+
+void reset_se_col_ids_tblvars(scalarexp_t *se,  gb_table *gtbl){
+       vector<scalarexp_t *> operands;
+       int o;
+
+       if(! se)
+               return;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return;
+       case SE_UNARY_OP:
+               reset_se_col_ids_tblvars(se->get_left_se(),gtbl);
+               return;
+       case SE_BINARY_OP:
+               reset_se_col_ids_tblvars(se->get_left_se(),gtbl);
+               reset_se_col_ids_tblvars(se->get_right_se(),gtbl);
+               return;
+       case SE_COLREF:
+               if(! se->is_gb() ){
+                       se->get_colref()->set_tablevar_ref(0);
+               }else{
+                       if(gtbl==NULL){
+                               fprintf(stderr,"INTERNAL ERROR: gbvar ref in gather_se_col_ids, but gtbl is NULL.\n");
+                               exit(1);
+                       }
+                       reset_se_col_ids_tblvars(gtbl->get_def(se->get_gb_ref()),gtbl);
+               }
+               return;
+       case SE_AGGR_STAR:
+               return;
+       case SE_AGGR_SE:
+               reset_se_col_ids_tblvars(se->get_left_se(),gtbl);
+               return;
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       reset_se_col_ids_tblvars(operands[o], gtbl);
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in reset_se_col_ids_tblvars, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               exit(1);
+       }
+}
+
+
+//             reset  column tblvars accessed in this pr.
+
+void reset_pr_col_ids_tblvars(predicate_t *pr,  gb_table *gtbl){
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               reset_se_col_ids_tblvars(pr->get_left_se(), gtbl);
+               return;
+       case PRED_COMPARE:
+               reset_se_col_ids_tblvars(pr->get_left_se(),gtbl) ;
+               reset_se_col_ids_tblvars(pr->get_right_se(),gtbl) ;
+               return;
+       case PRED_UNARY_OP:
+               reset_pr_col_ids_tblvars(pr->get_left_pr(),gtbl) ;
+               return;
+       case PRED_BINARY_OP:
+               reset_pr_col_ids_tblvars(pr->get_left_pr(),gtbl) ;
+               reset_pr_col_ids_tblvars(pr->get_right_pr(),gtbl) ;
+               return;
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       reset_se_col_ids_tblvars(op_list[o],gtbl) ;
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in reset_pr_col_ids_tblvars, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+       }
+}
+
+
+
+
+//                     Generate code that makes reference
+//                     to the tuple, and not to any aggregates.
+static string generate_se_code(scalarexp_t *se,table_list *schema){
+       string ret;
+    data_type *ldt, *rdt;
+       int o;
+       vector<scalarexp_t *> operands;
+
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               if(se->is_handle_ref()){
+                       sprintf(tmpstr,"t->handle_param_%d",se->get_handle_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               if(se->get_literal()->is_cpx_lit()){
+                       sprintf(tmpstr,"t->complex_literal_%d",se->get_literal()->get_cpx_lit_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               return(se->get_literal()->to_C_code("")); // not complex, no constructor
+       case SE_PARAM:
+               if(se->is_handle_ref()){
+                       sprintf(tmpstr,"t->handle_param_%d",se->get_handle_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               ret += "t->param_";
+               ret += se->get_param_name();
+               return(ret);
+       case SE_UNARY_OP:
+        ldt = se->get_left_se()->get_data_type();
+        if(ldt->complex_operator(se->get_op()) ){
+                       ret +=  ldt->get_complex_operator(se->get_op());
+                       ret += "(";
+                       ret += generate_se_code(se->get_left_se(),schema);
+            ret += ")";
+               }else{
+                       ret += "(";
+                       ret += se->get_op();
+                       ret += generate_se_code(se->get_left_se(),schema);
+                       ret += ")";
+               }
+               return(ret);
+       case SE_BINARY_OP:
+        ldt = se->get_left_se()->get_data_type();
+        rdt = se->get_right_se()->get_data_type();
+
+        if(ldt->complex_operator(rdt, se->get_op()) ){
+                       ret +=  ldt->get_complex_operator(rdt, se->get_op());
+                       ret += "(";
+                       ret += generate_se_code(se->get_left_se(),schema);
+                       ret += ", ";
+                       ret += generate_se_code(se->get_right_se(),schema);
+                       ret += ")";
+               }else{
+                       ret += "(";
+                       ret += generate_se_code(se->get_left_se(),schema);
+                       ret += se->get_op();
+                       ret += generate_se_code(se->get_right_se(),schema);
+                       ret += ")";
+               }
+               return(ret);
+       case SE_COLREF:
+               if(se->is_gb()){                // OK to ref gb attrs, but they're not yet unpacked ...
+                                                       // so return the defining code.
+                       ret = generate_se_code(gb_tbl->get_def(se->get_gb_ref()), schema );
+
+               }else{
+               sprintf(tmpstr,"unpack_var_%s_%d",
+                 se->get_colref()->get_field().c_str(), se->get_colref()->get_tablevar_ref() );
+               ret = tmpstr;
+               }
+               return(ret);
+       case SE_FUNC:
+//                             Should not be ref'ing any aggr here.
+               if(se->get_aggr_ref() >= 0){
+                       fprintf(stderr,"INTERNAL ERROR, UDAF reference in generate_se_code.\n");
+                       return("ERROR in generate_se_code");
+               }
+
+               if(se->is_partial()){
+                       sprintf(tmpstr,"partial_fcn_result_%d",se->get_partial_ref());
+                       ret = tmpstr;
+               }else{
+                       ret += se->op + "(";
+                       operands = se->get_operands();
+                       for(o=0;o<operands.size();o++){
+                               if(o>0) ret += ", ";
+                               if(operands[o]->get_data_type()->is_buffer_type() && (! (operands[o]->is_handle_ref()) ) )
+                                       ret += "&";
+                               ret += generate_se_code(operands[o], schema);
+                       }
+                       ret += ")";
+               }
+               return(ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in generate_se_code (lfta), line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               return("ERROR in generate_se_code");
+       }
+}
+
+//             generate code that refers only to aggregate data and constants.
+static string generate_se_code_fm_aggr(scalarexp_t *se, string var, table_list *schema){
+
+       string ret;
+    data_type *ldt, *rdt;
+       int o;
+       vector<scalarexp_t *> operands;
+
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               if(se->is_handle_ref()){
+                       sprintf(tmpstr,"t->handle_param_%d",se->get_handle_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               if(se->get_literal()->is_cpx_lit()){
+                       sprintf(tmpstr,"t->complex_literal_%d",se->get_literal()->get_cpx_lit_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               return(se->get_literal()->to_C_code("")); // not complex no constructor
+       case SE_PARAM:
+               if(se->is_handle_ref()){
+                       sprintf(tmpstr,"t->handle_param_%d",se->get_handle_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               ret += "t->param_";
+               ret += se->get_param_name();
+               return(ret);
+       case SE_UNARY_OP:
+        ldt = se->get_left_se()->get_data_type();
+        if(ldt->complex_operator(se->get_op()) ){
+                       ret +=  ldt->get_complex_operator(se->get_op());
+                       ret += "(";
+                       ret += generate_se_code_fm_aggr(se->get_left_se(),var,schema);
+            ret += ")";
+               }else{
+                       ret += "(";
+                       ret += se->get_op();
+                       ret += generate_se_code_fm_aggr(se->get_left_se(),var,schema);
+                       ret += ")";
+               }
+               return(ret);
+       case SE_BINARY_OP:
+        ldt = se->get_left_se()->get_data_type();
+        rdt = se->get_right_se()->get_data_type();
+
+        if(ldt->complex_operator(rdt, se->get_op()) ){
+                       ret +=  ldt->get_complex_operator(rdt, se->get_op());
+                       ret += "(";
+                       ret += generate_se_code_fm_aggr(se->get_left_se(),var,schema);
+                       ret += ", ";
+                       ret += generate_se_code_fm_aggr(se->get_right_se(),var,schema);
+                       ret += ")";
+               }else{
+                       ret += "(";
+                       ret += generate_se_code_fm_aggr(se->get_left_se(),var,schema);
+                       ret += se->get_op();
+                       ret += generate_se_code_fm_aggr(se->get_right_se(),var,schema);
+                       ret += ")";
+               }
+               return(ret);
+       case SE_COLREF:
+               if(se->is_gb()){                // OK to ref gb attrs, but they're not yet
+                                                       // unpacked ... so return the defining code.
+                       sprintf(tmpstr,"%sgb_var%d",var.c_str(),se->get_gb_ref());
+                       ret = tmpstr;
+
+               }else{
+               fprintf(stderr,"ERROR reference to non-GB column ref not permitted here,"
+                               "error in generate_se_code_fm_aggr, line %d, character %d.\n",
+                               se->get_lineno(), se->get_charno());
+               ret = tmpstr;
+               }
+               return(ret);
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               sprintf(tmpstr,"%saggr_var%d",var.c_str(),se->get_aggr_ref());
+               ret = tmpstr;
+               return(ret);
+       case SE_FUNC:
+//                             Is it a UDAF?
+               if(se->get_aggr_ref() >= 0){
+                       sprintf(tmpstr,"udaf_ret%d",se->get_aggr_ref());
+                       ret = tmpstr;
+                       return(ret);
+               }
+
+               if(se->is_partial()){
+                       sprintf(tmpstr,"partial_fcn_result_%d",se->get_partial_ref());
+                       ret = tmpstr;
+               }else{
+                       ret += se->op + "(";
+                       operands = se->get_operands();
+                       for(o=0;o<operands.size();o++){
+                               if(o>0) ret += ", ";
+                               if(operands[o]->get_data_type()->is_buffer_type() && (! (operands[o]->is_handle_ref()) ) )
+                                       ret += "&";
+                               ret += generate_se_code_fm_aggr(operands[o], var, schema);
+                       }
+                       ret += ")";
+               }
+               return(ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in generate_lfta_code.cc::generate_se_code_fm_aggr, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               return("ERROR in generate_se_code");
+       }
+
+}
+
+
+static string unpack_partial_fcn_fm_aggr(scalarexp_t *se, int pfn_id, string var, table_list *schema){
+       string ret;
+       int o;
+       vector<scalarexp_t *> operands;
+
+
+       if(se->get_operator_type() != SE_FUNC || se->get_aggr_ref() >= 0){
+               fprintf(stderr,"INTERNAL ERROR, non-function SE passed to unpack_partial_fcn_fm_aggr. line %d, character %d\n",
+                               se->get_lineno(), se->get_charno());
+               return("ERROR in generate_se_code");
+       }
+
+       ret = "\tretval = " + se->get_op() + "( ";
+       sprintf(tmpstr, "&partial_fcn_result_%d",pfn_id);
+       ret += tmpstr;
+
+       operands = se->get_operands();
+       for(o=0;o<operands.size();o++){
+               ret += ", ";
+               if(operands[o]->get_data_type()->is_buffer_type() && (! (operands[o]->is_handle_ref()) ) )
+                       ret += "&";
+               ret += generate_se_code_fm_aggr(operands[o], var, schema);
+       }
+       ret += ");\n";
+
+       return(ret);
+}
+
+static string generate_cached_fcn(scalarexp_t *se, table_list *schema){
+       string ret;
+       int o;
+       vector<scalarexp_t *> operands;
+
+       if(se->get_operator_type() != SE_FUNC || se->get_aggr_ref() >= 0){
+               fprintf(stderr,"INTERNAL ERROR, non-function SE passed to generate_cached_fcn. line %d, character %d\n",
+                               se->get_lineno(), se->get_charno());
+               return("ERROR in generate_se_code");
+       }
+
+       ret = se->get_op() + "( ";
+
+       operands = se->get_operands();
+       for(o=0;o<operands.size();o++){
+               if(o) ret += ", ";
+               if(operands[o]->get_data_type()->is_buffer_type() && (! (operands[o]->is_handle_ref()) ) )
+                       ret += "&";
+               ret += generate_se_code(operands[o], schema);
+       }
+       ret += ");\n";
+
+       return(ret);
+}
+
+
+
+static string unpack_partial_fcn(scalarexp_t *se, int pfn_id, table_list *schema){
+       string ret;
+       int o;
+       vector<scalarexp_t *> operands;
+
+
+       if(se->get_operator_type() != SE_FUNC || se->get_aggr_ref() >= 0){
+               fprintf(stderr,"INTERNAL ERROR, non-function SE passed to unpack_partial_fcn. line %d, character %d\n",
+                               se->get_lineno(), se->get_charno());
+               return("ERROR in generate_se_code");
+       }
+
+       ret = "\tretval = " + se->get_op() + "( ",
+       sprintf(tmpstr, "&partial_fcn_result_%d",pfn_id);
+       ret += tmpstr;
+
+       operands = se->get_operands();
+       for(o=0;o<operands.size();o++){
+               ret += ", ";
+               if(operands[o]->get_data_type()->is_buffer_type() && (! (operands[o]->is_handle_ref()) ) )
+                       ret += "&";
+               ret += generate_se_code(operands[o], schema);
+       }
+       ret += ");\n";
+
+       return(ret);
+}
+
+
+
+
+
+static string generate_C_comparison_op(string op){
+  if(op == "=") return("==");
+  if(op == "<>") return("!=");
+  return(op);
+}
+
+static string generate_C_boolean_op(string op){
+       if( (op == "AND") || (op == "And") || (op == "and") ){
+               return("&&");
+       }
+       if( (op == "OR") || (op == "Or") || (op == "or") ){
+               return("||");
+       }
+       if( (op == "NOT") || (op == "Not") || (op == "not") ){
+               return("!");
+       }
+
+       fprintf(stderr,"INTERNAL ERROR: unknown boolean operator %s\n",op.c_str());
+       return("ERROR UNKNOWN BOOLEAN OPERATOR :"+op);
+}
+
+
+static string generate_predicate_code(predicate_t *pr,table_list *schema){
+       string ret;
+       vector<literal_t *>  litv;
+       int i;
+    data_type *ldt, *rdt;
+       vector<scalarexp_t *> op_list;
+       int o,cref,ppos;
+       unsigned int bitmask;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+        ldt = pr->get_left_se()->get_data_type();
+
+               ret += "( ";
+               litv = pr->get_lit_vec();
+               for(i=0;i<litv.size();i++){
+                       if(i>0) ret += " || ";
+                       ret += "( ";
+
+               if(ldt->complex_comparison(ldt) ){
+                               ret +=  ldt->get_comparison_fcn(ldt) ;
+                               ret += "( ";
+                               if(ldt->is_buffer_type() ) ret += "&";
+                               ret += generate_se_code(pr->get_left_se(), schema);
+                               ret += ", ";
+                               if(ldt->is_buffer_type() ) ret += "&";
+                               if(litv[i]->is_cpx_lit()){
+                                       sprintf(tmpstr,"t->complex_literal_%d",litv[i]->get_cpx_lit_ref() );
+                                       ret += tmpstr;
+                               }else{
+                                       ret += litv[i]->to_C_code("");
+                               }
+                               ret += ") == 0";
+                       }else{
+                               ret += generate_se_code(pr->get_left_se(), schema);
+                               ret += " == ";
+                               ret += litv[i]->to_C_code("");
+                       }
+
+                       ret += " )";
+               }
+               ret += " )";
+               return(ret);
+
+       case PRED_COMPARE:
+        ldt = pr->get_left_se()->get_data_type();
+        rdt = pr->get_right_se()->get_data_type();
+
+               ret += "( ";
+        if(ldt->complex_comparison(rdt) ){
+                       ret += ldt->get_comparison_fcn(rdt);
+                       ret += "(";
+                       if(ldt->is_buffer_type() ) ret += "&";
+                       ret += generate_se_code(pr->get_left_se(),schema);
+                       ret += ", ";
+                       if(rdt->is_buffer_type() ) ret += "&";
+                       ret += generate_se_code(pr->get_right_se(),schema);
+                       ret += ") ";
+                       ret +=  generate_C_comparison_op(pr->get_op());
+                       ret += "0";
+               }else{
+                       ret += generate_se_code(pr->get_left_se(),schema);
+                       ret +=  generate_C_comparison_op(pr->get_op());
+                       ret += generate_se_code(pr->get_right_se(),schema);
+               }
+               ret += " )";
+               return(ret);
+       case PRED_UNARY_OP:
+               ret += "( ";
+               ret +=  generate_C_boolean_op(pr->get_op());
+               ret += generate_predicate_code(pr->get_left_pr(),schema);
+               ret += " )";
+               return(ret);
+       case PRED_BINARY_OP:
+               ret += "( ";
+               ret += generate_predicate_code(pr->get_left_pr(),schema);
+               ret +=  generate_C_boolean_op(pr->get_op());
+               ret += generate_predicate_code(pr->get_right_pr(),schema);
+               ret += " )";
+               return(ret);
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               cref = pr->get_combinable_ref();
+               if(cref >= 0){  // predicate is a combinable pred reference
+                       //              Trust, but verify
+                       if(pred_class.size() >= cref && pred_class[cref] >= 0){
+                               ppos = pred_pos[cref];
+                               bitmask = 1 << ppos % 32;
+                               sprintf(tmpstr,"(pref_common_pred_val_%d_%d & %u)",pred_class[cref],ppos/32,bitmask);
+                               ret = tmpstr;
+                               return ret;
+                       }
+               }
+
+               ret =  pr->get_op() + "(";
+               if (pr->is_sampling_fcn) {
+                       ret += "t->sampling_rate";
+                       if (!op_list.empty())
+                               ret += ", ";
+               }
+               for(o=0;o<op_list.size();++o){
+                       if(o>0) ret += ", ";
+                       if(op_list[o]->get_data_type()->is_buffer_type() && (! (op_list[o]->is_handle_ref()) ) )
+                                       ret += "&";
+                       ret += generate_se_code(op_list[o],schema);
+               }
+               ret += " )";
+               return(ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in generate_predicate_code, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               return("ERROR in generate_predicate_code");
+       }
+}
+
+
+static string generate_equality_test(string &lhs_op, string &rhs_op, data_type *dt){
+       string ret;
+
+    if(dt->complex_comparison(dt) ){
+               ret += dt->get_comparison_fcn(dt);
+               ret += "(";
+                       if(dt->is_buffer_type() ) ret += "&";
+               ret += lhs_op;
+               ret += ", ";
+                       if(dt->is_buffer_type() ) ret += "&";
+               ret += rhs_op;
+               ret += ") == 0";
+       }else{
+               ret += lhs_op;
+               ret += " == ";
+               ret += rhs_op;
+       }
+
+       return(ret);
+}
+
+static string generate_comparison(string &lhs_op, string &rhs_op, data_type *dt){
+       string ret;
+
+    if(dt->complex_comparison(dt) ){
+               ret += dt->get_comparison_fcn(dt);
+               ret += "(";
+                       if(dt->is_buffer_type() ) ret += "&";
+               ret += lhs_op;
+               ret += ", ";
+                       if(dt->is_buffer_type() ) ret += "&";
+               ret += rhs_op;
+               ret += ") == 0";
+       }else{
+               ret += lhs_op;
+               ret += " == ";
+               ret += rhs_op;
+       }
+
+       return(ret);
+}
+
+//             Here I assume that only MIN and MAX aggregates can be computed
+//             over BUFFER data types.
+
+static string generate_aggr_update(string var, aggregate_table *atbl,int aidx, table_list *schema){
+       string retval = "\t\t";
+       string op = atbl->get_op(aidx);
+
+//             Is it a UDAF
+       if(! atbl->is_builtin(aidx)) {
+               int o;
+               retval += op+"_LFTA_AGGR_UPDATE_(";
+               if(atbl->get_storage_type(aidx)->get_type() != fstring_t) retval+="&";
+               retval+="("+var+")";
+               vector<scalarexp_t *> opl = atbl->get_operand_list(aidx);
+               for(o=0;o<opl.size();++o){
+                       retval += ",";
+                       if(opl[o]->get_data_type()->is_buffer_type() && (! (opl[o]->is_handle_ref()) ) )
+                                       retval.append("&");
+                       retval += generate_se_code(opl[o], schema);
+               }
+               retval += ");\n";
+
+               return retval;
+       }
+
+//             Built-in aggregate processing.
+
+       data_type *dt = atbl->get_data_type(aidx);
+
+       if(op == "COUNT"){
+               retval.append(var);
+               retval.append("++;\n");
+               return(retval);
+       }
+       if(op == "SUM"){
+               retval.append(var);
+               retval.append(" += ");
+               retval.append(generate_se_code(atbl->get_aggr_se(aidx), schema) );
+               retval.append(";\n");
+               return(retval);
+       }
+       if(op == "MIN"){
+               sprintf(tmpstr,"aggr_tmp_%d = %s;\n",aidx,generate_se_code(atbl->get_aggr_se(aidx), schema ).c_str() );
+               retval.append(tmpstr);
+               if(dt->complex_comparison(dt)){
+                       if(dt->is_buffer_type())
+                         sprintf(tmpstr,"\t\tif(%s(&aggr_tmp_%d,&(%s)) < 0)\n",dt->get_comparison_fcn(dt).c_str(), aidx, var.c_str());
+                       else
+                         sprintf(tmpstr,"\t\tif(%s(aggr_tmp_%d,%s) < 0)\n",dt->get_comparison_fcn(dt).c_str(), aidx, var.c_str());
+               }else{
+                       sprintf(tmpstr,"\t\tif(aggr_tmp_%d < %s)\n",aidx,var.c_str());
+               }
+               retval.append(tmpstr);
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t\t%s(f,&(%s),&aggr_tmp_%d);\n",dt->get_buffer_replace().c_str(),var.c_str(),aidx);
+               }else{
+                       sprintf(tmpstr,"\t\t\t%s = aggr_tmp_%d;\n",var.c_str(),aidx);
+               }
+               retval.append(tmpstr);
+
+               return(retval);
+       }
+       if(op == "MAX"){
+               sprintf(tmpstr,"aggr_tmp_%d = %s;\n",aidx,generate_se_code(atbl->get_aggr_se(aidx), schema ).c_str() );
+               retval.append(tmpstr);
+               if(dt->complex_comparison(dt)){
+                       if(dt->is_buffer_type())
+                        sprintf(tmpstr,"\t\tif(%s(&aggr_tmp_%d,&(%s)) > 0)\n",dt->get_comparison_fcn(dt).c_str(), aidx, var.c_str());
+                       else
+                        sprintf(tmpstr,"\t\tif(%s(aggr_tmp_%d,%s) > 0)\n",dt->get_comparison_fcn(dt).c_str(), aidx, var.c_str());
+               }else{
+                       sprintf(tmpstr,"\t\tif(aggr_tmp_%d > %s)\n",aidx,var.c_str());
+               }
+               retval.append(tmpstr);
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t\t%s(f,&(%s),&aggr_tmp_%d);\n",dt->get_buffer_replace().c_str(),var.c_str(),aidx);
+               }else{
+                       sprintf(tmpstr,"\t\t\t%s = aggr_tmp_%d;\n",var.c_str(),aidx);
+               }
+               retval.append(tmpstr);
+
+               return(retval);
+
+       }
+       if(op == "AND_AGGR"){
+               retval.append(var);
+               retval.append(" &= ");
+               retval.append(generate_se_code(atbl->get_aggr_se(aidx), schema) );
+               retval.append(";\n");
+               return(retval);
+       }
+       if(op == "OR_AGGR"){
+               retval.append(var);
+               retval.append(" |= ");
+               retval.append(generate_se_code(atbl->get_aggr_se(aidx), schema) );
+               retval.append(";\n");
+               return(retval);
+       }
+       if(op == "XOR_AGGR"){
+               retval.append(var);
+               retval.append(" ^= ");
+               retval.append(generate_se_code(atbl->get_aggr_se(aidx), schema) );
+               retval.append(";\n");
+               return(retval);
+       }
+       fprintf(stderr,"INTERNAL ERROR : aggregate %s not recognized in generate_aggr_update.\n",op.c_str());
+       return("ERROR: aggregate not recognized: "+op);
+
+}
+
+
+
+static string generate_aggr_init(string var, aggregate_table *atbl,int aidx, table_list *schema){
+       string retval;
+       string op = atbl->get_op(aidx);
+
+//             Is it a UDAF
+       if(! atbl->is_builtin(aidx)) {
+               int o;
+               retval += "\t\t"+op+"_LFTA_AGGR_INIT_(";
+               if(atbl->get_storage_type(aidx)->get_type() != fstring_t) retval+="&";
+               retval+="("+var+"));\n";
+//                     Add 1st tupl
+               retval += "\t"+atbl->get_op(aidx)+"_LFTA_AGGR_UPDATE_(";
+               if(atbl->get_storage_type(aidx)->get_type() != fstring_t) retval+="&";
+               retval+="("+var+")";
+               vector<scalarexp_t *> opl = atbl->get_operand_list(aidx);
+               for(o=0;o<opl.size();++o){
+                       retval += ",";
+                       if(opl[o]->get_data_type()->is_buffer_type() && (! (opl[o]->is_handle_ref()) ) )
+                                       retval.append("&");
+                       retval += generate_se_code(opl[o],schema);
+               }
+               retval += ");\n";
+               return(retval);
+       }
+
+//             Built-in aggregate processing.
+
+
+       data_type *dt = atbl->get_data_type(aidx);
+
+       if(op == "COUNT"){
+               retval = "\t\t"+var;
+               retval.append(" = 1;\n");
+               return(retval);
+       }
+
+       if(op == "SUM" || op == "MIN" || op == "MAX" || op == "AND_AGGR" ||
+                                                                       op == "OR_AGGR" || op == "XOR_AGGR"){
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\taggr_tmp_%d = %s;\n",aidx,generate_se_code(atbl->get_aggr_se(aidx), schema ).c_str() );
+                       retval.append(tmpstr);
+                       sprintf(tmpstr,"\t\t%s(f,&(%s),&aggr_tmp_%d);\n",dt->get_buffer_assign_copy().c_str(),var.c_str(),aidx);
+                       retval.append(tmpstr);
+               }else{
+                       retval = "\t\t"+var;
+                       retval += " = ";
+                       retval.append(generate_se_code(atbl->get_aggr_se(aidx), schema));
+                       retval.append(";\n");
+               }
+               return(retval);
+       }
+
+       fprintf(stderr,"INTERNAL ERROR : aggregate %s not recognized in generate_aggr_init.\n",op.c_str());
+       return("ERROR: aggregate not recognized: "+op);
+}
+
+
+////////////////////////////////////////////////////////////
+
+
+string generate_preamble(table_list *schema, //map<string,string> &int_fcn_defs,
+       std::string &node_name, std::string &schema_embed_str){
+//                     Include these only once, not once per lfta
+//     string ret = "#include \"rts.h\"\n";
+//     ret +=  "#include \"fta.h\"\n\n");
+
+       string ret = "#ifndef LFTA_IN_NIC\n";
+       ret += "char *"+generate_schema_string_name(node_name)+" = " +schema_embed_str+";\n";
+       ret += "#include<stdio.h>\n";
+       ret += "#include <limits.h>\n";
+       ret += "#include <float.h>\n";
+       ret += "#include \"rdtsc.h\"\n";
+       ret += "#endif\n";
+
+
+
+       return(ret);
+}
+
+
+string generate_tuple_from_aggr(string node_name, table_list *schema, string idx){
+       int a,p,s;
+//                      need to create and output the tuple.
+       string ret = "/*\t\tCreate an output tuple for the aggregate being kicked out \t*/\n";
+//                     Check for any UDAFs with LFTA_BAILOUT
+       ret += "\tlfta_bailout = 0;\n";
+       for(a=0;a<aggr_tbl->size();a++){
+               if(aggr_tbl->has_bailout(a)){
+                       ret += "\tlfta_bailout+="+aggr_tbl->get_op(a)+"_LFTA_AGGR_BAILOUT_(";
+                       if(aggr_tbl->get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="(t->aggr_table["+idx+"].aggr_var"+int_to_string(a)+"));\n";
+               }
+       }
+       ret += "\tif(! lfta_bailout){\n";
+
+//                     First, compute the size of the tuple.
+
+//                     Unpack UDAF return values
+       for(a=0;a<aggr_tbl->size();a++){
+               if(! aggr_tbl->is_builtin(a)){
+                       ret += "\t"+aggr_tbl->get_op(a)+"_LFTA_AGGR_OUTPUT_(&(udaf_ret"+int_to_string(a)+"),";
+                       if(aggr_tbl->get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="(t->aggr_table["+idx+"].aggr_var"+int_to_string(a)+"));\n";
+
+               }
+       }
+
+
+//                     Unpack partial fcns ref'd by the select clause.
+  if(sl_fcns_start != sl_fcns_end){
+           ret += "\t\tunpack_failed = 0;\n";
+    for(p=sl_fcns_start;p<sl_fcns_end;p++){
+         if(is_partial_fcn[p]){
+               ret += "\t" + unpack_partial_fcn_fm_aggr(partial_fcns[p], p,
+                        "t->aggr_table["+idx+"].",schema);
+               ret += "\t\tif(retval) unpack_failed = 1;\n";
+         }
+    }
+                                                               // BEGIN don't allocate tuple if
+       ret += "\t\tif( unpack_failed == 0 ){\n"; // unpack failed.
+  }
+
+//                     Unpack any BUFFER type selections into temporaries
+//                     so that I can compute their size and not have
+//                     to recompute their value during tuple packing.
+//                     I can use regular assignment here because
+//                     these temporaries are non-persistent.
+
+         for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if(sdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t\tselvar_%d = ",s);
+                       ret += tmpstr;
+                       ret += generate_se_code_fm_aggr(sl_list[s],"t->aggr_table["+idx+"].",schema);
+                       ret += ";\n";
+               }
+         }
+
+
+//             The size of the tuple is the size of the tuple struct plus the
+//             size of the buffers to be copied in.
+
+         ret += "\t\t\ttuple_size = sizeof( struct ";
+         ret +=  generate_tuple_name(node_name);
+         ret += ")";
+         for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if(sdt->is_buffer_type()){
+                       sprintf(tmpstr," + %s(&selvar_%d)", sdt->get_buffer_size().c_str(),s);
+                       ret += tmpstr;
+               }
+         }
+         ret += ";\n";
+
+
+         ret += "\t\t\ttuple = allocate_tuple(f, tuple_size );\n";
+         ret += "\t\t\tif( tuple != NULL){\n";
+
+
+//                     Test passed, make assignments to the tuple.
+
+         ret += "\t\t\t\ttuple_pos = sizeof( struct ";
+         ret +=  generate_tuple_name(node_name) ;
+         ret += ");\n";
+
+//                     Mark tuple as REGULAR_TUPLE
+         ret += "\n\t\t\t\ttuple->tuple_type = REGULAR_TUPLE;\n";
+
+         for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if(sdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t\t\t%s(&(tuple->tuple_var%d), &selvar_%d, (char *)tuple, ((char *)tuple)+tuple_pos);\n", sdt->get_buffer_tuple_copy().c_str(),s, s);
+                       ret += tmpstr;
+                       sprintf(tmpstr,"\t\t\t\ttuple_pos += %s(&selvar_%d);\n", sdt->get_buffer_size().c_str(), s);
+                       ret += tmpstr;
+               }else{
+                       sprintf(tmpstr,"\t\t\t\ttuple->tuple_var%d = ",s);
+                       ret += tmpstr;
+//                     if(sdt->needs_hn_translation())
+//                             ret += sdt->hton_translation() +"( ";
+                       ret += generate_se_code_fm_aggr(sl_list[s],"t->aggr_table["+idx+"].",schema);
+//                     if(sdt->needs_hn_translation())
+//                             ret += ") ";
+                       ret += ";\n";
+               }
+         }
+
+//             Generate output.
+         ret += "\t\t\t\tpost_tuple(tuple);\n";
+         ret += "\t\t\t\t#ifdef LFTA_STATS\n";
+         ret+="\t\t\t\tt->out_tuple_cnt++;\n";
+         ret+="\t\t\t\tt->out_tuple_sz+=tuple_size;\n";
+         ret += "\t\t\t\t#endif\n\n";
+         ret += "\t\t\t}\n";
+
+         if(sl_fcns_start != sl_fcns_end)      // END don't allocate tuple if
+               ret += "\t\t}\n";                               // unpack failed.
+         ret += "\t}\n";
+
+//                     Need to release memory held by BUFFER types.
+               int g;
+
+         for(g=0;g<gb_tbl->size();g++){
+               data_type *gdt = gb_tbl->get_data_type(g);
+               if(gdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t\t%s(&(t->aggr_table[%s].gb_var%d));\n",gdt->get_buffer_destroy().c_str(),idx.c_str(),g);
+                       ret += tmpstr;
+               }
+         }
+         for(a=0;a<aggr_tbl->size();a++){
+               if(aggr_tbl->is_builtin(a)){
+                       data_type *adt = aggr_tbl->get_data_type(a);
+                       if(adt->is_buffer_type()){
+                               sprintf(tmpstr,"\t\t\t%s(&(t->aggr_table[%s].aggr_var%d));\n",adt->get_buffer_destroy().c_str(),idx.c_str(),a);
+                               ret += tmpstr;
+                       }
+               }else{
+                       ret += "\t\t"+aggr_tbl->get_op(a)+"_LFTA_AGGR_DESTROY_(";
+                       if(aggr_tbl->get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="(t->aggr_table["+idx+"].aggr_var"+int_to_string(a)+"));\n";
+               }
+         }
+
+       ret += "\t\tt->n_aggrs--;\n";
+
+       return(ret);
+
+}
+
+string generate_gb_match_test(string idx){
+       int g;
+       string ret="\tif (IS_FILLED(t->aggr_table_bitmap, "+idx+") &&  IS_NEW(t->aggr_table_bitmap,"+idx+")";
+       if(gb_tbl->size()>0){
+               ret+="\n\t/* \t\tcheck if the grouping variables are equal */\n";
+               ret+="\t\t";
+
+//                     Next, scan list for a match on the group-by attributes.
+         string rhs_op, lhs_op;
+         for(g=0;g<gb_tbl->size();g++){
+                 ret += " && ";
+                 ret += "(";
+                 sprintf(tmpstr,"gb_attr_%d",g); lhs_op = tmpstr;
+                 sprintf(tmpstr,"t->aggr_table[%s].gb_var%d",idx.c_str(),g); rhs_op = tmpstr;
+                 ret += generate_equality_test(lhs_op, rhs_op, gb_tbl->get_data_type(g) );
+                 ret += ")";
+         }
+        }
+
+         ret += "){\n";
+
+       return ret;
+}
+
+string generate_gb_update(string node_name, table_list *schema, string idx, bool has_udaf){
+       int g;
+       string ret;
+
+         ret += "/*\t\tMatch found : update in place.\t*/\n";
+         int a;
+         has_udaf = false;
+         for(a=0;a<aggr_tbl->size();a++){
+                 sprintf(tmpstr,"t->aggr_table[%s].aggr_var%d",idx.c_str(),a);
+                 ret += generate_aggr_update(tmpstr,aggr_tbl,a, schema);
+                 if(! aggr_tbl->is_builtin(a)) has_udaf = true;
+         }
+
+//                     garbage collect copied buffer type gb attrs.
+  for(g=0;g<gb_tbl->size();g++){
+         data_type *gdt = gb_tbl->get_data_type(g);
+         if(gdt->is_buffer_type()){
+               sprintf(tmpstr,"\t\t\t%s(&(gb_attr_%d));\n",gdt->get_buffer_destroy().c_str(),g);
+               ret+=tmpstr;
+         }
+       }
+
+
+
+         bool first_udaf = true;
+         if(has_udaf){
+               ret += "\t\tif(";
+               for(a=0;a<aggr_tbl->size();a++){
+                       if(! aggr_tbl->is_builtin(a)){
+                               if(! first_udaf)ret += " || ";
+                               else first_udaf = false;
+                               ret += aggr_tbl->get_op(a)+"_LFTA_AGGR_FLUSHME_(";
+                               if(aggr_tbl->get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                               ret+="(t->aggr_table["+idx+"].aggr_var"+int_to_string(a)+"))";
+                       }
+               }
+               ret+="){\n";
+               ret+=" fta_aggr_flush_old_"+node_name+"(f,t->max_aggrs);\n";
+               ret += generate_tuple_from_aggr(node_name,schema,idx);
+               ret += "\t\tt->aggr_table_hashmap["+idx+"] &= ~SLOT_FILLED;\n";
+               ret+="\t\t}\n";
+       }
+       return ret;
+}
+
+
+string generate_init_group( table_list *schema, string idx){
+         int g,a;
+         string ret="\t\t\tt->aggr_table_hashmap["+idx+"] = hash2 | SLOT_FILLED | gen_val;\n";
+//                     Fill up the aggregate block.
+         for(g=0;g<gb_tbl->size();g++){
+                 sprintf(tmpstr,"\t\t\tt->aggr_table[%s].gb_var%d = gb_attr_%d;\n",idx.c_str(),g,g);
+                 ret += tmpstr;
+         }
+         for(a=0;a<aggr_tbl->size();a++){
+                 sprintf(tmpstr,"t->aggr_table[%s].aggr_var%d",idx.c_str(),a);
+                 ret += generate_aggr_init(tmpstr, aggr_tbl,a,  schema);
+         }
+         ret+="\t\tt->n_aggrs++;\n";
+       return ret;
+}
+
+
+string generate_fta_flush(string node_name, table_list *schema,
+               ext_fcn_list *Ext_fcns){
+
+   string ret;
+   string select_var_defs ;
+       int s, p;
+
+//             Flush from previous epoch
+
+       ret+="static void fta_aggr_flush_old_"+node_name+"(struct FTA *f, unsigned int nflush){\n";
+
+       ret += "\tgs_int32_t tuple_size, tuple_pos;\n";
+    ret += "\tstruct "+generate_tuple_name(node_name)+" *tuple;\n";
+       ret += "\tint i, lfta_bailout;\n";
+       ret += "\tunsigned int gen_val;\n";
+
+       ret += "\tstruct "+generate_fta_name(node_name)+" * t = (struct ";
+       ret += generate_fta_name(node_name)+" *) f;\n";
+
+       ret += "\n";
+
+
+//             Variables needed to store selected attributes of BUFFER type
+//             temporarily, in order to compute their size for storage
+//             in an output tuple.
+
+  select_var_defs = "";
+  for(s=0;s<sl_list.size();s++){
+       data_type *sdt = sl_list[s]->get_data_type();
+       if(sdt->is_buffer_type()){
+         sprintf(tmpstr,"\t%s selvar_%d;\n",sdt->get_cvar_type().c_str(),s);
+         select_var_defs.append(tmpstr);
+       }
+  }
+  if(select_var_defs != ""){
+       ret += "/*\t\tTemporaries for computing buffer sizes.\t*/\n";
+    ret += select_var_defs;
+  }
+
+
+//             Variables to store results of partial functions.
+  if(sl_fcns_start != sl_fcns_end){
+       ret += "/*\t\tVariables to store the results of partial functions.\t*/\n";
+       for(p=sl_fcns_start;p<sl_fcns_end;p++){
+               sprintf(tmpstr,"\t%s partial_fcn_result_%d;\n",
+                       partial_fcns[p]->get_data_type()->get_cvar_type().c_str(), p);
+               ret += tmpstr;
+       }
+       ret += "\tgs_retval_t retval = 0;\n\tint unpack_failed = 0;\n;";
+  }
+
+//             Variables for udaf output temporaries
+       bool no_udaf = true;
+       int a;
+       for(a=0;a<aggr_tbl->size();a++){
+               if(! aggr_tbl->is_builtin(a)){
+                       if(no_udaf){
+                               ret+="/*\t\tUDAF output vars.\t*/\n";
+                               no_udaf = false;
+                       }
+                       int afcn_id = aggr_tbl->get_fcn_id(a);
+                       data_type *adt = Ext_fcns->get_fcn_dt(afcn_id);
+                       sprintf(tmpstr,"udaf_ret%d", a);
+                       ret+="\t"+adt->make_cvar(tmpstr)+";\n";
+               }
+       }
+
+
+//  ret+="\tt->flush_finished=1; /* flush will be completed */\n";
+  ret+="\n";
+  ret+="\tgen_val = t->generation & SLOT_GEN_BITS;\n";
+  ret+="\tfor (i=t->flush_pos; (i < t->max_aggrs) && t->n_aggrs && nflush>0; ++i){\n";
+  ret+="\t\tif ( (t->aggr_table_hashmap[i] & SLOT_FILLED) && (((t->aggr_table_hashmap[i] & SLOT_GEN_BITS) != gen_val ) || (";
+               bool first_g=true;
+               int g;
+               for(g=0;g<gb_tbl->size();g++){
+                 data_type *gdt = gb_tbl->get_data_type(g);
+                 if(gdt->is_temporal()){
+                       if(first_g) first_g=false; else ret+=" || ";
+                       ret += "t->last_gb_"+int_to_string(g)+" > t->aggr_table[i].gb_var"+int_to_string(g)+" ";
+                 }
+               }
+  ret += "))) {\n";
+  ret+="\t\t\tt->aggr_table_hashmap[i] = 0;\n";
+  ret+=
+"#ifdef LFTA_STATS\n"
+"\t\t\tt->eviction_cnt++;\n"
+"#endif\n"
+;
+
+
+  ret+=generate_tuple_from_aggr(node_name,schema,"i");
+
+//  ret+="\t\t\tt->n_aggrs--;\n";  // done in generate_tuple_from_aggr
+  ret+="\t\t\tnflush--;\n";
+  ret+="\t\t}\n";
+  ret+="\t}\n";
+  ret+="\tt->flush_pos=i;\n";
+  ret+="\tif(t->n_aggrs == 0) {\n";
+  ret+="\t\tt->flush_pos = t->max_aggrs;\n";
+  ret += "\t}\n\n";
+
+  ret+="\tif(t->flush_pos == t->max_aggrs) {\n";
+
+  for(int g=0;g<gb_tbl->size();g++){
+       data_type *dt = gb_tbl->get_data_type(g);
+       if(dt->is_temporal()){
+               data_type *gdt = gb_tbl->get_data_type(g);
+               if(!gdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\tt->last_flushed_gb_%d = t->flush_start_gb_%d;\n",g,g);
+                       ret += tmpstr;
+               }
+       }
+  }
+  ret += "\t}\n}\n\n";
+
+  return(ret);
+}
+
+// TODO Remove sprintf to perform string catenation
+string generate_fta_load_params(string node_name){
+       int p;
+       vector<string> param_names = param_tbl->get_param_names();
+
+       string ret = "static int load_params_"+node_name+"(struct "+generate_fta_name(node_name);
+               ret += " *t, int sz, void *value, int initial_call){\n";
+    ret += "\tint pos=0;\n";
+    ret += "\tint data_pos;\n";
+
+       for(p=0;p<param_names.size();p++){
+               data_type *dt = param_tbl->get_data_type(param_names[p]);
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"\t%s tmp_var_%s;\n",dt->get_cvar_type().c_str(), param_names[p].c_str() );
+                       ret += tmpstr;
+                       sprintf(tmpstr,"\t%s access_var_%s;\n",dt->get_tuple_cvar_type().c_str(), param_names[p].c_str() );
+                       ret += tmpstr;
+               }
+       }
+
+
+
+       ret += "\n\tdata_pos = ";
+       for(p=0;p<param_names.size();p++){
+               if(p>0) ret += " + ";
+               data_type *dt = param_tbl->get_data_type(param_names[p]);
+               ret += "sizeof( ";
+               ret +=  dt->get_tuple_cvar_type();
+               ret += " )";
+       }
+       ret += ";\n";
+       ret += "\tif(data_pos > sz) return 1;\n\n";
+
+
+       for(p=0;p<param_names.size();p++){
+               data_type *dt = param_tbl->get_data_type(param_names[p]);
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"\taccess_var_%s =  *( (%s *)((char *)value+pos) );\n",param_names[p].c_str(), dt->get_tuple_cvar_type().c_str() );
+                       ret += tmpstr;
+                       switch( dt->get_type() ){
+                       case v_str_t:
+//                             ret += "\ttmp_var_"+param_names[p]+".data = ntohl( tmp_var_"+param_names[p]+".data );\n";               // ntoh conversion
+//                             ret += "\ttmp_var_"+param_names[p]+".length = ntohl( tmp_var_"+param_names[p]+".length );\n";   // ntoh conversion
+                               sprintf(tmpstr,"\tif( (access_var_%s.offset) + access_var_%s.length > sz) return 1;\n",param_names[p].c_str(), param_names[p].c_str() );
+                               ret += tmpstr;
+                               sprintf(tmpstr,"\ttmp_var_%s.data = (gs_sp_t)(value) + access_var_%s.offset ;\n",param_names[p].c_str(), param_names[p].c_str() );
+                               ret += tmpstr;
+                               sprintf(tmpstr,"\ttmp_var_%s.length =  access_var_%s.length ;\n",param_names[p].c_str(), param_names[p].c_str() );
+                               ret += tmpstr;
+                       break;
+                       default:
+                               fprintf(stderr,"ERROR: parameter %s is of type %s, a buffered type, but I don't know how to unpack it as a parameter.\n",param_names[p].c_str(), dt->get_type_str().c_str() );
+                               exit(1);
+                       break;
+                       }
+//                                     First, destroy the old
+                       ret += "\tif(! initial_call)\n";
+                       sprintf(tmpstr,"\t\t%s(&(t->param_%s));\n",dt->get_buffer_destroy().c_str(),param_names[p].c_str());
+                       ret += tmpstr;
+//                                     Next, create the new.
+                       sprintf(tmpstr,"\t%s((struct FTA *)t, &(t->param_%s), &tmp_var_%s);\n", dt->get_buffer_assign_copy().c_str(), param_names[p].c_str(), param_names[p].c_str() );
+                       ret += tmpstr;
+               }else{
+//                     if(dt->needs_hn_translation()){
+//                             sprintf(tmpstr,"\tt->param_%s =  %s( *( (%s *)( (char *)value+pos) ) );\n",
+//                               param_names[p].c_str(), dt->ntoh_translation().c_str(), dt->get_cvar_type().c_str() );
+//                     }else{
+                               sprintf(tmpstr,"\tt->param_%s =  *( (%s *)( (char *)value+pos) );\n",
+                                 param_names[p].c_str(), dt->get_cvar_type().c_str() );
+//                     }
+                       ret += tmpstr;
+               }
+               sprintf(tmpstr,"\tpos += sizeof( %s );\n",dt->get_cvar_type().c_str() );
+               ret += tmpstr;
+       }
+
+//                     Register the pass-by-handle parameters
+
+       ret += "/* register and de-register the pass-by-handle parameters */\n";
+
+    int ph;
+    for(ph=0;ph<param_handle_table.size();++ph){
+               data_type pdt(param_handle_table[ph]->type_name);
+               switch(param_handle_table[ph]->val_type){
+               case cplx_lit_e:
+                       break;
+               case litval_e:
+                       break;
+               case param_e:
+                       ret += "\tif(! initial_call)\n";
+                       sprintf(tmpstr, "\t\t%s(t->handle_param_%d);\n",
+                               param_handle_table[ph]->lfta_deregistration_fcn().c_str(),ph);
+                       ret += tmpstr;
+                       sprintf(tmpstr,"\tt->handle_param_%d = %s((struct FTA *)t,",ph,param_handle_table[ph]->lfta_registration_fcn().c_str());
+                       ret += tmpstr;
+
+                       if(pdt.is_buffer_type()) ret += "&(";
+                       ret += "t->param_"+param_handle_table[ph]->param_name;
+                       if(pdt.is_buffer_type()) ret += ")";
+                       ret += ");\n";
+                       break;
+               default:
+                       sprintf(tmpstr, "INTERNAL ERROR unknown case (%d) found when processing pass-by-handle parameter table.",param_handle_table[ph]->val_type);
+                       fprintf(stderr,"%s\n",tmpstr);
+                       ret+=tmpstr;
+               }
+       }
+
+       ret+="\treturn 0;\n";
+       ret += "}\n\n";
+
+       return(ret);
+}
+
+
+
+
+string generate_fta_free(string node_name, bool is_aggr_query){
+
+       string ret="static gs_retval_t free_fta_"+node_name+"(struct FTA *f, gs_uint32_t recursive){\n";
+       ret+= "\tstruct "+generate_fta_name(node_name)+
+               " * t = (struct "+generate_fta_name(node_name)+" *) f;\n";
+       ret += "\tint i;\n";
+
+       if(is_aggr_query){
+               ret+="\tfta_aggr_flush_old_" + node_name+"(f,t->max_aggrs);\n";
+               ret+="\t/* \t\tmark all groups as old */\n";
+               ret+="\tt->generation++;\n";
+               ret+="\tt->flush_pos = 0;\n";
+                ret+="\tfta_aggr_flush_old_" + node_name+"(f,t->max_aggrs);\n";
+       }
+
+//                     Deregister the pass-by-handle parameters
+       ret += "/* de-register the pass-by-handle parameters */\n";
+    int ph;
+    for(ph=0;ph<param_handle_table.size();++ph){
+               sprintf(tmpstr, "\t%s(t->handle_param_%d);\n",
+                       param_handle_table[ph]->lfta_deregistration_fcn().c_str(),ph);
+               ret += tmpstr;
+       }
+
+
+       ret += "\treturn 0;\n}\n\n";
+       return(ret);
+}
+
+
+string generate_fta_control(string node_name, table_list *schema, bool is_aggr_query){
+       string ret="static gs_retval_t control_fta_"+node_name+"(struct FTA *f,  gs_int32_t command, gs_int32_t sz, void *value){\n";
+       ret += "\tstruct "+generate_fta_name(node_name)+" * t = (struct ";
+               ret += generate_fta_name(node_name)+" *) f;\n\n";
+       ret+="\tint i;\n";
+
+
+       ret += "\t/* temp status tuple */\n";
+       ret += "\tstruct "+generate_tuple_name(node_name)+" *tuple;\n";
+       ret += "\tgs_int32_t tuple_size;\n";
+
+
+       if(is_aggr_query){
+               ret+="\tif(command == FTA_COMMAND_FLUSH){\n";
+
+               ret+="\t\tif (!t->n_aggrs) {\n";
+               ret+="\t\t\ttuple = allocate_tuple(f, 0);\n";
+               ret+="\t\t\tif( tuple != NULL)\n";
+               ret+="\t\t\t\tpost_tuple(tuple);\n";
+
+               ret+="\t\t}else{\n";
+
+                ret+="\t\t\tfta_aggr_flush_old_" + node_name+"(f,t->max_aggrs);\n";
+               ret+="\t\t\t/* \t\tmark all groups as old */\n";
+               ret +="\t\tt->generation++;\n";
+               ret += "//\tmarking groups old should happen implicitly by advancing the generation.\n";
+               ret+="//\t\t\tfor (i = 0; i < t->bitmap_size; ++i)\n";
+               ret+="//\t\t\t\tt->aggr_table_bitmap[i] &= 0xAAAAAAAA;\n";
+               ret+="\t\t\tt->flush_pos = 0;\n";
+                ret+="\t\t\tfta_aggr_flush_old_" + node_name+"(f,t->max_aggrs);\n";
+               ret+="\t\t}\n";
+
+               ret+="\t}\n";
+       }
+       if(param_tbl->size() > 0){
+               ret+=
+"\tif(command == FTA_COMMAND_LOAD_PARAMS){\n"
+"\t\tif(load_params_"+node_name+"(t, sz, value, 0))\n"
+"#ifndef LFTA_IN_NIC\n"
+"\t\t\tfprintf(stderr,\"WARNING: parameter passed to lfta "+node_name+" is too small, ignored.\\n\");\n"
+"#else\n"
+"\t\t{}\n"
+"#endif\n"
+"\t}\n";
+       }
+       ret+=
+"\tif(command == FTA_COMMAND_SET_SAMPLING_RATE){\n"
+"\t\tmemcpy(&t->sampling_rate, value, sizeof(gs_float_t));\n"
+"\t}\n\n";
+
+
+       ret += "\tif(command == FTA_COMMAND_FILE_DONE ){\n";
+
+       if(is_aggr_query){
+               ret+="\t\tif (t->n_aggrs) {\n";
+               ret+="\t\t\tfta_aggr_flush_old_" + node_name+"(f,t->max_aggrs);\n";
+               ret+="\t\t\t/* \t\tmark all groups as old */\n";
+               ret +="\t\tt->generation++;\n";
+               ret += "//\tmarking groups old should happen implicitly by advancing the generation.\n";
+               ret+="//\t\t\tfor (i = 0; i < t->bitmap_size; ++i)\n";
+               ret+="//\t\t\t\tt->aggr_table_bitmap[i] &= 0xAAAAAAAA;\n";
+               ret+="\t\t\tt->flush_pos = 0;\n";
+               ret+="\t\t\tfta_aggr_flush_old_" + node_name+"(f,t->max_aggrs);\n";
+               ret+="\t\t}\n";
+       }
+
+       ret += "\t\ttuple_size = sizeof( struct "+generate_tuple_name(node_name)+");\n";
+       ret += "\t\ttuple = allocate_tuple(f, tuple_size );\n";
+       ret += "\t\tif( tuple == NULL)\n\t\treturn 1;\n";
+
+       /* mark tuple as EOF_TUPLE */
+       ret += "\n\t\t/* Mark tuple as eof_tuple */\n";
+       ret += "\t\ttuple->tuple_type = EOF_TUPLE;\n";
+       ret += "\t\tpost_tuple(tuple);\n";
+       ret += "\t}\n";
+
+       ret += "\treturn 0;\n}\n\n";
+
+       return(ret);
+}
+
+string generate_fta_clock(string node_name, table_list *schema, unsigned time_corr, bool is_aggr_query){
+       string ret="static gs_retval_t clock_fta_"+node_name+"(struct FTA *f){\n";
+       ret += "\tstruct "+generate_fta_name(node_name)+" * t = (struct ";
+               ret += generate_fta_name(node_name)+" *) f;\n\n";
+
+       ret += "\t/* Create a temp status tuple */\n";
+       ret += "\tstruct "+generate_tuple_name(node_name)+" *tuple;\n";
+       ret += "\tgs_int32_t tuple_size;\n";
+       ret += "\tunsigned int i;\n";
+       ret += "\ttime_t cur_time;\n";
+       ret += "\tint time_advanced;\n";
+       ret += "\tstruct fta_stat stats;\n";
+
+
+
+       /* copy the last seen values of temporal attributes */
+       col_id_set temp_cids;           //      col ids of temp attributes in select clause
+
+
+       /* HACK: in order to reuse the SE generation code, we need to copy
+        * the last values of the temp attributes into new variables
+        * which have names unpack_var_XXX_XXX
+        */
+
+       int s, g;
+       col_id_set::iterator csi;
+
+       for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if (sdt->is_temporal()) {
+                       gather_se_col_ids(sl_list[s],temp_cids, gb_tbl);
+               }
+       }
+
+       for(csi=temp_cids.begin(); csi != temp_cids.end();++csi){
+               int tblref = (*csi).tblvar_ref;
+               int schref = (*csi).schema_ref;
+               string field = (*csi).field;
+               data_type dt(schema->get_type_name(schref,field), schema->get_modifier_list(schref,field));
+               sprintf(tmpstr,"\t%s unpack_var_%s_%d;\n", dt.get_cvar_type().c_str(), field.c_str(), tblref);
+               ret += tmpstr;
+       }
+
+       if (is_aggr_query) {
+               for(g=0;g<gb_tbl->size();g++){
+                       data_type *gdt = gb_tbl->get_data_type(g);
+                       if(gdt->is_temporal()){
+                               sprintf(tmpstr,"\t%s gb_attr_%d;\n",gb_tbl->get_data_type(g)->get_cvar_type().c_str(),g);
+                               ret += tmpstr;
+                               data_type *gdt = gb_tbl->get_data_type(g);
+                               if(gdt->is_buffer_type()){
+                               sprintf(tmpstr,"\t%s gb_attr_tmp%d;\n",gb_tbl->get_data_type(g)->get_cvar_type().c_str(),g);
+                               ret += tmpstr;
+                               }
+                       }
+               }
+       }
+       ret += "\n";
+
+       ret += "\ttime_advanced = 0;\n";
+
+       for(csi=temp_cids.begin(); csi != temp_cids.end();++csi){
+               int tblref = (*csi).tblvar_ref;
+               int schref = (*csi).schema_ref;
+               string field = (*csi).field;
+               data_type dt(schema->get_type_name(schref,field), schema->get_modifier_list(schref,field));
+
+               // update last seen value with the value seen
+               ret += "\t#ifdef PREFILTER_DEFINED\n";
+               sprintf(tmpstr,"\tif (prefilter_temp_vars.unpack_var_%s_%d > t->last_%s_%d) {\n\t\tt->last_%s_%d = prefilter_temp_vars.unpack_var_%s_%d;\n",
+                       field.c_str(), tblref, field.c_str(), tblref, field.c_str(), tblref, field.c_str(), tblref);
+               ret += tmpstr;
+               ret += "\t\ttime_advanced = 1;\n\t}\n";
+               ret += "\t#endif\n";
+
+                // we need to pay special attention to time fields
+                if (field == "time" || field == "timestamp"){
+                        ret += "\tcur_time = time(&cur_time);\n";
+
+                        if (field == "time") {
+                               sprintf(tmpstr,"\tif (!gscp_blocking_mode() && (t->last_time_%d < (cur_time - %d))) {\n",
+                                       tblref, time_corr);
+                               ret += tmpstr;
+                                sprintf(tmpstr,"\t\tunpack_var_%s_%d = t->last_%s_%d = cur_time - %d;\n",
+                                        field.c_str(), tblref, field.c_str(), tblref, time_corr);
+                        } else {
+                               sprintf(tmpstr,"\tif (!gscp_blocking_mode() && ((gs_uint32_t)(t->last_%s_%d>>32) < (cur_time - %d))) {\n",
+                                       field.c_str(), tblref, time_corr);
+                               ret += tmpstr;
+                                sprintf(tmpstr,"\t\tunpack_var_%s_%d = t->last_%s_%d = ((gs_uint64_t)(cur_time - %d))<<32;\n",
+                                        field.c_str(), tblref, field.c_str(), tblref, time_corr);
+                        }
+                        ret += tmpstr;
+
+                        ret += "\t\ttime_advanced = 1;\n";
+                        ret += "\t}\n";
+
+                        sprintf(tmpstr,"\telse\n\t\tunpack_var_%s_%d = t->last_%s_%d;\n",
+                                field.c_str(), tblref, field.c_str(), tblref);
+                        ret += tmpstr;
+               } else {
+                       sprintf(tmpstr,"\tunpack_var_%s_%d = t->last_%s_%d;\n",
+                               field.c_str(), tblref, field.c_str(), tblref);
+                       ret += tmpstr;
+               }
+       }
+
+       // for aggregation lftas we need to check if the time was advanced beyond the current epoch
+       if (is_aggr_query) {
+
+               string change_test;
+               bool first_one = true;
+               for(g=0;g<gb_tbl->size();g++){
+                 data_type *gdt = gb_tbl->get_data_type(g);
+                 if(gdt->is_temporal()){
+//                                     To perform the test, first need to compute the value
+//                                     of the temporal gb attrs.
+                         if(gdt->is_buffer_type()){
+       //                              NOTE : if the SE defining the gb is anything
+       //                              other than a ref to a variable, this will generate
+       //                              illegal code.  To be resolved with Spatch.
+                               sprintf(tmpstr,"\tgb_attr_tmp%d = %s;\n",
+                                       g, generate_se_code(gb_tbl->get_def(g),schema).c_str() );
+                               ret+=tmpstr;
+                               sprintf(tmpstr,"\t%s(f, &gb_attr_%d, &gb_attr_tmp%d);\n",
+                                       gdt->get_buffer_assign_copy().c_str(), g, g);
+                         }else{
+                               sprintf(tmpstr,"\tgb_attr_%d = %s;\n",g,generate_se_code(gb_tbl->get_def(g),schema).c_str());
+                         }
+                         ret += tmpstr;
+
+                         sprintf(tmpstr,"t->last_gb_%d",g);   string lhs_op = tmpstr;
+                         sprintf(tmpstr,"gb_attr_%d",g);   string rhs_op = tmpstr;
+                         if(first_one){first_one = false;} else {change_test.append(") && (");}
+                         change_test.append(generate_equality_test(lhs_op, rhs_op, gdt));
+                 }
+               }
+
+               ret += "\n\tif( time_advanced && !( (";
+               ret += change_test;
+               ret += ") ) ){\n";
+
+               ret += "\n/*\t\tFlush the aggregates if the temporal gb attrs have changed.\t*/\n";
+               ret += "\t\tif(t->flush_pos<t->max_aggrs) \n";
+               ret += "\t\t\tfta_aggr_flush_old_"+node_name+"(f,t->max_aggrs);\n";
+
+               ret += "\t\t/* \t\tmark all groups as old */\n";
+               ret +="\t\tt->generation++;\n";
+               ret += "//\tmarking groups old should happen implicitly by advancing the generation.\n";
+               ret += "//\t\tfor (i = 0; i < t->bitmap_size; ++i)\n";
+               ret += "//\t\t\tt->aggr_table_bitmap[i] &= 0xAAAAAAAA;\n";
+               ret += "\t\tt->flush_pos = 0;\n";
+
+               for(g=0;g<gb_tbl->size();g++){
+                     data_type *gdt = gb_tbl->get_data_type(g);
+                     if(gdt->is_temporal()){
+                       sprintf(tmpstr,"\t\tt->flush_start_gb_%d = gb_attr_%d;\n",g,g);                 ret += tmpstr;
+                       sprintf(tmpstr,"\t\tt->last_gb_%d = gb_attr_%d;\n",g,g);                        ret += tmpstr;
+                     }
+                }
+               ret += "\t}\n\n";
+
+       }
+
+       ret += "\ttuple_size = sizeof( struct "+generate_tuple_name(node_name)+") + sizeof(gs_uint64_t) + sizeof(struct fta_stat);\n";
+       ret += "\ttuple = allocate_tuple(f, tuple_size );\n";
+       ret += "\tif( tuple == NULL)\n\t\treturn 1;\n";
+
+
+       for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if(sdt->is_temporal()){
+
+                       if (sl_list[s]->is_gb()) {
+                               sprintf(tmpstr,"\tt->last_flushed_gb_%d = (t->n_aggrs) ? t->last_flushed_gb_%d : %s;\n",sl_list[s]->get_gb_ref(), sl_list[s]->get_gb_ref(), generate_se_code(sl_list[s],schema).c_str());
+                               ret += tmpstr;
+                       }
+
+                       sprintf(tmpstr,"\ttuple->tuple_var%d = ",s);
+                       ret += tmpstr;
+//                     if(sdt->needs_hn_translation())
+//                             ret += sdt->hton_translation() +"( ";
+                       if (sl_list[s]->is_gb()) {
+                               sprintf(tmpstr, "t->last_flushed_gb_%d",sl_list[s]->get_gb_ref());
+                               ret += tmpstr;
+                       } else{
+                               ret += generate_se_code(sl_list[s],schema);
+                       }
+//                     if(sdt->needs_hn_translation())
+//                             ret += " )";
+                       ret += ";\n";
+               }
+       }
+
+       /* mark tuple as temporal */
+       ret += "\n\t/* Mark tuple as temporal */\n";
+       ret += "\ttuple->tuple_type = TEMPORAL_TUPLE;\n";
+
+       ret += "\n\t/* Copy trace id */\n";
+       ret += "\tmemcpy((gs_sp_t)tuple+sizeof( struct "+generate_tuple_name(node_name)+"), &t->trace_id, sizeof(gs_uint64_t));\n\n";
+
+       ret += "\n\t/* Populate runtime stats */\n";
+       ret += "\tstats.ftaid = f->ftaid;\n";
+       ret += "\tstats.in_tuple_cnt = t->in_tuple_cnt;\n";
+       ret += "\tstats.out_tuple_cnt = t->out_tuple_cnt;\n";
+       ret += "\tstats.out_tuple_sz = t->out_tuple_sz;\n";
+       ret += "\tstats.accepted_tuple_cnt = t->accepted_tuple_cnt;\n";
+       ret += "\tstats.cycle_cnt = t->cycle_cnt;\n";
+       ret += "\tstats.collision_cnt = t->collision_cnt;\n";
+       ret += "\tstats.eviction_cnt = t->eviction_cnt;\n";
+       ret += "\tstats.sampling_rate    = t->sampling_rate;\n";
+
+       ret += "\n#ifdef LFTA_PROFILE\n";
+       ret += "\n\t/* Print stats */\n";
+       ret += "\tfprintf(stderr, \"STATS " + node_name + " \");\n";
+       ret += "\tfprintf(stderr, \"in_tuple_cnt= %u \", t->in_tuple_cnt);\n";
+       ret += "\tfprintf(stderr, \"out_tuple_cnt= %u \", t->out_tuple_cnt);\n";
+       ret += "\tfprintf(stderr, \"out_tuple_sz= %u \", t->out_tuple_sz);\n";
+       ret += "\tfprintf(stderr, \"accepted_tuple_cnt= %u \", t->accepted_tuple_cnt);\n";
+       ret += "\tfprintf(stderr, \"cycle_cnt= %llu \", t->cycle_cnt);\n";
+       ret += "\tfprintf(stderr, \"cycle_per_in_tuple= %lf \", ((double)t->cycle_cnt)/((double)t->in_tuple_cnt));\n";
+       ret += "\tfprintf(stderr, \"collision_cnt= %d\\n\", t->collision_cnt);\n\n";
+       ret += "\tfprintf(stderr, \"eviction_cnt= %d\\n\", t->eviction_cnt);\n\n";
+       ret += "\n#endif\n";
+
+
+       ret += "\n\t/* Copy stats */\n";
+       ret += "\tmemcpy((gs_sp_t)tuple+sizeof( struct "+generate_tuple_name(node_name)+") + sizeof(gs_uint64_t), &stats, sizeof(fta_stat));\n\n";
+       ret+="\tpost_tuple(tuple);\n";
+
+       ret += "\n\t/* Send a heartbeat message to clearinghouse */\n";
+       ret += "\tfta_heartbeat(f->ftaid, t->trace_id++, 1, &stats);\n";
+
+       ret += "\n\t/* Reset runtime stats */\n";
+       ret += "\tt->in_tuple_cnt = 0;\n";
+       ret += "\tt->out_tuple_cnt = 0;\n";
+       ret += "\tt->out_tuple_sz = 0;\n";
+       ret += "\tt->accepted_tuple_cnt = 0;\n";
+       ret += "\tt->cycle_cnt = 0;\n";
+       ret += "\tt->collision_cnt = 0;\n";
+       ret += "\tt->eviction_cnt = 0;\n";
+
+       ret += "\treturn 0;\n}\n\n";
+
+       return(ret);
+}
+
+
+//             accept processing before the where clause,
+//             do flush processwing.
+string generate_aggr_accept_prelim(qp_node *fs, string node_name, table_list *schema,   col_id_set &unpacked_cids, string &temporal_flush){
+       int s;
+
+//             Slow flush
+  string ret="\n/*\tslow flush\t*/\n";
+  string slow_flush_str = fs->get_val_of_def("slow_flush");
+  int n_slow_flush = atoi(slow_flush_str.c_str());
+  if(n_slow_flush <= 0) n_slow_flush = 2;
+  if(n_slow_flush > 1){
+       ret += "\tt->flush_ctr++;\n";
+       ret += "\tif(t->flush_ctr >= "+int_to_string(n_slow_flush)+"){\n";
+       ret += "\t\tt->flush_ctr = 0;\n";
+    ret+="\t\tif(t->flush_pos<t->max_aggrs) fta_aggr_flush_old_"+node_name+"(f,1);\n";
+       ret += "\t}\n\n";
+  }else{
+    ret+="\tif(t->flush_pos<t->max_aggrs) fta_aggr_flush_old_"+node_name+"(f,1);\n\n";
+  }
+
+
+       string change_test;
+       bool first_one = true;
+       int g;
+    col_id_set flush_cids;             //      col ids accessed when computing flush variables.
+                                                       //  unpack them at temporal flush test time.
+    temporal_flush = "";
+
+
+       for(g=0;g<gb_tbl->size();g++){
+                 data_type *gdt = gb_tbl->get_data_type(g);
+                 if(gdt->is_temporal()){
+                         gather_se_col_ids(gb_tbl->get_def(g), flush_cids, gb_tbl);
+
+//                                     To perform the test, first need to compute the value
+//                                     of the temporal gb attrs.
+                         if(gdt->is_buffer_type()){
+       //                              NOTE : if the SE defining the gb is anything
+       //                              other than a ref to a variable, this will generate
+       //                              illegal code.  To be resolved with Spatch.
+                               sprintf(tmpstr,"\tgb_attr_tmp%d = %s;\n",
+                                       g, generate_se_code(gb_tbl->get_def(g),schema).c_str() );
+                               temporal_flush += tmpstr;
+                               sprintf(tmpstr,"\t%s(f, &gb_attr_%d, &gb_attr_tmp%d);\n",
+                                       gdt->get_buffer_assign_copy().c_str(), g, g);
+                         }else{
+                               sprintf(tmpstr,"\tgb_attr_%d = %s;\n",g,generate_se_code(gb_tbl->get_def(g),schema).c_str());
+                         }
+                         temporal_flush += tmpstr;
+//                                     END computing the value of the temporal GB attr.
+
+
+                         sprintf(tmpstr,"t->last_gb_%d",g);   string lhs_op = tmpstr;
+                         sprintf(tmpstr,"gb_attr_%d",g);   string rhs_op = tmpstr;
+                         if(first_one){first_one = false;} else {change_test.append(") && (");}
+                         change_test += generate_equality_test(lhs_op, rhs_op, gdt);
+                 }
+       }
+       if(!first_one){         // will be false iff. there is a temporal GB attribute
+                 temporal_flush += "\n/*\t\tFlush the aggregates if the temporal gb attrs have changed.\t*/\n";
+                 temporal_flush += "\tif( !( (";
+                 temporal_flush += change_test;
+                 temporal_flush += ") ) ){\n";
+
+//               temporal_flush+="\t\tif(t->flush_pos<t->max_aggrs) fta_aggr_flush_old_"+node_name+"(f,t->max_aggrs);\n";
+                 temporal_flush+="\t\tif(t->flush_pos<t->max_aggrs){ \n";
+                 temporal_flush+="\t\t\tfta_aggr_flush_old_"+node_name+"(f,t->max_aggrs);\n";
+                 temporal_flush+="\t\t}\n";
+                 temporal_flush+="\t\t/* \t\tmark all groups as old */\n";
+                 temporal_flush+="\t\tt->generation++;\n";
+                 temporal_flush+="\t\tt->flush_pos = 0;\n";
+
+
+//                             Now set the saved temporal value of the gb to the
+//                             current value of the gb.  Only for simple types,
+//                             not for buffer types -- but the strings are not
+//                             temporal in any case.
+
+                       for(g=0;g<gb_tbl->size();g++){
+                         data_type *gdt = gb_tbl->get_data_type(g);
+                         if(gdt->is_temporal()){
+                                 if(gdt->is_buffer_type()){
+
+                                       fprintf(stderr,"ERROR : can't handle temporal buffer types, ignoring in buffer flush control.\n");
+                                 }else{
+                                       sprintf(tmpstr,"\t\tt->flush_start_gb_%d = gb_attr_%d;\n",g,g);
+                                       temporal_flush += tmpstr;
+                                       sprintf(tmpstr,"\t\tt->last_gb_%d = gb_attr_%d;\n",g,g);
+                                       temporal_flush += tmpstr;
+                                 }
+                               }
+                       }
+                 temporal_flush += "\t}\n\n";
+       }
+
+// Unpack all the temporal attributes referenced in select clause
+// and update the last value of the attribute
+       col_id_set temp_cids;           //      col ids of temp attributes in select clause
+       col_id_set::iterator csi;
+
+       for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if (sdt->is_temporal()) {
+                       gather_se_col_ids(sl_list[s],temp_cids, gb_tbl);
+               }
+       }
+
+       for(csi=temp_cids.begin(); csi != temp_cids.end();++csi){
+               if(unpacked_cids.count((*csi)) == 0){
+                       int tblref = (*csi).tblvar_ref;
+                       int schref = (*csi).schema_ref;
+                       string field = (*csi).field;
+                       ret += generate_unpack_code(tblref,schref,field,schema,node_name);
+/*
+                       data_type dt(schema->get_type_name(schref,field), schema->get_modifier_list(schref,field));
+                       sprintf(tmpstr,"\tretval =  %s(p, &unpack_var_%s_%d);\n",
+                               schema->get_fcn(schref,field).c_str(), field.c_str(), tblref);
+                       ret += tmpstr;
+                       ret += "\tif(retval) return 1;\n";
+*/
+                       sprintf(tmpstr,"\tt->last_%s_%d = unpack_var_%s_%d;\n", field.c_str(), tblref, field.c_str(), tblref);
+                       ret += tmpstr;
+
+                       unpacked_cids.insert( (*csi) );
+               }
+       }
+
+
+//                             Do the flush here if this is a real_time query
+       string rt_level = fs->get_val_of_def("real_time");
+       if(rt_level != "" && temporal_flush != ""){
+               for(csi=flush_cids.begin(); csi != flush_cids.end();++csi){
+                       if(unpacked_cids.count((*csi)) == 0){
+                       int tblref = (*csi).tblvar_ref;
+                       int schref = (*csi).schema_ref;
+                       string field = (*csi).field;
+                               ret += generate_unpack_code(tblref,schref,field,schema,node_name);
+/*
+                               sprintf(tmpstr,"\tretval =  %s(p, &unpack_var_%s_%d);\n",
+                               schema->get_fcn(schref,field).c_str(), field.c_str(), tblref);
+                       ret += tmpstr;
+                       ret += "\tif(retval) return 1;\n";
+*/
+                               unpacked_cids.insert( (*csi) );
+                       }
+               }
+               ret += temporal_flush;
+       }
+
+       return ret;
+ }
+
+string generate_sel_accept_body(qp_node *fs, string node_name, table_list *schema){
+
+int p,s;
+string ret;
+
+///////////////                        Processing for filter-only query
+
+//                     test passed : create the tuple, then assign to it.
+         ret += "/*\t\tCreate and post the tuple\t*/\n";
+
+//                     Unpack partial fcns ref'd by the select clause.
+//                     Its a kind of a WHERE clause ...
+  for(p=sl_fcns_start;p<sl_fcns_end;p++){
+       if(fcn_ref_cnt[p] > 1){
+               ret += "\tif(fcn_ref_cnt_"+int_to_string(p)+"==0){\n";
+       }
+       if(is_partial_fcn[p]){
+               ret += unpack_partial_fcn(partial_fcns[p], p, schema);
+               ret += "\tif(retval) goto end;\n";
+       }
+       if(fcn_ref_cnt[p] > 1){
+               if(!is_partial_fcn[p]){
+                       ret += "\t\tpartial_fcn_result_"+int_to_string(p)+"="+generate_cached_fcn(partial_fcns[p],schema)+";\n";
+               }
+               ret += "\t\tfcn_ref_cnt_"+int_to_string(p)+"=1;\n";
+               ret += "\t}\n";
+       }
+  }
+
+  // increment the counter of accepted tuples
+  ret += "\n\t#ifdef LFTA_STATS\n";
+  ret += "\n\tt->accepted_tuple_cnt++;\n\n";
+  ret += "\t#endif\n\n";
+
+//                     First, compute the size of the tuple.
+
+//                     Unpack any BUFFER type selections into temporaries
+//                     so that I can compute their size and not have
+//                     to recompute their value during tuple packing.
+//                     I can use regular assignment here because
+//                     these temporaries are non-persistent.
+
+         for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if(sdt->is_buffer_type()){
+                       sprintf(tmpstr,"\tselvar_%d = ",s);
+                       ret += tmpstr;
+                       ret += generate_se_code(sl_list[s],schema);
+                       ret += ";\n";
+               }
+         }
+
+
+//             The size of the tuple is the size of the tuple struct plus the
+//             size of the buffers to be copied in.
+
+         ret+="\ttuple_size = sizeof( struct "+generate_tuple_name(node_name)+")";
+         for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if(sdt->is_buffer_type()){
+                       sprintf(tmpstr," + %s(&selvar_%d)", sdt->get_buffer_size().c_str(),s);
+                       ret += tmpstr;
+               }
+         }
+         ret += ";\n";
+
+
+         ret += "\ttuple = allocate_tuple(f, tuple_size );\n";
+         ret += "\tif( tuple == NULL)\n\t\tgoto end;\n";
+
+//                     Test passed, make assignments to the tuple.
+
+         ret += "\ttuple_pos = sizeof( struct "+generate_tuple_name(node_name)+");\n";
+
+//                     Mark tuple as REGULAR_TUPLE
+         ret += "\ttuple->tuple_type = REGULAR_TUPLE;\n";
+
+
+         for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if(sdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t%s(&(tuple->tuple_var%d), &selvar_%d, (char *)tuple, ((char *)tuple)+tuple_pos);\n", sdt->get_buffer_tuple_copy().c_str(),s, s);
+                       ret += tmpstr;
+                       sprintf(tmpstr,"\ttuple_pos += %s(&selvar_%d);\n", sdt->get_buffer_size().c_str(), s);
+                       ret += tmpstr;
+               }else{
+                       sprintf(tmpstr,"\ttuple->tuple_var%d = ",s);
+                       ret += tmpstr;
+//                     if(sdt->needs_hn_translation())
+//                             ret += sdt->hton_translation() +"( ";
+                       ret += generate_se_code(sl_list[s],schema);
+//                     if(sdt->needs_hn_translation())
+//                             ret += ") ";
+                       ret += ";\n";
+               }
+         }
+
+//             Generate output.
+
+         ret += "\tpost_tuple(tuple);\n";
+
+//             Increment the counter of posted tuples
+  ret += "\n\t#ifdef LFTA_STATS\n";
+  ret += "\tt->out_tuple_cnt++;\n";
+  ret+="\tt->out_tuple_sz+=tuple_size;\n";
+  ret += "\t#endif\n\n";
+
+
+
+       return ret;
+}
+
+string generate_fj_accept_body(filter_join_qpn *fs, string node_name,col_id_set &unpacked_cids,ext_fcn_list *Ext_fcns, table_list *schema){
+
+int p,s,w;
+string ret;
+
+//                     Get parameters
+       unsigned int window_len = fs->temporal_range;
+       unsigned int n_bloom = 11;
+       string n_bloom_str = fs->get_val_of_def("num_bloom");
+       int tmp_n_bloom = atoi(n_bloom_str.c_str());
+       if(tmp_n_bloom>0)
+               n_bloom = tmp_n_bloom+1;
+       float bloom_width = (window_len+1.0)/(1.0*n_bloom-1);
+       sprintf(tmpstr,"%f",bloom_width);
+       string bloom_width_str = tmpstr;
+
+       if(window_len < n_bloom){
+               n_bloom = window_len+1;
+               bloom_width_str = "1";
+       }
+
+
+//             Grab the current window time
+       scalarexp_t winvar(fs->temporal_var);
+       ret += "\tcurr_fj_ts = "+generate_se_code(&winvar,schema)+";\n";
+
+       int bf_exp_size = 12;  // base-2 log of number of bits
+       string bloom_len_str = fs->get_val_of_def("bloom_size");
+       int tmp_bf_exp_size = atoi(bloom_len_str.c_str());
+       if(tmp_bf_exp_size > 3 && tmp_bf_exp_size < 32){
+               bf_exp_size = tmp_bf_exp_size;
+       }
+       int bf_bit_size = 1 << bf_exp_size;
+       int bf_byte_size = bf_bit_size / (8*sizeof(char));
+
+       unsigned int ht_size = 4096;
+       string ht_size_s = fs->get_val_of_def("aggregate_slots");
+       int tmp_ht_size = atoi(ht_size_s.c_str());
+       if(tmp_ht_size > 1024){
+               unsigned int hs = 1;            // make it power of 2
+               while(tmp_ht_size){
+                       hs =hs << 1;
+                       tmp_ht_size = tmp_ht_size >> 1;
+               }
+               ht_size = hs;
+       }
+
+       int i, bf_mask = 0;
+       if(fs->use_bloom){
+               for(i=0;i<bf_exp_size;i++)
+                       bf_mask = (bf_mask << 1) | 1;
+       }else{
+               for(i=ht_size;i>1;i=i>>1)
+                       bf_mask = (bf_mask << 1) | 1;
+       }
+
+/*
+printf("n_bloom=%d, window_len=%d, bloom_width=%s, bf_exp_size=%d, bf_bit_size=%d, bf_byte_size=%d, ht_size=%d, ht_size_s=%s, bf_mask=%d\n",
+       n_bloom,
+       window_len,
+       bloom_width_str.c_str(),
+       bf_exp_size,
+       bf_bit_size,
+       bf_byte_size,
+       ht_size,
+       ht_size_s.c_str(),
+       bf_mask);
+*/
+
+
+
+
+//             If this is a bloom-filter fj, first test if the
+//             bloom filter needs to be advanced.
+//             SET_BF_EMPTY(table,number of bloom filters,bloom filter index,bit index)
+//             t->bf_size : number of bits in bloom filter
+       if(fs->use_bloom){
+               ret +=
+"//                    Clean out old bloom filters if needed.\n"
+"      if(t->first_exec){\n"
+"              t->first_exec = 0;\n"
+"              t->last_bin = (long long int)(curr_fj_ts/"+bloom_width_str+");\n"
+"              t->last_bloom_pos = t->last_bin % "+int_to_string(n_bloom)+";\n"
+"      }else{\n"
+"              curr_bin = (long long int)(curr_fj_ts/"+bloom_width_str+");\n"
+"              if(curr_bin != t->last_bin){\n"
+"                      for(the_bin=t->last_bin+1;the_bin<=curr_bin;the_bin++){\n"
+"                              t->last_bloom_pos++;\n"
+"                              if(t->last_bloom_pos >= "+int_to_string(n_bloom)+")\n"
+"                                      t->last_bloom_pos = 0;\n"
+"                              tmp_i = t->last_bloom_pos;\n"
+"                              for(j=0;j<"+int_to_string(bf_bit_size)+";j++){\n"
+"                                      SET_BF_EMPTY(t->bf_table, "+int_to_string(n_bloom)+", tmp_i,j);\n"
+"                              }\n"
+"                      }\n"
+"              }\n"
+"              t->last_bin = curr_bin;\n"
+"      }\n"
+;
+       }
+
+
+//-----------------------------------------------------------------
+//             First, determine whether to do S (filter stream) processing.
+
+       ret +=
+"//            S (filtering stream) predicate, should it be processed?\n"
+"\n"
+;
+// Sort S preds based on cost.
+       vector<cnf_elem *> s_filt = fs->pred_t1;
+       col_id_set::iterator csi;
+  if(s_filt.size() > 0){
+
+//                     Unpack fields ref'd in the S pred
+       for(w=0;w<s_filt.size();++w){
+               col_id_set this_pred_cids;
+               gather_pr_col_ids(s_filt[w]->pr, this_pred_cids, gb_tbl);
+               for(csi=this_pred_cids.begin();csi!=this_pred_cids.end();++csi){
+                       if(unpacked_cids.count( (*csi) ) == 0){
+                               int tblref = (*csi).tblvar_ref;
+                               int schref = (*csi).schema_ref;
+                               string field = (*csi).field;
+                               ret += generate_unpack_code(tblref,schref,field,schema,node_name,"end_s");
+                               unpacked_cids.insert( (*csi) );
+                       }
+               }
+       }
+
+
+//             Sort by evaluation cost.
+//             First, estimate evaluation costs
+//             Eliminate predicates covered by the prefilter (those in s_pids).
+//             I need to do it before the sort becuase the indices refer
+//             to the position in the unsorted list.
+       vector<cnf_elem *> tmp_wh;
+       for(w=0;w<s_filt.size();++w){
+               compute_cnf_cost(s_filt[w],Ext_fcns);
+               tmp_wh.push_back(s_filt[w]);
+       }
+       s_filt = tmp_wh;
+
+       sort(s_filt.begin(), s_filt.end(), compare_cnf_cost());
+
+//             Now generate the predicates.
+       for(w=0;w<s_filt.size();++w){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.(cost %d)\n",w,s_filt[w]->cost);
+               ret += tmpstr;
+
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pfcn_refs;
+               collect_partial_fcns_pr(s_filt[w]->pr, pfcn_refs);
+//                     Since set<..> is a "Sorted Associative Container",
+//                     we can walk through it in sorted order by walking from
+//                     begin() to end().  (and the partial fcns must be
+//                     evaluated in this order).
+               set<int>::iterator si;
+               string pf_preds;
+               for(si=pfcn_refs.begin();si!=pfcn_refs.end();++si){
+                       if(fcn_ref_cnt[(*si)] > 1){
+                               ret += "\tif(fcn_ref_cnt_"+int_to_string((*si))+"==0){\n";
+                       }
+                       if(is_partial_fcn[(*si)]){
+                               ret += "\t"+unpack_partial_fcn(partial_fcns[(*si)], (*si), schema);
+                               ret += "\t\tif(retval) goto end_s;\n";
+                       }
+                       if(fcn_ref_cnt[(*si)] > 1){
+                               if(!is_partial_fcn[(*si)]){
+                                       ret += "\t\tpartial_fcn_result_"+int_to_string((*si))+"="+generate_cached_fcn(partial_fcns[(*si)],schema)+";\n";
+//             Testing for S is a side branch.
+//             I don't want a cacheable partial function to be
+//             marked as evaluated.  Therefore I mark the function
+//             as evalauted ONLY IF it is not partial.
+                                       ret += "\t\tfcn_ref_cnt_"+int_to_string((*si))+"=1;\n";
+                               }
+                               ret += "\t}\n";
+                       }
+               }
+
+               ret += "\tif( !("+generate_predicate_code(s_filt[w]->pr,schema)+
+                               ") ) goto end_s;\n";
+       }
+  }else{
+         ret += "\n\n/*\t\t (no predicate to test)\t*/\n\n";
+  }
+
+       for(p=0;p<fs->hash_eq.size();++p)
+               ret += "\t\ts_equijoin_"+int_to_string(p)+" = "+generate_se_code(fs->hash_eq[p]->pr->get_right_se(),schema)+";\n";
+
+       if(fs->use_bloom){
+//                     First, generate the S scalar expressions in the hash_eq
+
+//                     Iterate over the bloom filters
+               for(i=0;i<3;i++){
+                       ret += "\t\tbucket=0;\n";
+                       for(p=0;p<fs->hash_eq.size();++p){
+                               ret +=
+"              bucket ^= (("+hash_nums[(i*fs->hash_eq.size()+p)%NRANDS]+" * lfta_"+
+       fs->hash_eq[p]->pr->get_right_se()->get_data_type()->get_type_str()+
+       +"_to_hash(s_equijoin_"+int_to_string(p)+"))>>32);\n";
+                       }
+//             SET_BF_BIT(table,number of bloom filters,bloom filter index,bit index)
+                               ret +=
+"              bucket &= "+int_to_string(bf_mask)+";\n"
+"              SET_BF_BIT(t->bf_table,"+int_to_string(n_bloom)+",t->last_bloom_pos,bucket);\n"
+"\n"
+;
+               }
+       }else{
+               ret += "\t\tbucket=0;\n";
+               for(p=0;p<fs->hash_eq.size();++p){
+                       ret +=
+"              bucket ^= (("+hash_nums[(i*fs->hash_eq.size()+p)%NRANDS]+" * lfta_"+
+       fs->hash_eq[p]->pr->get_right_se()->get_data_type()->get_type_str()+
+       +"_to_hash(s_equijoin_"+int_to_string(p)+"))>>32);\n";
+               }
+               ret +=
+"              bucket &= "+int_to_string(bf_mask)+";\n"
+"              bucket1 = (bucket + 1) & "+int_to_string(bf_mask)+";\n"
+;
+//                     Try the first bucket
+               ret += "\t\tif(";
+               for(p=0;p<fs->hash_eq.size();++p){
+                       if(p>0) ret += " && ";
+//                     ret += "t->join_table[bucket].key_var"+int_to_string(p)+
+//                                     " == s_equijoin_"+int_to_string(p);
+                       data_type *hdt = fs->hash_eq[p]->pr->get_right_se()->get_data_type();
+                       string lhs_op = "t->join_table[bucket].key_var"+int_to_string(p);
+                       string rhs_op = "s_equijoin_"+int_to_string(p);
+                       ret += generate_equality_test(lhs_op,rhs_op,hdt);
+               }
+               ret += "){\n\t\t\tthe_bucket = bucket;\n";
+               ret += "\t\t}else {if(";
+               for(p=0;p<fs->hash_eq.size();++p){
+                       if(p>0) ret += " && ";
+//                     ret += "t->join_table[bucket1].key_var"+int_to_string(p)+
+//                                     " == s_equijoin_"+int_to_string(p);
+                       data_type *hdt = fs->hash_eq[p]->pr->get_right_se()->get_data_type();
+                       string lhs_op = "t->join_table[bucket].key_var"+int_to_string(p);
+                       string rhs_op = "s_equijoin_"+int_to_string(p);
+                       ret += generate_equality_test(lhs_op,rhs_op,hdt);
+               }
+               ret +=  "){\n\t\t\tthe_bucket = bucket1;\n";
+               ret += "\t\t}else{ if(t->join_table[bucket].ts <= t->join_table[bucket1].ts)\n";
+               ret+="\t\t\tthe_bucket = bucket;\n\t\t\telse the_bucket=bucket1;\n";
+               ret += "\t\t}}\n";
+               for(p=0;p<fs->hash_eq.size();++p){
+                       data_type *hdt = fs->hash_eq[p]->pr->get_right_se()->get_data_type();
+                       if(hdt->is_buffer_type()){
+                               sprintf(tmpstr,"\t\t%s(f, &(t->join_table[the_bucket].key_var%d), &s_equijoin_%d);\n", hdt->get_buffer_assign_copy().c_str(), p, p);
+                               ret += tmpstr;
+                       }else{
+                               ret += "\t\tt->join_table[the_bucket].key_var"+int_to_string(p)+
+                                       " = s_equijoin_"+int_to_string(p)+";\n";
+                       }
+               }
+               ret+="\t\tt->join_table[the_bucket].ts =  curr_fj_ts;\n";
+       }
+  ret += "\tend_s:\n";
+
+//     ------------------------------------------------------------
+//             Next, determine if the R record should be processed.
+
+
+       ret +=
+"//            R (main stream) cheap predicate\n"
+"\n"
+;
+
+//             Unpack r_filt fields
+       vector<cnf_elem *> r_filt = fs->pred_t0;
+       for(w=0;w<r_filt.size();++w){
+               col_id_set this_pred_cids;
+               gather_pr_col_ids(r_filt[w]->pr, this_pred_cids, gb_tbl);
+               for(csi=this_pred_cids.begin();csi!=this_pred_cids.end();++csi){
+                       if(unpacked_cids.count( (*csi) ) == 0){
+                               int tblref = (*csi).tblvar_ref;
+                               int schref = (*csi).schema_ref;
+                               string field = (*csi).field;
+                               ret += generate_unpack_code(tblref,schref,field,schema,node_name);
+                               unpacked_cids.insert( (*csi) );
+                       }
+               }
+       }
+
+// Sort S preds based on cost.
+
+       vector<cnf_elem *> tmp_wh;
+       for(w=0;w<r_filt.size();++w){
+               compute_cnf_cost(r_filt[w],Ext_fcns);
+               tmp_wh.push_back(r_filt[w]);
+       }
+       r_filt = tmp_wh;
+
+       sort(r_filt.begin(), r_filt.end(), compare_cnf_cost());
+
+//             WARNING! the constant 20 below is a wild-ass guess.
+       int cheap_rpos;
+       for(cheap_rpos=0;cheap_rpos<r_filt.size() && r_filt[cheap_rpos]->cost <= 20;cheap_rpos++)
+
+//             Test the cheap filters on R.
+  if(cheap_rpos >0){
+
+//             Now generate the predicates.
+       for(w=0;w<cheap_rpos;++w){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.(cost %d)\n",w,r_filt[w]->cost);
+               ret += tmpstr;
+
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pfcn_refs;
+               collect_partial_fcns_pr(r_filt[w]->pr, pfcn_refs);
+//                     Since set<..> is a "Sorted Associative Container",
+//                     we can walk through it in sorted order by walking from
+//                     begin() to end().  (and the partial fcns must be
+//                     evaluated in this order).
+               set<int>::iterator si;
+               for(si=pfcn_refs.begin();si!=pfcn_refs.end();++si){
+                       if(fcn_ref_cnt[(*si)] > 1){
+                               ret += "\tif(fcn_ref_cnt_"+int_to_string((*si))+"==0){\n";
+                       }
+                       if(is_partial_fcn[(*si)]){
+                               ret += "\t"+unpack_partial_fcn(partial_fcns[(*si)], (*si), schema);
+                               ret += "\t\tif(retval) goto end;\n";
+                       }
+                       if(fcn_ref_cnt[(*si)] > 1){
+                               if(!is_partial_fcn[(*si)]){
+                                       ret += "\t\tpartial_fcn_result_"+int_to_string((*si))+"="+generate_cached_fcn(partial_fcns[(*si)],schema)+";\n";
+                               }
+                               ret += "\t\tfcn_ref_cnt_"+int_to_string((*si))+"=1;\n";
+                               ret += "\t}\n";
+                       }
+               }
+
+               ret += "\tif( !("+generate_predicate_code(r_filt[w]->pr,schema)+
+                               ") ) goto end;\n";
+       }
+  }else{
+         ret += "\n\n/*\t\t (no predicate to test)\t*/\n\n";
+  }
+
+       ret += "\n//    Do the join\n\n";
+       for(p=0;p<fs->hash_eq.size();++p)
+               ret += "\t\tr_equijoin_"+int_to_string(p)+" = "+generate_se_code(fs->hash_eq[p]->pr->get_left_se(),schema)+";\n";
+
+
+//                     Passed the cheap pred, now test the join with S.
+       if(fs->use_bloom){
+               for(i=0;i<3;i++){
+                       ret += "\t\tbucket"+int_to_string(i)+"=0;\n";
+                       for(p=0;p<fs->hash_eq.size();++p){
+                               ret +=
+"      bucket"+int_to_string(i)+
+       " ^= (("+hash_nums[(i*fs->hash_eq.size()+p)%NRANDS]+" * lfta_"+
+       fs->hash_eq[p]->pr->get_right_se()->get_data_type()->get_type_str()+
+       +"_to_hash(r_equijoin_"+int_to_string(p)+"))>>32);\n";
+                       }
+                               ret +=
+"      bucket"+int_to_string(i)+" &= "+int_to_string(bf_mask)+";\n";
+               }
+               ret += "\tfound = 0;\n";
+               ret += "\tfor(b=0;b<"+int_to_string(n_bloom)+" && !found; b++){\n";
+               ret +=
+"\t\tif(IS_BF_SET(t->bf_table,"+int_to_string(n_bloom)+",t->last_bloom_pos,bucket0) && "
+"IS_BF_SET(t->bf_table,"+int_to_string(n_bloom)+",t->last_bloom_pos,bucket1) && "
+"IS_BF_SET(t->bf_table,"+int_to_string(n_bloom)+",t->last_bloom_pos,bucket2))\n "
+"\t\t\tfound=1;\n"
+"\t}\n"
+;
+               ret +=
+"      if(!found)\n"
+"              goto end;\n"
+;
+       }else{
+               ret += "\tfound = 0;\n";
+               ret += "\t\tbucket=0;\n";
+               for(p=0;p<fs->hash_eq.size();++p){
+                       ret +=
+"              bucket ^= (("+hash_nums[(i*fs->hash_eq.size()+p)%NRANDS]+" * lfta_"+
+       fs->hash_eq[p]->pr->get_right_se()->get_data_type()->get_type_str()+
+       +"_to_hash(r_equijoin_"+int_to_string(p)+"))>>32);\n";
+               }
+               ret +=
+"              bucket &= "+int_to_string(bf_mask)+";\n"
+"              bucket1 = (bucket + 1) & "+int_to_string(bf_mask)+";\n"
+;
+//                     Try the first bucket
+               ret += "\t\tif(";
+               for(p=0;p<fs->hash_eq.size();++p){
+                       if(p>0) ret += " && ";
+//                     ret += "t->join_table[bucket].key_var"+int_to_string(p)+
+//                                     " == r_equijoin_"+int_to_string(p);
+                       data_type *hdt = fs->hash_eq[p]->pr->get_right_se()->get_data_type();
+                       string lhs_op = "t->join_table[bucket].key_var"+int_to_string(p);
+                       string rhs_op = "s_equijoin_"+int_to_string(p);
+                       ret += generate_equality_test(lhs_op,rhs_op,hdt);
+               }
+               if(p>0) ret += " && ";
+               ret += "t->join_table[bucket].ts+"+int_to_string(fs->temporal_range)+" <=  curr_fj_ts";
+               ret += "){\n\t\t\tfound = 1;\n";
+               ret += "\t\t}else {if(";
+               for(p=0;p<fs->hash_eq.size();++p){
+                       if(p>0) ret += " && ";
+//                     ret += "t->join_table[bucket1].key_var"+int_to_string(p)+
+//                                     " == r_equijoin_"+int_to_string(p);
+                       data_type *hdt = fs->hash_eq[p]->pr->get_right_se()->get_data_type();
+                       string lhs_op = "t->join_table[bucket].key_var"+int_to_string(p);
+                       string rhs_op = "s_equijoin_"+int_to_string(p);
+                       ret += generate_equality_test(lhs_op,rhs_op,hdt);
+               }
+               if(p>0) ret += " && ";
+               ret += "t->join_table[bucket1].ts+"+int_to_string(fs->temporal_range)+" <=  curr_fj_ts";
+               ret +=  ")\n\t\t\tfound=1;\n";
+               ret+="\t\t}\n";
+               ret +=
+"      if(!found)\n"
+"              goto end;\n"
+;
+       }
+
+
+//             Test the expensive filters on R.
+  if(cheap_rpos < r_filt.size()){
+
+//             Now generate the predicates.
+       for(w=cheap_rpos;w<r_filt.size();++w){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.(cost %d)\n",w,r_filt[w]->cost);
+               ret += tmpstr;
+
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pfcn_refs;
+               collect_partial_fcns_pr(r_filt[w]->pr, pfcn_refs);
+//                     Since set<..> is a "Sorted Associative Container",
+//                     we can walk through it in sorted order by walking from
+//                     begin() to end().  (and the partial fcns must be
+//                     evaluated in this order).
+               set<int>::iterator si;
+               for(si=pfcn_refs.begin();si!=pfcn_refs.end();++si){
+                       if(fcn_ref_cnt[(*si)] > 1){
+                               ret += "\tif(fcn_ref_cnt_"+int_to_string((*si))+"==0){\n";
+                       }
+                       if(is_partial_fcn[(*si)]){
+                               ret += "\t"+unpack_partial_fcn(partial_fcns[(*si)], (*si), schema);
+                               ret += "\t\tif(retval) goto end;\n";
+                       }
+                       if(fcn_ref_cnt[(*si)] > 1){
+                               if(!is_partial_fcn[(*si)]){
+                                       ret += "\t\tpartial_fcn_result_"+int_to_string((*si))+"="+generate_cached_fcn(partial_fcns[(*si)],schema)+";\n";
+                               }
+                               ret += "\t\tfcn_ref_cnt_"+int_to_string((*si))+"=1;\n";
+                               ret += "\t}\n";
+                       }
+               }
+
+               ret += "\tif( !("+generate_predicate_code(r_filt[w]->pr,schema)+
+                               ") ) goto end;\n";
+       }
+  }else{
+         ret += "\n\n/*\t\t (no predicate to test)\t*/\n\n";
+  }
+
+
+
+///////////////                        post the tuple
+
+//                     test passed : create the tuple, then assign to it.
+         ret += "/*\t\tCreate and post the tuple\t*/\n";
+
+//             Unpack r_filt fields
+       for(s=0;s<sl_list.size();++s){
+               col_id_set this_se_cids;
+               gather_se_col_ids(sl_list[s], this_se_cids, gb_tbl);
+               for(csi=this_se_cids.begin();csi!=this_se_cids.end();++csi){
+                       if(unpacked_cids.count( (*csi) ) == 0){
+                               int tblref = (*csi).tblvar_ref;
+                               int schref = (*csi).schema_ref;
+                               string field = (*csi).field;
+                               ret += generate_unpack_code(tblref,schref,field,schema,node_name);
+                               unpacked_cids.insert( (*csi) );
+                       }
+               }
+       }
+
+
+//                     Unpack partial fcns ref'd by the select clause.
+//                     Its a kind of a WHERE clause ...
+  for(p=sl_fcns_start;p<sl_fcns_end;p++){
+       if(fcn_ref_cnt[p] > 1){
+               ret += "\tif(fcn_ref_cnt_"+int_to_string(p)+"==0){\n";
+       }
+       if(is_partial_fcn[p]){
+               ret += unpack_partial_fcn(partial_fcns[p], p, schema);
+               ret += "\tif(retval) goto end;\n";
+       }
+       if(fcn_ref_cnt[p] > 1){
+               if(!is_partial_fcn[p]){
+                       ret += "\t\tpartial_fcn_result_"+int_to_string(p)+"="+generate_cached_fcn(partial_fcns[p],schema)+";\n";
+               }
+               ret += "\t\tfcn_ref_cnt_"+int_to_string(p)+"=1;\n";
+               ret += "\t}\n";
+       }
+  }
+
+  // increment the counter of accepted tuples
+  ret += "\n\t#ifdef LFTA_STATS\n";
+  ret += "\n\tt->accepted_tuple_cnt++;\n\n";
+  ret += "\t#endif\n\n";
+
+//                     First, compute the size of the tuple.
+
+//                     Unpack any BUFFER type selections into temporaries
+//                     so that I can compute their size and not have
+//                     to recompute their value during tuple packing.
+//                     I can use regular assignment here because
+//                     these temporaries are non-persistent.
+
+         for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if(sdt->is_buffer_type()){
+                       sprintf(tmpstr,"\tselvar_%d = ",s);
+                       ret += tmpstr;
+                       ret += generate_se_code(sl_list[s],schema);
+                       ret += ";\n";
+               }
+         }
+
+
+//             The size of the tuple is the size of the tuple struct plus the
+//             size of the buffers to be copied in.
+
+         ret+="\ttuple_size = sizeof( struct "+generate_tuple_name(node_name)+")";
+         for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if(sdt->is_buffer_type()){
+                       sprintf(tmpstr," + %s(&selvar_%d)", sdt->get_buffer_size().c_str(),s);
+                       ret += tmpstr;
+               }
+         }
+         ret += ";\n";
+
+
+         ret += "\ttuple = allocate_tuple(f, tuple_size );\n";
+         ret += "\tif( tuple == NULL)\n\t\tgoto end;\n";
+
+//                     Test passed, make assignments to the tuple.
+
+         ret += "\ttuple_pos = sizeof( struct "+generate_tuple_name(node_name)+");\n";
+
+//                     Mark tuple as REGULAR_TUPLE
+         ret += "\ttuple->tuple_type = REGULAR_TUPLE;\n";
+
+
+         for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if(sdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t%s(&(tuple->tuple_var%d), &selvar_%d, (char *)tuple, ((char *)tuple)+tuple_pos);\n", sdt->get_buffer_tuple_copy().c_str(),s, s);
+                       ret += tmpstr;
+                       sprintf(tmpstr,"\ttuple_pos += %s(&selvar_%d);\n", sdt->get_buffer_size().c_str(), s);
+                       ret += tmpstr;
+               }else{
+                       sprintf(tmpstr,"\ttuple->tuple_var%d = ",s);
+                       ret += tmpstr;
+//                     if(sdt->needs_hn_translation())
+//                             ret += sdt->hton_translation() +"( ";
+                       ret += generate_se_code(sl_list[s],schema);
+//                     if(sdt->needs_hn_translation())
+//                             ret += ") ";
+                       ret += ";\n";
+               }
+         }
+
+//             Generate output.
+
+         ret += "\tpost_tuple(tuple);\n";
+
+//             Increment the counter of posted tuples
+  ret += "\n\t#ifdef LFTA_STATS\n";
+  ret += "\n\tt->out_tuple_cnt++;\n\n";
+  ret+="\t\t\t\tt->out_tuple_sz+=tuple_size;\n";
+  ret += "\t#endif\n\n";
+
+
+       return ret;
+}
+
+string generate_aggr_accept_body(qp_node *fs,string node_name,table_list *schema, string &temporal_flush){
+       string ret;
+       int a,p,g;
+
+//////////////         Processing for aggregtion query
+
+//             First, search for a match.  Start by unpacking the group-by attributes.
+
+//                     One complication : if a real-time aggregate flush occurs,
+//                     the GB attr has already been calculated.  So don't compute
+//                     it again if 1) its temporal and 2) it will be computed in the
+//                     agggregate flush code.
+
+//             Unpack the partial fcns ref'd by the gb's and the aggr defs.
+  for(p=gb_fcns_start;p<gb_fcns_end;p++){
+    if(is_partial_fcn[p]){
+               ret += unpack_partial_fcn(partial_fcns[p], p, schema);
+               ret += "\tif(retval) goto end;\n";
+       }
+  }
+  for(p=ag_fcns_start;p<ag_fcns_end;p++){
+    if(is_partial_fcn[p]){
+               ret += unpack_partial_fcn(partial_fcns[p], p, schema);
+               ret += "\tif(retval) goto end;\n";
+       }
+  }
+
+  // increment the counter of accepted tuples
+  ret += "\n\t#ifdef LFTA_STATS\n";
+  ret += "\n\tt->accepted_tuple_cnt++;\n\n";
+  ret += "\t#endif\n\n";
+
+  ret += "/*\t\tTest if the group is in the hash table \t*/\n";
+//                     Compute the values of the group-by variables.
+  for(g=0;g<gb_tbl->size();g++){
+         data_type *gdt = gb_tbl->get_data_type(g);
+         if((! gdt->is_temporal()) || temporal_flush == ""){
+
+                 if(gdt->is_buffer_type()){
+       //                              NOTE : if the SE defining the gb is anything
+       //                              other than a ref to a variable, this will generate
+       //                              illegal code.  To be resolved with Spatch.
+                       sprintf(tmpstr,"\tgb_attr_tmp%d = %s;\n",
+                               g, generate_se_code(gb_tbl->get_def(g),schema).c_str() );
+                       ret += tmpstr;
+                       sprintf(tmpstr,"\t%s(f, &gb_attr_%d, &gb_attr_tmp%d);\n",
+                               gdt->get_buffer_assign_copy().c_str(), g, g);
+                 }else{
+                       sprintf(tmpstr,"\tgb_attr_%d = %s;\n",g,generate_se_code(gb_tbl->get_def(g),schema).c_str());
+                 }
+                 ret += tmpstr;
+         }
+  }
+  ret += "\n";
+
+//                     A quick aside : if any of the GB attrs are temporal,
+//                     test for change and flush if any change occurred.
+//                     We've already computed the flush code,
+//                     Put it here if this is not a real time query.
+//                     We've already unpacked all column refs, so no need to
+//                     do it again here.
+
+       string rt_level = fs->get_val_of_def("real_time");
+       if(rt_level == "" && temporal_flush != ""){
+               ret += temporal_flush;
+       }
+
+//                     Compute the hash bucket
+       if(gb_tbl->size() > 0){
+               ret += "\thashval = ";\
+               for(g=0;g<gb_tbl->size();g++){
+                 if(g>0) ret += " ^ ";
+                 data_type *gdt = gb_tbl->get_data_type(g);
+                 if(gdt->is_buffer_type()){
+                       sprintf(tmpstr,"((%s * lfta_%s_to_hash(gb_attr_%d)))",hash_nums[g%NRANDS].c_str(),
+                               gdt->get_type_str().c_str(), g);
+                 }else{
+                       sprintf(tmpstr,"((%s * lfta_%s_to_hash(gb_attr_%d)))",hash_nums[g%NRANDS].c_str(),
+                               gdt->get_type_str().c_str(), g);
+                 }
+                 ret += tmpstr;
+               }
+               ret += ";\n";
+               ret += "\thash2 = ((hashval * "+hash_nums[g%NRANDS]+") >> 32) & SLOT_HASH_BITS;\n";
+        ret+="\tprobe = (hashval >> 32) & (t->max_aggrs-1);\n";
+       }else{
+               ret+="\tprobe = 0;\n";
+               ret+="\thash2 = 0;\n\n";
+       }
+
+//             Does the lfta reference a udaf?
+         bool has_udaf = false;
+         for(a=0;a<aggr_tbl->size();a++){
+                 if(! aggr_tbl->is_builtin(a)) has_udaf = true;
+         }
+
+//             Scan for a match, or alternatively the best slot.
+//             Currently, hardcode 5 tests.
+       ret +=
+"      gen_val = t->generation & SLOT_GEN_BITS;\n"
+"      match_found = 0;\n"
+"      best_slot = probe;\n"
+"      for(i=0;i<5 && match_found == 0;i++){\n"
+"              if((t->aggr_table_hashmap[probe] & SLOT_FILLED) && (t->aggr_table_hashmap[probe] & SLOT_GEN_BITS) == gen_val && (t->aggr_table_hashmap[probe] & SLOT_HASH_BITS) == hash2 ){\n"
+;
+       if(gb_tbl->size()>0){
+               ret+="\n\t/* \t\tcheck if the grouping variables are equal */\n";
+               ret+="\t\tif(";
+               string rhs_op, lhs_op;
+               for(g=0;g<gb_tbl->size();g++){
+                 if(g>0) ret += " && ";
+                 ret += "(";
+                 sprintf(tmpstr,"gb_attr_%d",g); lhs_op = tmpstr;
+                 sprintf(tmpstr,"t->aggr_table[probe].gb_var%d",g); rhs_op = tmpstr;
+                 ret += generate_equality_test(lhs_op,rhs_op,gb_tbl->get_data_type(g));
+                 ret += ")";
+               }
+        }
+        ret += "){\n"
+"                      match_found = 1;\n"
+"                      best_slot = probe;\n"
+"              }\n"
+"      }\n"
+"//            Rate slots in case no match found: prefer empty, then full but old slots\n"
+"      if(t->aggr_table_hashmap[best_slot] & SLOT_FILLED){\n"
+"              if((t->aggr_table_hashmap[probe] & SLOT_FILLED)==0)\n"
+"                      best_slot = probe;\n"
+"              }else{\n"
+"                      if((t->aggr_table_hashmap[best_slot] & SLOT_GEN_BITS) == gen_val && (t->aggr_table_hashmap[probe] & SLOT_GEN_BITS) != gen_val){\n"
+"                              best_slot = probe;\n"
+"                      }\n"
+"              }\n"
+"              probe++;\n"
+"              if(probe >= t->max_aggrs)\n"
+"                      probe=0;\n"
+"      }\n"
+"      if(match_found){\n"
+;
+       ret += generate_gb_update(node_name, schema, "best_slot",has_udaf);
+       ret +=
+"      }else{\n"
+"              if(t->aggr_table_hashmap[best_slot] & SLOT_FILLED){\n"
+;
+printf("sgah_qpn name is %s, disorder is %d\n",fs->node_name.c_str(),((sgah_qpn *)fs)->lfta_disorder);
+       if(((sgah_qpn *)fs)->lfta_disorder <= 1){
+               ret +=
+"                      if((t->aggr_table_hashmap[best_slot] & SLOT_GEN_BITS)==gen_val){\n"
+"                              if((";
+               bool first_g = true;
+               for(int g=0;g<gb_tbl->size();g++){
+                       data_type *gdt = gb_tbl->get_data_type(g);
+                       if(gdt->is_temporal()){
+                               if(first_g) first_g = false; else ret+=" + ";
+                               ret += "(gb_attr_"+int_to_string(g)+" - t->aggr_table[best_slot].gb_var"+int_to_string(g)+")";
+                       }
+               }
+               ret += ") == 0 ){\n";
+
+               ret +=
+"                                      fta_aggr_flush_old_"+ node_name+"(f,t->max_aggrs);\n"
+"                              }\n"
+"                      }\n"
+;
+       }
+
+       ret += generate_tuple_from_aggr(node_name,schema,"best_slot");
+       ret +=
+"\t\t\t#ifdef LFTA_STATS\n"
+"\t\t\tif((t->aggr_table_hashmap[best_slot] & SLOT_GEN_BITS) == gen_val)\n"
+"\t\t\t\tt->collision_cnt++;\n\n"
+"\t\t\t#endif\n\n"
+"\t\t}\n"
+;
+       ret += generate_init_group(schema,"best_slot");
+
+
+         ret += "\t}\n";
+
+       return ret;
+}
+
+
+
+string generate_fta_accept(qp_node *fs, string node_name, table_list *schema, ext_fcn_list *Ext_fcns, bool is_aggr_query, bool is_fj, set<unsigned int> &s_pids){
+
+       string ret="static gs_retval_t accept_packet_"+node_name+
+               "(struct FTA *f, FTAID * ftaid, void *pkt, gs_int32_t sz){\n";
+    ret += "\tstruct packet *p = (struct packet *)pkt;\n";
+
+  int a;
+
+//                     Define all of the variables needed by this
+//                     procedure.
+
+
+//                     Gather all column references, need to define unpacking variables.
+  int w,s;
+  col_id_set cid_set;
+  col_id_set::iterator csi;
+
+//             If its a filter join, rebind all colrefs
+//             to the first range var, to avoid double unpacking.
+
+  if(is_fj){
+    for(w=0;w<where.size();++w)
+               reset_pr_col_ids_tblvars(where[w]->pr, gb_tbl);
+    for(s=0;s<sl_list.size();s++)
+               reset_se_col_ids_tblvars(sl_list[s], gb_tbl);
+  }
+
+  for(w=0;w<where.size();++w){
+       if(is_fj || s_pids.count(w) == 0)
+               gather_pr_col_ids(where[w]->pr,cid_set, gb_tbl);
+       }
+  for(s=0;s<sl_list.size();s++){
+       gather_se_col_ids(sl_list[s],cid_set, gb_tbl);
+  }
+
+  int g;
+  if(gb_tbl != NULL){
+       for(g=0;g<gb_tbl->size();g++)
+         gather_se_col_ids(gb_tbl->get_def(g),cid_set, gb_tbl);
+  }
+
+  //                   Variables for unpacking attributes.
+  ret += "/*\t\tVariables for unpacking attributes\t*/\n";
+  for(csi=cid_set.begin(); csi!=cid_set.end();++csi){
+    int schref = (*csi).schema_ref;
+       int tblref = (*csi).tblvar_ref;
+    string field = (*csi).field;
+    data_type dt(schema->get_type_name(schref,field));
+    sprintf(tmpstr,"\t%s unpack_var_%s_%d;\n",dt.get_cvar_type().c_str(),
+       field.c_str(), tblref);
+    ret += tmpstr;
+  }
+
+  ret += "\n\n";
+
+//                     Variables that are always needed
+  ret += "/*\t\tVariables which are always needed\t*/\n";
+  ret += "\tgs_retval_t retval;\n";
+  ret += "\tgs_int32_t tuple_size, tuple_pos, lfta_bailout;\n";
+  ret += "\tstruct "+generate_tuple_name(node_name)+" *tuple;\n";
+
+  ret+="\tstruct "+generate_fta_name(node_name)+" *t = (struct "+generate_fta_name(node_name)+"*) f;\n\n";
+
+
+//                     Variables needed for aggregation queries.
+  if(is_aggr_query){
+         ret += "\n/*\t\tVariables for aggregation\t*/\n";
+         ret+="\tunsigned int i, probe;\n";
+         ret+="\tunsigned int gen_val, match_found, best_slot;\n";
+         ret+="\tgs_uint64_t hashval, hash2;\n";
+//                     Variables for storing group-by attribute values.
+         if(gb_tbl->size() > 0)
+               ret += "/*\t\tGroup-by attributes\t*/\n";
+         for(g=0;g<gb_tbl->size();g++){
+               sprintf(tmpstr,"\t%s gb_attr_%d;\n",gb_tbl->get_data_type(g)->get_cvar_type().c_str(),g);
+               ret += tmpstr;
+               data_type *gdt = gb_tbl->get_data_type(g);
+               if(gdt->is_buffer_type()){
+                 sprintf(tmpstr,"\t%s gb_attr_tmp%d;\n",gb_tbl->get_data_type(g)->get_cvar_type().c_str(),g);
+                 ret += tmpstr;
+               }
+         }
+         ret += "\n";
+//                     Temporaries for min/max
+         string aggr_tmp_str = "";
+         for(a=0;a<aggr_tbl->size();a++){
+               string aggr_op = aggr_tbl->get_op(a);
+               if(aggr_op == "MIN" || aggr_op == "MAX"){
+                       sprintf(tmpstr,"\t%s aggr_tmp_%d;\n",aggr_tbl->get_data_type(a)->get_cvar_type().c_str(),a);
+                       aggr_tmp_str.append(tmpstr);
+               }
+         }
+         if(aggr_tmp_str != ""){
+               ret += "/*\t\tTemp vars for BUFFER aggregates\t*/\n";
+               ret += aggr_tmp_str;
+               ret += "\n";
+         }
+//             Variables for udaf output temporaries
+       bool no_udaf = true;
+       for(a=0;a<aggr_tbl->size();a++){
+               if(! aggr_tbl->is_builtin(a)){
+                       if(no_udaf){
+                               ret+="/*\t\tUDAF output vars.\t*/\n";
+                               no_udaf = false;
+                       }
+                       int afcn_id = aggr_tbl->get_fcn_id(a);
+                       data_type *adt = Ext_fcns->get_fcn_dt(afcn_id);
+                       sprintf(tmpstr,"udaf_ret%d", a);
+                       ret+="\t"+adt->make_cvar(tmpstr)+";\n";
+               }
+       }
+  }
+
+//                     Variables needed for a filter join query
+  if(fs->node_type() == "filter_join"){
+       filter_join_qpn *fjq = (filter_join_qpn *)fs;
+       bool uses_bloom = fjq->use_bloom;
+       ret += "/*\t\tJoin fields\t*/\n";
+       for(g=0;g<fjq->hash_eq.size();g++){
+               sprintf(tmpstr,"\t%s s_equijoin_%d, r_equijoin_%d;\n",fjq->hash_eq[g]->pr->get_left_se()->get_data_type()->get_cvar_type().c_str(),g,g);
+               ret += tmpstr;
+         }
+       if(uses_bloom){
+               ret +=
+"  /*          Variables for fj bloom filter   */ \n"
+"\tunsigned int i=0,j=0,k=0, b, bf_clean = 0, tmp_i, found; \n"
+"\tunsigned int bucket, bucket0, bucket1, bucket2;\n"
+"\tlong long int curr_fj_ts;\n"
+"\tunsigned int curr_bin, the_bin;\n"
+"\n"
+;
+       }else{
+               ret +=
+"  /*          Variables for fj join table     */ \n"
+"\tunsigned int i, bucket, found; \n"
+"\tunsigned int bucket1, the_bucket;\n"
+"      long long int curr_fj_ts;\n"
+"\n"
+;
+       }
+  }
+
+
+//             Variables needed to store selected attributes of BUFFER type
+//             temporarily, in order to compute their size for storage
+//             in an output tuple.
+
+  string select_var_defs = "";
+  for(s=0;s<sl_list.size();s++){
+       data_type *sdt = sl_list[s]->get_data_type();
+       if(sdt->is_buffer_type()){
+         sprintf(tmpstr,"\t%s selvar_%d;\n",sdt->get_cvar_type().c_str(),s);
+         select_var_defs.append(tmpstr);
+       }
+  }
+  if(select_var_defs != ""){
+       ret += "/*\t\tTemporaries for computing buffer sizes.\t*/\n";
+    ret += select_var_defs;
+  }
+
+//             Variables to store results of partial functions.
+  int p;
+  if(partial_fcns.size()>0){
+         ret += "/*\t\tVariables for storing results of partial functions. \t*/\n";
+         for(p=0;p<partial_fcns.size();++p){
+               if(is_partial_fcn[p] || (!is_aggr_query && fcn_ref_cnt[p] >1)){
+                 sprintf(tmpstr,"\t%s partial_fcn_result_%d;\n",
+                   partial_fcns[p]->get_data_type()->get_cvar_type().c_str(), p);
+                 ret += tmpstr;
+                 if(!is_aggr_query && fcn_ref_cnt[p] >1){
+                       ret += "\tint fcn_ref_cnt_"+int_to_string(p)+" = 0;\n";
+                 }
+               }
+         }
+
+         if(is_aggr_query) ret += "\tint unpack_failed = 0;\n";
+         ret += "\n";
+  }
+
+//             variable to hold packet struct  //
+       if(packed_return){
+               ret += "\t struct "+node_name+"_input_struct *"+node_name+"_input_struct_var;\n";
+       }
+
+
+  ret += "\t#ifdef LFTA_STATS\n";
+// variable to store counter of cpu cycles spend in accept_tuple
+       ret += "\tgs_uint64_t start_cycle = rdtsc();\n";
+// increment counter of received tuples
+       ret += "\tt->in_tuple_cnt++;\n";
+  ret += "\t#endif\n";
+
+
+//     -------------------------------------------------
+//             If the packet is "packet", test if its for this lfta,
+//             and if so load it into its struct
+
+       if(packed_return){
+               ret+="\n/*  packed tuple : test and load. \t*/\n";
+               ret+="\t"+node_name+"_input_struct_var = (struct "+node_name+"_input_struct *) pkt;\n";
+               ret+="\tif("+node_name+"_input_struct_var->__lfta_id_fm_nic__ != "+int_to_string(global_id) + ")\n";
+               ret+="\t\tgoto end;\n\n";
+       }
+
+
+
+  col_id_set unpacked_cids;    //      Keep track of the cols that have been unpacked.
+
+  string temporal_flush;
+  if(is_aggr_query)
+       ret += generate_aggr_accept_prelim(fs, node_name, schema, unpacked_cids, temporal_flush);
+  else {       // non-aggregation operators
+
+// Unpack all the temporal attributes referenced in select clause
+// and update the last value of the attribute
+       col_id_set temp_cids;           //      col ids of temp attributes in select clause
+
+       for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if (sdt->is_temporal()) {
+                       gather_se_col_ids(sl_list[s],temp_cids, gb_tbl);
+               }
+       }
+//                     If this is a filter join,
+//                     ensure that the temporal range field is unpacked.
+       if(is_fj){
+               col_id window_var_cid(((filter_join_qpn *)fs)->temporal_var);
+               if(temp_cids.count(window_var_cid)==0)
+                       temp_cids.insert(window_var_cid);
+       }
+
+       for(csi=temp_cids.begin(); csi != temp_cids.end();++csi){
+               if(unpacked_cids.count((*csi)) == 0){
+                       int tblref = (*csi).tblvar_ref;
+                       int schref = (*csi).schema_ref;
+                       string field = (*csi).field;
+                       ret += generate_unpack_code(tblref,schref,field,schema,node_name);
+                       sprintf(tmpstr,"\tt->last_%s_%d = unpack_var_%s_%d;\n", field.c_str(), tblref, field.c_str(), tblref);
+                       ret += tmpstr;
+
+                       unpacked_cids.insert( (*csi) );
+               }
+       }
+
+  }
+
+  vector<cnf_elem *> filter = fs->get_filter_clause();
+//             Test the filter predicate (some query types have additional preds).
+  if(filter.size() > 0){
+
+//             Sort by evaluation cost.
+//             First, estimate evaluation costs
+//             Eliminate predicates covered by the prefilter (those in s_pids).
+//             I need to do it before the sort becuase the indices refer
+//             to the position in the unsorted list./
+       vector<cnf_elem *> tmp_wh;
+       for(w=0;w<filter.size();++w){
+               if(s_pids.count(w) == 0){
+                       compute_cnf_cost(filter[w],Ext_fcns);
+                       tmp_wh.push_back(filter[w]);
+               }
+       }
+       filter = tmp_wh;
+
+       sort(filter.begin(), filter.end(), compare_cnf_cost());
+
+//             Now generate the predicates.
+       for(w=0;w<filter.size();++w){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.(cost %d)\n",w,filter[w]->cost);
+               ret += tmpstr;
+//                     Find the set of variables accessed in this CNF elem,
+//                     but in no previous element.
+               col_id_set this_pred_cids;
+               gather_pr_col_ids(filter[w]->pr, this_pred_cids, gb_tbl);
+               for(csi=this_pred_cids.begin();csi!=this_pred_cids.end();++csi){
+                       if(unpacked_cids.count( (*csi) ) == 0){
+                       int tblref = (*csi).tblvar_ref;
+                       int schref = (*csi).schema_ref;
+                       string field = (*csi).field;
+                               ret += generate_unpack_code(tblref,schref,field,schema,node_name);
+                               unpacked_cids.insert( (*csi) );
+                       }
+               }
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pfcn_refs;
+               collect_partial_fcns_pr(filter[w]->pr, pfcn_refs);
+//                     Since set<..> is a "Sorted Associative Container",
+//                     we can walk through it in sorted order by walking from
+//                     begin() to end().  (and the partial fcns must be
+//                     evaluated in this order).
+               set<int>::iterator si;
+               for(si=pfcn_refs.begin();si!=pfcn_refs.end();++si){
+                       if(fcn_ref_cnt[(*si)] > 1){
+                               ret += "\tif(fcn_ref_cnt_"+int_to_string((*si))+"==0){\n";
+                       }
+                       if(is_partial_fcn[(*si)]){
+                               ret += "\t"+unpack_partial_fcn(partial_fcns[(*si)], (*si), schema);
+                               ret += "\t\tif(retval) goto end;\n";
+                       }
+                       if(fcn_ref_cnt[(*si)] > 1){
+                               if(!is_partial_fcn[(*si)]){
+                                       ret += "\t\tpartial_fcn_result_"+int_to_string((*si))+"="+generate_cached_fcn(partial_fcns[(*si)],schema)+";\n";
+                               }
+                               ret += "\t\tfcn_ref_cnt_"+int_to_string((*si))+"=1;\n";
+                               ret += "\t}\n";
+                       }
+               }
+
+               ret += "\tif( !("+generate_predicate_code(filter[w]->pr,schema)+
+                               ") ) goto end;\n";
+       }
+  }else{
+         ret += "\n\n/*\t\t (no predicate to test)\t*/\n\n";
+  }
+
+
+//                     We've passed the WHERE clause,
+//                     unpack the remainder of the accessed fields.
+  if(is_fj){
+       ret += "\n/*\tPassed the WHERE clause, unpack the hash fields. */\n";
+       vector<cnf_elem *> h_eq = ((filter_join_qpn *)fs)-> hash_eq;
+               for(w=0;w<h_eq.size();++w){
+               col_id_set this_pred_cids;
+               gather_pr_col_ids(h_eq[w]->pr, this_pred_cids, gb_tbl);
+               for(csi=this_pred_cids.begin();csi!=this_pred_cids.end();++csi){
+                       if(unpacked_cids.count( (*csi) ) == 0){
+                               int tblref = (*csi).tblvar_ref;
+                               int schref = (*csi).schema_ref;
+                               string field = (*csi).field;
+                               ret += generate_unpack_code(tblref,schref,field,schema,node_name);
+                               unpacked_cids.insert( (*csi) );
+                       }
+               }
+       }
+  }else{
+         ret += "\n/*\tPassed the WHERE clause, unpack the rest of the accessed fields. */\n";
+
+         for(csi=cid_set.begin();csi!=cid_set.end();++csi){
+               if(unpacked_cids.count( (*csi) ) == 0){
+                       int schref = (*csi).schema_ref;
+                       int tblref = (*csi).tblvar_ref;
+                       string field = (*csi).field;
+                       ret += generate_unpack_code(tblref,schref,field,schema,node_name);
+                       unpacked_cids.insert( (*csi) );
+               }
+         }
+  }
+
+
+//////////////////
+//////////////////     After this, the query types
+//////////////////     are processed differently.
+
+  if(!is_aggr_query && !is_fj)
+       ret += generate_sel_accept_body(fs, node_name, schema);
+  else if(is_aggr_query)
+       ret += generate_aggr_accept_body(fs, node_name, schema, temporal_flush);
+  else
+       ret += generate_fj_accept_body((filter_join_qpn *)fs, node_name, unpacked_cids, Ext_fcns, schema);
+
+
+//             Finish up.
+
+   ret += "\n\tend:\n";
+  ret += "\t#ifdef LFTA_STATS\n";
+       ret+= "\tt->cycle_cnt += rdtsc() - start_cycle;\n";
+  ret += "\t#endif\n";
+   ret += "\n\treturn 1;\n}\n\n";
+
+       return(ret);
+}
+
+
+string generate_fta_alloc(qp_node *fs, string node_name, table_list *schema, bool is_aggr_query, bool is_fj, bool uses_bloom){
+       int g, cl;
+
+       string ret = "struct FTA * "+generate_alloc_name(node_name) +
+          "(struct FTAID ftaid, gs_uint32_t reusable, gs_int32_t command,  gs_int32_t sz, void *value){\n";
+
+       ret+="\tstruct "+generate_fta_name(node_name)+"* f;\n";
+       ret+="\tint i;\n";
+       ret += "\n";
+       ret+="\tif((f=fta_alloc(0,sizeof(struct "+generate_fta_name(node_name)+")))==0){\n\t\treturn(0);\n\t}\n";
+
+//                             assign a streamid to fta instance
+       ret+="\t/* assign a streamid */\n";
+       ret+="\tf->f.ftaid = ftaid;\n";
+       ret+="\tf->f.ftaid.streamid = (gs_p_t)f;\n";
+       ret+="\tgslog(LOG_INFO,\"Lfta "+node_name+" has FTAID {ip=%u,port=%u,index=%u,streamid=%u}\\n\",f->f.ftaid.ip,f->f.ftaid.port,f->f.ftaid.index,f->f.ftaid.streamid);\n";
+
+       if(is_aggr_query){
+               ret += "\tf->n_aggrs = 0;\n";
+
+               ret += "\tf->max_aggrs = ";
+
+//                             Computing the number of aggregate blocks is a little
+//                             tricky.  If there are no GB attrs, or if all GB attrs
+//                             are temporal, then use a single aggregate block, else
+//                             use a default value (10).  A user specification overrides
+//                             this logic.
+               bool single_group = true;
+               for(g=0;g<gb_tbl->size();g++){
+                       data_type *gdt = gb_tbl->get_data_type(g);
+                       if(! gdt->is_temporal() ){
+                               single_group = false;
+                       }
+               }
+               string max_aggr_str = fs->get_val_of_def("aggregate_slots");
+               int max_aggr_i = atoi(max_aggr_str.c_str());
+               if(max_aggr_i <= 0){
+                       if(single_group)
+                               ret += "2";
+                       else
+                               ret += int_to_string(DEFAULT_LFTA_HASH_TABLE_SIZE);
+               }else{
+                       unsigned int naggrs = 1;                // make it power of 2
+                       unsigned int nones = 0;
+                       while(max_aggr_i){
+                               if(max_aggr_i&1)
+                                       nones++;
+                               naggrs = naggrs << 1;
+                               max_aggr_i = max_aggr_i >> 1;
+                       }
+                       if(nones==1)            // in case it was already a power of 2.
+                               naggrs/=2;
+                       ret += int_to_string(naggrs);
+               }
+               ret += ";\n";
+
+               ret+="\tif ((f->aggr_table = sp_fta_alloc((struct FTA *)f,sizeof(struct "+generate_aggr_struct_name(node_name)+") * f->max_aggrs))==0) {\n";
+               ret+="\t\treturn(0);\n";
+               ret+="\t}\n\n";
+//             ret+="/* compute how many integers we need to store the hashmap */\n";
+//             ret+="\tf->bitmap_size = (f->max_aggrs % (sizeof(gs_uint32_t) * 4)) ? (f->max_aggrs / (sizeof(gs_uint32_t) * 4) + 1) : (f->max_aggrs / (sizeof(gs_uint32_t) * 4));\n\n";
+               ret+="\tif ((f->aggr_table_hashmap = sp_fta_alloc((struct FTA *)f,sizeof(gs_uint32_t) * f->max_aggrs))==0) {\n";
+               ret+="\t\treturn(0);\n";
+               ret+="\t}\n";
+               ret+="/*\t\tfill bitmap with zero \t*/\n";
+               ret+="\tfor (i = 0; i < f->max_aggrs; ++i)\n";
+               ret+="\t\tf->aggr_table_hashmap[i] = 0;\n";
+               ret+="\tf->generation=0;\n";
+               ret+="\tf->flush_pos = f->max_aggrs;\n";
+
+               ret += "\tf->flush_ctr = 0;\n";
+
+       }
+
+       if(is_fj){
+               if(uses_bloom){
+                       ret+="\tf->first_exec = 1;\n";
+                       unsigned int n_bloom = 11;
+                       string n_bloom_str = fs->get_val_of_def("num_bloom");
+                       int tmp_n_bloom = atoi(n_bloom_str.c_str());
+                       if(tmp_n_bloom>0)
+                               n_bloom = tmp_n_bloom+1;
+
+                       unsigned int window_len = ((filter_join_qpn *)fs)->temporal_range;
+                       if(window_len < n_bloom){
+                               n_bloom = window_len+1;
+                       }
+
+                       int bf_exp_size = 12;  // base-2 log of number of bits
+                       string bloom_len_str = fs->get_val_of_def("bloom_size");
+                       int tmp_bf_exp_size = atoi(bloom_len_str.c_str());
+                       if(tmp_bf_exp_size > 3 && tmp_bf_exp_size < 32){
+                               bf_exp_size = tmp_bf_exp_size;
+                       }
+                       int bf_bit_size = 1 << 12;
+                       int bf_byte_size = bf_bit_size / (8*sizeof(char));
+
+                       int bf_tot = n_bloom*bf_byte_size;
+                       ret+="\tif ((f->bf_table = sp_fta_alloc((struct FTA *)f,"+int_to_string(bf_tot)+"))==0) {\n";
+                       ret+="\t\treturn(0);\n";
+                       ret+="\t}\n";
+                       ret +=
+"      for(i=0;i<"+int_to_string(bf_tot)+";i++)\n"
+"              f->bf_table[i] = 0;\n"
+;
+               }else{
+                       unsigned int ht_size = 4096;
+                       string ht_size_s = fs->get_val_of_def("aggregate_slots");
+                       int tmp_ht_size = atoi(ht_size_s.c_str());
+                       if(tmp_ht_size > 1024){
+                               unsigned int hs = 1;            // make it power of 2
+                               while(tmp_ht_size){
+                                       hs =hs << 1;
+                                       tmp_ht_size = tmp_ht_size >> 1;
+                               }
+                               ht_size = hs;
+                       }
+                       ret+="\tif ((f->join_table = sp_fta_alloc((struct FTA *)f,sizeof(struct "+generate_fj_struct_name(node_name)+") * "+int_to_string(ht_size)+"))==0) {\n";
+                       ret+="\t\treturn(0);\n";
+                       ret+="\t}\n\n";
+                       ret +=
+"      for(i=0;i<"+int_to_string(ht_size)+";i++)\n"
+"              f->join_table[i].ts = 0;\n"
+;
+               }
+       }
+
+//                     Initialize the complex literals (which might be handles).
+
+       for(cl=0;cl<complex_literals->size();cl++){
+               literal_t *l = complex_literals->get_literal(cl);
+//             sprintf(tmpstr,"\tf->complex_literal_%d = ",cl);
+//             ret += tmpstr + l->to_C_code() + ";\n";
+               sprintf(tmpstr,"&(f->complex_literal_%d)",cl);
+               ret += "\t" + l->to_C_code(tmpstr) + ";\n";
+       }
+
+       ret += "\n";
+
+//                     Initialize the last seen values of temporal attributes to min(max) value of
+//                     their respective type
+//                     Create places to hold the last values of temporal attributes referenced in select clause
+
+
+       col_id_set temp_cids;           //      col ids of temp attributes in select clause
+
+       int s;
+       col_id_set::iterator csi;
+
+       for(s=0;s<sl_list.size();s++){
+               data_type *sdt = sl_list[s]->get_data_type();
+               if (sdt->is_temporal()) {
+                       gather_se_col_ids(sl_list[s],temp_cids, gb_tbl);
+               }
+       }
+
+       for(csi=temp_cids.begin(); csi != temp_cids.end();++csi){
+               int tblref = (*csi).tblvar_ref;
+               int schref = (*csi).schema_ref;
+               string field = (*csi).field;
+               data_type dt(schema->get_type_name(schref,field), schema->get_modifier_list(schref,field));
+               if (dt.is_increasing()) {
+                       sprintf(tmpstr,"\tf->last_%s_%d = %s;\n", field.c_str(), tblref, dt.get_min_literal().c_str());
+                       ret += tmpstr;
+               } else if (dt.is_decreasing()) {
+                       sprintf(tmpstr,"\tf->last_%s_%d = %s;\n", field.c_str(), tblref, dt.get_max_literal().c_str());
+                       ret += tmpstr;
+               }
+       }
+
+//     initialize last seen values of temporal groubpy variables
+       if(is_aggr_query){
+               for(g=0;g<gb_tbl->size();g++){
+                        data_type *dt = gb_tbl->get_data_type(g);
+                        if(dt->is_temporal()){
+/*
+                                fprintf(stderr,"group by attribute %s is temporal, ",
+                                                gb_tbl->get_name(g).c_str());
+*/
+                                if(dt->is_increasing()){
+                                       sprintf(tmpstr,"\tf->last_gb_%d = f->last_flushed_gb_%d = %s;\n",g, g, dt->get_min_literal().c_str());
+                                }else{
+                                       sprintf(tmpstr,"\tf->last_gb_%d = f->last_flushed_gb_%d = %s;\n",g, g, dt->get_max_literal().c_str());
+                                }
+                               ret += tmpstr;
+                        }
+               }
+       }
+
+       ret += "\tf->f.alloc_fta="+generate_alloc_name(node_name)+";\n";
+       ret+="\tf->f.free_fta=free_fta_"+node_name+";\n";
+       ret+="\tf->f.control_fta=control_fta_"+node_name+";\n";
+       ret+="\tf->f.accept_packet=accept_packet_"+node_name+";\n";
+       ret+="\tf->f.clock_fta=clock_fta_"+node_name+";\n\n";
+
+//                     Initialize runtime stats
+       ret+="\tf->in_tuple_cnt = 0;\n";
+       ret+="\tf->out_tuple_cnt = 0;\n";
+       ret+="\tf->out_tuple_sz = 0;\n";
+       ret+="\tf->accepted_tuple_cnt = 0;\n";
+       ret+="\tf->cycle_cnt = 0;\n";
+       ret+="\tf->collision_cnt = 0;\n";
+       ret+="\tf->eviction_cnt = 0;\n";
+       ret+="\tf->sampling_rate = 1.0;\n";
+
+       ret+="\tf->trace_id = 0;\n\n";
+    if(param_tbl->size() > 0){
+       ret+=
+"\tif(load_params_"+node_name+"(f, sz, value, 1)){\n"
+"#ifndef LFTA_IN_NIC\n"
+"\t\t\tfprintf(stderr,\"WARNING: parameter passed to lfta "+node_name+" is too small (%d). This query does not have valid parameters, bailing out.\\n\",sz);\n"
+"#else\n"
+"\t\t}\n"
+"#endif\n"
+"\t\t\treturn 0;\n"
+"\t\t}\n";
+       }
+
+//                     Register the pass-by-handle parameters
+    int ph;
+    for(ph=0;ph<param_handle_table.size();++ph){
+               data_type pdt(param_handle_table[ph]->type_name);
+               sprintf(tmpstr,"\tf->handle_param_%d = %s((struct FTA *)f,",ph,param_handle_table[ph]->lfta_registration_fcn().c_str());
+               switch(param_handle_table[ph]->val_type){
+               case cplx_lit_e:
+                       ret += tmpstr;
+                       if(pdt.is_buffer_type()) ret += "&(";
+                       sprintf(tmpstr,"f->complex_literal_%d",param_handle_table[ph]->complex_literal_idx);
+                       ret += tmpstr ;
+                       if(pdt.is_buffer_type()) ret += ")";
+                       ret +=  ");\n";
+                       break;
+               case litval_e:
+//                             not complex, no constructor
+                       ret += tmpstr;
+                       ret += param_handle_table[ph]->litval->to_C_code("") + ");\n";
+                       break;
+               case param_e:
+//                             query parameter handles are regstered/deregistered in the
+//                             load_params function.
+//                     ret += "t->param_"+param_handle_table[ph]->param_name;
+                       break;
+               default:
+                       fprintf(stderr, "INTERNAL ERROR unknown case found when processing pass-by-handle parameter table.\n");
+                       exit(1);
+               }
+       }
+
+       ret += "\treturn (struct FTA *) f;\n";
+       ret += "}\n\n";
+
+       return(ret);
+}
+
+
+
+
+//////////////////////////////////////////////////////////////////
+
+string generate_lfta_block(qp_node *fs, table_list *schema, int gid,
+//             map<string,string> &int_fcn_defs,
+               ext_fcn_list *Ext_fcns, string &schema_embed_str, ifq_t *ifdb, nic_property *nicp, set<unsigned int> &s_pids){
+       bool is_aggr_query;
+       int s,p,g;
+       string retval;
+
+/////////////////////////////////////////////////////////////
+///            Do operator-generic processing, such as
+///            gathering the set of referenced columns,
+///            generating structures, etc.
+
+//             Initialize globals to empty.
+       gb_tbl = NULL; aggr_tbl = NULL;
+       global_id = -1; nicprop = NULL;
+       param_tbl = fs->get_param_tbl();
+       sl_list.clear(); where.clear();
+       partial_fcns.clear();
+       fcn_ref_cnt.clear(); is_partial_fcn.clear();
+       pred_class.clear(); pred_pos.clear();
+       sl_fcns_start=sl_fcns_end=wh_fcns_start=wh_fcns_end=0;
+       gb_fcns_start=gb_fcns_end=ag_fcns_start=ag_fcns_end=0;
+
+
+//             Does the lfta read packed results from the NIC?
+       nicprop = nicp;                 // load into global
+       global_id = gid;
+    packed_return = false;
+       if(nicp && nicp->option_exists("Return")){
+               if(nicp->option_value("Return") == "Packed"){
+                       packed_return = true;
+               }else{
+                       fprintf(stderr,"Warning, nic option value of Return=%s is not recognized, ignoring\n",nicp->option_value("Return").c_str());
+               }
+       }
+
+
+//                     Extract data which defines the query.
+//                             complex literals gathered now.
+       complex_literals = fs->get_cplx_lit_tbl(Ext_fcns);
+       param_handle_table = fs->get_handle_param_tbl(Ext_fcns);
+       string node_name = fs->get_node_name();
+    bool is_fj = false, uses_bloom = false;
+
+
+       if(fs->node_type() == "spx_qpn"){
+               is_aggr_query = false;
+               spx_qpn *spx_node = (spx_qpn *)fs;
+               sl_list = spx_node->get_select_se_list();
+               where = spx_node->get_where_clause();
+               gb_tbl = NULL;
+               aggr_tbl = NULL;
+       } else
+       if(fs->node_type() == "sgah_qpn"){
+               is_aggr_query = true;
+               sgah_qpn *sgah_node = (sgah_qpn *)fs;
+               sl_list = sgah_node->get_select_se_list();
+               where = sgah_node->get_where_clause();
+               gb_tbl = sgah_node->get_gb_tbl();
+               aggr_tbl = sgah_node->get_aggr_tbl();
+
+               if((sgah_node->get_having_clause()).size() > 0){
+                       fprintf(stderr,"Warning in LFTA %s: HAVING clause will be ignored.\n", fs->get_node_name().c_str());
+               }
+       } else
+       if(fs->node_type() == "filter_join"){
+               is_aggr_query = false;
+        is_fj = true;
+               filter_join_qpn *fj_node = (filter_join_qpn *)fs;
+               sl_list = fj_node->get_select_se_list();
+               where = fj_node->get_where_clause();
+               uses_bloom = fj_node->use_bloom;
+               gb_tbl = NULL;
+               aggr_tbl = NULL;
+       } else {
+               fprintf(stderr,"INTERNAL ERROR, unrecognized node type %s in generate_lfta_block\n", fs->node_type().c_str());
+               exit(1);
+       }
+
+//                     Build list of "partial functions", by clause.
+//                     NOTE : partial fcns are not handles well.
+//                     The act of searching for them associates the fcn call
+//                     in the SE with an index to an array.  Refs to the
+//                     fcn value are replaced with refs to the variable they are
+//                     unpacked into.  A more general tagging mechanism would be better.
+
+       int i;
+       vector<bool> *pfunc_ptr = NULL;
+       vector<int> *ref_cnt_ptr = NULL;
+       if(!is_aggr_query){             // don't collect cacheable fcns on aggr query.
+               ref_cnt_ptr = &fcn_ref_cnt;
+               pfunc_ptr = &is_partial_fcn;
+       }
+
+       sl_fcns_start = 0;
+       for(i=0;i<sl_list.size();i++){
+               find_partial_fcns(sl_list[i], &partial_fcns, ref_cnt_ptr, pfunc_ptr, Ext_fcns);
+       }
+       wh_fcns_start = sl_fcns_end = partial_fcns.size();
+       for(i=0;i<where.size();i++){
+               find_partial_fcns_pr(where[i]->pr, &partial_fcns, ref_cnt_ptr, pfunc_ptr, Ext_fcns);
+       }
+       gb_fcns_start = wh_fcns_end = partial_fcns.size();
+       if(gb_tbl != NULL){
+               for(i=0;i<gb_tbl->size();i++){
+                       find_partial_fcns(gb_tbl->get_def(i), &partial_fcns, NULL, NULL, Ext_fcns);
+               }
+       }
+       ag_fcns_start = gb_fcns_end = partial_fcns.size();
+       if(aggr_tbl != NULL){
+               for(i=0;i<aggr_tbl->size();i++){
+                       find_partial_fcns(aggr_tbl->get_aggr_se(i), NULL, NULL, &is_partial_fcn, Ext_fcns);
+               }
+       }
+       ag_fcns_end = partial_fcns.size();
+
+//             Fill up the is_partial_fcn and fcn_ref_cnt arrays.
+       if(is_aggr_query){
+               for(i=0; i<partial_fcns.size();i++){
+                       fcn_ref_cnt.push_back(1);
+                       is_partial_fcn.push_back(true);
+               }
+       }
+
+//             Unmark non-partial expensive functions referenced only once.
+       for(i=0; i<partial_fcns.size();i++){
+               if(!is_partial_fcn[i] && fcn_ref_cnt[i] <= 1){
+                       partial_fcns[i]->set_partial_ref(-1);
+               }
+       }
+
+       node_name = normalize_name(node_name);
+
+       retval += generate_preamble(schema, /*int_fcn_defs,*/ node_name, schema_embed_str);
+
+       if(packed_return){              // generate unpack struct
+               vector<tablevar_t *> input_tbls = fs->get_input_tbls();
+               int schref = input_tbls[0]->get_schema_ref();
+               vector<string> refd_cols;
+               for(s=0;s<sl_list.size();++s){
+                       gather_nicsafe_cols(sl_list[s],refd_cols, nicp, gb_tbl);
+               }
+               for(p=0;p<where.size();++p){
+//                             I'm not disabling these preds ...
+                       gather_nicsafe_cols(where[p]->pr,refd_cols, nicp, gb_tbl);
+               }
+               if(gb_tbl){
+                       for(g=0;g<gb_tbl->size();++g){
+                         gather_nicsafe_cols(gb_tbl->get_def(g),refd_cols, nicp, gb_tbl);
+                       }
+               }
+               sort(refd_cols.begin(), refd_cols.end());
+               retval += "struct "+node_name+"_input_struct{\n";
+               retval += "\tint __lfta_id_fm_nic__;\n";
+               int vsi;
+               for(vsi=0;vsi<refd_cols.size();++vsi){
+               data_type dt(schema->get_type_name(schref,refd_cols[vsi]));
+                       retval+="\t"+dt.get_cvar_type()+" unpack_var_"+refd_cols[vsi]+";\n";
+               }
+               retval+="};\n\n";
+       }
+
+
+/////////////////////////////////////////////////////
+//                     Common stuff unpacked, do some generation
+
+       if(is_aggr_query)
+         retval += generate_aggr_struct(node_name, gb_tbl, aggr_tbl);
+       if(is_fj)
+               retval += generate_fj_struct((filter_join_qpn *)fs, node_name);
+
+       retval += generate_fta_struct(node_name, gb_tbl, aggr_tbl, param_tbl, complex_literals, param_handle_table, is_aggr_query, is_fj, uses_bloom, schema);
+       retval += generate_tuple_struct(node_name, sl_list) ;
+
+       if(is_aggr_query)
+               retval += generate_fta_flush(node_name, schema, Ext_fcns) ;
+       if(param_tbl->size() > 0)
+               retval += generate_fta_load_params(node_name) ;
+       retval += generate_fta_free(node_name, is_aggr_query) ;
+       retval +=  generate_fta_control(node_name, schema, is_aggr_query) ;
+       retval +=  generate_fta_accept(fs, node_name, schema, Ext_fcns, is_aggr_query, is_fj, s_pids) ;
+
+
+       /* extract the value of Time_Correlation from interface definition */
+       int e,v;
+       string es;
+       unsigned time_corr;
+       vector<tablevar_t *> tvec =  fs->get_input_tbls();
+       vector<string> time_corr_vec = ifdb->get_iface_vals(tvec[0]->get_machine(), tvec[0]->get_interface(),"Time_Correlation",e,es);
+       if (time_corr_vec.empty())
+               time_corr = DEFAULT_TIME_CORR;
+       else
+               time_corr = atoi(time_corr_vec[0].c_str());
+
+       retval.append( generate_fta_clock(node_name, schema, time_corr, is_aggr_query) );
+       retval.append( generate_fta_alloc(fs, node_name, schema, is_aggr_query, is_fj, uses_bloom) );
+
+  return(retval);
+}
+
+
+
+int compute_snap_len(qp_node *fs, table_list *schema){
+
+//             Initialize global vars
+       gb_tbl = NULL;
+       sl_list.clear(); where.clear();
+
+       if(fs->node_type() == "spx_qpn"){
+               spx_qpn *spx_node = (spx_qpn *)fs;
+               sl_list = spx_node->get_select_se_list();
+               where = spx_node->get_where_clause();
+       }
+       else if(fs->node_type() == "sgah_qpn"){
+               sgah_qpn *sgah_node = (sgah_qpn *)fs;
+               sl_list = sgah_node->get_select_se_list();
+               where = sgah_node->get_where_clause();
+               gb_tbl = sgah_node->get_gb_tbl();
+       }
+       else if(fs->node_type() == "filter_join"){
+               filter_join_qpn *fj_node = (filter_join_qpn *)fs;
+               sl_list = fj_node->get_select_se_list();
+               where = fj_node->get_where_clause();
+       } else{
+               fprintf(stderr,"INTERNAL ERROR, node type %s not recognized in compute_snap_len\n",fs->node_type().c_str());
+               exit(1);
+       }
+
+//                     Gather all column references, need to define unpacking variables.
+  int w,s;
+  col_id_set cid_set;
+  col_id_set::iterator csi;
+
+  for(w=0;w<where.size();++w)
+       gather_pr_col_ids(where[w]->pr,cid_set, gb_tbl);
+  for(s=0;s<sl_list.size();s++){
+       gather_se_col_ids(sl_list[s],cid_set, gb_tbl);
+  }
+
+  int g;
+  if(gb_tbl != NULL){
+       for(g=0;g<gb_tbl->size();g++)
+         gather_se_col_ids(gb_tbl->get_def(g),cid_set, gb_tbl);
+  }
+
+  //                   compute snap length
+  int snap_len = -1;
+  int n_snap=0;
+  for(csi=cid_set.begin(); csi!=cid_set.end();++csi){
+    int schref = (*csi).schema_ref;
+       int tblref = (*csi).tblvar_ref;
+    string field = (*csi).field;
+
+       param_list *field_params = schema->get_modifier_list(schref, field);
+       if(field_params->contains_key("snap_len")){
+               string fld_snap_str = field_params->val_of("snap_len");
+               int fld_snap;
+               if(sscanf(fld_snap_str.c_str(),"%d",&fld_snap)>0){
+                       if(fld_snap > snap_len) snap_len = fld_snap;
+                       n_snap++;
+               }else{
+                       fprintf(stderr,"CONFIGURATION ERROR: field %s has a non-numeric snap length (%s), ignoring\n",field.c_str(), fld_snap_str.c_str() );
+               }
+       }
+  }
+
+  if(n_snap == cid_set.size()){
+       return (snap_len);
+  }else{
+       return -1;
+  }
+
+
+}
+
+//             Function which computes an optimal
+//             set of unpacking functions.
+
+void find_optimal_unpack_fcns(col_id_set &upref_cids, table_list *Schema, map<col_id, string,lt_col_id> &ucol_fcn_map){
+       map<string, int> pfcn_count;
+       map<string, int>::iterator msii;
+       col_id_set::iterator cisi;
+       set<string>::iterator ssi;
+       string best_fcn;
+
+       while(ucol_fcn_map.size() < upref_cids.size()){
+
+//                     Gather unpack functions referenced by unaccounted-for
+//                     columns, and increment their reference count.
+               pfcn_count.clear();
+               for(cisi=upref_cids.begin();cisi!=upref_cids.end();++cisi){
+                       if(ucol_fcn_map.count((*cisi)) == 0){
+                               set<string> ufcns = Schema->get_field((*cisi).schema_ref, (*cisi).field)->get_unpack_fcns();
+                               for(ssi=ufcns.begin();ssi!=ufcns.end();++ssi)
+                                       pfcn_count[(*ssi)]++;
+                       }
+               }
+
+//             Get the lowest cost per field function.
+               float min_cost = 0.0;
+               string best_fcn = "";
+               for(msii=pfcn_count.begin();msii!=pfcn_count.end();++msii){
+                       int fcost = Schema->get_ufcn_cost((*msii).first);
+                       if(fcost < 0){
+                               fprintf(stderr,"CONFIGURATION ERROR, unpack function %s either has negative cost or is not defined.\n",(*msii).first.c_str());
+                               exit(1);
+                       }
+                       float this_cost = (1.0*fcost)/(*msii).second;
+                       if(msii == pfcn_count.begin() || this_cost < min_cost){
+                               min_cost = this_cost;
+                               best_fcn = (*msii).first;
+                       }
+               }
+               if(best_fcn == ""){
+                       fprintf(stderr,"ERROR, could not find a best field unpqacking function.\n");
+                       exit(1);
+               }
+
+//             Assign this function to the unassigned fcns which use it.
+               for(cisi=upref_cids.begin();cisi!=upref_cids.end();++cisi){
+                       if(ucol_fcn_map.count((*cisi)) == 0){
+                               set<string> ufcns = Schema->get_field((*cisi).schema_ref, (*cisi).field)->get_unpack_fcns();
+                               if(ufcns.count(best_fcn)>0)
+                                       ucol_fcn_map[(*cisi)] = best_fcn;
+                       }
+               }
+       }
+}
+
+
+
+//             Generate an initial test test for the lfta
+//             Assume that the predicate references no external functions,
+//             and especially no partial functions,
+//             aggregates, internal functions.
+string generate_lfta_prefilter(vector<cnf_set *> &pred_list,
+               col_id_set &temp_cids, table_list *Schema, ext_fcn_list *Ext_fcns,
+               vector<col_id_set> &lfta_cols, vector<long long int> &lfta_sigs,
+               vector<int> &lfta_snap_lens, string iface){
+  col_id_set tmp_cid_set, cid_set,upref_cids,upall_cids;
+  col_id_set::iterator csi;
+       int o,p,q;
+       string ret;
+
+//             Gather complex literals in the prefilter.
+       cplx_lit_table *complex_literals = new cplx_lit_table();
+       for(p=0;p<pred_list.size();++p){
+               find_complex_literal_pr(pred_list[p]->pr,Ext_fcns, complex_literals);
+       }
+
+
+//             Find the combinable predicates
+       vector<predicate_t *> pr_list;
+       for(p=0;p<pred_list.size();++p){
+       find_combinable_preds(pred_list[p]->pr,&pr_list, Schema, Ext_fcns);
+       }
+
+//             Analyze the combinable predicates to find the predicate classes.
+       pred_class.clear();             // idx to equiv pred in equiv_list
+       pred_pos.clear();               // idx to returned bitmask.
+       vector<predicate_t *> equiv_list;
+       vector<int> num_equiv;
+
+
+       for(p=0;p<pr_list.size();++p){
+               for(q=0;q<equiv_list.size();++q){
+                       if(is_equivalent_class_pred_base(equiv_list[q],pr_list[p],Schema,Ext_fcns))
+                               break;
+               }
+               if(q == equiv_list.size()){             // no equiv : create new
+                       pred_class.push_back(equiv_list.size());
+                       equiv_list.push_back(pr_list[p]);
+                       pred_pos.push_back(0);
+                       num_equiv.push_back(1);
+
+               }else{                  // pr_list[p] is equivalent to pred q
+                       pred_class.push_back(q);
+                       pred_pos.push_back(num_equiv[q]);
+                       num_equiv[q]++;
+               }
+       }
+
+//             Generate the variables which hold the common pred handles
+       ret += "/*\t\tprefilter global vars.\t*/\n";
+       for(q=0;q<equiv_list.size();++q){
+               for(p=0;p<=(num_equiv[q]/32);++p){
+                       ret += "void *pref_common_pred_hdl_"+int_to_string(q)+"_"+int_to_string(p)+"_"+iface+";\n";
+               }
+       }
+
+//             Struct to hold prefilter complex literals
+       ret += "struct prefilter_complex_lit_struct_"+iface+" {\n";
+       if(complex_literals->size() == 0)
+               ret += "\tint no_variable;\n";
+       int cl;
+       for(cl=0;cl<complex_literals->size();cl++){
+               literal_t *l = complex_literals->get_literal(cl);
+               data_type *dtl = new data_type( l->get_type() );
+               sprintf(tmpstr,"\t%s complex_literal_%d;\n",dtl->get_cvar_type().c_str(),cl);
+               ret += tmpstr;
+       }
+       ret += "} prefilter_complex_lits_"+iface+";\n\n";
+
+
+//             Generate the prefilter initialziation code
+       ret += "void init_lfta_prefilter_"+iface+"(){\n";
+
+//             First initialize complex literals, if any.
+       ret += "\tstruct prefilter_complex_lit_struct_"+iface+" *t = &prefilter_complex_lits_"+iface+";\n";
+       for(cl=0;cl<complex_literals->size();cl++){
+               literal_t *l = complex_literals->get_literal(cl);
+               sprintf(tmpstr,"&(t->complex_literal_%d)",cl);
+               ret += "\t" + l->to_C_code(tmpstr) + ";\n";
+       }
+
+
+       set<int> epred_seen;
+       for(p=0;p<pr_list.size();++p){
+               int q = pred_class[p];
+//printf("\tq=%d\n",q);
+               if(epred_seen.count(q)>0){
+                       ret += "\tregister_commonpred_handles_"+equiv_list[q]->get_op()+"(";
+                       vector<bool> cl_op = Ext_fcns->get_class_indicators(equiv_list[q]->get_fcn_id());
+                       vector<scalarexp_t *> op_list = pr_list[p]->get_op_list();
+                       for(o=0;o<op_list.size();++o){
+                               if(! cl_op[o]){
+                                       ret += generate_se_code(op_list[o],Schema)+", ";
+                               }
+                       }
+                       ret += "pref_common_pred_hdl_"+int_to_string(q)+"_"+int_to_string(pred_pos[p]/32)+"_"+iface+","+int_to_string(pred_pos[p]%32)+");\n";
+                       epred_seen.insert(q);
+               }else{
+                       ret += "\tpref_common_pred_hdl_"+int_to_string(q)+"_"+int_to_string(pred_pos[p]/32)+"_"+iface+" = (void *)register_commonpred_handles_"+equiv_list[q]->get_op()+"(";
+                       vector<bool> cl_op = Ext_fcns->get_class_indicators(equiv_list[q]->get_fcn_id());
+                       vector<scalarexp_t *> op_list = pr_list[p]->get_op_list();
+                       for(o=0;o<op_list.size();++o){
+                               if(! cl_op[o]){
+                                       ret += generate_se_code(op_list[o],Schema)+", ";
+                               }
+                       }
+                       ret += "NULL,"+int_to_string(pred_pos[p]%32)+");\n";
+                       epred_seen.insert(q);
+               }
+       }
+       ret += "}\n\n";
+
+
+
+//             Start on main body code generation
+  ret+="gs_uint64_t lfta_prefilter_"+iface+"(void *pkt){\n";
+
+
+///--------------------------------------------------------------
+///            Generate and store the prefilter body,
+///            reuse it for the snap length calculator
+///-------------------------------------------------------------
+       string body;
+
+    body += "\tstruct packet *p = (struct packet *)pkt;\n";
+
+
+
+//             Gather the colids to store unpacked variables.
+       for(p=0;p<pred_list.size();++p){
+       gather_pr_col_ids(pred_list[p]->pr,tmp_cid_set, gb_tbl);
+       }
+
+//             make the col_ids refer to the base tables, and
+//             grab the col_ids with at least one unpacking function.
+       for(csi=tmp_cid_set.begin();csi!=tmp_cid_set.end();++csi){
+               string c_tbl = Schema->get_basetbl_name((*csi).schema_ref,(*csi).field);
+               col_id tmp_col_id;
+               tmp_col_id.field = (*csi).field;
+               tmp_col_id.tblvar_ref = (*csi).tblvar_ref;
+               tmp_col_id.schema_ref = Schema->get_table_ref(c_tbl);
+               cid_set.insert(tmp_col_id);
+               field_entry *fe = Schema->get_field(tmp_col_id.schema_ref, tmp_col_id.field);
+               if(fe->get_unpack_fcns().size()>0)
+                       upref_cids.insert(tmp_col_id);
+
+
+       }
+
+//             Find the set of unpacking programs needed for the
+//             prefilter fields.
+       map<col_id, string,lt_col_id>  ucol_fcn_map;
+       find_optimal_unpack_fcns(upref_cids, Schema, ucol_fcn_map);
+       set<string> pref_ufcns;
+       map<col_id, string,lt_col_id>::iterator mcis;
+       for(mcis=ucol_fcn_map.begin(); mcis!=ucol_fcn_map.end(); mcis++){
+               pref_ufcns.insert((*mcis).second);
+       }
+
+
+
+//                     Variables for unpacking attributes.
+    body += "/*\t\tVariables for unpacking attributes\t*/\n";
+    for(csi=cid_set.begin(); csi!=cid_set.end();++csi){
+      int schref = (*csi).schema_ref;
+         int tblref = (*csi).tblvar_ref;
+      string field = (*csi).field;
+      data_type dt(Schema->get_type_name(schref,field));
+      sprintf(tmpstr,"\t%s unpack_var_%s_%d;\n",dt.get_cvar_type().c_str(),
+       field.c_str(), tblref);
+      body += tmpstr;
+      sprintf(tmpstr,"\tgs_retval_t ret_%s_%d;\n", field.c_str(),tblref);
+      body += tmpstr;
+    }
+//                     Variables for unpacking temporal attributes.
+    body += "/*\t\tVariables for unpacking temporal attributes\t*/\n";
+    for(csi=temp_cids.begin(); csi!=temp_cids.end();++csi){
+         if (cid_set.count(*csi) == 0) {
+       int schref = (*csi).schema_ref;
+               int tblref = (*csi).tblvar_ref;
+        string field = (*csi).field;
+        data_type dt(Schema->get_type_name(schref,field));
+        sprintf(tmpstr,"\t%s unpack_var_%s_%d;\n",dt.get_cvar_type().c_str(),
+         field.c_str(), tblref);
+        body += tmpstr;
+
+         }
+    }
+    body += "\n\n";
+
+//             Variables for combinable predicate evaluation
+       body += "/*\t\tVariables for common prdicate evaluation\t*/\n";
+       for(q=0;q<equiv_list.size();++q){
+               for(p=0;p<=(num_equiv[q]/32);++p){
+                       body += "unsigned long int pref_common_pred_val_"+int_to_string(q)+"_"+int_to_string(p)+" = 0;\n";
+               }
+       }
+
+
+//                     Variables that are always needed
+    body += "/*\t\tVariables which are always needed\t*/\n";
+       body += "\tgs_uint64_t retval=0, bitpos=1;\n";
+       body += "\tstruct prefilter_complex_lit_struct_"+iface+" *t = &prefilter_complex_lits_"+iface+";\n";
+
+//             Call the unpacking functions for the prefilter fields
+       if(pref_ufcns.size() > 0)
+               body += "\n/*\t\tcall field unpacking functions\t*/\n";
+       set<string>::iterator ssi;
+       for(ssi=pref_ufcns.begin(); ssi!=pref_ufcns.end(); ++ssi){
+               body += "\t"+Schema->get_ufcn_fcn((*ssi))+"(p);\n";
+       }
+
+
+//             Unpack the accessed attributes
+       body += "\n/*\t\tUnpack the accessed attributes.\t*/\n";
+    for(csi=cid_set.begin();csi!=cid_set.end();++csi){
+         int tblref = (*csi).tblvar_ref;
+      int schref = (*csi).schema_ref;
+         string field = (*csi).field;
+         sprintf(tmpstr,"\tret_%s_%d =  (%s(p, &unpack_var_%s_%d) == 0);\n",
+               field.c_str(),tblref,Schema->get_fcn(schref,field).c_str(), field.c_str(), tblref);
+         body += tmpstr;
+    }
+
+//             next unpack the temporal attributes and ignore the errors
+//             We are assuming here that failed unpack of temporal attributes
+//             is not going to overwrite the last stored value
+//             Failed upacks are ignored
+    for(csi=temp_cids.begin();csi!=temp_cids.end();++csi){
+         int tblref = (*csi).tblvar_ref;
+      int schref = (*csi).schema_ref;
+         string field = (*csi).field;
+         sprintf(tmpstr,"\t%s(p, &prefilter_temp_vars.unpack_var_%s_%d);\n",
+                Schema->get_fcn(schref,field).c_str(), field.c_str(), tblref);
+         body += tmpstr;
+    }
+
+//             Evaluate the combinable predicates
+       if(equiv_list.size()>0)
+               body += "/*\t\tEvaluate the combinable predicates.\t*/\n";
+       for(q=0;q<equiv_list.size();++q){
+               for(p=0;p<=(num_equiv[q]/32);++p){
+
+//             Only call the common eval fcn if all ref'd fields present.
+                       col_id_set pred_cids;
+                       col_id_set::iterator cpi;
+                       gather_pr_col_ids(equiv_list[q], pred_cids, gb_tbl);
+                       if(pred_cids.size()>0){
+                       body += "\tif(";
+                               for(cpi=pred_cids.begin();cpi!=pred_cids.end();++cpi){
+                                       if(cpi != pred_cids.begin())
+                                               body += " && ";
+                               string field = (*cpi).field;
+                                       int tblref = (*cpi).tblvar_ref;
+                                       body += "ret_"+field+"_"+int_to_string(tblref);
+                               }
+                               body+=")\n";
+                       }
+
+                       body += "\t\tpref_common_pred_val_"+int_to_string(q)+"_"+int_to_string(p)+" = eval_commonpred_"+equiv_list[q]->get_op()+"(pref_common_pred_hdl_"+int_to_string(q)+"_"+int_to_string(p)+"_"+iface;
+                       vector<scalarexp_t *> op_list = equiv_list[q]->get_op_list();
+                       vector<bool> cl_op = Ext_fcns->get_class_indicators(equiv_list[q]->get_fcn_id());
+                       for(o=0;o<op_list.size();++o){
+                               if(cl_op[o]){
+                                       body += ","+generate_se_code(op_list[o],Schema);
+                               }
+                       }
+                       body += ");\n";
+               }
+       }
+
+
+       for(p=0;p<pred_list.size();++p){
+               col_id_set pred_cids;
+               col_id_set::iterator cpi;
+               gather_pr_col_ids(pred_list[p]->pr,pred_cids, gb_tbl);
+               if(pred_cids.size()>0){
+                       body += "\tif(";
+                       for(cpi=pred_cids.begin();cpi!=pred_cids.end();++cpi){
+                               if(cpi != pred_cids.begin())
+                                       body += " && ";
+                       string field = (*cpi).field;
+                               int tblref = (*cpi).tblvar_ref;
+                               body += "ret_"+field+"_"+int_to_string(tblref);
+                       }
+                       body+=")\n";
+               }
+       body += "\t\tif("+generate_predicate_code(pred_list[p]->pr,Schema)+")\n\t\t\tretval |= bitpos;\n";
+               body+="\tbitpos = bitpos << 1;\n";
+       }
+
+// ---------------------------------------------------------------
+//             Finished with the body of the prefilter
+// --------------------------------------------------------------
+
+       ret += body;
+
+//                     Collect fields referenced by an lfta but not
+//                     already unpacked for the prefilter.
+
+//printf("upref_cids is:\n");
+//for(csi=upref_cids.begin();csi!=upref_cids.end();csi++)
+//printf("\t%s %d\n",(*csi).field.c_str(), (*csi).schema_ref);
+//printf("pref_ufcns is:\n");
+//for(ssi=pref_ufcns.begin();ssi!=pref_ufcns.end();++ssi)
+//printf("\t%s\n",(*ssi).c_str());
+
+       int l;
+       for(l=0;l<lfta_cols.size();++l){
+               for(csi=lfta_cols[l].begin();csi!=lfta_cols[l].end();++csi){
+                       string c_tbl = Schema->get_basetbl_name((*csi).schema_ref,(*csi).field);
+                       col_id tmp_col_id;
+                       tmp_col_id.field = (*csi).field;
+                       tmp_col_id.tblvar_ref = (*csi).tblvar_ref;
+                       tmp_col_id.schema_ref = Schema->get_table_ref(c_tbl);
+                       field_entry *fe = Schema->get_field(tmp_col_id.schema_ref, tmp_col_id.field);
+                       set<string> fld_ufcns = fe->get_unpack_fcns();
+//printf("tmpcol is (%s, %d), ufcns size is %d, upref_cids cnt is %d\n",tmp_col_id.field.c_str(),tmp_col_id.schema_ref,fld_ufcns.size(),  upref_cids.count(tmp_col_id));
+                       if(fld_ufcns.size()>0 && upref_cids.count(tmp_col_id) == 0){
+//             Ensure that this field not already unpacked.
+                               bool found = false;
+                               for(ssi=fld_ufcns.begin();ssi!=fld_ufcns.end();++ssi){
+//printf("\tField has unpacking fcn %s\n",(*ssi).c_str());
+                                       if(pref_ufcns.count((*ssi))){
+//printf("Field already unpacked.\n");
+                                               found = true;;
+                                       }
+                               }
+                               if(! found){
+//printf("\tadding to unpack list\n");
+                                       upall_cids.insert(tmp_col_id);
+                               }
+                       }
+               }
+       }
+
+//printf("upall_cids is:\n");
+//for(csi=upall_cids.begin();csi!=upall_cids.end();csi++)
+//printf("\t%s %d\n",(*csi).field.c_str(), (*csi).schema_ref);
+
+//             Get the set of unpacking programs for these.
+       map<col_id, string,lt_col_id>  uall_fcn_map;
+       find_optimal_unpack_fcns(upall_cids, Schema, uall_fcn_map);
+       set<string> pall_ufcns;
+       for(mcis=uall_fcn_map.begin(); mcis!=uall_fcn_map.end(); mcis++){
+//printf("uall_fcn_map[%s %d] = %s\n",(*mcis).first.field.c_str(),(*mcis).first.schema_ref,(*mcis).second.c_str());
+               pall_ufcns.insert((*mcis).second);
+       }
+
+//             Iterate through the remaining set of unpacking function
+       if(pall_ufcns.size() > 0)
+               ret += "//\t\tcall all remaining field unpacking functions.\n";
+       for(ssi=pall_ufcns.begin(); ssi!=pall_ufcns.end(); ++ssi){
+//             gather the set of columns unpacked by this ufcn
+               col_id_set fcol_set;
+               for(csi=upall_cids.begin();csi!=upall_cids.end();++csi){
+                       if(uall_fcn_map[(*csi)] == (*ssi))
+                               fcol_set.insert((*csi));
+               }
+
+//             gather the set of lftas which access a field unpacked by the fcn
+               set<long long int> clfta;
+               for(l=0;l<lfta_cols.size();l++){
+                       for(csi=fcol_set.begin();csi!=fcol_set.end();++csi){
+                               if(lfta_cols[l].count((*csi)) > 0)
+                                       break;
+                       }
+                       if(csi != fcol_set.end())
+                               clfta.insert(lfta_sigs[l]);
+               }
+
+//             generate the unpacking code
+               ret += "\tif(";
+               set<long long int>::iterator sii;
+               for(sii=clfta.begin();sii!=clfta.end();++sii){
+                       if(sii!=clfta.begin())
+                               ret += " || ";
+                       sprintf(tmpstr,"((retval & %lluull) == %lluull)",(*sii),(*sii));
+                       ret += tmpstr;
+               }
+               ret += ")\n\t\t"+Schema->get_ufcn_fcn((*ssi))+"(p);\n";
+       }
+
+
+    ret += "\treturn(retval);\n\n";
+  ret += "}\n\n";
+
+
+// --------------------------------------------------------
+//             reuse prefilter body for snaplen calculator
+//
+//     This is dummy code, so I'm commenting it out.
+
+/*
+  ret+="gs_uint32_t lfta_pkt_snaplen(void *pkt){\n";
+
+       ret += body;
+
+       int i;
+       vector<int> s_snaps = lfta_snap_lens;
+       sort(s_snaps.begin(), s_snaps.end());
+
+       if(s_snaps[0] == -1){
+               set<unsigned long long int> sigset;
+               for(i=0;i<lfta_snap_lens.size();++i){
+                       if(lfta_snap_lens[i] == -1){
+                               sigset.insert(lfta_sigs[i]);
+                       }
+               }
+               ret += "\tif( ";
+               set<unsigned long long int>::iterator sulli;
+               for(sulli=sigset.begin();sulli!=sigset.end();++sulli){
+                       if(sulli!=sigset.begin())
+                               ret += " || ";
+                       sprintf(tmpstr,"((retval & %lluull) == %lluull)",(*sulli),(*sulli));
+                       ret += tmpstr;
+               }
+               ret += ") return -1;\n";
+       }
+
+       int nextpos = lfta_snap_lens.size()-1;
+       int nextval = lfta_snap_lens[nextpos];
+       while(nextval >= 0){
+               set<unsigned long long int> sigset;
+               for(i=0;i<lfta_snap_lens.size();++i){
+                       if(lfta_snap_lens[i] == nextval){
+                               sigset.insert(lfta_sigs[i]);
+                       }
+               }
+               ret += "\tif( ";
+               set<unsigned long long int>::iterator sulli;
+               for(sulli=sigset.begin();sulli!=sigset.end();++sulli){
+                       if(sulli!=sigset.begin())
+                               ret += " || ";
+                       sprintf(tmpstr,"((retval & %lluull) == %lluull)",(*sulli),(*sulli));
+                       ret += tmpstr;
+               }
+               ret += ") return "+int_to_string(nextval)+";\n";
+
+               for(nextpos--;nextpos>0 && lfta_snap_lens[nextpos] == nextval;nextpos--);
+               if(nextpos>0)
+                       nextval = lfta_snap_lens[nextpos];
+               else
+                       nextval = -1;
+       }
+       ret += "\treturn 0;\n";
+       ret += "}\n\n";
+*/
+
+
+  return(ret);
+}
+
+
+
+
+//             Generate the struct which will store the the values of
+//             temporal attributesunpacked by prefilter
+string generate_lfta_prefilter_struct(col_id_set &cid_set, table_list *Schema) {
+
+  col_id_set::iterator csi;
+
+// printf("generate_lfta_prefilter_struct : %d vars\n",cid_set.size());
+
+  string ret="struct prefilter_unpacked_temp_vars {\n";
+  ret += "\t/*\tVariables for unpacking temporal attributes\t*/\n";
+
+  string init_code;
+
+  for(csi=cid_set.begin(); csi!=cid_set.end();++csi){
+    int schref = (*csi).schema_ref;
+    int tblref = (*csi).tblvar_ref;
+    string field = (*csi).field;
+       data_type dt(Schema->get_type_name(schref,field), Schema->get_modifier_list(schref,field));
+    sprintf(tmpstr,"\t%s unpack_var_%s_%d;\n",dt.get_cvar_type().c_str(),
+       field.c_str(), tblref);
+    ret += tmpstr;
+
+       if (init_code != "")
+               init_code += ", ";
+       if (dt.is_increasing())
+               init_code += dt.get_min_literal();
+       else
+               init_code += dt.get_max_literal();
+
+  }
+  ret += "};\n\n";
+
+  ret += "struct prefilter_unpacked_temp_vars prefilter_temp_vars = {" + init_code + "};\n\n";
+
+  return(ret);
+}
diff --git a/src/ftacmp/generate_lfta_code.h b/src/ftacmp/generate_lfta_code.h
new file mode 100644 (file)
index 0000000..a1dbe4e
--- /dev/null
@@ -0,0 +1,37 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __GENERATE_FTA_CODE_H_DEFINED__
+#define __GENERATE_FTA_CODE_H_DEFINED__
+
+#include <string>
+#include <map>
+#include "parse_fta.h"
+#include "parse_schema.h"
+#include "query_plan.h"
+#include"nic_def.h"
+
+
+std::string generate_lfta_block(qp_node *fs, table_list *schema, int gid,
+//     std::map<std::string,std::string> &int_fcn_defs,
+       ext_fcn_list *Ext_fcns, std::string &schema_embed_str, ifq_t *ifdb, nic_property *nicp, set<unsigned int> &s_pids);
+
+std::string generate_lfta_prefilter(std::vector<cnf_set *> &pred_list, col_id_set &temp_cids, table_list *Schema, ext_fcn_list *Ext_fcns, std::vector<col_id_set> &lfta_cols, std::vector<long long int> &lfta_sigs, vector<int> &lfta_snap_lens, std::string iface);
+std::string generate_lfta_prefilter_struct(col_id_set &temp_cids, table_list *Schema);
+
+int compute_snap_len(qp_node *fs, table_list *schema);
+
+
+#endif
+
diff --git a/src/ftacmp/generate_nic_code.cc b/src/ftacmp/generate_nic_code.cc
new file mode 100644 (file)
index 0000000..77de31a
--- /dev/null
@@ -0,0 +1,543 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include <string>
+#include <stdio.h>
+#include <stdlib.h>
+#include <algorithm>
+
+#include "parse_fta.h"
+#include "parse_schema.h"
+#include "analyze_fta.h"
+#include "generate_utils.h"
+#include "query_plan.h"
+#include "generate_nic_code.h"
+#include"analyze_fta.h"
+
+#define LEFT 1
+#define RIGHT 2
+
+using namespace std;
+
+static const char *fcn_for_op[] = {
+       "+", "plus",
+       "-", "minus",
+       "|", "bitwise_or",
+       "*", "multiply",
+       "/", "divide",
+       "&", "bitwise_and",
+       "%", "modulo",
+       ">>", "shift_right",
+       "<<", "shift_left",
+       "AND", "AND",
+       "OR", "OR",
+       "=", "equal",
+       ">", "greater",
+       "<", "less",
+       ">=", "greater_equal",
+       "<=", "less_equal",
+       "<>", "not_equal",
+       "END"
+};
+
+static const char *fcn_for_unary_op[]= {
+       "+", "unary_plus",
+       "-", "unary_minus",
+       "!", "integer_not",
+       "~", "bitwise_not",
+       "NOT", "logical_not",
+       "END"
+};
+
+static string nic_fcn(string op){
+int i = 0;
+bool done = false;
+
+  while(!done){
+       if(string(fcn_for_op[i]) == string("END")){
+               done = true;
+               break;
+       }
+       if(string(fcn_for_op[i]) == op){
+               return string(fcn_for_op[i+1]);
+       }
+       i++;
+  }
+  fprintf(stderr,"INTERNAL ERROR, operator %s not found in nic_fcn\n",op.c_str());
+  return string("ERROR");
+}
+
+
+static string unary_nic_fcn(string op){
+int i = 0;
+bool done = false;
+
+  while(!done){
+       if(string(fcn_for_unary_op[i]) == string("END")){
+               done = true;
+               break;
+       }
+       if(string(fcn_for_unary_op[i]) == op){
+               return string(fcn_for_unary_op[i+1]);
+       }
+       i++;
+  }
+  fprintf(stderr,"INTERNAL ERROR, operator %s not found in unary_nic_fcn\n",op.c_str());
+  return string("ERROR");
+}
+
+
+
+
+//                     Generate code that makes reference
+//                     to the tuple, and not to any aggregates.
+static string generate_nic_se_code(scalarexp_t *se,
+               map<string, string> &constants,
+               int &copy_var_cnt,
+               set<string> &no_copy_vars,
+               string *retvar, int lr,
+               gb_table *gbt  ){
+
+       string ret = "";
+       string l,cid;
+    data_type *ldt, *rdt;
+       int o;
+       vector<scalarexp_t *> operands;
+       string lvar, rvar;
+       int gbref;
+
+       string op = se->get_op();
+//printf("op_type=%d op=%s\n",se->get_operator_type(),op.c_str());
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               l = se->get_literal()->to_query_string();
+               if(constants.count(l)){
+                       cid = constants[l];
+               }else{
+                       cid = "constant"+int_to_string(constants.size());
+                       constants[cid] = l;
+               }
+               *retvar = cid;
+               if(lr == LEFT){
+                       *retvar = "copyvar_"+int_to_string(copy_var_cnt);
+                       copy_var_cnt++;
+                       ret += "load_with_copy("+*retvar+","+cid+")\n";
+               }
+               return(ret);
+       case SE_PARAM:
+               fprintf(stderr,"INTERNAL ERROR, param ref'd in generate_nic_se_code\n");
+               *retvar = "error";
+               return("ERROR in generate_nic_se_code");
+       case SE_UNARY_OP:
+               ret += generate_nic_se_code(se->get_left_se(),
+                       constants, copy_var_cnt, no_copy_vars, &lvar,LEFT,gbt);
+               ret += unary_nic_fcn(op)+"("+lvar+")\n";
+               *retvar = lvar;
+               return(ret);
+       case SE_BINARY_OP:
+               ret += generate_nic_se_code(se->get_left_se(),
+                       constants, copy_var_cnt, no_copy_vars, &lvar,LEFT,gbt);
+               ret += generate_nic_se_code(se->get_right_se(),
+                       constants, copy_var_cnt, no_copy_vars, &rvar,RIGHT,gbt);
+               ret += nic_fcn(op)+"("+lvar+","+rvar+")\n";
+               *retvar = lvar;
+//printf("op %s; lvar=%s, rvar=%s, retvar=%s\n",op.c_str(), lvar.c_str(), rvar.c_str(), retvar->c_str());
+               return(ret);
+       case SE_COLREF:
+               if(se->is_gb()){
+                       gbref = se->get_gb_ref();
+/*
+                       if(gbt->get_reftype(gbref) != GBVAR_COLREF){
+                               fprintf(stderr,"INTERNAL ERROR, non-colref gbvar in generate_nic_se_code\n");
+                               exit(1);
+                       }
+*/
+                       ret = generate_nic_se_code(gbt->get_def(gbref),constants,copy_var_cnt, no_copy_vars, &lvar,LEFT,gbt);
+                       *retvar = lvar;
+                       return ret;
+               }
+               if(lr == LEFT){
+                       *retvar = "copyvar_"+int_to_string(copy_var_cnt);
+                       copy_var_cnt++;
+                       ret += "load_with_copy("+*retvar+","+se->get_colref()->get_field()+")\n";
+               }else{
+                       *retvar = "nocopyvar_"+se->get_colref()->get_field();
+                       if(no_copy_vars.count(*retvar) == 0){
+                               no_copy_vars.insert(*retvar);
+                               ret += "load("+*retvar+","+se->get_colref()->get_field()+")\n";
+                       }
+               }
+               return ret;
+
+       case SE_FUNC:
+               fprintf(stderr,"CONFIG ERROR, fcn reference in generate_nic_se_code, not yet implemented.\n");
+               *retvar = "error";
+               return(ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in generate_nic_se_code (lfta), line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               *retvar = "error";
+               return("ERROR in generate_nic_se_code");
+       }
+}
+
+
+static string generate_nic_predicate_code(predicate_t *pr,
+               map<string, string> &constants,
+               int &copy_var_cnt,
+               set<string> &no_copy_vars,
+               string *retvar, gb_table *gbt  ){
+       string ret;
+       vector<literal_t *>  litv;
+       int i;
+    data_type *ldt, *rdt;
+       vector<scalarexp_t *> op_list;
+       int o;
+       string lvar, rvar;
+       string l,cid;
+       string op = pr->get_op();
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               fprintf(stderr,"CONFIG ERROR: IN not supported in generate_nic_predicate_code\n");
+               *retvar = "error";
+               return("ERROR in generate_nic_predicate_code");
+
+       case PRED_COMPARE:
+               ret += generate_nic_se_code(pr->get_left_se(),
+                       constants, copy_var_cnt, no_copy_vars, &lvar,LEFT,gbt);
+               ret += generate_nic_se_code(pr->get_right_se(),
+                       constants, copy_var_cnt, no_copy_vars, &rvar,RIGHT,gbt);
+               ret += nic_fcn(op)+"("+lvar+","+rvar+")\n";
+               *retvar = lvar;
+               return(ret);
+       case PRED_UNARY_OP:
+               ret += generate_nic_predicate_code(pr->get_left_pr(),
+                       constants, copy_var_cnt, no_copy_vars, &lvar,gbt);
+               ret += unary_nic_fcn(op)+"("+lvar+")\n";
+               *retvar = lvar;
+               return(ret);
+       case PRED_BINARY_OP:
+               ret += generate_nic_predicate_code(pr->get_left_pr(),
+                       constants, copy_var_cnt, no_copy_vars, &lvar,gbt);
+               ret += generate_nic_predicate_code(pr->get_right_pr(),
+                       constants, copy_var_cnt, no_copy_vars, &rvar,gbt);
+               ret += nic_fcn(op)+"("+lvar+","+rvar+")\n";
+               *retvar = lvar;
+               return(ret);
+       case PRED_FUNC:
+               fprintf(stderr,"CONFIG ERROR, fcn reference in generate_nic_pred_code, not yet implemented.\n");
+               *retvar = "error";
+               return(ret);
+               ret += " )";
+               return(ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in generate_predicate_nic_code, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               return("ERROR in generate_nic_predicate_code");
+       }
+}
+
+
+bool se_is_nic_safe(scalarexp_t *se, nic_property *nicp, gb_table *gbt){
+  string dts, colname;
+  bool rs, ls;
+  int gbref;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               dts = se->get_data_type()->get_type_str();
+               if(nicp->legal_type(dts))
+                       return true;
+               return false;
+               break;
+       case SE_PARAM:
+               return false;
+               break;
+       case SE_UNARY_OP:
+               if(!se_is_nic_safe(se->get_left_se(), nicp, gbt)) return false;
+               return(nicp->legal_unary_op(se->get_op()));
+               break;
+       case SE_BINARY_OP:
+               if(!se_is_nic_safe(se->get_left_se(), nicp, gbt)) return false;
+               if(!se_is_nic_safe(se->get_right_se(), nicp, gbt)) return false;
+               return(nicp->legal_binary_op(se->get_op()));
+               break;
+       case SE_COLREF:
+               if(se->is_gb()){
+                       gbref = se->get_gb_ref();
+/*
+                       if(gbt->get_reftype(gbref) != GBVAR_COLREF){
+                               return false;
+                       }
+*/
+                       return se_is_nic_safe(gbt->get_def(gbref),nicp,gbt);
+               }
+               dts = se->get_data_type()->get_type_str();
+               if(! nicp->legal_type(dts))
+                       return false;
+               colname = se->get_colref()->get_field();
+               if(! nicp->illegal_field(colname))
+                       return true;
+               return false;
+               break;
+       case SE_FUNC:
+               return false;
+    default:
+               return false;
+       }
+
+       return false;
+}
+
+
+bool pr_is_nic_safe(predicate_t *pr, nic_property *nicp, gb_table *gbt){
+  string dts, colname;
+  bool rs, ls;
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               return false;
+       case PRED_COMPARE:
+               if(!se_is_nic_safe(pr->get_left_se(), nicp, gbt)) return false;
+               if(!se_is_nic_safe(pr->get_right_se(), nicp, gbt)) return false;
+               return(nicp->legal_binary_op(pr->get_op()));
+       case PRED_UNARY_OP:
+               if(!pr_is_nic_safe(pr->get_left_pr(),nicp, gbt)) return false;
+               return(nicp->legal_unary_op(pr->get_op()));
+       case PRED_BINARY_OP:
+               if(!pr_is_nic_safe(pr->get_left_pr(),nicp, gbt)) return false;
+               if(!pr_is_nic_safe(pr->get_right_pr(),nicp, gbt)) return false;
+               return(nicp->legal_binary_op(pr->get_op()));
+       case PRED_FUNC:
+               return false;
+       default:
+               return false;
+       }
+
+       return false;
+}
+
+
+void gather_nicsafe_cols(scalarexp_t *se, vector<string> &cols, nic_property *nicp, gb_table *gbt){
+       int i, gbref;
+       string colname;
+       vector<scalarexp_t *> operands;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+               return;
+       case SE_UNARY_OP:
+               gather_nicsafe_cols(se->get_left_se(),cols,nicp, gbt);
+               return;
+       case SE_BINARY_OP:
+               gather_nicsafe_cols(se->get_left_se(),cols,nicp, gbt);
+               gather_nicsafe_cols(se->get_right_se(),cols,nicp, gbt);
+               return;
+       case SE_COLREF:
+               if(se->is_gb()){
+                       gbref = se->get_gb_ref();
+                       return gather_nicsafe_cols(gbt->get_def(gbref),cols,nicp, gbt);
+               }
+               colname = se->get_colref()->get_field();
+               if(! nicp->illegal_field(colname)){
+                 for(i=0;i<cols.size();++i){
+                       if(colname == cols[i])
+                               break;
+                 }
+                 if(i==cols.size())
+                       cols.push_back(colname);
+               }
+               return;
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(i=0;i<operands.size();++i)
+                       gather_nicsafe_cols(operands[i],cols,nicp,gbt);
+               return;
+       default:
+               return;
+       }
+       return;
+}
+
+void gather_nicsafe_cols(predicate_t *pr, vector<string> &cols, nic_property *nicp, gb_table *gbt){
+  string dts, colname;
+  bool rs, ls;
+       vector<scalarexp_t *> operands;
+       int i;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               gather_nicsafe_cols(pr->get_left_se(), cols, nicp, gbt);
+               return ;
+       case PRED_COMPARE:
+               gather_nicsafe_cols(pr->get_left_se(), cols, nicp, gbt);
+               gather_nicsafe_cols(pr->get_right_se(), cols, nicp, gbt);
+               return;
+       case PRED_UNARY_OP:
+               gather_nicsafe_cols(pr->get_left_pr(),cols, nicp, gbt);
+               return;
+       case PRED_BINARY_OP:
+               gather_nicsafe_cols(pr->get_left_pr(),cols, nicp, gbt);
+               gather_nicsafe_cols(pr->get_right_pr(),cols, nicp, gbt);
+               return;
+       case PRED_FUNC:
+               operands = pr->get_op_list();
+               for(i=0;i<operands.size();++i)
+                       gather_nicsafe_cols(operands[i],cols,nicp, gbt);
+               return ;
+       default:
+               return ;
+       }
+
+       return ;
+}
+
+
+string generate_nic_code(vector<stream_query *> lftas, nic_property *nicp){
+  int i,p,s,g;
+  string ret = "";
+  string vars = "";
+  gb_table *gbtbl;
+
+  bool packed_return = false;
+
+       if(nicp->option_exists("Return")){
+               if(nicp->option_value("Return") == "Packed"){
+//printf("val of Return is %s\n",nicp->option_value("Return").c_str());
+                       packed_return = true;
+               }else{
+                       fprintf(stderr,"Warning, nic option value of Return=%s is not recognized, ignoring\n",nicp->option_value("Return").c_str());
+               }
+       }
+
+       vector<vector<predicate_t *> > nicsafe_preds;
+       vector<predicate_t *> empty_list;
+       for(i=0;i<lftas.size();i++){
+               qp_node *qpn = lftas[i]->get_query_head();
+               if(qpn->node_type() == "sgah_qpn"){
+                       gbtbl = ((sgah_qpn *)(qpn))->get_gb_tbl();
+               }else{
+                       gbtbl = NULL;
+               }
+               nicsafe_preds.push_back(empty_list);
+               vector<cnf_elem *> lfta_cnfs = qpn->get_filter_clause();
+               for(p=0;p<lfta_cnfs.size();++p){
+                       if(pr_is_nic_safe(lfta_cnfs[p]->pr,nicp,gbtbl)){
+                               nicsafe_preds[i].push_back(lfta_cnfs[p]->pr);
+                       }
+               }
+       }
+
+       map<string, string> consts;
+       int n_copyvar = 0;
+       set<string> nocopy_vars;
+       string retvar;
+
+       if(packed_return){
+//printf("dping packed return\n");
+               for(i=0;i<lftas.size();++i){
+                       qp_node *qpn = lftas[i]->get_query_head();
+                       ret += "comment( lfta "+qpn->get_node_name() + " )\n";
+                       if(qpn->node_type() == "sgah_qpn"){
+                               gbtbl = ((sgah_qpn *)(qpn))->get_gb_tbl();
+                       }else{
+                               gbtbl = NULL;
+                       }
+                       ret += "\nlabel(lfta"+int_to_string(i)+")\n";
+                       for(p=0;p<nicsafe_preds[i].size();++p){
+                               ret += generate_nic_predicate_code(nicsafe_preds[i][p],
+                                               consts, n_copyvar, nocopy_vars, &retvar, gbtbl);
+                               ret += "jump_if_zero("+retvar+",lfta"+int_to_string(i+1)+")\n";
+                       }
+                       vector<scalarexp_t *> se_list;
+                       if(qpn->node_type() == "sgah_qpn"){
+                               se_list =((sgah_qpn *)(qpn))->get_select_se_list();
+                       }else{
+                               se_list =((spx_qpn *)(qpn))->get_select_se_list();
+                       }
+
+                       vector<string> refd_cols;
+                       for(s=0;s<se_list.size();++s){
+                               gather_nicsafe_cols(se_list[s],refd_cols, nicp, gbtbl);
+                       }
+                       vector<cnf_elem *> lfta_cnfs = qpn->get_where_clause();
+                       for(p=0;p<lfta_cnfs.size();++p){
+                               gather_nicsafe_cols(lfta_cnfs[p]->pr,refd_cols, nicp, gbtbl);
+                       }
+                       if(gbtbl){
+                               for(g=0;g<gbtbl->size();++g){
+//printf("gathering gbvar %d\n",g);
+                                 gather_nicsafe_cols(gbtbl->get_def(g),refd_cols, nicp, gbtbl);
+                               }
+                       }
+                       sort(refd_cols.begin(), refd_cols.end());
+
+                       ret += "pack_and_send(const_id"+int_to_string(i);
+                       consts["const_id"+int_to_string(i)] = int_to_string(lftas[i]->get_gid());
+                       for(s=0;s<refd_cols.size();++s){
+                               ret += ",";
+                               ret += refd_cols[s];
+                       }
+                       ret += ")\n\n";
+               }
+               ret += "\nlabel(lfta"+int_to_string(i)+")\n";
+       }else{
+               for(i=0;i<lftas.size();++i){
+                       qp_node *qpn = lftas[i]->get_query_head();
+                       ret += "comment( lfta "+qpn->get_node_name() + " )\n";
+                       if(qpn->node_type() == "sgah_qpn"){
+                               gbtbl = ((sgah_qpn *)(qpn))->get_gb_tbl();
+                       }else{
+                               gbtbl = NULL;
+                       }
+                       ret += "\nlabel(lfta"+int_to_string(i)+")\n";
+                       for(p=0;p<nicsafe_preds[i].size();++p){
+                               ret += generate_nic_predicate_code(nicsafe_preds[i][p],
+                                               consts, n_copyvar, nocopy_vars, &retvar, gbtbl);
+                               if(p<nicsafe_preds[i].size()-1){
+                                       ret += "jump_if_zero("+retvar+",lfta"+int_to_string(i+1)+")\n\n";
+                               }else{
+                                       ret += "jump_if_notzero("+retvar+",pass)\n\n";
+                               }
+                       }
+               }
+               ret += "label(pass)\n";
+               ret += "send_packet()\n";
+               ret += "\nlabel(lfta"+int_to_string(i)+")\n";
+       }
+    ret += "label(exit)\n";
+       ret += "exit()\n";
+
+       map<string, string>::iterator mssi;
+       for(mssi=consts.begin();mssi!=consts.end();++mssi){
+               vars += "constant( "+(*mssi).first+" , "+(*mssi).second+")\n";
+       }
+       for(i=0;i<n_copyvar;++i){
+               vars += "variable( copyvar_"+int_to_string(i)+" )\n";
+       }
+       set<string>::iterator ssi;
+       for(ssi=nocopy_vars.begin(); ssi!=nocopy_vars.end(); ++ssi){
+               vars += "variable( "+(*ssi)+" )\n";
+       }
+
+       ret = "BEGIN\n"+vars + "\n"+ret + "END\n";
+
+       return ret;
+
+}
+
+
diff --git a/src/ftacmp/generate_nic_code.h b/src/ftacmp/generate_nic_code.h
new file mode 100644 (file)
index 0000000..a41cbc0
--- /dev/null
@@ -0,0 +1,30 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef _generate_nic_code_h__
+#define _generate_nic_code_h__
+
+#include"nic_def.h"
+#include"stream_query.h"
+#include<string>
+#include<vector>
+
+
+std::string generate_nic_code(std::vector<stream_query *> lftas, nic_property *nicp);
+void gather_nicsafe_cols(scalarexp_t *se, std::vector<std::string> &cols, nic_property *nicp, gb_table *gbt);
+void gather_nicsafe_cols(predicate_t *pr, std::vector<std::string> &cols, nic_property *nicp, gb_table *gbt);
+
+
+
+#endif
diff --git a/src/ftacmp/generate_utils.cc b/src/ftacmp/generate_utils.cc
new file mode 100644 (file)
index 0000000..8285d74
--- /dev/null
@@ -0,0 +1,391 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+//             This file contains functions used by more than one
+//             code generation system.
+
+
+#include"generate_utils.h"
+#include"lapp.h"
+
+
+using namespace std;
+
+
+static char tmpstr[1000];
+
+
+//                     Replace dots in node name with underscore to prevent generating variable
+//                     and structure names with dots inside
+string normalize_name(string name) {
+       string ret = name;
+       int pos = ret.find('.');
+       while (pos >=0) {
+               ret = ret.replace(pos, 1, "_");
+               pos = ret.find('.', pos + 1);
+       }
+       pos = ret.find('/');
+       while (pos >=0) {
+               ret = ret.replace(pos, 1, "_XX_");
+               pos = ret.find('/', pos + 1);
+       }
+       return ret;
+}
+
+
+//     name of tuple struct
+
+string generate_tuple_name(string node_name){
+       string ret = normalize_name(node_name);
+       if(ret == ""){
+               ret = "default";
+       }
+       ret.append("_tuple");
+
+       return(ret);
+}
+
+
+//             LFTA allocation function name.
+
+string generate_alloc_name(string node_name){
+       string ret = normalize_name(node_name);
+       if(ret == ""){
+               ret = "default";
+       }
+       ret.append("_fta_alloc");
+
+       return(ret);
+}
+
+
+//             The name of the schema definition string.
+
+string generate_schema_string_name(string node_name){
+       string ret = normalize_name(node_name);
+       if(ret == ""){
+               ret = "default";
+       }
+       ret += "_schema_definition";
+
+       return(ret);
+}
+
+
+
+//             Generate representations of a tuple.
+//             LFTA and HFTA use slightly different names.
+
+string generate_tuple_struct(string node_name, vector<scalarexp_t *> sl_list){
+  string ret = "struct "+generate_tuple_name(normalize_name(node_name))+"{\n";
+
+  int s;
+  for(s=0;s<sl_list.size();s++){
+     sprintf(tmpstr,"tuple_var%d",s);
+     ret += "\t" + sl_list[s]->get_data_type()->make_tuple_cvar(tmpstr)+";\n";
+  }
+  ret.append("\tgs_int8_t tuple_type;\n");
+  ret.append("} __attribute__ ((__packed__));\n\n");
+
+  return(ret);
+}
+
+
+//             generate_host_tuple_struct uses numbered fields,
+//             while generate_host_name_tuple_struct uses the filed names themselves.
+//                     TODO: change over from generate_host_tuple_struct
+//                     to generate_host_name_tuple_struct
+string generate_host_name_tuple_struct(table_def *td){
+  string ret = "struct "+generate_tuple_name(normalize_name(td->get_tbl_name()))+"{\n";
+
+  vector<field_entry *> flds = td->get_fields();
+
+  int f;
+  for(f=0;f<flds.size();f++){
+        data_type dt(flds[f]->get_type());
+//fprintf(stderr,"tbl=%s, fld=%s, type=%s, dt.type=%d, dt.schema_type=%s\n",td->get_tbl_name().c_str(), flds[f]->get_name().c_str(),flds[f]->get_fcn().c_str(), dt.get_type(),dt.get_type_str().c_str());
+        ret+="\t"+dt.make_host_cvar(flds[f]->get_name())+";\n";
+  }
+  ret.append("\tgs_int8_t tuple_type;\n");
+  ret.append("} __attribute__ ((__packed__));\n\n");
+
+  return(ret);
+}
+
+string generate_host_tuple_struct(table_def *td){
+  string ret = "struct "+generate_tuple_name(normalize_name(td->get_tbl_name()))+"{\n";
+
+  vector<field_entry *> flds = td->get_fields();
+
+  int f;
+  for(f=0;f<flds.size();f++){
+        data_type dt(flds[f]->get_type());
+//fprintf(stderr,"tbl=%s, fld=%s, type=%s, dt.type=%d, dt.schema_type=%s out=%s\n",td->get_tbl_name().c_str(), flds[f]->get_name().c_str(),flds[f]->get_type().c_str(), dt.get_type(),dt.get_type_str().c_str(),dt.make_host_cvar(tmpstr).c_str());
+     sprintf(tmpstr,"tuple_var%d",f);
+        ret+="\t"+dt.make_host_tuple_cvar(tmpstr)+";\n";
+  }
+  ret.append("} __attribute__ ((__packed__));\n\n");
+
+  return(ret);
+}
+
+
+//             convert internal tuple format to exteral tuple format.
+//             mostly, perform htonl conversions.
+
+string generate_hfta_finalize_tuple(table_def *td){
+  string ret = "void finalize_tuple(host_tuple &tup){\n";
+  ret += "\tstruct "+generate_tuple_name(normalize_name(td->get_tbl_name()))+" *tuple = ("+
+               generate_tuple_name(td->get_tbl_name())+" *)(tup.data);\n";
+
+
+  vector<field_entry *> flds = td->get_fields();
+
+/*
+  int f;
+  for(f=0;f<flds.size();f++){
+        ret.append("\t");
+        data_type dt(flds[f]->get_type());
+        if(dt.get_type() == v_str_t){
+               sprintf(tmpstr,"\ttuple->tuple_var%d.offset = htonl(tuple->tuple_var%d.offset);\n",f,f);
+               ret += tmpstr;
+               sprintf(tmpstr,"\ttuple->tuple_var%d.length = htonl(tuple->tuple_var%d.length);\n",f,f);
+               ret += tmpstr;
+               sprintf(tmpstr,"\ttuple->tuple_var%d.reserved = htonl(tuple->tuple_var%d.reserved);\n",f,f);
+               ret += tmpstr;
+        }else{
+               if(dt.needs_hn_translation()){
+                       sprintf(tmpstr,"\ttuple->tuple_var%d = %s(tuple->tuple_var%d);\n",
+                               f, dt.hton_translation().c_str(), f);
+                       ret += tmpstr;
+               }
+        }
+  }
+*/
+  ret.append("};\n\n");
+
+  return(ret);
+}
+
+
+
+
+//             make code translation so that it embeds
+//             as a C-string -- escape the escape characters.
+
+string make_C_embedded_string(string &instr){
+       string outstr = "\"";
+       int i;
+       for(i=0;i<instr.size();++i){
+               if(instr[i] == '\n'){
+                       outstr += "\\n\"\n\t\"";
+               }else{
+                       if(instr[i] == '\\'){
+                               outstr += "\\\\";
+                       }else
+                               outstr += instr[i];
+               }
+       }
+       outstr += "\"";
+       return(outstr);
+}
+
+string generate_host_tuple_pack(table_def *td){
+  int f;
+  string ret = "int pack_"+normalize_name(td->get_tbl_name())+"_tuple(host_tuple *tup, char *buf, int len, struct "+generate_tuple_name(normalize_name(td->get_tbl_name()))+" *s, gs_int8_t tuple_type){\n";
+       ret +=
+"\tstruct "+generate_tuple_name(td->get_tbl_name())+" *d;\n";
+
+  vector<field_entry *> flds = td->get_fields();
+
+  ret+="\tif (tuple_type == TEMPORAL_TUPLE) {\n";
+  ret+="\t\td=(struct "+generate_tuple_name(td->get_tbl_name())+" *)buf;\n";
+  ret+="\t\ttup->data = (char *)d;\n";
+  ret+="\t\ttup->heap_resident=false;\n";
+  for(f=0;f<flds.size();f++){
+       data_type dt(flds[f]->get_type(),flds[f]->get_modifier_list());
+       if (dt.is_temporal()) {
+               string fldnm = flds[f]->get_name();
+//             if(dt.needs_hn_translation())
+//                     ret+="\t\td->"+fldnm+"="+dt.hton_translation()+"(s->"+fldnm+");\n";
+//             else
+                       ret+="\t\td->"+fldnm+"=s->"+fldnm+";\n";
+       }
+  }
+  ret += "\t\td->tuple_type = TEMPORAL_TUPLE;\n";
+  ret += "\t\ttup->tuple_size=sizeof(struct "+generate_tuple_name(td->get_tbl_name())+");\n";
+  ret += "\t\treturn 0;\n}\n";
+
+
+  bool uses_buffer_type = false;
+  for(f=0;f<flds.size();f++){
+        data_type dt(flds[f]->get_type());
+        if(dt.is_buffer_type()) uses_buffer_type = true;
+  }
+
+  if(!uses_buffer_type){
+       ret+="\td=s;\n";
+       ret+="\ttup->data = (char *)d;\n";
+       ret+="\ttup->heap_resident=false;\n";
+       for(f=0;f<flds.size();f++){
+               data_type dt(flds[f]->get_type());
+               string fldnm = flds[f]->get_name();
+//             if(dt.needs_hn_translation())
+//                     ret+="\td->"+fldnm+"="+dt.hton_translation()+"(s->"+fldnm+");\n";
+//             else
+                       ret+="\td->"+fldnm+"=s->"+fldnm+";\n";
+       }
+       ret+=
+"\ttup->tuple_size=sizeof(struct "+generate_tuple_name(td->get_tbl_name())+");\n";
+  }else{
+       ret+="\tint pos=sizeof(struct "+generate_tuple_name(td->get_tbl_name())+");\n";
+       ret+="\td=(struct "+generate_tuple_name(td->get_tbl_name())+" *)buf;\n";
+       ret+="\ttup->data = (char *)d;\n";
+       ret+="\ttup->heap_resident=false;\n";
+       for(f=0;f<flds.size();f++){
+               data_type dt(flds[f]->get_type());
+               string fldnm = flds[f]->get_name();
+               if(dt.is_buffer_type()){
+                       ret+="\tif(pos+"+dt.get_hfta_buffer_size()+"(&(s->"+fldnm+"))>len) return 1;\n";
+                       ret+="\t"+dt.get_hfta_buffer_tuple_copy()+"(&(d->"+fldnm+"),&(s->"+fldnm+"), buf+pos, pos);\n";
+                       ret+="\tpos+="+dt.get_hfta_buffer_size()+"(&(s->"+fldnm+"));\n";
+//                     ret+="\td->"+fldnm+".length = htonl(d->"+fldnm+".length);\n";
+//                     ret+="\td->"+fldnm+".offset = htonl(d->"+fldnm+".offset);\n";
+//                     ret+="\td->"+fldnm+".reserved = htonl(d->"+fldnm+".reserved);\n";
+               }else{
+//               if(dt.needs_hn_translation())
+//                     ret+="\td->"+fldnm+"="+dt.hton_translation()+"(s->"+fldnm+");\n";
+//               else
+                       ret+="\td->"+fldnm+"=s->"+fldnm+";\n";
+               }
+       }
+       ret+="\ttup->tuple_size=pos;\n";
+  }
+
+  ret+=   "\td->tuple_type = REGULAR_TUPLE;\n";
+
+  ret += "\treturn 0;\n";
+  ret+="}\n\n";
+
+  return(ret);
+}
+
+
+string generate_host_tuple_unpack(table_def *td){
+  int f;
+  string ret = "struct "+generate_tuple_name(normalize_name(td->get_tbl_name())) +" *unpack_"+normalize_name(td->get_tbl_name())+"_tuple(host_tuple *tup){\n";
+       ret += "\tstruct "+generate_tuple_name(normalize_name(td->get_tbl_name()))+" *d;\n";
+       ret+="\td=(struct "+generate_tuple_name(normalize_name(td->get_tbl_name()))+" *)(tup->data);\n";
+       ret+="\tif(tup->tuple_size<sizeof(struct "+generate_tuple_name(normalize_name(td->get_tbl_name())) +")) return NULL;\n";
+
+  vector<field_entry *> flds = td->get_fields();
+
+       for(f=0;f<flds.size();f++){
+               data_type dt(flds[f]->get_type());
+               string fldnm = flds[f]->get_name();
+               if(dt.is_buffer_type()){
+//                     ret+="\td->"+fldnm+".length = ntohl(d->"+fldnm+".length);\n";
+//                     ret+="\td->"+fldnm+".offset = ntohl(d->"+fldnm+".offset);\n";
+                       ret+="\td->"+fldnm+".reserved = SHALLOW_COPY;\n";
+                       ret+="\tif(d->"+fldnm+".offset+d->"+fldnm+".length>tup->tuple_size) return NULL;\n";
+                       ret+="\td->"+fldnm+".offset+=(unsigned int)(tup->data);\n";
+               }else{
+//               if(dt.needs_hn_translation())
+//                     ret+="\td->"+fldnm+"="+dt.ntoh_translation()+"(d->"+fldnm+");\n";
+               }
+       }
+
+  ret += "\treturn d;\n";
+  ret+="}\n\n";
+
+  return(ret);
+}
+//             Functions related to parsing.
+
+ int split_string(char *instr,char sep, char **words,int max_words){
+   char *loc;
+   char *str;
+   int nwords = 0;
+
+   str = instr;
+   words[nwords++] = str;
+   while( (loc = strchr(str,sep)) != NULL){
+        *loc = '\0';
+        str = loc+1;
+        if(nwords >= max_words){
+                fprintf(stderr,"Error in split_string, too many words discovered (max is %d)\n",max_words);
+                nwords = max_words-1;
+        }
+        words[nwords++] = str;
+   }
+
+   return(nwords);
+}
+
+//     For fast hashing
+string hash_nums[NRANDS] = {
+"12916008961267169387ull", "13447227858232756685ull",
+"15651770379918602919ull", "1154671861688431608ull",
+"6777078091984849858ull", "14217205709582564356ull",
+"4955408621820609982ull", "15813680319165523695ull",
+"9897969721407807129ull", "5799700135519793083ull",
+"3446529189623437397ull", "2766403683465910630ull",
+"3759321430908793328ull", "6569396511892890354ull",
+"11124853911180290924ull", "17425412145238035549ull",
+"6879931585355039943ull", "16598635011539670441ull",
+"9615975578494811651ull", "4378135509538422740ull",
+"741282195344332574ull", "17368612862906255584ull",
+"17294299200556814618ull", "518343398779663051ull",
+"3861893449302272757ull", "8951107288843549591ull",
+"15785139392894559409ull", "5917810836789601602ull",
+"16169988133001117004ull", "9792861259254509262ull",
+"5089058010244872136ull", "2130075224835397689ull",
+"844136788226150435ull", "1303298091153875333ull",
+"3579898206894361183ull", "7529542662845336496ull",
+"13151949992653382522ull", "2145333536541545660ull",
+"11258221828939586934ull", "3741808146124570279ull",
+"16272841626371307089ull", "12174572036188391283ull",
+"9749343496254107661ull", "9141275584134508830ull",
+"10134192232065698216ull", "12944268412561423018ull",
+"17499725811865666340ull", "5281482378159088661ull",
+"13254803486023572607ull", "4526762838498717025ull",
+"15990846379668494011ull", "10680949816169027468ull",
+"7116154096012931030ull", "5296740689865236632ull",
+"5222427027515795922ull", "6893215299448261251ull",
+"10164707755932877485ull", "15325979189512082255ull",
+"3713267224148573289ull", "12292682741753167354ull",
+"4098115959960163588ull", "16095675565885113990ull",
+"11391590846210510720ull", "8432889531466002673ull",
+"7146668520368482523ull", "7678169991822407997ull",
+"9882712513525031447ull", "13904414563513869160ull",
+"1080076724395768626ull", "8448147843172150388ull",
+"17633093729608185134ull", "10044622457050142303ull",
+"4128911859292425737ull", "30642269109444395ull",
+"16124215396922640581ull", "15444089895060081110ull",
+"16437006538696302944ull", "800338649777443426ull",
+"5355794945275091932ull", "11656354278827687117ull",
+"1110873718944691255ull", "10829576045617693977ull",
+"3846916616884579955ull", "17055821716837625668ull",
+"13418968402643535758ull", "11671612594828802128ull",
+"11597298928184328586ull", "13196028510862205499ull",
+"16539578557089782373ull", "3182048322921507591ull",
+"10016080431267550241ull", "148751875162592690ull",
+"10400930266590768572ull", "4023803397139127870ull",
+"17766462746879108920ull", "14807761432134600873ull",
+"13521540421053792403ull", "13980983198941385205ull",
+"16257584414193564367ull", "1760484796451765024ull"
+};
+
+
diff --git a/src/ftacmp/generate_utils.h b/src/ftacmp/generate_utils.h
new file mode 100644 (file)
index 0000000..ba8e1a8
--- /dev/null
@@ -0,0 +1,82 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __GENERATE_UTILS_H_DEFINED__
+#define __GENERATE_UTILS_H_DEFINED__
+
+#include <string>
+#include <map>
+
+#include "parse_fta.h"
+#include "analyze_fta.h"
+#include "nic_def.h"
+
+//             This file contains functions used by more than one
+//             code generation system.
+
+
+//             replaces dots in node names with undescores - dots are illegal in C variable names
+std::string normalize_name(std::string name);
+
+
+//     name of tuple struct
+
+std::string generate_tuple_name(std::string node_name);
+
+
+//             LFTA allocation function name.
+
+std::string generate_alloc_name(std::string node_name);
+
+
+//             The name of the schema definition string.
+
+std::string generate_schema_string_name(std::string node_name);
+
+
+//             Generate representations of a tuple.
+//             LFTA and HFTA use slightly different names.
+
+std::string generate_tuple_struct(std::string node_name,
+                                                       std::vector<scalarexp_t *> sl_list);
+
+std::string generate_host_tuple_struct(table_def *td);
+std::string generate_host_name_tuple_struct(table_def *td);
+
+
+//             convert internal tuple format to exteral tuple format.
+//             mostly, perform htonl conversions.
+
+std::string generate_hfta_finalize_tuple(table_def *td);
+
+
+
+//             make code translation so that it embeds
+//             as a C-string -- escape the escape characters.
+
+std::string make_C_embedded_string(std::string &instr);
+
+//             pack, unpack tuple struct for use by user defined operators.
+std::string generate_host_tuple_pack(table_def *td);
+std::string generate_host_tuple_unpack(table_def *td);
+
+int split_string(char *instr,char sep, char **words,int max_words);
+
+
+// # random numbers for hashing
+#define NRANDS 100
+
+
+#endif
+
diff --git a/src/ftacmp/iface_q.cc b/src/ftacmp/iface_q.cc
new file mode 100644 (file)
index 0000000..3b74acd
--- /dev/null
@@ -0,0 +1,649 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#include "iface_q.h"
+#include<errno.h>
+#include <unistd.h>
+#include <algorithm>
+#include <cctype>
+
+
+using namespace std;
+
+extern string hostname;                // namne of the current host
+
+static string int_to_string(int i){
+    string ret;
+    char tmpstr[100];
+    sprintf(tmpstr,"%d",i);
+    ret=tmpstr;
+    return(ret);
+}
+
+
+//             Interface for the res parser
+extern int ResParserparse(void);
+extern FILE *ResParserin;
+extern int ResParserdebug;
+void ResParser_setfileinput(FILE *f);
+void ResParser_setstringinput(char *s);
+extern int flex_res_lineno;
+
+resparse_data *rpd_ptr;
+vector<string> res_val_vec, res_attr_vec;
+string res_a, res_v;
+
+///////////////////////////////////////
+///            iface_t methods
+
+       void iface_t::add_property(const char *name, const char *att){
+               string nm(name);
+               std::transform(nm.begin(), nm.end(), nm.begin(), (int(*)(int))std::tolower);
+               vals[nm].push_back(att);
+       }
+
+       void iface_t::add_property(const char *name, const char **atts){
+               string val = "";
+               string nm = name;
+               std::transform(nm.begin(), nm.end(), nm.begin(), (int(*)(int))std::tolower);
+               if(atts[0]) val = atts[1];
+
+               vals[nm].push_back(val);
+       }
+
+       void iface_t::add_property(const char *name, vector<string> &val_vec){
+               string val = "";
+               string nm = name;
+               std::transform(nm.begin(), nm.end(), nm.begin(), (int(*)(int))std::tolower);
+               if(val_vec.size()) val = val_vec[0];
+
+               vals[nm].push_back(val);
+       }
+
+       int iface_t::finalize(string &errs){
+               string tag ="ERROR in interface starting at line "+int_to_string(lineno)+", ";
+               string e;
+               if(vals.count("name") == 0){
+                       e += "Name not specified. ";
+               }else{
+                       if(vals["name"].size() > 1){
+                               e+="More than one name specified. ";
+                       }
+               }
+
+               if(e != ""){
+                       errs += tag + e + "\n";
+                       return(1);
+               }
+               return(0);
+       }
+
+       string iface_t::to_string(){
+               int i;
+               string ret = "Interface "+vals["name"][0]+":\n";
+               map<string, vector<string> >::iterator svmi;
+               for(svmi=vals.begin();svmi!=vals.end();++svmi){
+                       ret += "\t"+(*svmi).first + " : ";
+                       for(i=0;i<((*svmi).second).size();++i){
+                               if(i>0) ret+=", ";
+                               ret += (*svmi).second[i];
+                       }
+                       ret += "\n";
+               }
+
+               return ret;
+       }
+
+       string iface_t::get_name(){
+               if(vals.count("name") == 0) return (string)"";
+               return (vals["name"])[0];
+       }
+
+       string iface_t::get_host(){
+               if(vals.count("host") == 0) return (string)"";
+               return (vals["host"])[0];
+       }
+
+
+       bool iface_t::eval_Contains(string prop, string val){
+               // convert to lowercase
+               std::transform(prop.begin(), prop.end(), prop.begin(), (int(*)(int))std::tolower);
+
+               if(vals.count(prop) == 0) return false;
+               int i;
+               for(i=0;i<vals[prop].size();++i){
+                       if((vals[prop])[i] == val) return true;
+               }
+               return false;
+       }
+
+       bool iface_t::eval_Equals(string prop, string val){
+               // convert to lowercase
+               std::transform(prop.begin(), prop.end(), prop.begin(), (int(*)(int))std::tolower);
+               if(vals.count(prop) == 0) return false;
+               if(vals[prop].size() != 1) return false;
+               int i;
+               for(i=0;i<vals[prop].size();++i){
+                       if((vals[prop])[i] == val) return true;
+               }
+               return false;
+       }
+
+       bool iface_t::eval_Exists(string prop){
+               // convert to lowercase
+               std::transform(prop.begin(), prop.end(), prop.begin(), (int(*)(int))std::tolower);
+               if(vals.count(prop) == 0) return false;
+               return true;
+       }
+
+
+///////////////////////////////////////
+///            gs_host_t methods
+
+       void gs_host_t::add_property(const char *name, const char *att){
+               string nm(name);
+               std::transform(nm.begin(), nm.end(), nm.begin(), (int(*)(int))std::tolower);
+               vals[nm].push_back(att);
+       }
+
+       void gs_host_t::add_property(const char *name, vector<string> &val_vec){
+               string val = "";
+               string nm = name;
+               std::transform(nm.begin(), nm.end(), nm.begin(), (int(*)(int))std::tolower);
+               if(val_vec.size()) val = val_vec[0];
+
+               vals[nm].push_back(val);
+       }
+
+       int gs_host_t::finalize(string &errs){
+               string tag ="ERROR in host starting at line "+int_to_string(lineno)+", ";
+               string e;
+               if(vals.count("name") == 0){
+                       e += "Name not specified. ";
+               }else{
+                       if(vals["name"].size() > 1){
+                               e+="More than one name specified. ";
+                       }
+               }
+
+               if(e != ""){
+                       errs += tag + e + "\n";
+                       return(1);
+               }
+               return(0);
+       }
+
+
+/////////////////////////////////////////////////////////////////
+///            reparse_data methods
+
+       int resparse_data::finalize_iface(string &errs){
+               int ret = curr_iface->finalize(errs);
+               if(ret) {
+                       delete curr_iface;
+                       failure = true;
+               }else{
+                       curr_host->add_interface(curr_iface);
+               }
+               return ret;
+       }
+
+
+       int resparse_data::finalize_host(string &errs){
+               int ret = curr_host->finalize(errs);
+               if(ret) {
+                       delete curr_host;
+                       failure = true;
+               }else{
+
+                       string host = curr_host->vals["name"][0];
+                       // in non-distributed case we will ignore all other hosts
+                       if (!distributed_mode) {
+                               char buf[1000];
+                               if (host != hostname)
+                                       return ret;
+                       }
+                       // we need to exclude failed hosts
+                       if (!use_live_hosts_file || live_hosts->count(hostname)) {
+                               hosts.push_back(curr_host);
+
+                               // push the host name to every interface
+                               curr_host->propagate_name();
+
+                               // add all interfaces into interface list
+                               for(int i=0;i<curr_host->ifaces.size();i++)
+                                       ifaces.push_back(curr_host->ifaces[i]);
+                       }
+               }
+               return ret;
+       }
+
+       string resparse_data::to_string(){
+               string ret;
+               int i;
+               for(i=0;i<ifaces.size();i++)
+                       ret += ifaces[i]->to_string();
+               return ret;
+       }
+
+       vector<pair<string,string> > resparse_data::find_ifaces(predicate_t *pr){
+               int i;
+               vector<pair<string,string> > ret;
+               for(i=0;i<ifaces.size();++i){
+                       if(this->eval_pred(i,pr)){
+                               pair<string,string> p(ifaces[i]->get_host(), ifaces[i]->get_name());
+                               ret.push_back(p);
+                       }
+               }
+               return ret;
+       }
+
+
+       vector<int> resparse_data::get_ifaces_by_Name(std::string host_name, std::string if_name){
+               int i;
+               vector<int> ret;
+               for(i=0;i<ifaces.size();++i){
+                       if(ifaces[i]->get_host() == host_name && ifaces[i]->get_name() == if_name)
+                               ret.push_back(i);
+
+               }
+               return ret;
+       }
+
+
+       bool resparse_data::eval_pred(int i, predicate_t *pr){
+    vector<scalarexp_t *> op_list;
+       string prop, val;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               fprintf(stderr,"INTERNAL ERROR in reparse_date::eval_pred, line %d, character %d, IN not supported. %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       case PRED_COMPARE:
+               fprintf(stderr,"INTERNAL ERROR in reparse_date::eval_pred, line %d, character %d, IN not supported. %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       case PRED_UNARY_OP:
+               if(pr->get_op() == "NOT")
+                       return(! eval_pred(i, pr->get_left_pr()) );
+               fprintf(stderr,"INTERNAL ERROR in reparse_date::eval_pred, line %d, character %d, unknown unary pred operator %s.\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_op().c_str() );
+               exit(1);
+       case PRED_BINARY_OP:
+               if(pr->get_op() == "AND"){
+                       if(! eval_pred(i, pr->get_left_pr()) ) return false;
+                       return  eval_pred(i, pr->get_right_pr()) ;
+               }
+               if(pr->get_op() == "OR"){
+                       if( eval_pred(i, pr->get_left_pr()) ) return true;
+                       return  eval_pred(i, pr->get_right_pr()) ;
+               }
+               fprintf(stderr,"INTERNAL ERROR in reparse_date::eval_pred, line %d, character %d, unknown binary pred operator %s.\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_op().c_str() );
+               exit(1);
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               if(op_list[0]->get_operator_type() != SE_PARAM){
+                       fprintf(stderr,"INTERNAL ERROR : ifq parameters are supposed to be of type SE_PARAM, found %s at position 0\n",op_list[0]->get_op().c_str());
+                       exit(1);
+               }else{
+                       prop=op_list[0]->get_op();
+               }
+               if(op_list.size() > 1){
+                       if(op_list[1]->get_operator_type() != SE_PARAM){
+                               fprintf(stderr,"INTERNAL ERROR : ifq parameters are supposed to be of type SE_PARAM, found %s at position 1\n",op_list[0]->get_op().c_str());
+                               exit(1);
+                       }else{
+                               val=op_list[1]->get_op();
+                       }
+               }
+
+               if(pr->get_op() == "Contains"){
+                       if(op_list.size() != 2){
+                               fprintf(stderr,"INTERNAL ERROR : predicate Contains expects 2 parameters, received %lu\n",op_list.size());
+                               exit(1);
+                       }
+                       return ifaces[i]->eval_Contains(prop,val);
+               }
+
+               if(pr->get_op() == "Equals"){
+                       if(op_list.size() != 2){
+                               fprintf(stderr,"INTERNAL ERROR : predicate Equals expects 2 parameters, received %lu\n",op_list.size());
+                               exit(1);
+                       }
+                       return ifaces[i]->eval_Equals(prop,val);
+               }
+
+               if(pr->get_op() == "Exists"){
+                       if(op_list.size() != 1){
+                               fprintf(stderr,"INTERNAL ERROR : predicate Exists expects 1 parameter, received %lu\n",op_list.size());
+                               exit(1);
+                       }
+                       return ifaces[i]->eval_Exists(prop);
+               }
+
+               fprintf(stderr,"INTERNAL ERROR : Unknown predicate %s in reparse_date::eval_pred.\n",pr->get_op().c_str());
+               exit(1);
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in reparse_date::eval_pred, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return(false);
+
+       }
+
+
+///////////////////////////////////////////
+///            XML parser callbacks for parsing interface resources
+
+void startElement(void *userData, const char *name, const char **atts) {
+  int i;
+
+  resparse_data *rpd = (resparse_data *)userData;
+  rpd->level.push_back(name);
+
+  if(rpd->level.size() == 1 && rpd->level[0] == "Resources")
+       rpd->in_Resources = true;
+
+  if(rpd->in_Resources && rpd->level.size() == 2 && rpd->level[1] == "Interface"){
+//     rpd->new_iface(XML_GetCurrentLineNumber(rpd->parser));
+       rpd->new_iface(1);
+    rpd->in_Iface = true;
+  }
+
+  if(rpd->in_Iface && rpd->level.size() == 3){
+       rpd->add_property(name, atts);
+  }
+
+
+//  for(i=0;i<rpd->level.size();++i) printf("%s, ",rpd->level[i].c_str());
+//  printf("\n");
+}
+
+void startElement(void *userData, const char *name, vector<string> &attr_vec, vector<string> &val_vec){
+  int i;
+
+  resparse_data *rpd = (resparse_data *)userData;
+  rpd->level.push_back(name);
+
+  if(rpd->level.size() == 1 && rpd->level[0] == "Resources")
+       rpd->in_Resources = true;
+
+  if(rpd->in_Resources && rpd->level.size() == 2 && rpd->level[1] == "Host"){
+//     rpd->new_iface(XML_GetCurrentLineNumber(rpd->parser));
+
+       rpd->new_host(flex_res_lineno);
+       for (int i = 0; i < attr_vec.size(); ++i)
+               rpd->curr_host->add_property(attr_vec[i].c_str(), val_vec[i].c_str());
+    rpd->in_Host = true;
+  }
+
+  if(rpd->in_Host && rpd->level.size() == 3) {
+         if ( rpd->level[2] == "Interface"){
+               //      rpd->new_iface(XML_GetCurrentLineNumber(rpd->parser));
+               rpd->new_iface(flex_res_lineno);
+               for (int i = 0; i < attr_vec.size(); ++i)
+                       rpd->add_property(attr_vec[i].c_str(), val_vec[i].c_str());
+               rpd->in_Iface = true;
+         } else {
+               rpd->curr_host->add_property(name, val_vec);
+         }
+       }
+
+  if(rpd->in_Iface && rpd->level.size() == 4){
+       rpd->add_property(name, val_vec);
+  }
+
+
+//  for(i=0;i<rpd->level.size();++i) printf("%s, ",rpd->level[i].c_str());
+//  printf("\n");
+}
+
+
+void endElement(void *userData, const char *name) {
+  resparse_data *rpd = (resparse_data *)userData;
+
+  if(rpd->in_Iface && rpd->level.size() == 3){
+       string err_msg;
+       int err = rpd->finalize_iface(err_msg);
+       if(err) fprintf(stderr,"%s\n",err_msg.c_str());
+  } else if (rpd->in_Host && rpd->level.size() == 2) {
+       string err_msg;
+       int err = rpd->finalize_host(err_msg);
+       if(err) fprintf(stderr,"%s\n",err_msg.c_str());
+  }
+
+  rpd->level.pop_back();
+}
+
+
+//             Interface to ifq definition lexer and parser ...
+
+extern int IfqParserparse(void);
+extern FILE *IfqParserin;
+extern int IfqParserdebug;
+void IfqParser_setfileinput(FILE *f);
+void IfqParser_setstringinput(char *s);
+
+
+fta_parse_t *ifq_parse_result;
+
+int ifq_t::load_ifaces(string fname, bool use_live_hosts_file, bool disributed_mode, string &err){
+  char buf[1000], errbuf[1000];
+//  XML_Parser parser = XML_ParserCreate(NULL);
+
+  int done;
+  int depth = 0;
+  err="";
+
+  // open the list of failed hosts
+  set<string> live_hosts;
+  if (use_live_hosts_file) {
+         FILE* live_hosts_file = fopen("live_hosts.txt", "r");
+         if (!live_hosts_file) {
+               err="Error, can't open live_hosts.txt, error is ";
+               err+=strerror(errno); err+="\n";
+               return(1);
+         }
+
+         while(fgets(buf, 1000, live_hosts_file)) {
+                 char* host = strtok(buf, " \t\n\r");  // strip the line
+                 if (host)
+                         live_hosts.insert(host);
+         }
+
+         fclose(live_hosts_file);
+  }
+
+
+
+// IfqParserdebug = 1;
+
+  FILE *resfile = fopen(fname.c_str(),"r");
+  if(resfile == NULL){
+       err="Error, can't open "+fname+", error is ";
+       err+=strerror(errno); err+="\n";
+       return(1);
+  }
+
+//  rpd = new resparse_data(parser);
+  rpd = new resparse_data(use_live_hosts_file, &live_hosts, disributed_mode);
+  rpd_ptr = rpd;
+
+  ResParser_setfileinput(resfile);
+  if(ResParserparse()){
+       err = "ERROR, interface query parse failed.\n";
+       return(1);
+  }
+
+/*
+  XML_SetUserData(parser, rpd);
+  XML_SetElementHandler(parser, startElement, endElement);
+  do {
+    size_t len = fread(buf, 1, sizeof(buf), resfile);
+    done = len < sizeof(buf);
+    if (!XML_Parse(parser, buf, len, done)) {
+      sprintf(errbuf,
+             "%s at line %d\n",
+             XML_ErrorString(XML_GetErrorCode(parser)),
+             XML_GetCurrentLineNumber(parser));
+               err=errbuf;
+      return 1;
+    }
+  } while (!done);
+  XML_ParserFree(parser);
+
+  if(rpd->failed()){
+       err = "Interface resource parse failed, exiting.\n";
+  }
+*/
+
+  fclose(resfile);
+
+  return(0);
+
+}
+
+int ifq_t::load_ifqs(string fname, string &err){
+  char err_buf[1000];
+  err="";
+
+  FILE *qfile = fopen(fname.c_str(),"r");
+  if(qfile == NULL){
+       sprintf(err_buf, "ERROR, can't open %s, error is %s\n",fname.c_str(),strerror(errno));
+       err=err_buf;
+       return(1);
+  }
+
+  ifq_parse_result = new fta_parse_t();
+  IfqParser_setfileinput(qfile);
+  if(IfqParserparse()){
+       err = "ERROR, interface query parse failed.\n";
+       return(1);
+  }
+
+  vector<table_exp_t *> ifqlist = ifq_parse_result->parse_tree_list->qlist;
+  int i;
+  bool dup = false;
+  for(i=0;i<ifqlist.size();++i){
+       string nm = ifqlist[i]->nmap["name"];
+       if(ifq_map.count(nm)){
+               err += "ERROR, Duplicate interface query "+nm+"\n";
+               dup = true;
+       }
+       ifq_map[nm] = ifqlist[i]->wh;
+  }
+
+
+  if(dup) return(1);
+  return(0);
+}
+
+
+vector<pair<string,string> > ifq_t::eval(string qname, int &err_no){
+       vector<pair<string,string> > retval;
+       err_no = 0;
+
+       if(ifq_map.count(qname) == 0){
+               err_no = 1;
+               return retval;
+       }
+       if(rpd->failed()){
+               err_no = 2;
+               return retval;
+       }
+
+       return rpd->find_ifaces(ifq_map[qname]);
+
+}
+
+vector<string> ifq_t::get_iface_vals(string host_name, string basic_if_name, string property, int &err_no, string &err_str){
+       vector<string> retval;
+       err_no = 0;
+
+       char *cdat = strdup(basic_if_name.c_str());
+       int pos;
+       string virtual_iface = "0";
+       string iface_name = basic_if_name;
+       for(pos=strlen(cdat)-1;pos>=0 && isdigit(cdat[pos]);--pos);
+       if(pos>0 && cdat[pos] == 'X' && pos<=strlen(cdat)-2){
+               cdat[pos] = '\0';
+               virtual_iface = cdat+pos+1;
+               iface_name = cdat;
+       }
+       free(cdat);
+
+       if(property == "virtual_interface_id"){
+               retval.push_back(virtual_iface);
+               return retval;
+       }
+
+
+       if(rpd->failed()){
+               err_no = 1; err_str = "interface resource parse failed.";
+               return retval;
+       }
+
+       vector<int> ifi = rpd->get_ifaces_by_Name(host_name, iface_name);
+       if(ifi.size() == 0){
+               err_no = 1; err_str="interface not found.";
+               return retval;
+       }
+       if(ifi.size()>1){
+               err_no = 1; err_str="multiple interfaces found.";
+               return retval;
+       }
+
+       return rpd->get_property(ifi[0], property);
+
+}
+
+vector<string> ifq_t::get_iface_properties(string host_name, string basic_if_name, int &err_no, string &err_str){
+       vector<string> retval;
+       err_no = 0;
+
+       char *cdat = strdup(basic_if_name.c_str());
+       int pos;
+       string virtual_iface = "0";
+       string iface_name = basic_if_name;
+       for(pos=strlen(cdat)-1;pos>=0 && isdigit(cdat[pos]);--pos);
+       if(pos>0 && cdat[pos] == 'X' && pos<=strlen(cdat)-2){
+               cdat[pos] = '\0';
+               virtual_iface = cdat+pos+1;
+               iface_name = cdat;
+       }
+       free(cdat);
+
+       if(rpd->failed()){
+               err_no = 1; err_str = "interface resource parse failed.";
+               return retval;
+       }
+
+       vector<int> ifi = rpd->get_ifaces_by_Name(host_name, iface_name);
+       if(ifi.size() == 0){
+               err_no = 1; err_str="interface not found.";
+               return retval;
+       }
+       if(ifi.size()>1){
+               err_no = 1; err_str="multiple interfaces found.";
+               return retval;
+       }
+
+       return rpd->get_properties(ifi[0]);
+
+}
diff --git a/src/ftacmp/iface_q.h b/src/ftacmp/iface_q.h
new file mode 100644 (file)
index 0000000..6b35021
--- /dev/null
@@ -0,0 +1,208 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __IFACE_Q_DEFINED_
+#define __IFACE_Q_DEFINED_
+
+#include <stdio.h>
+//#include "xmlparse.h"
+#include<vector>
+#include<string>
+#include<map>
+#include<set>
+#include<algorithm>
+
+#include"parse_fta.h"
+
+
+//                     Represent an interface.
+class iface_t{
+public:
+       int lineno;
+       std::map<std::string, std::vector<std::string> > vals;
+
+       iface_t(int l){
+               lineno = l;
+       }
+
+       void add_property(const char *name, const char *att);
+       void add_property(const char *name, const char **atts);
+       void add_property(const char *name, std::vector<std::string> &val_vec);
+
+       std::vector<std::string> get_property(std::string p){
+               std::vector<std::string> ret;
+
+       /* convert property name to lcase */
+       std::transform(p.begin(), p.end(), p.begin(), (int(*)(int))std::tolower);
+
+/*
+printf("get_property %s :\n",p.c_str());
+std::map<std::string, std::vector<std::string> >::iterator msvsi;
+for(msvsi=vals.begin(); msvsi!=vals.end();++msvsi){
+  printf("\t%s : ",(*msvsi).first.c_str());
+  std::vector<std::string>  vs = (*msvsi).second;
+  int i;
+  for(i=0;i<vs.size();++i){
+    printf(" %s",vs[i].c_str());
+  }
+  printf("\n");
+}
+*/
+               if(vals.count(p)) return vals[p];
+               else return ret;
+       }
+
+       std::vector<std::string> get_properties(){
+               std::vector<std::string> ret;
+
+               std::map<std::string, std::vector<std::string> >::iterator iter;
+               for (iter = vals.begin(); iter != vals.end(); iter++) {
+                       ret.push_back((*iter).first);
+               }
+               return ret;
+       }
+
+       int finalize(std::string &errs);
+       std::string to_string();
+       std::string get_name();
+       std::string get_host();
+       bool eval_Contains(std::string prop, std::string val);
+       bool eval_Equals(std::string prop, std::string val);
+       bool eval_Exists(std::string prop);
+};
+
+//                     Represent an interface.
+class gs_host_t{
+public:
+       int lineno;
+       std::map<std::string, std::vector<std::string> > vals;
+
+       gs_host_t(int l){
+               lineno = l;
+       }
+
+       void add_property(const char *name, const char *att);
+       void add_property(const char *name, std::vector<std::string> &val_vec);
+       std::vector<std::string> get_property(std::string p){
+               std::vector<std::string> ret;
+               if(vals.count(p)) return vals[p];
+               else return ret;
+       }
+       int finalize(std::string &errs);
+
+       void add_interface(iface_t* it) {ifaces.push_back(it);}
+
+       void propagate_name() {
+               for(int i=0;i<ifaces.size();i++)
+                       ifaces[i]->add_property("host", vals["name"]);
+       }
+
+       std::string to_string();
+       std::string get_name();
+
+       std::vector<iface_t *> ifaces;
+};
+
+
+
+//             A collection of resources (interfaces)
+
+class resparse_data{
+public:
+       std::vector<std::string> level;
+       bool in_Resources, in_Iface, in_Host;
+       iface_t *curr_iface;
+       gs_host_t *curr_host;
+       bool failure;
+    std::vector<iface_t *> ifaces;
+       std::vector<gs_host_t *> hosts;
+       bool use_live_hosts_file;
+       std::set<std::string> *live_hosts;
+       bool distributed_mode;
+
+//     XML_Parser parser;
+
+//     resparse_data(XML_Parser p){
+//             parser = p;
+       resparse_data(bool use_live_hosts_file, std::set<std::string> *live_hosts, bool distributed_mode){
+               in_Resources = false;
+               in_Iface = false;
+               curr_iface = NULL;
+               failure = false;
+               this->use_live_hosts_file = use_live_hosts_file;
+               this->live_hosts = live_hosts;
+               this->distributed_mode = distributed_mode;
+       };
+
+       void new_iface(int l){
+               curr_iface = new iface_t(l);
+       };
+       void new_host(int l){
+               curr_host = new gs_host_t(l);
+       };
+       void add_property(const char *name, const char *att){
+               curr_iface->add_property(name, att);
+       };
+       void add_property(const char *name, const char **atts){
+               curr_iface->add_property(name, atts);
+       };
+       void add_property(const char *name, std::vector<std::string> &val_vec){
+               curr_iface->add_property(name, val_vec);
+       };
+
+
+       std::vector<std::string> get_property(int i, std::string property){
+               return ifaces[i]->get_property(property);
+       };
+       std::vector<std::string> get_properties(int i){
+               return ifaces[i]->get_properties();
+       };
+
+       int finalize_iface(std::string &errs);
+       int finalize_host(std::string &errs);
+       bool failed(){return failure;};
+       std::string to_string();
+       std::vector<std::pair<std::string,std::string> > find_ifaces(predicate_t *pr);
+       std::vector<int> get_ifaces_by_Name(std::string host_name, std::string if_name);
+private:
+       bool eval_pred(int i, predicate_t *pr);
+};
+
+
+class ifq_t{
+public:
+       resparse_data *rpd;
+       std::map<std::string, predicate_t *> ifq_map;
+
+       ifq_t(){ rpd = NULL;};
+
+       int load_ifaces(std::string fname, bool use_live_hosts_file, bool distributed_mode, std::string &err);
+       int load_ifqs(std::string fname, std::string &err);
+
+       std::vector<std::pair<std::string,std::string> > eval(std::string qname, int &errnbr);
+       std::vector<std::string> get_iface_vals(std::string host_name, std::string if_name, std::string property, int &errnbr, std::string &err_str);
+       std::vector<std::string> get_iface_properties(std::string host_name, std::string basic_if_name, int &err_no, std::string &err_str);
+};
+
+
+/////////////////////////
+//     for resource parser
+
+void startElement(void *userData, const char *name, std::vector<std::string> &attr_vec, std::vector<std::string> &val_vec);
+void endElement(void *userData, const char *name) ;
+
+
+
+
+#endif
diff --git a/src/ftacmp/ifq.l b/src/ftacmp/ifq.l
new file mode 100644 (file)
index 0000000..52092d7
--- /dev/null
@@ -0,0 +1,246 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+/*
+       MUST COMPILE WITH
+               flex -PIfqParser -oifqlexer.cc ifq.l
+       (or equivalent).
+*/     
+
+%{
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_fta.h"
+ #include <string.h>
+
+
+
+#include "ifq.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int IfqParserwrap(){return(1);}
+
+extern int IfqParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_ifq_lineno : the line currently being parsed when the error occurs.
+               flex_ifq_ch : the character on the line where the error occurs
+               flex_ifq_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_ifq_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_ifq_lineno = 1;
+int flex_ifq_ch = 0;
+char flex_ifq_linebuf[20000];
+
+char *flex_ifq_stringinput = NULL;
+int flex_ifq_stringinput_ptr = 0;
+FILE *flex_ifq_fileinput = NULL;
+int my_IfqParser_yyinput(char *buf, int max_size);
+
+
+
+void IfqParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_ifq_lineno, flex_ifq_ch, s, IfqParsertext, flex_ifq_linebuf );
+    for(i=0;i<flex_ifq_ch;i++){
+               if(flex_ifq_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_ifq_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_IfqParser_yyinput(b,ms))
+
+%}
+       /* MKS needs the next line to increase the NFA table */
+%e 1200
+%option noyywrap
+
+%%
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+AND|And|and            { flex_ifq_ch+=IfqParserleng; return AND; }
+NOT|Not|not            { flex_ifq_ch+=IfqParserleng; return NOT; }
+OR|Or|or       { flex_ifq_ch+=IfqParserleng; return OR; }
+
+TRUE   { flex_ifq_ch+=IfqParserleng; return TRUE_V;}
+FALSE  { flex_ifq_ch+=IfqParserleng; return FALSE_V;}
+
+Contains|Equals|Exists {flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return PRED; }
+
+;              {flex_ifq_ch+=IfqParserleng; return SEMICOLON;}
+
+
+
+[&|!+*/:(),.\[\]$]     { flex_ifq_ch+=IfqParserleng; return yytext[0]; }
+"-"    { flex_ifq_ch+=IfqParserleng; return yytext[0]; }
+"~"    { flex_ifq_ch+=IfqParserleng; return yytext[0]; }
+
+       /* names */
+
+[A-Za-z_][A-Za-z0-9_]* { flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return NAME; }
+
+       /* numbers */
+
+[0-9]+ |
+[0-9]+UL       { flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext);  return INTNUM; }
+
+[0-9]+ULL      { flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext);  return LONGINTNUM; }
+
+[0-9]+"."[0-9]* |
+"."[0-9]*      |
+[0-9]+[eE][+-]?[0-9]+  |
+[0-9]+"."[0-9]*[eE][+-]?[0-9]+ |
+"."[0-9]*[eE][+-]?[0-9]+       { flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return APPROXNUM; }
+
+       /* strings */
+
+'[^'\n]*'      {
+               
+               int c;
+               
+               IfqParserlval.strval = strdup(IfqParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_ifq_ch+=IfqParserleng; 
+                       IfqParserlval.strval[IfqParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+               
+'[^'\n]*$      { flex_ifq_ch+=IfqParserleng; IfqParsererror("Unterminated string"); }
+
+ /*                                                                                                                    */
+ /*            Newline : advance the error reporting line number       */
+ /*            and grab the next line into flex_ifq_linebuf                    */
+ /*                                                                                                                    */
+
+\n.*           {flex_ifq_ch=0; flex_ifq_lineno++;
+                          strcpy(flex_ifq_linebuf,IfqParsertext+1);
+                          yyless(1);
+                          }
+
+[ \t\r]+       {flex_ifq_ch+=IfqParserleng; }  /* white space */
+
+"--".*$                {flex_ifq_ch+=IfqParserleng; }; /* comment */
+"//".*$                {flex_ifq_ch+=IfqParserleng; }; /* comment */
+
+.|\n            {flex_ifq_ch+=IfqParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  IfqParsererror(yytext);}
+
+%%
+
+int my_IfqParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_ifq_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_ifq_stringinput[flex_ifq_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_ifq_stringinput[flex_ifq_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_ifq_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_ifq_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void IfqParser_setfileinput(FILE *f){
+       IfqParserrestart(NULL);
+
+       flex_ifq_fileinput = f;
+       flex_ifq_stringinput = NULL;
+       flex_ifq_lineno = 1;
+       flex_ifq_ch = 0;
+}
+
+void IfqParser_setstringinput(char *s){
+       IfqParserrestart(NULL);
+
+       flex_ifq_fileinput = NULL;
+       flex_ifq_stringinput = s;
+       flex_ifq_stringinput_ptr = 0;
+       flex_ifq_lineno = 1;
+       flex_ifq_ch = 0;
+}
+       
+               
+
+
diff --git a/src/ftacmp/ifq.tab.cc b/src/ftacmp/ifq.tab.cc
new file mode 100644 (file)
index 0000000..a2817f4
--- /dev/null
@@ -0,0 +1,1469 @@
+/* A Bison parser, made from ifq.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON        1
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* If NAME_PREFIX is specified substitute the variables and functions
+   names.  */
+#define yyparse IfqParserparse
+#define yylex   IfqParserlex
+#define yyerror IfqParsererror
+#define yylval  IfqParserlval
+#define yychar  IfqParserchar
+#define yydebug IfqParserdebug
+#define yynerrs IfqParsernerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     PRED = 259,
+     STRING_TOKEN = 260,
+     INTNUM = 261,
+     LONGINTNUM = 262,
+     APPROXNUM = 263,
+     OR = 264,
+     AND = 265,
+     NOT = 266,
+     SEMICOLON = 267,
+     LEFTBRACE = 268,
+     RIGHTBRACE = 269,
+     BY = 270,
+     AS = 271,
+     AGGR = 272,
+     FROM = 273,
+     INNER_JOIN = 274,
+     OUTER_JOIN = 275,
+     LEFT_OUTER_JOIN = 276,
+     RIGHT_OUTER_JOIN = 277,
+     GROUP = 278,
+     HAVING = 279,
+     IN = 280,
+     SELECT = 281,
+     WHERE = 282,
+     SUCH = 283,
+     THAT = 284,
+     TRUE_V = 285,
+     FALSE_V = 286,
+     TIMEVAL_L = 287,
+     HEX_L = 288,
+     LHEX_L = 289,
+     IP_L = 290,
+     MERGE = 291,
+     SLACK = 292,
+     DEFINE_SEC = 293,
+     PARAM_SEC = 294,
+     PROTOCOL = 295,
+     TABLE = 296,
+     STREAM = 297,
+     FTA = 298,
+     OPERATOR = 299,
+     OPERATOR_VIEW = 300,
+     FIELDS = 301,
+     SUBQUERIES = 302,
+     SELECTION_PUSHDOWN = 303
+   };
+#endif
+#define NAME 258
+#define PRED 259
+#define STRING_TOKEN 260
+#define INTNUM 261
+#define LONGINTNUM 262
+#define APPROXNUM 263
+#define OR 264
+#define AND 265
+#define NOT 266
+#define SEMICOLON 267
+#define LEFTBRACE 268
+#define RIGHTBRACE 269
+#define BY 270
+#define AS 271
+#define AGGR 272
+#define FROM 273
+#define INNER_JOIN 274
+#define OUTER_JOIN 275
+#define LEFT_OUTER_JOIN 276
+#define RIGHT_OUTER_JOIN 277
+#define GROUP 278
+#define HAVING 279
+#define IN 280
+#define SELECT 281
+#define WHERE 282
+#define SUCH 283
+#define THAT 284
+#define TRUE_V 285
+#define FALSE_V 286
+#define TIMEVAL_L 287
+#define HEX_L 288
+#define LHEX_L 289
+#define IP_L 290
+#define MERGE 291
+#define SLACK 292
+#define DEFINE_SEC 293
+#define PARAM_SEC 294
+#define PROTOCOL 295
+#define TABLE 296
+#define STREAM 297
+#define FTA 298
+#define OPERATOR 299
+#define OPERATOR_VIEW 300
+#define FIELDS 301
+#define SUBQUERIES 302
+#define SELECTION_PUSHDOWN 303
+
+
+
+
+/* Copy the first part of user declarations.  */
+#line 8 "ifq.y"
+
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "parse_fta.h"
+
+
+extern fta_parse_t *ifq_parse_result;
+
+
+#define YYDEBUG 1
+
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#ifndef YYSTYPE
+#line 35 "ifq.y"
+typedef union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+/*                     for FTA definition.     */
+       literal_t *litval;
+       scalarexp_t *scalarval;
+       se_list_t *se_listval;
+       select_list_t *select_listval;
+       table_exp_t *tblp;
+       predicate_t *predp;
+       literal_list_t *lit_l;
+       tablevar_t *table;
+       tablevar_list_t *tbl_list;
+       colref_t *colref;
+       colref_list_t *clist;
+       var_defs_t *var_defs;
+       var_pair_t *var_pair;
+       gb_t *gb_val;
+       gb_list_t *gb_list;
+
+       query_list_t *q_list;
+
+
+} yystype;
+/* Line 193 of /usr/local/share/bison/yacc.c.  */
+#line 230 "ifq.tab.cc"
+# define YYSTYPE yystype
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+#ifndef YYLTYPE
+typedef struct yyltype
+{
+  int first_line;
+  int first_column;
+  int last_line;
+  int last_column;
+} yyltype;
+# define YYLTYPE yyltype
+# define YYLTYPE_IS_TRIVIAL 1
+#endif
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 213 of /usr/local/share/bison/yacc.c.  */
+#line 251 "ifq.tab.cc"
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
+#    define YYSTACK_ALLOC alloca
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
+      + YYSTACK_GAP_MAX)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         register YYSIZE_T yyi;                \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];    \
+       }                                       \
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;   \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  6
+#define YYLAST   46
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  55
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  12
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  28
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  46
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   303
+
+#define YYTRANSLATE(X) \
+  ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+      50,    51,     2,     2,    54,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    49,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,    52,     2,    53,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned char yyprhs[] =
+{
+       0,     0,     3,     5,     9,    11,    15,    17,    19,    21,
+      25,    29,    32,    36,    38,    43,    45,    47,    49,    53,
+      55,    57,    59,    61,    63,    65,    68,    71,    74
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      56,     0,    -1,    58,    -1,     3,    49,    59,    -1,    57,
+      -1,    58,    12,    57,    -1,    60,    -1,    61,    -1,    62,
+      -1,    62,     9,    62,    -1,    62,    10,    62,    -1,    11,
+      62,    -1,    50,    62,    51,    -1,    63,    -1,     4,    52,
+      65,    53,    -1,    66,    -1,     3,    -1,    64,    -1,    65,
+      54,    64,    -1,     5,    -1,     6,    -1,     7,    -1,     8,
+      -1,    30,    -1,    31,    -1,    32,     5,    -1,    33,     5,
+      -1,    34,     5,    -1,    35,     5,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned char yyrline[] =
+{
+       0,   117,   117,   130,   135,   136,   140,   149,   155,   163,
+     165,   166,   167,   168,   171,   178,   180,   184,   186,   189,
+     191,   192,   193,   194,   195,   196,   197,   198,   199
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "NAME", "PRED", "STRING_TOKEN", "INTNUM", 
+  "LONGINTNUM", "APPROXNUM", "OR", "AND", "NOT", "SEMICOLON", "LEFTBRACE", 
+  "RIGHTBRACE", "BY", "AS", "AGGR", "FROM", "INNER_JOIN", "OUTER_JOIN", 
+  "LEFT_OUTER_JOIN", "RIGHT_OUTER_JOIN", "GROUP", "HAVING", "IN", 
+  "SELECT", "WHERE", "SUCH", "THAT", "TRUE_V", "FALSE_V", "TIMEVAL_L", 
+  "HEX_L", "LHEX_L", "IP_L", "MERGE", "SLACK", "DEFINE_SEC", "PARAM_SEC", 
+  "PROTOCOL", "TABLE", "STREAM", "FTA", "OPERATOR", "OPERATOR_VIEW", 
+  "FIELDS", "SUBQUERIES", "SELECTION_PUSHDOWN", "':'", "'('", "')'", 
+  "'['", "']'", "','", "$accept", "parse_result", "gsql", "query_list", 
+  "select_statement", "table_exp", "where_clause", "search_condition", 
+  "predicate", "scalar_exp", "scalar_exp_commalist", "literal", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296,   297,   298,   299,   300,   301,   302,   303,    58,
+      40,    41,    91,    93,    44
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,    55,    56,    57,    58,    58,    59,    60,    61,    62,
+      62,    62,    62,    62,    63,    64,    64,    65,    65,    66,
+      66,    66,    66,    66,    66,    66,    66,    66,    66
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     1,     3,     1,     3,     1,     1,     1,     3,
+       3,     2,     3,     1,     4,     1,     1,     1,     3,     1,
+       1,     1,     1,     1,     1,     2,     2,     2,     2
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       0,     0,     0,     4,     2,     0,     1,     0,     0,     0,
+       0,     3,     6,     7,     8,    13,     5,     0,    11,     0,
+       0,     0,    16,    19,    20,    21,    22,    23,    24,     0,
+       0,     0,     0,    17,     0,    15,    12,     9,    10,    25,
+      26,    27,    28,    14,     0,    18
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+      -1,     2,     3,     4,    11,    12,    13,    14,    15,    33,
+      34,    35
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -42
+static const yysigned_char yypact[] =
+{
+       2,   -31,    19,   -42,     8,    -4,   -42,     2,   -30,    -4,
+      -4,   -42,   -42,   -42,     7,   -42,   -42,     3,   -42,    -8,
+      -4,    -4,   -42,   -42,   -42,   -42,   -42,   -42,   -42,    16,
+      18,    20,    21,   -42,   -41,   -42,   -42,    14,   -42,   -42,
+     -42,   -42,   -42,   -42,     3,   -42
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yysigned_char yypgoto[] =
+{
+     -42,   -42,    22,   -42,   -42,   -42,   -42,    -6,   -42,   -17,
+     -42,   -42
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, parse error.  */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+       8,    20,    21,    18,    19,     1,    22,     9,    23,    24,
+      25,    26,    43,    44,    37,    38,    20,    21,     5,     6,
+       7,    39,    17,    40,    21,    41,    42,    45,     0,    16,
+       0,     0,     0,    27,    28,    29,    30,    31,    32,     0,
+       0,     0,     0,    36,     0,     0,    10
+};
+
+static const yysigned_char yycheck[] =
+{
+       4,     9,    10,     9,    10,     3,     3,    11,     5,     6,
+       7,     8,    53,    54,    20,    21,     9,    10,    49,     0,
+      12,     5,    52,     5,    10,     5,     5,    44,    -1,     7,
+      -1,    -1,    -1,    30,    31,    32,    33,    34,    35,    -1,
+      -1,    -1,    -1,    51,    -1,    -1,    50
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,     3,    56,    57,    58,    49,     0,    12,     4,    11,
+      50,    59,    60,    61,    62,    63,    57,    52,    62,    62,
+       9,    10,     3,     5,     6,     7,     8,    30,    31,    32,
+      33,    34,    35,    64,    65,    66,    51,    62,    62,     5,
+       5,     5,     5,    53,    54,    64
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT                goto yyabortlab
+#define YYERROR                goto yyerrlab1
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL         goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");                        \
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)           \
+  Current.first_line   = Rhs[1].first_line;      \
+  Current.first_column = Rhs[1].first_column;    \
+  Current.last_line    = Rhs[N].last_line;       \
+  Current.last_column  = Rhs[N].last_column;
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#define YYLEX  yylex ()
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+# define YYDSYMPRINT(Args)                     \
+do {                                           \
+  if (yydebug)                                 \
+    yysymprint Args;                           \
+} while (0)
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+\f
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+\f
+
+#if YYDEBUG
+/*-----------------------------.
+| Print this symbol on YYOUT.  |
+`-----------------------------*/
+
+static void
+#if defined (__STDC__) || defined (__cplusplus)
+yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue)
+#else
+yysymprint (yyout, yytype, yyvalue)
+    FILE* yyout;
+    int yytype;
+    YYSTYPE yyvalue;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvalue;
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyout, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+      YYPRINT (yyout, yytoknum[yytype], yyvalue);
+# endif
+    }
+  else
+    YYFPRINTF (yyout, "nterm %s (", yytname[yytype]);
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyout, ")");
+}
+#endif /* YYDEBUG. */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+static void
+#if defined (__STDC__) || defined (__cplusplus)
+yydestruct (int yytype, YYSTYPE yyvalue)
+#else
+yydestruct (yytype, yyvalue)
+    int yytype;
+    YYSTYPE yyvalue;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvalue;
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+}
+
+\f
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
+# else
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of parse errors so far.  */
+int yynerrs;
+
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule.  */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+
+                   &yystacksize);
+
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with.  */
+
+  if (yychar <= 0)             /* This means end of input.  */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more.  */
+
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE (yychar);
+
+      /* We have to keep this `#if YYDEBUG', since we use variables
+        which are defined only if `YYDEBUG' is set.  */
+      YYDPRINTF ((stderr, "Next token is "));
+      YYDSYMPRINT ((stderr, yychar1, yylval));
+      YYDPRINTF ((stderr, "\n"));
+    }
+
+  /* If the proper action on seeing token YYCHAR1 is to reduce or to
+     detect an error, take that action.  */
+  yyn += yychar1;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+             yychar, yytname[yychar1]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+
+#if YYDEBUG
+  /* We have to keep this `#if YYDEBUG', since we use variables which
+     are defined only if `YYDEBUG' is set.  */
+  if (yydebug)
+    {
+      int yyi;
+
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+                yyn - 1, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++)
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+  switch (yyn)
+    {
+        case 2:
+#line 117 "ifq.y"
+    {
+               ifq_parse_result->parse_tree_list = yyvsp[0].q_list;
+               ifq_parse_result->tables = NULL;
+               ifq_parse_result->parse_type = QUERY_PARSE;
+       }
+    break;
+
+  case 3:
+#line 130 "ifq.y"
+    {
+                               yyval.tblp = yyvsp[0].tblp; yyval.tblp->nmap["name"] = yyvsp[-2].strval;
+                       }
+    break;
+
+  case 4:
+#line 135 "ifq.y"
+    {yyval.q_list = new query_list_t(yyvsp[0].tblp);}
+    break;
+
+  case 5:
+#line 136 "ifq.y"
+    {yyval.q_list = yyvsp[-2].q_list->append(yyvsp[0].tblp);}
+    break;
+
+  case 6:
+#line 141 "ifq.y"
+    {yyval.tblp = yyvsp[0].tblp;}
+    break;
+
+  case 7:
+#line 150 "ifq.y"
+    {yyval.tblp=new table_exp_t(NULL,yyvsp[0].predp,NULL,NULL,NULL,NULL,NULL,NULL);}
+    break;
+
+  case 8:
+#line 156 "ifq.y"
+    {yyval.predp = yyvsp[0].predp;}
+    break;
+
+  case 9:
+#line 164 "ifq.y"
+    {yyval.predp=new predicate_t("OR",yyvsp[-2].predp,yyvsp[0].predp);}
+    break;
+
+  case 10:
+#line 165 "ifq.y"
+    {yyval.predp=new predicate_t("AND",yyvsp[-2].predp,yyvsp[0].predp);}
+    break;
+
+  case 11:
+#line 166 "ifq.y"
+    {yyval.predp = new predicate_t("NOT", yyvsp[0].predp );}
+    break;
+
+  case 12:
+#line 167 "ifq.y"
+    {yyval.predp = yyvsp[-1].predp;}
+    break;
+
+  case 13:
+#line 168 "ifq.y"
+    {yyval.predp = yyvsp[0].predp;}
+    break;
+
+  case 14:
+#line 172 "ifq.y"
+    {yyval.predp = new predicate_t(yyvsp[-3].strval, yyvsp[-1].se_listval->get_se_list()); }
+    break;
+
+  case 15:
+#line 179 "ifq.y"
+    { yyval.scalarval= scalarexp_t::make_param_reference(yyvsp[0].litval->to_string().c_str());}
+    break;
+
+  case 16:
+#line 180 "ifq.y"
+    {yyval.scalarval = scalarexp_t::make_param_reference(yyvsp[0].strval);}
+    break;
+
+  case 17:
+#line 185 "ifq.y"
+    {  yyval.se_listval= new se_list_t(yyvsp[0].scalarval); }
+    break;
+
+  case 18:
+#line 186 "ifq.y"
+    { yyval.se_listval=yyvsp[-2].se_listval->append(yyvsp[0].scalarval); }
+    break;
+
+  case 19:
+#line 190 "ifq.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_STRING);}
+    break;
+
+  case 20:
+#line 191 "ifq.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_INT);}
+    break;
+
+  case 21:
+#line 192 "ifq.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_LONGINT);}
+    break;
+
+  case 22:
+#line 193 "ifq.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_FLOAT);}
+    break;
+
+  case 23:
+#line 194 "ifq.y"
+    {yyval.litval = new literal_t("TRUE",LITERAL_BOOL);}
+    break;
+
+  case 24:
+#line 195 "ifq.y"
+    {yyval.litval = new literal_t("FALSE",LITERAL_BOOL);}
+    break;
+
+  case 25:
+#line 196 "ifq.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_TIMEVAL);}
+    break;
+
+  case 26:
+#line 197 "ifq.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_HEX);}
+    break;
+
+  case 27:
+#line 198 "ifq.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_LONGHEX);}
+    break;
+
+  case 28:
+#line 199 "ifq.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_IP);}
+    break;
+
+
+    }
+
+/* Line 1016 of /usr/local/share/bison/yacc.c.  */
+#line 1248 "ifq.tab.cc"
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         int yytype = YYTRANSLATE (yychar);
+         char *yymsg;
+         int yyx, yycount;
+
+         yycount = 0;
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         for (yyx = yyn < 0 ? -yyn : 0;
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+           if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen (yytname[yytype]);
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[yytype]);
+
+             if (yycount < 5)
+               {
+                 yycount = 0;
+                 for (yyx = yyn < 0 ? -yyn : 0;
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));
+                      yyx++)
+                   if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+                     {
+                       const char *yyq = ! yycount ? ", expecting " : " or ";
+                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yycount++;
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exhausted");
+       }
+      else
+#endif /* YYERROR_VERBOSE */
+       yyerror ("parse error");
+    }
+  goto yyerrlab1;
+
+
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action.  |
+`----------------------------------------------------*/
+yyerrlab1:
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      /* Return failure if at end of input.  */
+      if (yychar == YYEOF)
+        {
+         /* Pop the error token.  */
+          YYPOPSTACK;
+         /* Pop the rest of the stack.  */
+         while (yyssp > yyss)
+           {
+             YYDPRINTF ((stderr, "Error: popping "));
+             YYDSYMPRINT ((stderr,
+                           yystos[*yyssp],
+                           *yyvsp));
+             YYDPRINTF ((stderr, "\n"));
+             yydestruct (yystos[*yyssp], *yyvsp);
+             YYPOPSTACK;
+           }
+         YYABORT;
+        }
+
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+                 yychar, yytname[yychar1]));
+      yydestruct (yychar1, yylval);
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+
+  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+       {
+         yyn += YYTERROR;
+         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+           {
+             yyn = yytable[yyn];
+             if (0 < yyn)
+               break;
+           }
+       }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+       YYABORT;
+
+      YYDPRINTF ((stderr, "Error: popping "));
+      YYDSYMPRINT ((stderr,
+                   yystos[*yyssp], *yyvsp));
+      YYDPRINTF ((stderr, "\n"));
+
+      yydestruct (yystos[yystate], *yyvsp);
+      yyvsp--;
+      yystate = *--yyssp;
+
+
+#if YYDEBUG
+      if (yydebug)
+       {
+         short *yyssp1 = yyss - 1;
+         YYFPRINTF (stderr, "Error: state stack now");
+         while (yyssp1 != yyssp)
+           YYFPRINTF (stderr, " %d", *++yyssp1);
+         YYFPRINTF (stderr, "\n");
+       }
+#endif
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+
+
+#line 204 "ifq.y"
+
+
+
diff --git a/src/ftacmp/ifq.tab.cc.h b/src/ftacmp/ifq.tab.cc.h
new file mode 100644 (file)
index 0000000..bccb871
--- /dev/null
@@ -0,0 +1,171 @@
+/* A Bison parser, made from ifq.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef BISON_IFQ_TAB_CC_H
+# define BISON_IFQ_TAB_CC_H
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     PRED = 259,
+     STRING_TOKEN = 260,
+     INTNUM = 261,
+     LONGINTNUM = 262,
+     APPROXNUM = 263,
+     OR = 264,
+     AND = 265,
+     NOT = 266,
+     SEMICOLON = 267,
+     LEFTBRACE = 268,
+     RIGHTBRACE = 269,
+     BY = 270,
+     AS = 271,
+     AGGR = 272,
+     FROM = 273,
+     INNER_JOIN = 274,
+     OUTER_JOIN = 275,
+     LEFT_OUTER_JOIN = 276,
+     RIGHT_OUTER_JOIN = 277,
+     GROUP = 278,
+     HAVING = 279,
+     IN = 280,
+     SELECT = 281,
+     WHERE = 282,
+     SUCH = 283,
+     THAT = 284,
+     TRUE_V = 285,
+     FALSE_V = 286,
+     TIMEVAL_L = 287,
+     HEX_L = 288,
+     LHEX_L = 289,
+     IP_L = 290,
+     MERGE = 291,
+     SLACK = 292,
+     DEFINE_SEC = 293,
+     PARAM_SEC = 294,
+     PROTOCOL = 295,
+     TABLE = 296,
+     STREAM = 297,
+     FTA = 298,
+     OPERATOR = 299,
+     OPERATOR_VIEW = 300,
+     FIELDS = 301,
+     SUBQUERIES = 302,
+     SELECTION_PUSHDOWN = 303
+   };
+#endif
+#define NAME 258
+#define PRED 259
+#define STRING_TOKEN 260
+#define INTNUM 261
+#define LONGINTNUM 262
+#define APPROXNUM 263
+#define OR 264
+#define AND 265
+#define NOT 266
+#define SEMICOLON 267
+#define LEFTBRACE 268
+#define RIGHTBRACE 269
+#define BY 270
+#define AS 271
+#define AGGR 272
+#define FROM 273
+#define INNER_JOIN 274
+#define OUTER_JOIN 275
+#define LEFT_OUTER_JOIN 276
+#define RIGHT_OUTER_JOIN 277
+#define GROUP 278
+#define HAVING 279
+#define IN 280
+#define SELECT 281
+#define WHERE 282
+#define SUCH 283
+#define THAT 284
+#define TRUE_V 285
+#define FALSE_V 286
+#define TIMEVAL_L 287
+#define HEX_L 288
+#define LHEX_L 289
+#define IP_L 290
+#define MERGE 291
+#define SLACK 292
+#define DEFINE_SEC 293
+#define PARAM_SEC 294
+#define PROTOCOL 295
+#define TABLE 296
+#define STREAM 297
+#define FTA 298
+#define OPERATOR 299
+#define OPERATOR_VIEW 300
+#define FIELDS 301
+#define SUBQUERIES 302
+#define SELECTION_PUSHDOWN 303
+
+
+
+
+#ifndef YYSTYPE
+#line 35 "ifq.y"
+typedef union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+/*                     for FTA definition.     */
+       literal_t *litval;
+       scalarexp_t *scalarval;
+       se_list_t *se_listval;
+       select_list_t *select_listval;
+       table_exp_t *tblp;
+       predicate_t *predp;
+       literal_list_t *lit_l;
+       tablevar_t *table;
+       tablevar_list_t *tbl_list;
+       colref_t *colref;
+       colref_list_t *clist;
+       var_defs_t *var_defs;
+       var_pair_t *var_pair;
+       gb_t *gb_val;
+       gb_list_t *gb_list;
+
+       query_list_t *q_list;
+
+
+} yystype;
+/* Line 1281 of /usr/local/share/bison/yacc.c.  */
+#line 164 "ifq.tab.cc.h"
+# define YYSTYPE yystype
+#endif
+
+extern YYSTYPE IfqParserlval;
+
+
+#endif /* not BISON_IFQ_TAB_CC_H */
+
diff --git a/src/ftacmp/ifq.y b/src/ftacmp/ifq.y
new file mode 100644 (file)
index 0000000..ebddc9f
--- /dev/null
@@ -0,0 +1,220 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+       MUST COMPILE WITH
+               bison --verbose --defines=ifq.tab.cc.h -p IfqParser  -o ifq.tab.cc ifq.y
+
+        (or equivalent).
+*/
+
+%{
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "parse_fta.h"
+
+
+extern fta_parse_t *ifq_parse_result;
+
+
+#define YYDEBUG 1
+
+%}
+
+
+       /* symbolic tokens */
+
+%union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+/*                     for FTA definition.     */
+       literal_t *litval;
+       scalarexp_t *scalarval;
+       se_list_t *se_listval;
+       select_list_t *select_listval;
+       table_exp_t *tblp;
+       predicate_t *predp;
+       literal_list_t *lit_l;
+       tablevar_t *table;
+       tablevar_list_t *tbl_list;
+       colref_t *colref;
+       colref_list_t *clist;
+       var_defs_t *var_defs;
+       var_pair_t *var_pair;
+       gb_t *gb_val;
+       gb_list_t *gb_list;
+
+       query_list_t *q_list;
+
+
+}
+
+%token <strval> NAME
+%token <strval> PRED
+%token <strval> STRING_TOKEN
+%token <strval> INTNUM
+%token <strval> LONGINTNUM
+%token <strval> APPROXNUM
+
+/*                     for FTA definition.     */
+%type <q_list> query_list
+%type <tblp> gsql
+%type <tblp> select_statement
+%type <tblp> table_exp
+%type <predp> where_clause
+%type <predp> search_condition
+%type <predp> predicate
+%type <litval> literal
+%type <scalarval> scalar_exp
+%type <se_listval> scalar_exp_commalist
+
+
+
+
+
+       /* operators */
+
+%left OR
+%left AND
+%left NOT
+
+       /* literal keyword tokens */
+%token  SEMICOLON LEFTBRACE RIGHTBRACE
+/*             For query definition    */
+%token BY AS
+%token <strval> AGGR
+%token FROM INNER_JOIN OUTER_JOIN LEFT_OUTER_JOIN RIGHT_OUTER_JOIN
+%token GROUP HAVING IN
+%token SELECT
+%token WHERE
+%token SUCH THAT
+
+%token TRUE_V FALSE_V
+%token TIMEVAL_L HEX_L LHEX_L IP_L
+%token MERGE SLACK
+
+%token DEFINE_SEC PARAM_SEC
+
+/*             For table definition    */
+%token RIGHTBRACE PROTOCOL TABLE STREAM FTA
+%token OPERATOR OPERATOR_VIEW FIELDS SUBQUERIES SELECTION_PUSHDOWN
+
+
+%%
+
+/*                     Union of possible results       */
+parse_result:  query_list      {
+               ifq_parse_result->parse_tree_list = $1;
+               ifq_parse_result->tables = NULL;
+               ifq_parse_result->parse_type = QUERY_PARSE;
+       }
+       ;
+
+
+
+/*             Query definition.
+               WARNING: there might be some relics.
+*/
+
+gsql:  NAME ':' select_statement {
+                               $$ = $3; $$->nmap["name"] = $1;
+                       }
+       ;
+
+query_list:    gsql    {$$ = new query_list_t($1);}
+       |       query_list SEMICOLON gsql       {$$ = $1->append($3);}
+       ;
+
+
+select_statement:
+               table_exp       {$$ = $1;}
+       ;
+
+
+       /* query expressions */
+
+
+
+table_exp:
+               where_clause {$$=new table_exp_t(NULL,$1,NULL,NULL,NULL,NULL,NULL,NULL);}
+       ;
+
+
+
+where_clause:
+               search_condition        {$$ = $1;}
+       ;
+
+
+
+       /* search conditions */
+
+search_condition:
+               search_condition OR search_condition  {$$=new predicate_t("OR",$1,$3);}
+       |       search_condition AND search_condition {$$=new predicate_t("AND",$1,$3);}
+       |       NOT search_condition    {$$ = new predicate_t("NOT", $2 );}
+       |       '(' search_condition ')' {$$ = $2;}
+       |       predicate {$$ = $1;}
+       ;
+
+predicate:
+               PRED '[' scalar_exp_commalist ']' {$$ = new predicate_t($1, $3->get_se_list()); }
+       ;
+
+
+       /* scalar expressions */
+
+scalar_exp:
+               literal { $$= scalarexp_t::make_param_reference($1->to_string().c_str());}
+       |       NAME {$$ = scalarexp_t::make_param_reference($1);}
+       ;
+
+
+scalar_exp_commalist:
+               scalar_exp      {       $$= new se_list_t($1); }
+       |       scalar_exp_commalist ',' scalar_exp     { $$=$1->append($3); }
+       ;
+
+literal:
+               STRING_TOKEN    {$$ = new literal_t($1,LITERAL_STRING);}
+       |       INTNUM          {$$ = new literal_t($1,LITERAL_INT);}
+       |       LONGINTNUM              {$$ = new literal_t($1,LITERAL_LONGINT);}
+       |       APPROXNUM       {$$ = new literal_t($1,LITERAL_FLOAT);}
+       |       TRUE_V          {$$ = new literal_t("TRUE",LITERAL_BOOL);}
+       |       FALSE_V         {$$ = new literal_t("FALSE",LITERAL_BOOL);}
+       |       TIMEVAL_L STRING_TOKEN  {$$ = new literal_t($2,LITERAL_TIMEVAL);}
+       |       HEX_L  STRING_TOKEN     {$$ = new literal_t($2,LITERAL_HEX);}
+       |       LHEX_L  STRING_TOKEN    {$$ = new literal_t($2,LITERAL_LONGHEX);}
+       |       IP_L  STRING_TOKEN      {$$ = new literal_t($2,LITERAL_IP);}
+       ;
+
+
+
+%%
+
diff --git a/src/ftacmp/ifqlexer.cc b/src/ftacmp/ifqlexer.cc
new file mode 100644 (file)
index 0000000..53ce50c
--- /dev/null
@@ -0,0 +1,1879 @@
+#define yy_create_buffer IfqParser_create_buffer
+#define yy_delete_buffer IfqParser_delete_buffer
+#define yy_scan_buffer IfqParser_scan_buffer
+#define yy_scan_string IfqParser_scan_string
+#define yy_scan_bytes IfqParser_scan_bytes
+#define yy_flex_debug IfqParser_flex_debug
+#define yy_init_buffer IfqParser_init_buffer
+#define yy_flush_buffer IfqParser_flush_buffer
+#define yy_load_buffer_state IfqParser_load_buffer_state
+#define yy_switch_to_buffer IfqParser_switch_to_buffer
+#define yyin IfqParserin
+#define yyleng IfqParserleng
+#define yylex IfqParserlex
+#define yyout IfqParserout
+#define yyrestart IfqParserrestart
+#define yytext IfqParsertext
+
+#line 19 "ifqlexer.cc"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /cvsroot/gscpv4/src/ftacmp/ifqlexer.cc,v 1.1.1.1 2013/12/02 17:44:57 spatsch Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <unistd.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yytext_ptr -= yy_more_len; \
+       yyleng = (int) (yy_cp - yytext_ptr); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 27
+#define YY_END_OF_BUFFER 28
+static yyconst short int yy_accept[86] =
+    {   0,
+        0,    0,   28,   26,   23,   22,    8,   26,    9,    8,
+        8,   12,    7,   11,   11,   11,   11,   11,   11,   11,
+       11,   11,   11,   11,   10,   23,   22,    0,   21,   20,
+        0,   16,    0,    0,   15,   12,    0,    0,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,    3,   11,   11,
+       11,    0,   24,    0,   19,    0,   25,   15,    0,    0,
+       17,   13,    1,   11,   11,   11,   11,    2,   11,    0,
+       18,   14,   11,   11,   11,   11,    4,   11,   11,   11,
+        5,   11,    6,   11,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    4,    1,    1,    4,    1,    4,    5,    4,
+        4,    4,    6,    4,    7,    8,    9,   10,   10,   10,
+       10,   10,   10,   10,   10,   10,   10,    4,   11,    1,
+        1,    1,    1,    1,   12,   13,   14,   15,   16,   17,
+       13,   13,   13,   13,   13,   18,   13,   19,   20,   13,
+       13,   21,   22,   23,   24,   13,   13,   13,   13,   13,
+        4,    1,    4,    1,   13,    1,   25,   13,   13,   26,
+
+       27,   13,   13,   13,   28,   13,   13,   29,   13,   30,
+       31,   13,   32,   33,   34,   35,   36,   13,   13,   37,
+       13,   13,    1,    4,    1,   38,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[39] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    3,
+        1,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    1
+    } ;
+
+static yyconst short int yy_base[91] =
+    {   0,
+        0,    0,  141,  142,  138,    0,  142,   36,  132,   30,
+      129,   34,  142,   24,    0,  106,   15,  124,   25,   27,
+      114,  104,  102,   99,  142,  129,    0,   46,  142,  142,
+      127,   43,   56,  126,   55,   59,   66,  110,    0,  112,
+      100,   95,   88,   95,  104,   98,   85,    0,   95,   92,
+       82,  113,  142,  105,  104,  110,  142,   58,   71,  102,
+      101,   92,    0,   74,   83,   73,   84,    0,   89,   94,
+       93,  142,   77,   72,   65,   83,    0,   60,   50,   46,
+        0,   49,    0,   30,  142,   86,   89,   52,   92,   95
+    } ;
+
+static yyconst short int yy_def[91] =
+    {   0,
+       85,    1,   85,   85,   85,   86,   85,   87,   85,   85,
+       85,   85,   85,   88,   88,   88,   88,   88,   88,   88,
+       88,   88,   88,   88,   85,   85,   86,   87,   85,   85,
+       89,   85,   85,   90,   85,   85,   85,   85,   88,   88,
+       88,   88,   88,   88,   88,   88,   88,   88,   88,   88,
+       88,   89,   85,   85,   85,   90,   85,   85,   85,   85,
+       85,   85,   88,   88,   88,   88,   88,   88,   88,   85,
+       85,   85,   88,   88,   88,   88,   88,   88,   88,   88,
+       88,   88,   88,   88,    0,   85,   85,   85,   85,   85
+    } ;
+
+static yyconst short int yy_nxt[181] =
+    {   0,
+        4,    5,    6,    7,    8,    7,    9,   10,   11,   12,
+       13,   14,   15,   16,   15,   17,   18,   15,   19,   20,
+       15,   15,   21,   15,   22,   15,   15,   15,   15,   23,
+       24,   15,   15,   15,   15,   15,   15,   25,   29,   32,
+       30,   35,   40,   36,   46,   33,   43,   48,   29,   37,
+       30,   44,   32,   41,   39,   47,   33,   38,   33,   48,
+       37,   54,   54,   83,   58,   55,   35,   58,   36,   33,
+       59,   60,   60,   59,   37,   61,   70,   70,   84,   83,
+       71,   59,   38,   83,   59,   37,   27,   82,   27,   28,
+       28,   28,   52,   52,   52,   56,   56,   56,   81,   80,
+
+       79,   78,   71,   71,   77,   76,   75,   74,   73,   72,
+       61,   61,   57,   55,   55,   53,   68,   63,   69,   68,
+       68,   67,   66,   65,   64,   63,   63,   62,   57,   53,
+       26,   48,   51,   50,   49,   45,   42,   34,   31,   26,
+       85,    3,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85
+    } ;
+
+static yyconst short int yy_chk[181] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    8,   10,
+        8,   12,   14,   12,   19,   10,   17,   20,   28,   12,
+       28,   17,   32,   14,   88,   19,   10,   12,   32,   20,
+       12,   33,   33,   84,   35,   33,   36,   58,   36,   32,
+       35,   37,   37,   58,   36,   37,   59,   59,   82,   80,
+       59,   35,   36,   79,   58,   36,   86,   78,   86,   87,
+       87,   87,   89,   89,   89,   90,   90,   90,   76,   75,
+
+       74,   73,   71,   70,   69,   67,   66,   65,   64,   62,
+       61,   60,   56,   55,   54,   52,   51,   50,   49,   47,
+       46,   45,   44,   43,   42,   41,   40,   38,   34,   31,
+       26,   24,   23,   22,   21,   18,   16,   11,    9,    5,
+        3,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85,
+       85,   85,   85,   85,   85,   85,   85,   85,   85,   85
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+static int yy_more_flag = 0;
+static int yy_more_len = 0;
+#define yymore() (yy_more_flag = 1)
+#define YY_MORE_ADJ yy_more_len
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "ifq.l"
+#define INITIAL 0
+/*
+       MUST COMPILE WITH
+               flex -PIfqParser -oifqlexer.cc ifq.l
+       (or equivalent).
+*/     
+#line 9 "ifq.l"
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_fta.h"
+ #include <string.h>
+
+
+
+#include "ifq.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int IfqParserwrap(){return(1);}
+
+extern int IfqParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_ifq_lineno : the line currently being parsed when the error occurs.
+               flex_ifq_ch : the character on the line where the error occurs
+               flex_ifq_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_ifq_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_ifq_lineno = 1;
+int flex_ifq_ch = 0;
+char flex_ifq_linebuf[20000];
+
+char *flex_ifq_stringinput = NULL;
+int flex_ifq_stringinput_ptr = 0;
+FILE *flex_ifq_fileinput = NULL;
+int my_IfqParser_yyinput(char *buf, int max_size);
+
+
+
+void IfqParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_ifq_lineno, flex_ifq_ch, s, IfqParsertext, flex_ifq_linebuf );
+    for(i=0;i<flex_ifq_ch;i++){
+               if(flex_ifq_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_ifq_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_IfqParser_yyinput(b,ms))
+
+/* MKS needs the next line to increase the NFA table */
+#line 531 "ifqlexer.cc"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( yy_current_buffer->yy_is_interactive ) \
+               { \
+               int c = '*', n; \
+               for ( n = 0; n < max_size && \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+                       buf[n] = (char) c; \
+               if ( c == '\n' ) \
+                       buf[n++] = (char) c; \
+               if ( c == EOF && ferror( yyin ) ) \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+               result = n; \
+               } \
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+                 && ferror( yyin ) ) \
+               YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+       YY_USER_ACTION
+
+YY_DECL
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp = NULL, *yy_bp = NULL;
+       register int yy_act;
+
+#line 88 "ifq.l"
+
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+#line 701 "ifqlexer.cc"
+
+       if ( yy_init )
+               {
+               yy_init = 0;
+
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! yy_start )
+                       yy_start = 1;   /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( ! yy_current_buffer )
+                       yy_current_buffer =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+
+               yy_load_buffer_state();
+               }
+
+       while ( 1 )             /* loops until end-of-file is reached */
+               {
+               yy_more_len = 0;
+               if ( yy_more_flag )
+                       {
+                       yy_more_len = yy_c_buf_p - yytext_ptr;
+                       yy_more_flag = 0;
+                       }
+               yy_cp = yy_c_buf_p;
+
+               /* Support of yytext. */
+               *yy_cp = yy_hold_char;
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = yy_start;
+yy_match:
+               do
+                       {
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               yy_last_accepting_state = yy_current_state;
+                               yy_last_accepting_cpos = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 86 )
+                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 142 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+               if ( yy_act == 0 )
+                       { /* have to back up */
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       yy_act = yy_accept[yy_current_state];
+                       }
+
+               YY_DO_BEFORE_ACTION;
+
+
+do_action:     /* This label is used only to access EOF actions. */
+
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = yy_hold_char;
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 106 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; return AND; }
+       YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 107 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; return NOT; }
+       YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 108 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; return OR; }
+       YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 110 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; return TRUE_V;}
+       YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 111 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; return FALSE_V;}
+       YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 113 "ifq.l"
+{flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return PRED; }
+       YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 115 "ifq.l"
+{flex_ifq_ch+=IfqParserleng; return SEMICOLON;}
+       YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 119 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; return yytext[0]; }
+       YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 120 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; return yytext[0]; }
+       YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 121 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; return yytext[0]; }
+       YY_BREAK
+/* names */
+case 11:
+YY_RULE_SETUP
+#line 125 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return NAME; }
+       YY_BREAK
+/* numbers */
+case 12:
+#line 130 "ifq.l"
+case 13:
+YY_RULE_SETUP
+#line 130 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext);  return INTNUM; }
+       YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 132 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext);  return LONGINTNUM; }
+       YY_BREAK
+case 15:
+#line 135 "ifq.l"
+case 16:
+#line 136 "ifq.l"
+case 17:
+#line 137 "ifq.l"
+case 18:
+#line 138 "ifq.l"
+case 19:
+YY_RULE_SETUP
+#line 138 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; IfqParserlval.strval = strdup(yytext); return APPROXNUM; }
+       YY_BREAK
+/* strings */
+case 20:
+YY_RULE_SETUP
+#line 142 "ifq.l"
+{
+               
+               int c;
+               
+               IfqParserlval.strval = strdup(IfqParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_ifq_ch+=IfqParserleng; 
+                       IfqParserlval.strval[IfqParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+       YY_BREAK
+case 21:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 159 "ifq.l"
+{ flex_ifq_ch+=IfqParserleng; IfqParsererror("Unterminated string"); }
+       YY_BREAK
+/*                                                                                                                     */
+/*             Newline : advance the error reporting line number       */
+/*             and grab the next line into flex_ifq_linebuf                    */
+/*                                                                                                                     */
+case 22:
+YY_RULE_SETUP
+#line 166 "ifq.l"
+{flex_ifq_ch=0; flex_ifq_lineno++;
+                          strcpy(flex_ifq_linebuf,IfqParsertext+1);
+                          yyless(1);
+                          }
+       YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 171 "ifq.l"
+{flex_ifq_ch+=IfqParserleng; } /* white space */
+       YY_BREAK
+case 24:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 173 "ifq.l"
+{flex_ifq_ch+=IfqParserleng; };        /* comment */
+       YY_BREAK
+case 25:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 174 "ifq.l"
+{flex_ifq_ch+=IfqParserleng; };        /* comment */
+       YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 176 "ifq.l"
+{flex_ifq_ch+=IfqParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  IfqParsererror(yytext);}
+       YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 178 "ifq.l"
+ECHO;
+       YY_BREAK
+#line 944 "ifqlexer.cc"
+case YY_STATE_EOF(INITIAL):
+       yyterminate();
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = yy_hold_char;
+               YY_RESTORE_YY_MORE_OFFSET
+
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between yy_current_buffer and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       yy_n_chars = yy_current_buffer->yy_n_chars;
+                       yy_current_buffer->yy_input_file = yyin;
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state();
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++yy_c_buf_p;
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                               yy_cp = yy_c_buf_p;
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer() )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               yy_did_buffer_switch_on_eof = 0;
+
+                               if ( yywrap() )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               yy_c_buf_p =
+                                       yytext_ptr + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               yy_c_buf_p =
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+       {
+       register char *dest = yy_current_buffer->yy_ch_buf;
+       register char *source = yytext_ptr;
+       register int number_to_move, i;
+       int ret_val;
+
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( yy_current_buffer->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a single character, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+       else
+               {
+               int num_to_read =
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+                       YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = yy_current_buffer;
+
+                       int yy_c_buf_p_offset =
+                               (int) (yy_c_buf_p - b->yy_ch_buf);
+
+                       if ( b->yy_is_our_buffer )
+                               {
+                               int new_size = b->yy_buf_size * 2;
+
+                               if ( new_size <= 0 )
+                                       b->yy_buf_size += b->yy_buf_size / 8;
+                               else
+                                       b->yy_buf_size *= 2;
+
+                               b->yy_ch_buf = (char *)
+                                       /* Include room in for 2 EOB chars. */
+                                       yy_flex_realloc( (void *) b->yy_ch_buf,
+                                                        b->yy_buf_size + 2 );
+                               }
+                       else
+                               /* Can't grow it, we don't own it. */
+                               b->yy_ch_buf = 0;
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = yy_current_buffer->yy_buf_size -
+                                               number_to_move - 1;
+#endif
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+                       yy_n_chars, num_to_read );
+
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       if ( yy_n_chars == 0 )
+               {
+               if ( number_to_move == YY_MORE_ADJ )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       yy_current_buffer->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       yy_n_chars += number_to_move;
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+       return ret_val;
+       }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp;
+
+       yy_current_state = yy_start;
+
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+               {
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       yy_last_accepting_state = yy_current_state;
+                       yy_last_accepting_cpos = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 86 )
+                               yy_c = yy_meta[(unsigned int) yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+               }
+
+       return yy_current_state;
+       }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+       {
+       register int yy_is_jam;
+       register char *yy_cp = yy_c_buf_p;
+
+       register YY_CHAR yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               yy_last_accepting_state = yy_current_state;
+               yy_last_accepting_cpos = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 86 )
+                       yy_c = yy_meta[(unsigned int) yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+       yy_is_jam = (yy_current_state == 85);
+
+       return yy_is_jam ? 0 : yy_current_state;
+       }
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+       {
+       register char *yy_cp = yy_c_buf_p;
+
+       /* undo effects of setting up yytext */
+       *yy_cp = yy_hold_char;
+
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               register int number_to_move = yy_n_chars + 2;
+               register char *dest = &yy_current_buffer->yy_ch_buf[
+                                       yy_current_buffer->yy_buf_size + 2];
+               register char *source =
+                               &yy_current_buffer->yy_ch_buf[number_to_move];
+
+               while ( source > yy_current_buffer->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += (int) (dest - source);
+               yy_bp += (int) (dest - source);
+               yy_current_buffer->yy_n_chars =
+                       yy_n_chars = yy_current_buffer->yy_buf_size;
+
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       *--yy_cp = (char) c;
+
+
+       yytext_ptr = yy_bp;
+       yy_hold_char = *yy_cp;
+       yy_c_buf_p = yy_cp;
+       }
+#endif /* ifndef YY_NO_UNPUT */
+
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+       {
+       int c;
+
+       *yy_c_buf_p = yy_hold_char;
+
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       /* This was really a NUL. */
+                       *yy_c_buf_p = '\0';
+
+               else
+                       { /* need more input */
+                       int offset = yy_c_buf_p - yytext_ptr;
+                       ++yy_c_buf_p;
+
+                       switch ( yy_get_next_buffer() )
+                               {
+                               case EOB_ACT_LAST_MATCH:
+                                       /* This happens because yy_g_n_b()
+                                        * sees that we've accumulated a
+                                        * token and flags that we need to
+                                        * try matching the token before
+                                        * proceeding.  But for input(),
+                                        * there's no matching to consider.
+                                        * So convert the EOB_ACT_LAST_MATCH
+                                        * to EOB_ACT_END_OF_FILE.
+                                        */
+
+                                       /* Reset buffer status. */
+                                       yyrestart( yyin );
+
+                                       /* fall through */
+
+                               case EOB_ACT_END_OF_FILE:
+                                       {
+                                       if ( yywrap() )
+                                               return EOF;
+
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+#ifdef __cplusplus
+                                       return yyinput();
+#else
+                                       return input();
+#endif
+                                       }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       yy_c_buf_p = yytext_ptr + offset;
+                                       break;
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
+       *yy_c_buf_p = '\0';     /* preserve yytext */
+       yy_hold_char = *++yy_c_buf_p;
+
+
+       return c;
+       }
+#endif /* YY_NO_INPUT */
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+       {
+       if ( ! yy_current_buffer )
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+       yy_init_buffer( yy_current_buffer, input_file );
+       yy_load_buffer_state();
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+       {
+       if ( yy_current_buffer == new_buffer )
+               return;
+
+       if ( yy_current_buffer )
+               {
+               /* Flush out information for old buffer. */
+               *yy_c_buf_p = yy_hold_char;
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       yy_current_buffer = new_buffer;
+       yy_load_buffer_state();
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       yy_did_buffer_switch_on_eof = 1;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+       {
+       yy_n_chars = yy_current_buffer->yy_n_chars;
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+       yyin = yy_current_buffer->yy_input_file;
+       yy_hold_char = *yy_c_buf_p;
+       }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_is_our_buffer = 1;
+
+       yy_init_buffer( b, file );
+
+       return b;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+       {
+       if ( ! b )
+               return;
+
+       if ( b == yy_current_buffer )
+               yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+       if ( b->yy_is_our_buffer )
+               yy_flex_free( (void *) b->yy_ch_buf );
+
+       yy_flex_free( (void *) b );
+       }
+
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+       {
+       yy_flush_buffer( b );
+
+       b->yy_input_file = file;
+       b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+       b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+       b->yy_is_interactive = 0;
+#else
+       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+       {
+       if ( ! b )
+               return;
+
+       b->yy_n_chars = 0;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[0];
+
+       b->yy_at_bol = 1;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       if ( b == yy_current_buffer )
+               yy_load_buffer_state();
+       }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       if ( size < 2 ||
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||
+            base[size-1] != YY_END_OF_BUFFER_CHAR )
+               /* They forgot to leave room for the EOB's. */
+               return 0;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+       b->yy_buf_pos = b->yy_ch_buf = base;
+       b->yy_is_our_buffer = 0;
+       b->yy_input_file = 0;
+       b->yy_n_chars = b->yy_buf_size;
+       b->yy_is_interactive = 0;
+       b->yy_at_bol = 1;
+       b->yy_fill_buffer = 0;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       yy_switch_to_buffer( b );
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+       {
+       int len;
+       for ( len = 0; yy_str[len]; ++len )
+               ;
+
+       return yy_scan_bytes( yy_str, len );
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+       {
+       YY_BUFFER_STATE b;
+       char *buf;
+       yy_size_t n;
+       int i;
+
+       /* Get memory for full buffer, including space for trailing EOB's. */
+       n = len + 2;
+       buf = (char *) yy_flex_alloc( n );
+       if ( ! buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+       for ( i = 0; i < len; ++i )
+               buf[i] = bytes[i];
+
+       buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+       b = yy_scan_buffer( buf, n );
+       if ( ! b )
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+       /* It's okay to grow etc. this buffer, and we should throw it
+        * away when we're done.
+        */
+       b->yy_is_our_buffer = 1;
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+       {
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )
+               {
+               yy_size_t new_size;
+
+               yy_start_stack_depth += YY_START_STACK_INCR;
+               new_size = yy_start_stack_depth * sizeof( int );
+
+               if ( ! yy_start_stack )
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+               else
+                       yy_start_stack = (int *) yy_flex_realloc(
+                                       (void *) yy_start_stack, new_size );
+
+               if ( ! yy_start_stack )
+                       YY_FATAL_ERROR(
+                       "out of memory expanding start-condition stack" );
+               }
+
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+       BEGIN(new_state);
+       }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+       {
+       if ( --yy_start_stack_ptr < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);
+       }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+       {
+       return yy_start_stack[yy_start_stack_ptr - 1];
+       }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+       {
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+       }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               yytext[yyleng] = yy_hold_char; \
+               yy_c_buf_p = yytext + n; \
+               yy_hold_char = *yy_c_buf_p; \
+               *yy_c_buf_p = '\0'; \
+               yyleng = n; \
+               } \
+       while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+       {
+       register int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+       }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+       {
+       register int n;
+       for ( n = 0; s[n]; ++n )
+               ;
+
+       return n;
+       }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+       {
+       return (void *) malloc( size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+       {
+       /* The cast to (char *) in the following accommodates both
+        * implementations that use char* generic pointers, and those
+        * that use void* generic pointers.  It works with the latter
+        * because both ANSI C and C++ allow castless assignment from
+        * any pointer type to void*, and deal with argument conversions
+        * as though doing an assignment.
+        */
+       return (void *) realloc( (char *) ptr, size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+       {
+       free( ptr );
+       }
+
+#if YY_MAIN
+int main()
+       {
+       yylex();
+       return 0;
+       }
+#endif
+#line 178 "ifq.l"
+
+
+int my_IfqParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_ifq_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_ifq_stringinput[flex_ifq_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_ifq_stringinput[flex_ifq_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_ifq_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_ifq_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void IfqParser_setfileinput(FILE *f){
+       IfqParserrestart(NULL);
+
+       flex_ifq_fileinput = f;
+       flex_ifq_stringinput = NULL;
+       flex_ifq_lineno = 1;
+       flex_ifq_ch = 0;
+}
+
+void IfqParser_setstringinput(char *s){
+       IfqParserrestart(NULL);
+
+       flex_ifq_fileinput = NULL;
+       flex_ifq_stringinput = s;
+       flex_ifq_stringinput_ptr = 0;
+       flex_ifq_lineno = 1;
+       flex_ifq_ch = 0;
+}
+       
+               
+
+
diff --git a/src/ftacmp/literal_types.h b/src/ftacmp/literal_types.h
new file mode 100644 (file)
index 0000000..167e738
--- /dev/null
@@ -0,0 +1,31 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __LITERAL_TYPES_H_INCLUDED__
+
+
+#define LITERAL_UDEF -1
+#define LITERAL_STRING 1
+#define LITERAL_INT 2
+#define LITERAL_FLOAT 3
+#define LITERAL_BOOL 4
+#define LITERAL_TIMEVAL 5
+#define LITERAL_HEX 6
+#define LITERAL_LONGINT 7
+#define LITERAL_LONGHEX 8
+#define LITERAL_IP 9
+#define LITERAL_IPV6 10
+
+#define __LITERAL_TYPES_H_INCLUDED__
+#endif
diff --git a/src/ftacmp/nic.l b/src/ftacmp/nic.l
new file mode 100644 (file)
index 0000000..82c0ebd
--- /dev/null
@@ -0,0 +1,226 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+/*
+       MUST COMPILE WITH
+               flex -PNicParser -oniclexer.cc nic.l
+       (or equivalent).
+*/     
+
+%{
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "nic_def.h"
+ #include <string.h>
+
+
+
+#include "nic.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int NicParserwrap(){return(1);}
+
+extern int NicParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_nic_lineno : the line currently being parsed when the error occurs.
+               flex_nic_ch : the character on the line where the error occurs
+               flex_nic_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_nic_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_nic_lineno = 1;
+int flex_nic_ch = 0;
+char flex_nic_linebuf[20000];
+
+char *flex_nic_stringinput = NULL;
+int flex_nic_stringinput_ptr = 0;
+FILE *flex_nic_fileinput = NULL;
+int my_NicParser_yyinput(char *buf, int max_size);
+
+
+
+void NicParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_nic_lineno, flex_nic_ch, s, NicParsertext, flex_nic_linebuf );
+    for(i=0;i<flex_nic_ch;i++){
+               if(flex_nic_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_nic_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_NicParser_yyinput(b,ms))
+
+%}
+       /* MKS needs the next line to increase the NFA table */
+%e 1200
+%option noyywrap
+
+%%
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+OPTIONS:             { flex_nic_ch+=NicParserleng; return OPTIONS; }
+FUNCTIONS:             { flex_nic_ch+=NicParserleng; return FUNC; }
+TYPES:             { flex_nic_ch+=NicParserleng; return TYPES; }
+UNARY_OPS:             { flex_nic_ch+=NicParserleng; return UNARY_OPS; }
+BINARY_OPS:             { flex_nic_ch+=NicParserleng; return BINARY_OPS; }
+MISSING_FIELDS:             { flex_nic_ch+=NicParserleng; return FIELDS; }
+
+[;,=]  { flex_nic_ch+=NicParserleng;  return yytext[0]; }
+
+       /* names */
+
+[A-Za-z_][A-Za-z0-9_]* { flex_nic_ch+=NicParserleng; NicParserlval.strval = strdup(yytext); return NAME; }
+
+
+       /* strings */
+
+'[^'\n]*'      {
+               
+               int c;
+               
+               NicParserlval.strval = strdup(NicParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_nic_ch+=NicParserleng; 
+                       NicParserlval.strval[NicParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+               
+'[^'\n]*$      { flex_nic_ch+=NicParserleng; NicParsererror("Unterminated string"); }
+
+ /*                                                                                                                    */
+ /*            Newline : advance the error reporting line number       */
+ /*            and grab the next line into flex_nic_linebuf                    */
+ /*                                                                                                                    */
+
+\n.*           {flex_nic_ch=0; flex_nic_lineno++;
+                          strcpy(flex_nic_linebuf,NicParsertext+1);
+                          yyless(1);
+                          }
+
+[ \t\r]+       {flex_nic_ch+=NicParserleng; }  /* white space */
+
+"--".*$                {flex_nic_ch+=NicParserleng; }; /* comment */
+"//".*$                {flex_nic_ch+=NicParserleng; }; /* comment */
+
+.|\n            {flex_nic_ch+=NicParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  NicParsererror(yytext);}
+
+%%
+
+int my_NicParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_nic_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_nic_stringinput[flex_nic_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_nic_stringinput[flex_nic_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_nic_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_nic_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void NicParser_setfileinput(FILE *f){
+       NicParserrestart(NULL);
+
+       flex_nic_fileinput = f;
+       flex_nic_stringinput = NULL;
+       flex_nic_lineno = 1;
+       flex_nic_ch = 0;
+}
+
+void NicParser_setstringinput(char *s){
+       NicParserrestart(NULL);
+
+       flex_nic_fileinput = NULL;
+       flex_nic_stringinput = s;
+       flex_nic_stringinput_ptr = 0;
+       flex_nic_lineno = 1;
+       flex_nic_ch = 0;
+}
+       
+               
+
+
diff --git a/src/ftacmp/nic.tab.cc b/src/ftacmp/nic.tab.cc
new file mode 100644 (file)
index 0000000..29f2af1
--- /dev/null
@@ -0,0 +1,1306 @@
+/* A Bison parser, made from nic.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON        1
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* If NAME_PREFIX is specified substitute the variables and functions
+   names.  */
+#define yyparse NicParserparse
+#define yylex   NicParserlex
+#define yyerror NicParsererror
+#define yylval  NicParserlval
+#define yychar  NicParserchar
+#define yydebug NicParserdebug
+#define yynerrs NicParsernerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259,
+     FUNC = 260,
+     TYPES = 261,
+     UNARY_OPS = 262,
+     BINARY_OPS = 263,
+     FIELDS = 264,
+     OPTIONS = 265
+   };
+#endif
+#define NAME 258
+#define STRING_TOKEN 259
+#define FUNC 260
+#define TYPES 261
+#define UNARY_OPS 262
+#define BINARY_OPS 263
+#define FIELDS 264
+#define OPTIONS 265
+
+
+
+
+/* Copy the first part of user declarations.  */
+#line 8 "nic.y"
+
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "nic_def.h"
+
+extern int NicParserlex();
+void NicParsererror(char *s);
+
+
+extern nic_property *nicp;
+extern std::vector<std::string> nic_attr_vec;
+extern std::vector<std::string> nic_val_vec;
+extern std::string nic_a, nic_v;
+
+
+
+#define YYDEBUG 1
+
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#ifndef YYSTYPE
+#line 42 "nic.y"
+typedef union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       /*                      for FTA definition.     */
+
+} yystype;
+/* Line 193 of /usr/local/share/bison/yacc.c.  */
+#line 143 "nic.tab.cc"
+# define YYSTYPE yystype
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+#ifndef YYLTYPE
+typedef struct yyltype
+{
+  int first_line;
+  int first_column;
+  int last_line;
+  int last_column;
+} yyltype;
+# define YYLTYPE yyltype
+# define YYLTYPE_IS_TRIVIAL 1
+#endif
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 213 of /usr/local/share/bison/yacc.c.  */
+#line 164 "nic.tab.cc"
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
+#    define YYSTACK_ALLOC alloca
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
+      + YYSTACK_GAP_MAX)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         register YYSIZE_T yyi;                \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];    \
+       }                                       \
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;   \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  8
+#define YYLAST   30
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  14
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  13
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  20
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  41
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   265
+
+#define YYTRANSLATE(X) \
+  ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,    12,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,    11,
+       2,    13,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned char yyprhs[] =
+{
+       0,     0,     3,    10,    14,    18,    22,    26,    30,    34,
+      36,    37,    39,    41,    45,    49,    51,    52,    54,    58,
+      62
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      15,     0,    -1,    16,    17,    18,    19,    20,    21,    -1,
+      10,    24,    11,    -1,     6,    22,    11,    -1,     7,    22,
+      11,    -1,     8,    22,    11,    -1,     9,    22,    11,    -1,
+       5,    22,    11,    -1,    23,    -1,    -1,     3,    -1,     4,
+      -1,    23,    12,     3,    -1,    23,    12,     4,    -1,    25,
+      -1,    -1,    26,    -1,    25,    12,    26,    -1,     3,    13,
+       4,    -1,     3,    13,     3,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned char yyrline[] =
+{
+       0,    61,    61,    65,    69,    73,    77,    81,    85,    89,
+      91,    94,    96,    97,    98,   101,   103,   106,   109,   113,
+     115
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "NAME", "STRING_TOKEN", "FUNC", "TYPES", 
+  "UNARY_OPS", "BINARY_OPS", "FIELDS", "OPTIONS", "';'", "','", "'='", 
+  "$accept", "parse_result", "opts", "types", "unary_ops", "binary_ops", 
+  "fields", "fcns", "opt_attr_list", "attr_list", "opt_val_list", 
+  "val_list", "val", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,    59,    44,    61
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      22,    23,    23,    23,    23,    24,    24,    25,    25,    26,
+      26
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     6,     3,     3,     3,     3,     3,     3,     1,
+       0,     1,     1,     3,     3,     1,     0,     1,     3,     3,
+       3
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       0,    16,     0,     0,     0,     0,    15,    17,     1,    10,
+       0,     0,     3,     0,    11,    12,     0,     9,    10,     0,
+      20,    19,    18,     4,     0,     0,    10,     0,    13,    14,
+       5,     0,    10,     0,     6,     0,    10,     2,     7,     0,
+       8
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+      -1,     2,     3,    10,    19,    27,    33,    37,    16,    17,
+       5,     6,     7
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -19
+static const yysigned_char yypact[] =
+{
+      -3,     6,    10,     5,    -1,     4,     1,   -19,   -19,    -2,
+       9,     0,   -19,     6,   -19,   -19,     8,    11,    -2,    12,
+     -19,   -19,   -19,   -19,     2,    13,    -2,    16,   -19,   -19,
+     -19,    15,    -2,    17,   -19,    18,    -2,   -19,   -19,    19,
+     -19
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yysigned_char yypgoto[] =
+{
+     -19,   -19,   -19,   -19,   -19,   -19,   -19,   -19,   -18,   -19,
+     -19,   -19,    14
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, parse error.  */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+      25,    14,    15,    20,    21,    28,    29,     1,    31,     4,
+       8,     9,    11,    13,    35,    12,    18,     0,    39,    23,
+      26,     0,    36,    24,    30,    32,    34,    22,     0,    38,
+      40
+};
+
+static const yysigned_char yycheck[] =
+{
+      18,     3,     4,     3,     4,     3,     4,    10,    26,     3,
+       0,     6,    13,    12,    32,    11,     7,    -1,    36,    11,
+       8,    -1,     5,    12,    11,     9,    11,    13,    -1,    11,
+      11
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,    10,    15,    16,     3,    24,    25,    26,     0,     6,
+      17,    13,    11,    12,     3,     4,    22,    23,     7,    18,
+       3,     4,    26,    11,    12,    22,     8,    19,     3,     4,
+      11,    22,     9,    20,    11,    22,     5,    21,    11,    22,
+      11
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT                goto yyabortlab
+#define YYERROR                goto yyerrlab1
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL         goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");                        \
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)           \
+  Current.first_line   = Rhs[1].first_line;      \
+  Current.first_column = Rhs[1].first_column;    \
+  Current.last_line    = Rhs[N].last_line;       \
+  Current.last_column  = Rhs[N].last_column;
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#define YYLEX  yylex ()
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+# define YYDSYMPRINT(Args)                     \
+do {                                           \
+  if (yydebug)                                 \
+    yysymprint Args;                           \
+} while (0)
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+\f
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+\f
+
+#if YYDEBUG
+/*-----------------------------.
+| Print this symbol on YYOUT.  |
+`-----------------------------*/
+
+static void
+#if defined (__STDC__) || defined (__cplusplus)
+yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue)
+#else
+yysymprint (yyout, yytype, yyvalue)
+    FILE* yyout;
+    int yytype;
+    YYSTYPE yyvalue;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvalue;
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyout, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+      YYPRINT (yyout, yytoknum[yytype], yyvalue);
+# endif
+    }
+  else
+    YYFPRINTF (yyout, "nterm %s (", yytname[yytype]);
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyout, ")");
+}
+#endif /* YYDEBUG. */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+static void
+#if defined (__STDC__) || defined (__cplusplus)
+yydestruct (int yytype, YYSTYPE yyvalue)
+#else
+yydestruct (yytype, yyvalue)
+    int yytype;
+    YYSTYPE yyvalue;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvalue;
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+}
+
+\f
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
+# else
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of parse errors so far.  */
+int yynerrs;
+
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule.  */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+
+                   &yystacksize);
+
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with.  */
+
+  if (yychar <= 0)             /* This means end of input.  */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more.  */
+
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE (yychar);
+
+      /* We have to keep this `#if YYDEBUG', since we use variables
+        which are defined only if `YYDEBUG' is set.  */
+      YYDPRINTF ((stderr, "Next token is "));
+      YYDSYMPRINT ((stderr, yychar1, yylval));
+      YYDPRINTF ((stderr, "\n"));
+    }
+
+  /* If the proper action on seeing token YYCHAR1 is to reduce or to
+     detect an error, take that action.  */
+  yyn += yychar1;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+             yychar, yytname[yychar1]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+
+#if YYDEBUG
+  /* We have to keep this `#if YYDEBUG', since we use variables which
+     are defined only if `YYDEBUG' is set.  */
+  if (yydebug)
+    {
+      int yyi;
+
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+                yyn - 1, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++)
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+  switch (yyn)
+    {
+        case 3:
+#line 66 "nic.y"
+    {nicp->opta=nic_attr_vec; nicp->optv=nic_val_vec;}
+    break;
+
+  case 4:
+#line 70 "nic.y"
+    {nicp->typea=nic_attr_vec;}
+    break;
+
+  case 5:
+#line 74 "nic.y"
+    {nicp->opua=nic_attr_vec;}
+    break;
+
+  case 6:
+#line 78 "nic.y"
+    {nicp->opba=nic_attr_vec;}
+    break;
+
+  case 7:
+#line 82 "nic.y"
+    {nicp->fieldsa=nic_attr_vec;}
+    break;
+
+  case 8:
+#line 86 "nic.y"
+    {nicp->funca=nic_attr_vec;}
+    break;
+
+  case 10:
+#line 91 "nic.y"
+    {nic_attr_vec.clear(); }
+    break;
+
+  case 11:
+#line 95 "nic.y"
+    {nic_attr_vec.clear();  nic_attr_vec.push_back(yyvsp[0].strval); }
+    break;
+
+  case 12:
+#line 96 "nic.y"
+    {nic_attr_vec.clear();  nic_attr_vec.push_back(yyvsp[0].strval); }
+    break;
+
+  case 13:
+#line 97 "nic.y"
+    {nic_attr_vec.push_back(yyvsp[0].strval);}
+    break;
+
+  case 14:
+#line 98 "nic.y"
+    {nic_attr_vec.push_back(yyvsp[0].strval);}
+    break;
+
+  case 16:
+#line 103 "nic.y"
+    {nic_attr_vec.clear(); nic_val_vec.clear();}
+    break;
+
+  case 17:
+#line 107 "nic.y"
+    {nic_attr_vec.clear();  nic_attr_vec.push_back(nic_a);
+                        nic_val_vec.clear(); nic_val_vec.push_back(nic_v); }
+    break;
+
+  case 18:
+#line 109 "nic.y"
+    {nic_attr_vec.push_back(nic_a);
+                                       nic_val_vec.push_back(nic_v); }
+    break;
+
+  case 19:
+#line 114 "nic.y"
+    {nic_a = yyvsp[-2].strval; nic_v = yyvsp[0].strval;}
+    break;
+
+  case 20:
+#line 115 "nic.y"
+    {nic_a = yyvsp[-2].strval; nic_v = yyvsp[0].strval;}
+    break;
+
+
+    }
+
+/* Line 1016 of /usr/local/share/bison/yacc.c.  */
+#line 1085 "nic.tab.cc"
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         int yytype = YYTRANSLATE (yychar);
+         char *yymsg;
+         int yyx, yycount;
+
+         yycount = 0;
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         for (yyx = yyn < 0 ? -yyn : 0;
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+           if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen (yytname[yytype]);
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[yytype]);
+
+             if (yycount < 5)
+               {
+                 yycount = 0;
+                 for (yyx = yyn < 0 ? -yyn : 0;
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));
+                      yyx++)
+                   if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+                     {
+                       const char *yyq = ! yycount ? ", expecting " : " or ";
+                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yycount++;
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exhausted");
+       }
+      else
+#endif /* YYERROR_VERBOSE */
+       yyerror ("parse error");
+    }
+  goto yyerrlab1;
+
+
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action.  |
+`----------------------------------------------------*/
+yyerrlab1:
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      /* Return failure if at end of input.  */
+      if (yychar == YYEOF)
+        {
+         /* Pop the error token.  */
+          YYPOPSTACK;
+         /* Pop the rest of the stack.  */
+         while (yyssp > yyss)
+           {
+             YYDPRINTF ((stderr, "Error: popping "));
+             YYDSYMPRINT ((stderr,
+                           yystos[*yyssp],
+                           *yyvsp));
+             YYDPRINTF ((stderr, "\n"));
+             yydestruct (yystos[*yyssp], *yyvsp);
+             YYPOPSTACK;
+           }
+         YYABORT;
+        }
+
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+                 yychar, yytname[yychar1]));
+      yydestruct (yychar1, yylval);
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+
+  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+       {
+         yyn += YYTERROR;
+         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+           {
+             yyn = yytable[yyn];
+             if (0 < yyn)
+               break;
+           }
+       }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+       YYABORT;
+
+      YYDPRINTF ((stderr, "Error: popping "));
+      YYDSYMPRINT ((stderr,
+                   yystos[*yyssp], *yyvsp));
+      YYDPRINTF ((stderr, "\n"));
+
+      yydestruct (yystos[yystate], *yyvsp);
+      yyvsp--;
+      yystate = *--yyssp;
+
+
+#if YYDEBUG
+      if (yydebug)
+       {
+         short *yyssp1 = yyss - 1;
+         YYFPRINTF (stderr, "Error: state stack now");
+         while (yyssp1 != yyssp)
+           YYFPRINTF (stderr, " %d", *++yyssp1);
+         YYFPRINTF (stderr, "\n");
+       }
+#endif
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+
+
+#line 122 "nic.y"
+
+
+
diff --git a/src/ftacmp/nic.tab.cc.h b/src/ftacmp/nic.tab.cc.h
new file mode 100644 (file)
index 0000000..b44f522
--- /dev/null
@@ -0,0 +1,77 @@
+/* A Bison parser, made from nic.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef BISON_NIC_TAB_CC_H
+# define BISON_NIC_TAB_CC_H
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259,
+     FUNC = 260,
+     TYPES = 261,
+     UNARY_OPS = 262,
+     BINARY_OPS = 263,
+     FIELDS = 264,
+     OPTIONS = 265
+   };
+#endif
+#define NAME 258
+#define STRING_TOKEN 259
+#define FUNC 260
+#define TYPES 261
+#define UNARY_OPS 262
+#define BINARY_OPS 263
+#define FIELDS 264
+#define OPTIONS 265
+
+
+
+
+#ifndef YYSTYPE
+#line 42 "nic.y"
+typedef union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       /*                      for FTA definition.     */
+
+} yystype;
+/* Line 1281 of /usr/local/share/bison/yacc.c.  */
+#line 70 "nic.tab.cc.h"
+# define YYSTYPE yystype
+#endif
+
+extern YYSTYPE NicParserlval;
+
+
+#endif /* not BISON_NIC_TAB_CC_H */
+
diff --git a/src/ftacmp/nic.y b/src/ftacmp/nic.y
new file mode 100644 (file)
index 0000000..39026c5
--- /dev/null
@@ -0,0 +1,138 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+       MUST COMPILE WITH
+  bison --verbose --defines=nic.tab.cc.h -p NicParser  -o nic.tab.cc nic.y
+
+        (or equivalent).
+*/
+
+%{
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "nic_def.h"
+
+extern int NicParserlex();
+void NicParsererror(char *s);
+
+
+extern nic_property *nicp;
+extern std::vector<std::string> nic_attr_vec;
+extern std::vector<std::string> nic_val_vec;
+extern std::string nic_a, nic_v;
+
+
+
+#define YYDEBUG 1
+
+%}
+
+
+       /* symbolic tokens */
+
+%union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       /*                      for FTA definition.     */
+
+}
+
+%token <strval> NAME
+%token <strval> STRING_TOKEN
+%token FUNC TYPES UNARY_OPS BINARY_OPS FIELDS OPTIONS
+
+
+
+
+%%
+
+parse_result:
+       opts types unary_ops binary_ops fields fcns 
+       ;
+
+opts:
+       OPTIONS opt_val_list ';' {nicp->opta=nic_attr_vec; nicp->optv=nic_val_vec;}
+       ;
+
+types:
+       TYPES  opt_attr_list ';' {nicp->typea=nic_attr_vec;}
+       ;
+
+unary_ops:
+       UNARY_OPS  opt_attr_list ';' {nicp->opua=nic_attr_vec;}
+       ;
+
+binary_ops:
+       BINARY_OPS  opt_attr_list ';' {nicp->opba=nic_attr_vec;}
+       ;
+
+fields:
+       FIELDS  opt_attr_list ';' {nicp->fieldsa=nic_attr_vec;}
+       ;
+
+fcns:
+       FUNC  opt_attr_list ';' {nicp->funca=nic_attr_vec;}
+       ;
+
+opt_attr_list:
+       attr_list
+       |               {nic_attr_vec.clear(); }
+       ;
+
+attr_list:
+       NAME            {nic_attr_vec.clear();  nic_attr_vec.push_back($1); }
+       | STRING_TOKEN  {nic_attr_vec.clear();  nic_attr_vec.push_back($1); }
+       | attr_list ',' NAME {nic_attr_vec.push_back($3);}
+       | attr_list ',' STRING_TOKEN {nic_attr_vec.push_back($3);}
+       ;
+
+opt_val_list:
+       val_list
+       |               {nic_attr_vec.clear(); nic_val_vec.clear();}
+       ;
+
+val_list:
+       val             {nic_attr_vec.clear();  nic_attr_vec.push_back(nic_a);
+                        nic_val_vec.clear(); nic_val_vec.push_back(nic_v); }
+       | val_list ',' val {nic_attr_vec.push_back(nic_a);
+                                       nic_val_vec.push_back(nic_v); }
+       ;
+
+val:
+       NAME '=' STRING_TOKEN   {nic_a = $1; nic_v = $3;}
+       | NAME '=' NAME         {nic_a = $1; nic_v = $3;}
+       ;
+       
+
+
+
+
+%%
+
diff --git a/src/ftacmp/nic_def.cc b/src/ftacmp/nic_def.cc
new file mode 100644 (file)
index 0000000..e613c3a
--- /dev/null
@@ -0,0 +1,128 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#include<stdio.h>
+#include<stdlib.h>
+
+#include"nic_def.h"
+
+extern int NicParserparse(void);
+extern FILE *NicParserin;
+extern int NicParserdebug;
+
+
+nic_property *nicp;
+std::vector<std::string> nic_attr_vec;
+std::vector<std::string> nic_val_vec;
+std::string nic_a, nic_v;
+
+using namespace std;
+
+nic_property *load_nic_property(std::string dir, std::string name){
+
+       string fname;
+       if(dir != "")
+               fname = dir + "/nic_property_"+name+".def";
+       else
+               fname = "nic_property_"+name+".def";
+
+       FILE *nicf = fopen(fname.c_str(),"r");
+       if(! nicf){
+               fprintf(stderr,"ERROR, can't open nic property file %s\n",fname.c_str());
+               return NULL;
+       }
+
+NicParserdebug = 0;
+       nicp = new nic_property();
+       NicParser_setfileinput(nicf);
+       if(NicParserparse()){
+               fprintf(stderr,"could not parse nic property file %s\n",fname.c_str());
+               return NULL;
+       }
+       
+       return nicp;
+}
+
+bool nic_property::legal_type(string t){
+int i;
+       for(i=0;i<typea.size();++i){
+               if(t==typea[i])
+                       return true;
+       }
+       return false;
+}
+
+
+bool nic_property::legal_unary_op(string t){
+int i;
+       for(i=0;i<opua.size();++i){
+               if(t==opua[i])
+                       return true;
+       }
+       return false;
+}
+
+
+
+bool nic_property::legal_binary_op(string t){
+int i;
+       for(i=0;i<opba.size();++i){
+               if(t==opba[i])
+                       return true;
+       }
+       return false;
+}
+
+
+bool nic_property::illegal_field(string t){
+int i;
+       for(i=0;i<fieldsa.size();++i){
+               if(t==fieldsa[i])
+                       return true;
+       }
+       return false;
+}
+
+
+
+bool nic_property::option_exists(string t){
+int i;
+       for(i=0;i<opta.size();++i){
+               if(t==opta[i])
+                       return true;
+       }
+       return false;
+}
+
+
+string nic_property::option_value(string t){
+int i;
+       for(i=0;i<opta.size();++i){
+               if(t==opta[i])
+                       return optv[i];
+       }
+       return "";
+}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/ftacmp/nic_def.h b/src/ftacmp/nic_def.h
new file mode 100644 (file)
index 0000000..08f6667
--- /dev/null
@@ -0,0 +1,84 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef _FTA_NIC_DEF_H_INCLUDED__
+#define _FTA_NIC_DEF_H_INCLUDED__
+
+#include<vector>
+#include<string>
+#include<map>
+
+class nic_property{
+public:
+       std::vector<std::string> opta;  // option args
+       std::vector<std::string> optv;  // val of option args
+       std::vector<std::string> typea; // legal types 
+       std::vector<std::string> opba;  // legal binary ops
+       std::vector<std::string> opua;  // legal unary ops
+       std::vector<std::string> fieldsa; // illegal fields
+       std::vector<std::string> funca;  // legal functions
+
+       nic_property(){};
+
+       bool legal_type(std::string t);
+       bool legal_unary_op(std::string t);
+       bool legal_binary_op(std::string t);
+       bool illegal_field(std::string t);
+       bool option_exists(std::string t);
+       std::string option_value(std::string t);
+};
+
+
+nic_property *load_nic_property(std::string dir, std::string name);
+
+
+class nic_prop_db{
+public:
+       std::string dir;
+       std::map<std::string, nic_property *> ndb;
+
+       nic_prop_db(std::string d){dir=d;};
+
+       
+       nic_property *get_nic_property(std::string nics, int &err_no){
+               if(ndb.count(nics))
+                       return ndb[nics];
+               nic_property *ret = load_nic_property(dir, nics);
+               if(ret)
+                       ndb[nics] = ret;
+               return ret;
+       };
+
+
+       std::string get_nic_prop_val(std::string nics, std::string prop,int &err_no){
+               nic_property *nicp = this->get_nic_property(nics, err_no);
+               if(!nicp){
+                       fprintf(stderr,"ERROR cannot load nic properties %s for nic type %s in get_nic_prop_val\n",nics.c_str(), prop.c_str());
+                               exit(1);
+               }
+               if(nicp->option_exists(prop)){
+                       return nicp->option_value("Return");
+               }else{
+                       return "";
+               }
+
+       }
+};
+
+
+void NicParser_setfileinput(FILE *f);
+
+
+
+#endif
diff --git a/src/ftacmp/niclexer.cc b/src/ftacmp/niclexer.cc
new file mode 100644 (file)
index 0000000..fa1eb2e
--- /dev/null
@@ -0,0 +1,1829 @@
+#define yy_create_buffer NicParser_create_buffer
+#define yy_delete_buffer NicParser_delete_buffer
+#define yy_scan_buffer NicParser_scan_buffer
+#define yy_scan_string NicParser_scan_string
+#define yy_scan_bytes NicParser_scan_bytes
+#define yy_flex_debug NicParser_flex_debug
+#define yy_init_buffer NicParser_init_buffer
+#define yy_flush_buffer NicParser_flush_buffer
+#define yy_load_buffer_state NicParser_load_buffer_state
+#define yy_switch_to_buffer NicParser_switch_to_buffer
+#define yyin NicParserin
+#define yyleng NicParserleng
+#define yylex NicParserlex
+#define yyout NicParserout
+#define yyrestart NicParserrestart
+#define yytext NicParsertext
+
+#line 19 "niclexer.cc"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /cvsroot/gscpv4/src/ftacmp/niclexer.cc,v 1.1.1.1 2013/12/02 17:44:57 spatsch Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <unistd.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yytext_ptr -= yy_more_len; \
+       yyleng = (int) (yy_cp - yytext_ptr); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 16
+#define YY_END_OF_BUFFER 17
+static yyconst short int yy_accept[85] =
+    {   0,
+        0,    0,   17,   15,   12,   11,   15,    7,   15,   15,
+        8,    8,    8,    8,    8,    8,    8,   12,   11,    0,
+       10,    9,    0,    0,    8,    8,    8,    8,    8,    8,
+        8,    0,   13,    0,   14,    8,    8,    8,    8,    8,
+        8,    8,    8,    8,    8,    8,    8,    8,    8,    8,
+        8,    8,    8,    8,    8,    8,    8,    3,    8,    8,
+        8,    8,    8,    8,    8,    8,    8,    1,    8,    8,
+        8,    8,    8,    8,    2,    8,    4,    5,    8,    8,
+        8,    8,    6,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    1,    1,    1,    1,    1,    4,    1,
+        1,    1,    1,    5,    6,    1,    7,    8,    8,    8,
+        8,    8,    8,    8,    8,    8,    8,    9,    5,    1,
+        5,    1,    1,    1,   10,   11,   12,   13,   14,   15,
+       16,   17,   18,   17,   17,   19,   20,   21,   22,   23,
+       17,   24,   25,   26,   27,   17,   17,   17,   28,   17,
+        1,    1,    1,    1,   29,    1,   17,   17,   17,   17,
+
+       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
+       17,   17,   17,   17,   17,   17,   17,   17,   17,   17,
+       17,   17,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[30] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    1,    3,    1,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3
+    } ;
+
+static yyconst short int yy_base[90] =
+    {   0,
+        0,    0,  108,  109,  105,    0,   27,  109,  100,   98,
+        0,   86,   76,   84,   78,   72,   78,   96,    0,   29,
+      109,  109,   94,   93,    0,   74,   73,   68,   66,   68,
+       80,   86,  109,   85,  109,   77,   74,   60,   66,   69,
+       58,   57,   54,   61,   56,   52,   48,   47,   56,   52,
+       51,   62,   41,   40,   46,   51,   41,  109,   43,   42,
+       42,   33,   52,   37,   36,   33,   42,  109,   31,   30,
+       45,   35,   43,   42,  109,   36,  109,  109,   30,   35,
+       22,   37,  109,  109,   33,   36,   32,   39,   42
+    } ;
+
+static yyconst short int yy_def[90] =
+    {   0,
+       84,    1,   84,   84,   84,   85,   86,   84,   84,   84,
+       87,   87,   87,   87,   87,   87,   87,   84,   85,   86,
+       84,   84,   88,   89,   87,   87,   87,   87,   87,   87,
+       87,   88,   84,   89,   84,   87,   87,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,   87,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,   84,   87,   87,
+       87,   87,   87,   87,   87,   87,   87,   84,   87,   87,
+       87,   87,   87,   87,   84,   87,   84,   84,   87,   87,
+       87,   87,   84,    0,   84,   84,   84,   84,   84
+    } ;
+
+static yyconst short int yy_nxt[139] =
+    {   0,
+        4,    5,    6,    7,    8,    9,   10,    4,    4,   11,
+       12,   11,   11,   11,   13,   11,   11,   11,   11,   14,
+       11,   15,   11,   11,   11,   16,   17,   11,   11,   21,
+       22,   21,   22,   19,   25,   19,   20,   20,   20,   32,
+       32,   32,   34,   34,   34,   83,   82,   81,   80,   79,
+       78,   77,   76,   75,   74,   73,   72,   71,   70,   69,
+       68,   67,   66,   65,   64,   63,   62,   61,   60,   59,
+       58,   57,   56,   55,   54,   53,   52,   51,   50,   49,
+       48,   47,   46,   45,   44,   43,   42,   35,   33,   41,
+       40,   39,   38,   37,   36,   35,   33,   18,   31,   30,
+
+       29,   28,   27,   26,   24,   23,   18,   84,    3,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84
+    } ;
+
+static yyconst short int yy_chk[139] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    7,
+        7,   20,   20,   85,   87,   85,   86,   86,   86,   88,
+       88,   88,   89,   89,   89,   82,   81,   80,   79,   76,
+       74,   73,   72,   71,   70,   69,   67,   66,   65,   64,
+       63,   62,   61,   60,   59,   57,   56,   55,   54,   53,
+       52,   51,   50,   49,   48,   47,   46,   45,   44,   43,
+       42,   41,   40,   39,   38,   37,   36,   34,   32,   31,
+       30,   29,   28,   27,   26,   24,   23,   18,   17,   16,
+
+       15,   14,   13,   12,   10,    9,    5,    3,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
+       84,   84,   84,   84,   84,   84,   84,   84
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+static int yy_more_flag = 0;
+static int yy_more_len = 0;
+#define yymore() (yy_more_flag = 1)
+#define YY_MORE_ADJ yy_more_len
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "nic.l"
+#define INITIAL 0
+/*
+       MUST COMPILE WITH
+               flex -PNicParser -oniclexer.cc nic.l
+       (or equivalent).
+*/     
+#line 9 "nic.l"
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "nic_def.h"
+ #include <string.h>
+
+
+
+#include "nic.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int NicParserwrap(){return(1);}
+
+extern int NicParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_nic_lineno : the line currently being parsed when the error occurs.
+               flex_nic_ch : the character on the line where the error occurs
+               flex_nic_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_nic_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_nic_lineno = 1;
+int flex_nic_ch = 0;
+char flex_nic_linebuf[20000];
+
+char *flex_nic_stringinput = NULL;
+int flex_nic_stringinput_ptr = 0;
+FILE *flex_nic_fileinput = NULL;
+int my_NicParser_yyinput(char *buf, int max_size);
+
+
+
+void NicParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_nic_lineno, flex_nic_ch, s, NicParsertext, flex_nic_linebuf );
+    for(i=0;i<flex_nic_ch;i++){
+               if(flex_nic_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_nic_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_NicParser_yyinput(b,ms))
+
+/* MKS needs the next line to increase the NFA table */
+#line 522 "niclexer.cc"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( yy_current_buffer->yy_is_interactive ) \
+               { \
+               int c = '*', n; \
+               for ( n = 0; n < max_size && \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+                       buf[n] = (char) c; \
+               if ( c == '\n' ) \
+                       buf[n++] = (char) c; \
+               if ( c == EOF && ferror( yyin ) ) \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+               result = n; \
+               } \
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+                 && ferror( yyin ) ) \
+               YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+       YY_USER_ACTION
+
+YY_DECL
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp = NULL, *yy_bp = NULL;
+       register int yy_act;
+
+#line 88 "nic.l"
+
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+#line 692 "niclexer.cc"
+
+       if ( yy_init )
+               {
+               yy_init = 0;
+
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! yy_start )
+                       yy_start = 1;   /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( ! yy_current_buffer )
+                       yy_current_buffer =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+
+               yy_load_buffer_state();
+               }
+
+       while ( 1 )             /* loops until end-of-file is reached */
+               {
+               yy_more_len = 0;
+               if ( yy_more_flag )
+                       {
+                       yy_more_len = yy_c_buf_p - yytext_ptr;
+                       yy_more_flag = 0;
+                       }
+               yy_cp = yy_c_buf_p;
+
+               /* Support of yytext. */
+               *yy_cp = yy_hold_char;
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = yy_start;
+yy_match:
+               do
+                       {
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               yy_last_accepting_state = yy_current_state;
+                               yy_last_accepting_cpos = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 85 )
+                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 109 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+               if ( yy_act == 0 )
+                       { /* have to back up */
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       yy_act = yy_accept[yy_current_state];
+                       }
+
+               YY_DO_BEFORE_ACTION;
+
+
+do_action:     /* This label is used only to access EOF actions. */
+
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = yy_hold_char;
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 106 "nic.l"
+{ flex_nic_ch+=NicParserleng; return OPTIONS; }
+       YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 107 "nic.l"
+{ flex_nic_ch+=NicParserleng; return FUNC; }
+       YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 108 "nic.l"
+{ flex_nic_ch+=NicParserleng; return TYPES; }
+       YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 109 "nic.l"
+{ flex_nic_ch+=NicParserleng; return UNARY_OPS; }
+       YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 110 "nic.l"
+{ flex_nic_ch+=NicParserleng; return BINARY_OPS; }
+       YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 111 "nic.l"
+{ flex_nic_ch+=NicParserleng; return FIELDS; }
+       YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 113 "nic.l"
+{ flex_nic_ch+=NicParserleng;  return yytext[0]; }
+       YY_BREAK
+/* names */
+case 8:
+YY_RULE_SETUP
+#line 117 "nic.l"
+{ flex_nic_ch+=NicParserleng; NicParserlval.strval = strdup(yytext); return NAME; }
+       YY_BREAK
+/* strings */
+case 9:
+YY_RULE_SETUP
+#line 122 "nic.l"
+{
+               
+               int c;
+               
+               NicParserlval.strval = strdup(NicParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_nic_ch+=NicParserleng; 
+                       NicParserlval.strval[NicParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+       YY_BREAK
+case 10:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 139 "nic.l"
+{ flex_nic_ch+=NicParserleng; NicParsererror("Unterminated string"); }
+       YY_BREAK
+/*                                                                                                                     */
+/*             Newline : advance the error reporting line number       */
+/*             and grab the next line into flex_nic_linebuf                    */
+/*                                                                                                                     */
+case 11:
+YY_RULE_SETUP
+#line 146 "nic.l"
+{flex_nic_ch=0; flex_nic_lineno++;
+                          strcpy(flex_nic_linebuf,NicParsertext+1);
+                          yyless(1);
+                          }
+       YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 151 "nic.l"
+{flex_nic_ch+=NicParserleng; } /* white space */
+       YY_BREAK
+case 13:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 153 "nic.l"
+{flex_nic_ch+=NicParserleng; };        /* comment */
+       YY_BREAK
+case 14:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 154 "nic.l"
+{flex_nic_ch+=NicParserleng; };        /* comment */
+       YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 156 "nic.l"
+{flex_nic_ch+=NicParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  NicParsererror(yytext);}
+       YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 158 "nic.l"
+ECHO;
+       YY_BREAK
+#line 894 "niclexer.cc"
+case YY_STATE_EOF(INITIAL):
+       yyterminate();
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = yy_hold_char;
+               YY_RESTORE_YY_MORE_OFFSET
+
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between yy_current_buffer and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       yy_n_chars = yy_current_buffer->yy_n_chars;
+                       yy_current_buffer->yy_input_file = yyin;
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state();
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++yy_c_buf_p;
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                               yy_cp = yy_c_buf_p;
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer() )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               yy_did_buffer_switch_on_eof = 0;
+
+                               if ( yywrap() )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               yy_c_buf_p =
+                                       yytext_ptr + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               yy_c_buf_p =
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+       {
+       register char *dest = yy_current_buffer->yy_ch_buf;
+       register char *source = yytext_ptr;
+       register int number_to_move, i;
+       int ret_val;
+
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( yy_current_buffer->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a single character, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+       else
+               {
+               int num_to_read =
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+                       YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = yy_current_buffer;
+
+                       int yy_c_buf_p_offset =
+                               (int) (yy_c_buf_p - b->yy_ch_buf);
+
+                       if ( b->yy_is_our_buffer )
+                               {
+                               int new_size = b->yy_buf_size * 2;
+
+                               if ( new_size <= 0 )
+                                       b->yy_buf_size += b->yy_buf_size / 8;
+                               else
+                                       b->yy_buf_size *= 2;
+
+                               b->yy_ch_buf = (char *)
+                                       /* Include room in for 2 EOB chars. */
+                                       yy_flex_realloc( (void *) b->yy_ch_buf,
+                                                        b->yy_buf_size + 2 );
+                               }
+                       else
+                               /* Can't grow it, we don't own it. */
+                               b->yy_ch_buf = 0;
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = yy_current_buffer->yy_buf_size -
+                                               number_to_move - 1;
+#endif
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+                       yy_n_chars, num_to_read );
+
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       if ( yy_n_chars == 0 )
+               {
+               if ( number_to_move == YY_MORE_ADJ )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       yy_current_buffer->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       yy_n_chars += number_to_move;
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+       return ret_val;
+       }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp;
+
+       yy_current_state = yy_start;
+
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+               {
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       yy_last_accepting_state = yy_current_state;
+                       yy_last_accepting_cpos = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 85 )
+                               yy_c = yy_meta[(unsigned int) yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+               }
+
+       return yy_current_state;
+       }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+       {
+       register int yy_is_jam;
+       register char *yy_cp = yy_c_buf_p;
+
+       register YY_CHAR yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               yy_last_accepting_state = yy_current_state;
+               yy_last_accepting_cpos = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 85 )
+                       yy_c = yy_meta[(unsigned int) yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+       yy_is_jam = (yy_current_state == 84);
+
+       return yy_is_jam ? 0 : yy_current_state;
+       }
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+       {
+       register char *yy_cp = yy_c_buf_p;
+
+       /* undo effects of setting up yytext */
+       *yy_cp = yy_hold_char;
+
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               register int number_to_move = yy_n_chars + 2;
+               register char *dest = &yy_current_buffer->yy_ch_buf[
+                                       yy_current_buffer->yy_buf_size + 2];
+               register char *source =
+                               &yy_current_buffer->yy_ch_buf[number_to_move];
+
+               while ( source > yy_current_buffer->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += (int) (dest - source);
+               yy_bp += (int) (dest - source);
+               yy_current_buffer->yy_n_chars =
+                       yy_n_chars = yy_current_buffer->yy_buf_size;
+
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       *--yy_cp = (char) c;
+
+
+       yytext_ptr = yy_bp;
+       yy_hold_char = *yy_cp;
+       yy_c_buf_p = yy_cp;
+       }
+#endif /* ifndef YY_NO_UNPUT */
+
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+       {
+       int c;
+
+       *yy_c_buf_p = yy_hold_char;
+
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       /* This was really a NUL. */
+                       *yy_c_buf_p = '\0';
+
+               else
+                       { /* need more input */
+                       int offset = yy_c_buf_p - yytext_ptr;
+                       ++yy_c_buf_p;
+
+                       switch ( yy_get_next_buffer() )
+                               {
+                               case EOB_ACT_LAST_MATCH:
+                                       /* This happens because yy_g_n_b()
+                                        * sees that we've accumulated a
+                                        * token and flags that we need to
+                                        * try matching the token before
+                                        * proceeding.  But for input(),
+                                        * there's no matching to consider.
+                                        * So convert the EOB_ACT_LAST_MATCH
+                                        * to EOB_ACT_END_OF_FILE.
+                                        */
+
+                                       /* Reset buffer status. */
+                                       yyrestart( yyin );
+
+                                       /* fall through */
+
+                               case EOB_ACT_END_OF_FILE:
+                                       {
+                                       if ( yywrap() )
+                                               return EOF;
+
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+#ifdef __cplusplus
+                                       return yyinput();
+#else
+                                       return input();
+#endif
+                                       }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       yy_c_buf_p = yytext_ptr + offset;
+                                       break;
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
+       *yy_c_buf_p = '\0';     /* preserve yytext */
+       yy_hold_char = *++yy_c_buf_p;
+
+
+       return c;
+       }
+#endif /* YY_NO_INPUT */
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+       {
+       if ( ! yy_current_buffer )
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+       yy_init_buffer( yy_current_buffer, input_file );
+       yy_load_buffer_state();
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+       {
+       if ( yy_current_buffer == new_buffer )
+               return;
+
+       if ( yy_current_buffer )
+               {
+               /* Flush out information for old buffer. */
+               *yy_c_buf_p = yy_hold_char;
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       yy_current_buffer = new_buffer;
+       yy_load_buffer_state();
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       yy_did_buffer_switch_on_eof = 1;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+       {
+       yy_n_chars = yy_current_buffer->yy_n_chars;
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+       yyin = yy_current_buffer->yy_input_file;
+       yy_hold_char = *yy_c_buf_p;
+       }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_is_our_buffer = 1;
+
+       yy_init_buffer( b, file );
+
+       return b;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+       {
+       if ( ! b )
+               return;
+
+       if ( b == yy_current_buffer )
+               yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+       if ( b->yy_is_our_buffer )
+               yy_flex_free( (void *) b->yy_ch_buf );
+
+       yy_flex_free( (void *) b );
+       }
+
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+       {
+       yy_flush_buffer( b );
+
+       b->yy_input_file = file;
+       b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+       b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+       b->yy_is_interactive = 0;
+#else
+       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+       {
+       if ( ! b )
+               return;
+
+       b->yy_n_chars = 0;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[0];
+
+       b->yy_at_bol = 1;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       if ( b == yy_current_buffer )
+               yy_load_buffer_state();
+       }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       if ( size < 2 ||
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||
+            base[size-1] != YY_END_OF_BUFFER_CHAR )
+               /* They forgot to leave room for the EOB's. */
+               return 0;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+       b->yy_buf_pos = b->yy_ch_buf = base;
+       b->yy_is_our_buffer = 0;
+       b->yy_input_file = 0;
+       b->yy_n_chars = b->yy_buf_size;
+       b->yy_is_interactive = 0;
+       b->yy_at_bol = 1;
+       b->yy_fill_buffer = 0;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       yy_switch_to_buffer( b );
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+       {
+       int len;
+       for ( len = 0; yy_str[len]; ++len )
+               ;
+
+       return yy_scan_bytes( yy_str, len );
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+       {
+       YY_BUFFER_STATE b;
+       char *buf;
+       yy_size_t n;
+       int i;
+
+       /* Get memory for full buffer, including space for trailing EOB's. */
+       n = len + 2;
+       buf = (char *) yy_flex_alloc( n );
+       if ( ! buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+       for ( i = 0; i < len; ++i )
+               buf[i] = bytes[i];
+
+       buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+       b = yy_scan_buffer( buf, n );
+       if ( ! b )
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+       /* It's okay to grow etc. this buffer, and we should throw it
+        * away when we're done.
+        */
+       b->yy_is_our_buffer = 1;
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+       {
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )
+               {
+               yy_size_t new_size;
+
+               yy_start_stack_depth += YY_START_STACK_INCR;
+               new_size = yy_start_stack_depth * sizeof( int );
+
+               if ( ! yy_start_stack )
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+               else
+                       yy_start_stack = (int *) yy_flex_realloc(
+                                       (void *) yy_start_stack, new_size );
+
+               if ( ! yy_start_stack )
+                       YY_FATAL_ERROR(
+                       "out of memory expanding start-condition stack" );
+               }
+
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+       BEGIN(new_state);
+       }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+       {
+       if ( --yy_start_stack_ptr < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);
+       }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+       {
+       return yy_start_stack[yy_start_stack_ptr - 1];
+       }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+       {
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+       }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               yytext[yyleng] = yy_hold_char; \
+               yy_c_buf_p = yytext + n; \
+               yy_hold_char = *yy_c_buf_p; \
+               *yy_c_buf_p = '\0'; \
+               yyleng = n; \
+               } \
+       while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+       {
+       register int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+       }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+       {
+       register int n;
+       for ( n = 0; s[n]; ++n )
+               ;
+
+       return n;
+       }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+       {
+       return (void *) malloc( size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+       {
+       /* The cast to (char *) in the following accommodates both
+        * implementations that use char* generic pointers, and those
+        * that use void* generic pointers.  It works with the latter
+        * because both ANSI C and C++ allow castless assignment from
+        * any pointer type to void*, and deal with argument conversions
+        * as though doing an assignment.
+        */
+       return (void *) realloc( (char *) ptr, size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+       {
+       free( ptr );
+       }
+
+#if YY_MAIN
+int main()
+       {
+       yylex();
+       return 0;
+       }
+#endif
+#line 158 "nic.l"
+
+
+int my_NicParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_nic_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_nic_stringinput[flex_nic_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_nic_stringinput[flex_nic_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_nic_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_nic_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void NicParser_setfileinput(FILE *f){
+       NicParserrestart(NULL);
+
+       flex_nic_fileinput = f;
+       flex_nic_stringinput = NULL;
+       flex_nic_lineno = 1;
+       flex_nic_ch = 0;
+}
+
+void NicParser_setstringinput(char *s){
+       NicParserrestart(NULL);
+
+       flex_nic_fileinput = NULL;
+       flex_nic_stringinput = s;
+       flex_nic_stringinput_ptr = 0;
+       flex_nic_lineno = 1;
+       flex_nic_ch = 0;
+}
+       
+               
+
+
diff --git a/src/ftacmp/parse_ext_fcns.h b/src/ftacmp/parse_ext_fcns.h
new file mode 100644 (file)
index 0000000..fc4b3f1
--- /dev/null
@@ -0,0 +1,907 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __EXT_FCN_DEF_H_INCLUDED__
+#define __EXT_FCN_DEF_H_INCLUDED__
+
+#include <string>
+#include <vector>
+
+#include "type_objects.h"
+#include "parse_schema.h"
+
+class ext_fcn_param{
+private:
+       std::string type_name;
+       bool handle;
+       bool constant;
+       bool classifier;
+       data_type *dt;
+
+public:
+       ext_fcn_param(){handle = false; dt=NULL;        };
+       ext_fcn_param(char *t, param_list *plist, int h, int cnst, int clss){
+               type_name = t;
+               if(h == 0) handle = false;
+               else       handle = true;
+               if(cnst == 1 ) constant = true;
+               else               constant = false;
+               if(clss == 1) classifier = true;
+               else              classifier = false;
+                       
+
+               dt = new data_type(type_name,plist);
+       };
+
+       data_type *get_dt(){return(dt);};
+
+       bool use_handle(){return handle;};
+       bool is_constant(){return constant;};
+       bool is_classifier(){return classifier;};
+
+};
+
+
+class ext_fcn_param_list{
+private:
+       std::vector<ext_fcn_param *> plist;
+
+public:
+       ext_fcn_param_list(){};
+       ext_fcn_param_list(ext_fcn_param *val){
+               plist.push_back(val);
+       };
+
+       ext_fcn_param_list *append(ext_fcn_param *val){
+               plist.push_back(val);
+               return(this);
+       };
+
+       int size(){return plist.size();};
+       std::vector<ext_fcn_param *> get_param_list(){return plist;};
+};
+
+class ext_fcn_modifier_list{
+public:
+       std::vector<std::string> modifiers;
+       std::vector<std::string> vals;
+
+       ext_fcn_modifier_list(char *s){
+               modifiers.push_back(s);
+               vals.push_back("");
+       };
+
+       ext_fcn_modifier_list(char *s, char *v){
+               modifiers.push_back(s);
+               vals.push_back(v);
+       };
+
+       ext_fcn_modifier_list *append(char *s){
+               modifiers.push_back(s);
+               vals.push_back("");
+               return(this);
+       };
+
+       ext_fcn_modifier_list *append(char *s, char *v){
+               modifiers.push_back(s);
+               vals.push_back(v);
+               return(this);
+       };
+};
+
+#define EXT_FCN_ 1
+#define EXT_PRED_ 2
+#define EXT_AGGR_ 3
+#define EXT_EXTR_ 4
+#define EXT_STATE_ 5
+#define EXT_SFUN_ 6
+
+class ext_fcn_def{
+private:
+    int fcn_type;
+       std::string type_name;  // return type name
+       data_type *fdt;                 // return type
+       std::string storage_type_name;  // storage type name
+       data_type *sdt;                                 // storage type
+       std::string fcn_name;   // name for calling this fcn.
+       std::string udaf_name;  // if an extraction function, its udaf.
+       std::string actual_fcn_name;    // if extr. the mapped-to function.
+       std::vector<ext_fcn_param *> ef_param_list;
+       std::vector<std::string> modifiers;     //      keyword modifiers of the fcn
+       std::vector<std::string> vals;          // optional vals of the keywords
+       bool partial;
+//                     pre-compute these during validation
+       int subaggr_id, superaggr_id, hfta_subaggr_id, hfta_superaggr_id, actual_fcn_id;
+
+public:
+
+       ext_fcn_def(){
+               fdt=NULL;
+               sdt = NULL;
+               fcn_type=-1;
+       };
+
+       ext_fcn_def(char *t, param_list *p, ext_fcn_modifier_list *m,
+                               char *f, ext_fcn_param_list *plist){
+               subaggr_id=superaggr_id=hfta_subaggr_id=hfta_superaggr_id=actual_fcn_id=-1;
+               if(plist != NULL)
+                       ef_param_list = plist->get_param_list();
+               if(m != NULL){
+                       modifiers = m->modifiers;
+                       vals = m->vals;
+               }
+               type_name = t;
+               fdt = new data_type(type_name,p);
+               storage_type_name = "";
+               sdt = NULL;
+               udaf_name = "";
+               actual_fcn_name = "";
+               fcn_type = EXT_FCN_;
+               fcn_name = f;
+       };
+
+       ext_fcn_def(ext_fcn_modifier_list *m,
+        char *f, ext_fcn_param_list *plist){
+               subaggr_id=superaggr_id=hfta_subaggr_id=hfta_superaggr_id=actual_fcn_id=-1;
+               if(plist != NULL)
+                       ef_param_list = plist->get_param_list();
+               if(m != NULL){
+                       modifiers = m->modifiers;
+                       vals = m->vals;
+               }
+               type_name = "";
+               fdt = NULL;
+               storage_type_name = "";
+               sdt = NULL;
+               udaf_name = "";
+               actual_fcn_name = "";
+               fcn_type = EXT_PRED_;
+               fcn_name = f;
+       };
+
+       ext_fcn_def(char *t, param_list *p, ext_fcn_modifier_list *m,
+                               char *f, char *st, ext_fcn_param_list *plist){
+               subaggr_id=superaggr_id=hfta_subaggr_id=hfta_superaggr_id=actual_fcn_id=-1;
+               if(plist != NULL)
+                       ef_param_list = plist->get_param_list();
+               if(m != NULL){
+                       modifiers = m->modifiers;
+                       vals = m->vals;
+               }
+               type_name = t;
+               fdt = new data_type(type_name,p);
+               storage_type_name = st;
+               sdt = new data_type(st);
+               udaf_name = "";
+               actual_fcn_name = "";
+               fcn_type = EXT_AGGR_;
+               fcn_name = f;
+       };
+
+
+       ext_fcn_def(char *t, param_list *p, ext_fcn_modifier_list *m,
+                               char *f, char *sa, char *af, ext_fcn_param_list *plist){
+               subaggr_id=superaggr_id=hfta_subaggr_id=hfta_superaggr_id=actual_fcn_id=-1;
+               if(plist != NULL)
+                       ef_param_list = plist->get_param_list();
+               if(m != NULL){
+                       modifiers = m->modifiers;
+                       vals = m->vals;
+               }
+               type_name = t;
+               fdt = new data_type(type_name,p);
+               storage_type_name = "";
+               sdt = NULL;
+               udaf_name = sa;
+               actual_fcn_name = af;
+               fcn_type = EXT_EXTR_;
+               fcn_name = f;
+       };
+
+       static ext_fcn_def *make_state_def(char *t, char *n){
+               ext_fcn_def *retval = new ext_fcn_def();
+               retval->fcn_type = EXT_STATE_;
+               retval->storage_type_name = t;
+               retval->sdt = new data_type(retval->storage_type_name);
+               retval->fcn_name = n;
+
+               return retval;
+       }
+
+       static ext_fcn_def *make_sfun_def(char *t, param_list *p,
+               ext_fcn_modifier_list *m,
+               char *n, char *s, ext_fcn_param_list *plist){
+               ext_fcn_def *retval = new ext_fcn_def();
+               retval->fcn_type = EXT_SFUN_;
+               retval->type_name = t;
+               retval->fdt = new data_type(retval->type_name,p);
+               retval->storage_type_name = s;
+               retval->fcn_name = n;
+               if(plist != NULL)
+                       retval->ef_param_list = plist->get_param_list();
+               if(m != NULL){
+                       retval->modifiers = m->modifiers;
+                       retval->vals= m->vals;
+               }
+
+               return retval;
+       }
+
+       data_type *get_fcn_dt(){return(fdt);};
+       data_type *get_storage_dt(){return sdt;};
+       std::string get_storage_state(){return storage_type_name;};
+       std::string get_fcn_name(){return fcn_name;};
+
+       std::vector<data_type *> get_operand_dt(){
+               int o;
+               std::vector<data_type *> ret;
+               for(o=0;o<ef_param_list.size();o++){
+                       ret.push_back(ef_param_list[o]->get_dt());
+               }
+               return(ret);
+       };
+       int get_nparams(){return ef_param_list.size();};
+
+       bool is_pred(){return fcn_type == EXT_PRED_;};
+       bool is_fcn(){return fcn_type == EXT_FCN_;};
+       bool is_udaf(){return fcn_type == EXT_AGGR_;};
+       bool is_extr(){return fcn_type == EXT_EXTR_;};
+       bool is_state(){return fcn_type == EXT_STATE_;};
+       bool is_sfun(){return fcn_type == EXT_SFUN_;};
+       int get_fcn_type(){return fcn_type;};
+
+       void set_subaggr_id(int i){subaggr_id = i;};
+       void set_superaggr_id(int i){superaggr_id = i;};
+       void set_hfta_subaggr_id(int i){hfta_subaggr_id = i;};
+       void set_hfta_superaggr_id(int i){hfta_superaggr_id = i;};      
+       void set_actual_fcnid(int i){actual_fcn_id = i;};
+       int get_subaggr_id(){return subaggr_id;};
+       int get_superaggr_id(){return superaggr_id;};
+       int get_hfta_subaggr_id(){return hfta_subaggr_id;};
+       int get_hfta_superaggr_id(){return hfta_superaggr_id;}; 
+       int get_actual_fcn_id(){return actual_fcn_id;};
+
+       std::string get_udaf_name(){return udaf_name;};
+       std::string get_actual_fcn(){return actual_fcn_name;};
+
+
+       bool is_partial(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "PARTIAL")
+                               return(true);
+               }
+               if(fdt->is_buffer_type()){
+                       return true;
+               }
+               return(false);
+       };
+
+       bool is_combinable(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "COMBINABLE")
+                               return(true);
+               }
+               return(false);
+       };
+
+       bool fta_legal(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "LFTA_LEGAL" || modifiers[m] == "LFTA_ONLY" || modifiers[m] == "SAMPLING")
+                               return(true);
+               }
+               return(false);
+       };
+
+       bool lfta_only(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "LFTA_ONLY" || modifiers[m] == "SAMPLING")
+                               return(true);
+               }
+               return(false);
+       };
+
+//             the SAMPLING modifier and the is_sampling_function
+//             was aded by Vlad, to support semantic sampling.
+       bool is_sampling_fcn(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "SAMPLING")
+                               return(true);
+               }
+               return(false);
+       };
+
+#define COST_FREE 0
+#define COST_LOW 1
+#define COST_HIGH 2
+#define COST_EXPENSIVE 3
+#define COST_TOP 4
+
+       int get_fcn_cost(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "COST"){
+                               if(vals[m] == "FREE")
+                                       return COST_FREE;
+                               if(vals[m] == "" || vals[m] == "LOW")
+                                       return COST_LOW;
+                               if(vals[m] == "HIGH")
+                                       return COST_HIGH;
+                               if(vals[m] == "EXPENSIVE")
+                                       return COST_EXPENSIVE;
+                               if(vals[m] == "TOP")
+                                       return COST_TOP;
+                               fprintf(stderr,"Warning, COST %s of function %s not understood, ignoring (options are FREE, LOW, HIGH, EXPENSIVE)\n",vals[m].c_str(), fcn_name.c_str());
+                               return COST_LOW;
+                       }
+               }
+               return(COST_LOW);
+       };
+
+       int estimate_fcn_cost(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "COST"){
+                               if(vals[m] == "FREE")
+                                       return 1;
+                               if(vals[m] == "" || vals[m] == "LOW")
+                                       return 10;
+                               if(vals[m] == "HIGH")
+                                       return 100;
+                               if(vals[m] == "EXPENSIVE")
+                                       return 1000;
+                               if(vals[m] == "TOP")
+                                       return 10000;
+                               fprintf(stderr,"Warning, COST %s of function %s not understood, ignoring (options are FREE, LOW, HIGH, EXPENSIVE)\n",vals[m].c_str(), fcn_name.c_str());
+                               return COST_LOW;
+                       }
+               }
+               return(COST_LOW);
+       };
+
+       std::string get_subaggr(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "SUBAGGR")
+                               return(vals[m]);
+               }
+               return("");
+       };
+
+       std::string get_superaggr(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "SUPERAGGR")
+                               return(vals[m]);
+               }
+               return("");
+       };
+       
+       std::string get_hfta_subaggr(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "HFTA_SUBAGGR")
+                               return(vals[m]);
+               }
+               return("");
+       };
+
+       std::string get_hfta_superaggr(){
+               int m;
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "HFTA_SUPERAGGR")
+                               return(vals[m]);
+               }
+               return("");
+       };      
+       
+
+       bool is_running_aggr(){
+               int m;
+               if(fcn_type != EXT_AGGR_)
+                       return false;
+
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "RUNNING")
+                               return(true);
+               }
+               return(false);
+       };
+
+//             For a special optimization,
+//             a UDAF can say that it has no contents
+//             worth transferring at tuple output time.
+       bool has_lfta_bailout(){
+               int m;
+               if(fcn_type != EXT_AGGR_)
+                       return false;
+
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "LFTA_BAILOUT")
+                               return(true);
+               }
+               return(false);
+       };
+
+
+//             Conventional aggregation requires only a simple
+//             execution of the produce_output callback.  The
+//             sampling operator might reference the output of (non-running)
+//             aggregates      multiple times.  The MULT_RETURNS keyword
+//             indicates that the UDAF doesn't destroy state when the
+//             produce_output acllback is evaluated.
+       bool multiple_returns(){
+               int m;
+               if(fcn_type != EXT_AGGR_)
+                       return false;
+
+               for(m=0;m<modifiers.size();m++){
+                       if(modifiers[m] == "MULT_RETURNS")
+                               return(true);
+               }
+               return(false);
+       };
+
+
+       std::vector<bool> get_handle_indicators(){
+               std::vector<bool> ret;
+               int o;
+               for(o=0;o<ef_param_list.size();o++){
+                       if(ef_param_list[o]->use_handle())
+                               ret.push_back(true);
+                       else
+                               ret.push_back(false);
+               }
+               return(ret);
+       };
+
+       std::vector<bool> get_const_indicators(){
+               std::vector<bool> ret;
+               int o;
+               for(o=0;o<ef_param_list.size();o++){
+                       if(ef_param_list[o]->is_constant())
+                               ret.push_back(true);
+                       else
+                               ret.push_back(false);
+               }
+               return(ret);
+       }
+
+       std::vector<bool> get_class_indicators(){
+               std::vector<bool> ret;
+               int o;
+               for(o=0;o<ef_param_list.size();o++){
+                       if(ef_param_list[o]->is_classifier())
+                               ret.push_back(true);
+                       else
+                               ret.push_back(false);
+               }
+               return(ret);
+       }
+
+       bool validate_types(std::string &err){
+               int o;
+
+               bool ret = false;
+               if(fdt){
+                       if(fdt->get_type() == undefined_t){
+                               err += "ERROR, unknown type "+type_name+" as return type of function "+fcn_name+"\n";
+                               ret = true;
+                       }
+                       if(fdt->get_type() == fstring_t){
+                               err += "ERROR, type "+type_name+" as not supported as return type, of function "+fcn_name+"\n";
+                               ret = true;
+                       }
+               }
+
+               if(sdt){
+                       if(sdt->get_type() == undefined_t){
+                               err += "ERROR, unknown type "+type_name+" as storage type of function "+fcn_name+"\n";
+                               ret = true;
+                       }
+               }
+
+               std::vector<data_type *> odt = this->get_operand_dt();
+               for(o=0;o<odt.size();++o){
+                       if(odt[o]->get_type() == undefined_t){
+                               err += "ERROR, unknown type "+odt[o]->get_type_str()+" as operand type of function "+fcn_name+"\n";
+                               ret = true;
+                       }
+                       if(odt[o]->get_type() == fstring_t){
+                               err += "ERROR, type "+odt[o]->get_type_str()+" as not supported as operand type, of function "+fcn_name+"\n";
+                               ret = true;
+                       }
+               }
+
+               return(ret);
+       }
+
+
+};
+
+class ext_fcn_list{
+private:
+       std::vector<ext_fcn_def *> fl;
+
+public:
+       ext_fcn_list(){};
+       ext_fcn_list(ext_fcn_def *f){
+               fl.push_back(f);
+       };
+
+       ext_fcn_list *append_ext_fcn_def(ext_fcn_def *f){
+               fl.push_back(f);
+               return(this);
+       };
+
+       int lookup_ext_fcn(std::string fname, const std::vector<data_type *> odt, int type){
+               int f, o;
+               int subsumer = -1;
+               int subsume_cnt;
+               for(f=0;f<fl.size();f++){
+                       if(fl[f]->get_fcn_type() != type) continue;
+                       if(fname == fl[f]->get_fcn_name()){
+                               subsume_cnt = 0;
+                               std::vector<data_type *> fdt = fl[f]->get_operand_dt();
+                               if(fdt.size() != odt.size())
+                                       continue;
+                               for(o=0;o<odt.size();o++){
+                                       if(! fdt[o]->subsumes_type(odt[o]) )
+                                                       break;
+                                       if(! fdt[o]->equals(odt[o])) subsume_cnt++;
+                               }
+                               if(o == odt.size()){
+                                       if(subsume_cnt == 0)
+                                               return(f);
+                                       if(subsumer != -1) return -2;
+                                       subsumer = f;
+                               }
+                       }
+               }
+               return(subsumer);       // -1 if no subsumer found.
+       };
+
+
+       int lookup_pred(std::string fname, const std::vector<data_type *> odt){
+               return lookup_ext_fcn(fname,odt,EXT_PRED_);
+       };
+       int lookup_fcn(std::string fname, const std::vector<data_type *> odt){
+               return lookup_ext_fcn(fname,odt,EXT_FCN_);
+       };
+       int lookup_udaf(std::string fname, const std::vector<data_type *> odt){
+               return lookup_ext_fcn(fname,odt,EXT_AGGR_);
+       };
+       int lookup_extr(std::string fname, const std::vector<data_type *> odt){
+               return lookup_ext_fcn(fname,odt,EXT_EXTR_);
+       };
+       int lookup_state(std::string fname){
+               std::vector<data_type *> dum;
+               return lookup_ext_fcn(fname,dum,EXT_STATE_);
+       };
+       int lookup_sfun(std::string fname, const std::vector<data_type *> odt){
+               return lookup_ext_fcn(fname,odt,EXT_SFUN_);
+       };
+
+
+
+
+
+       data_type *get_fcn_dt(int f){
+               return(fl[f]->get_fcn_dt() );
+       };
+       data_type *get_storage_dt(int f){
+               return(fl[f]->get_storage_dt() );
+       };
+
+       bool is_partial(int f){
+               return(fl[f]->is_partial());
+       };
+
+       bool is_combinable(int f){
+               return(fl[f]->is_combinable());
+       };
+
+       bool is_running_aggr(int f){
+               return(fl[f]->is_running_aggr());
+       };
+
+       bool has_lfta_bailout(int f){
+               return(fl[f]->has_lfta_bailout());
+       };
+
+       bool multiple_returns(int f){
+               return(fl[f]->multiple_returns());
+       };
+
+       bool fta_legal(int f){
+               return(fl[f]->fta_legal());
+       };
+
+       bool is_sampling_fcn(int f) {
+               return(fl[f]->is_sampling_fcn());
+       };
+
+       int get_fcn_cost(int f) {
+               return(fl[f]->get_fcn_cost());
+       };
+
+       int estimate_fcn_cost(int f) {
+               return(fl[f]->estimate_fcn_cost());
+       };
+
+       int get_actual_fcn_id(int i){ return(fl[i]->get_actual_fcn_id());};
+       int get_subaggr_id(int i){ return(fl[i]->get_subaggr_id());};
+       int get_superaggr_id(int i){ return(fl[i]->get_superaggr_id());};
+       int get_hfta_subaggr_id(int i){ return(fl[i]->get_hfta_subaggr_id());};
+       int get_hfta_superaggr_id(int i){ return(fl[i]->get_hfta_superaggr_id());};     
+       int get_nparams(int i){ return(fl[i]->get_nparams());};
+       std::string get_fcn_name(int i){
+               return fl[i]->get_fcn_name();
+       }
+       std::string get_storage_state(int i){return fl[i]->get_storage_state();};
+
+
+
+       std::vector<bool> get_handle_indicators(int f){
+               return(fl[f]->get_handle_indicators());
+       };
+       std::vector<bool> get_const_indicators(int f){
+               return(fl[f]->get_const_indicators());
+       };
+       std::vector<bool> get_class_indicators(int f){
+               return(fl[f]->get_class_indicators());
+       };
+
+       bool validate_fcns(std::string &err){
+         int e, f;
+         int subaggr_id, superaggr_id, hfta_subaggr_id, hfta_superaggr_id;
+
+//             First, validate that all data types exist and are valid.
+
+         int retval = 0;
+         for(e=0;e<fl.size();++e){
+               if(fl[e]->validate_types(err)) retval = 1;
+         }
+         if(retval) return(true);
+
+//             validate combinable predicates
+         for(e=0;e<fl.size();++e){
+                       if(fl[e]->is_pred() && fl[e]->is_combinable()){
+                       std::vector<bool> hlv = fl[e]->get_handle_indicators();
+                       std::vector<bool> cov = fl[e]->get_const_indicators();
+                       std::vector<bool> clv = fl[e]->get_class_indicators();
+                       int i;
+                       for(i=0;i<hlv.size();++i){
+                               if( hlv[i] == false && cov[i] == false && clv[i] == false)
+                                       break;
+                       }
+                       if(i<hlv.size()){
+                               err += "ERROR, in combinable predicate  "+fl[e]->get_fcn_name()+", there is a parameter that is not a CLASS-ification parameter, but neither is it CONST nor HANDLE.\n";
+                               retval = 1;
+                               for(i=0;i<hlv.size();++i){
+                                       printf("\t%d: h=%d, co=%d, cl=%d\n",i,(int)hlv[i],(int)cov[i],(int)clv[i]);
+                               }
+                       }
+                       }
+               }
+               
+                               
+
+//             validate the states of the stateful functions.
+         for(e=0;e<fl.size();++e){
+               if(fl[e]->is_sfun()){
+                       std::string sstate = fl[e]->get_storage_state();
+                       if(lookup_state(sstate) < 0){
+                               err += "ERROR, stateful function "+fl[e]->get_fcn_name()+" has state "+sstate+", which is not defined.\n";
+                               retval = 1;
+                               continue;
+                       }
+               }
+         }
+
+//             Validate subaggregates and superaggregates of udafs
+
+         for(e=0;e<fl.size();++e){
+               if(fl[e]->is_udaf()){
+                       std::string subaggr = fl[e]->get_subaggr();
+                       std::string superaggr = fl[e]->get_superaggr();
+                       if(subaggr != "" || superaggr != ""){
+                               if(subaggr == "" || superaggr == ""){
+                                       err += "ERROR, aggregate "+fl[e]->get_fcn_name()+" has a sub or superaggregate specified, but not both.\n";
+                                       retval = 1;
+                                       continue;
+                               }
+                               subaggr_id=lookup_udaf(subaggr, fl[e]->get_operand_dt());
+                               if(subaggr_id < 0){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a subaggregate specified, but it can't be found.\n";
+                                       if(subaggr_id == -2) err+="(multiple subsuming subaggrs found)\n";
+                                       retval=1;
+                                       continue;
+                               }
+                               std::vector<data_type *> dtv;
+                               dtv.push_back( fl[subaggr_id]->get_fcn_dt() );
+                               superaggr_id=lookup_udaf(superaggr, dtv);
+                               if(superaggr_id < 0){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a superaggregate specified, but it can't be found.\n";
+                                       if(subaggr_id == -2) err+="(multiple subsuming superaggrs found)\n";
+                                       retval=1;
+                                       continue;
+                               }
+
+                               if( fl[e]->is_running_aggr() != fl[superaggr_id]->is_running_aggr()){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a superaggregate specified, but  one is a running aggregate and the other isn't\n";
+//printf("e=%d (%u), superaggr_id=%d (%u)\n",e, fl[e]->is_running_aggr(),superaggr_id,fl[superaggr_id]->is_running_aggr());
+                                       retval=1;
+                                       continue;
+                               }
+
+                               if(! fl[e]->get_fcn_dt()->equals(fl[superaggr_id]->get_fcn_dt())){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a superaggregate specified, but they have different return types.\n";
+                                       retval=1;
+                                       continue;
+                               }
+
+                               if(fl[subaggr_id]->get_subaggr()!="" || fl[subaggr_id]->get_superaggr() != ""){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a subaggregate specified, but it also has sub/super aggregates\n";
+                                       retval=1;
+                                       continue;
+                               }
+                               if(fl[superaggr_id]->get_subaggr()!="" || fl[superaggr_id]->get_superaggr() != ""){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a subaggregate specified, but it also has sub/super aggregates\n";
+                                       retval=1;
+                                       continue;
+                               }
+
+                               fl[e]->set_subaggr_id(subaggr_id);
+                               fl[e]->set_superaggr_id(superaggr_id);
+                       }
+               }
+         }
+         
+//             Validate high level subaggregates and superaggregates of udafs (hfta_subaggregate and hfta_supeaggregate)
+
+         for(e=0;e<fl.size();++e){
+               if(fl[e]->is_udaf()){
+                       std::string hfta_subaggr = fl[e]->get_hfta_subaggr();
+                       std::string hfta_superaggr = fl[e]->get_hfta_superaggr();
+                       if(hfta_subaggr != "" || hfta_superaggr != ""){
+                               if(hfta_subaggr == "" || hfta_superaggr == ""){
+                                       err += "ERROR, aggregate "+fl[e]->get_fcn_name()+" has a hfta_sub or hfta_superaggregate specified, but not both.\n";
+                                       retval = 1;
+                                       continue;
+                               }
+                               hfta_subaggr_id=lookup_udaf(hfta_subaggr, fl[e]->get_operand_dt());
+                               if(hfta_subaggr_id < 0){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a hfta_subaggregate specified, but it can't be found.\n";
+                                       if(subaggr_id == -2) err+="(multiple subsuming hfta_subaggrs found)\n";
+                                       retval=1;
+                                       continue;
+                               }
+                               std::vector<data_type *> dtv;
+                               dtv.push_back( fl[hfta_subaggr_id]->get_fcn_dt() );
+                               hfta_superaggr_id=lookup_udaf(hfta_superaggr, dtv);
+                               if(hfta_superaggr_id < 0){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a hfta_superaggregate specified, but it can't be found.\n";
+                                       if(hfta_subaggr_id == -2) err+="(multiple subsuming hfta_superaggrs found)\n";
+                                       retval=1;
+                                       continue;
+                               }
+
+                               if(! fl[e]->get_fcn_dt()->equals(fl[hfta_superaggr_id]->get_fcn_dt())){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a hfta_superaggregate specified, but they have different return types.\n";
+                                       retval=1;
+                                       continue;
+                               }
+                               
+                               /*
+
+                               if(fl[hfta_subaggr_id]->get_hfta_subaggr()!="" || fl[hfta_subaggr_id]->get_hfta_superaggr() != ""){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a hfta_subaggregate specified, but it also has hfta sub/super aggregates\n";
+                                       retval=1;
+                                       continue;
+                               }
+                               if(fl[hfta_superaggr_id]->get_hfta_subaggr()!="" || fl[hfta_superaggr_id]->get_hfta_superaggr() != ""){
+                                       err+="ERROR, aggregate "+fl[e]->get_fcn_name()+" has a hfta_subaggregate specified, but it also has hfta sub/super aggregates\n";
+                                       retval=1;
+                                       continue;
+                               }
+                               */
+
+                               fl[e]->set_hfta_subaggr_id(hfta_subaggr_id);
+                               fl[e]->set_hfta_superaggr_id(hfta_superaggr_id);
+                       }
+               }
+         }       
+
+//                     Verify the extraction functions
+         for(e=0;e<fl.size();++e){
+               if(fl[e]->is_extr()){
+//printf("Verifying extractor %d\n",e);
+                       std::vector<data_type *> ope = fl[e]->get_operand_dt();
+//                             Find the subaggregate
+                       int a;
+                       for(a=0;a<fl.size();++a){
+                               if(fl[a]->is_udaf() && fl[e]->get_udaf_name() == fl[a]->get_fcn_name()){
+//printf("matching to subaggregagte %d\n",a);
+                                       std::vector<data_type *> opa = fl[a]->get_operand_dt();
+                                       if(opa.size() > ope.size()) continue;
+                                       int o;
+                                       bool match_ops = true;
+                                       for(o=0;o<opa.size();++o){
+                                               if(! ope[o]->equals(opa[o])) match_ops = false;
+//else printf("\tmatched operand %d\n",o);
+                                       }
+                                       if(match_ops) break;
+//else printf("subaggregate match failed.\n");
+                               }
+                       }
+                       if(a>=fl.size()){
+                               err+="ERROR, aggregate extractor "+fl[e]->get_fcn_name()+" has a subaggregate "+ fl[e]->get_udaf_name()+" specified, but it can't be found.\n";
+                               retval=1;
+                               continue;
+                       }
+
+//                             Found the subaggregate
+                       subaggr_id = a;
+                       std::vector<data_type *> opa = fl[a]->get_operand_dt();
+
+//                             Find the actual function
+                       for(f=0;f<fl.size();++f){
+                               if(fl[f]->is_fcn() && fl[e]->get_actual_fcn() == fl[f]->get_fcn_name()){
+//printf("Matching to extraction function %d\n",f);
+                                       std::vector<data_type *> opf = fl[f]->get_operand_dt();
+                                       if(opf.size() + opa.size() -1 != ope.size()) continue;
+//else printf("Operand sizes match (%d + %d -1 = %d)\n",opf.size(),opa.size(),ope.size() );
+                                       int o;
+                                       bool match_ops = true;
+                                       if(! fl[a]->get_fcn_dt()->equals(opf[0])) match_ops=false;
+//if(!match_ops) printf("aggr return val doesn't match 1st param\n");
+                                       for(o=1;o<opf.size();++o){
+                                               if(! ope[o+opa.size()-1]->equals(opf[o]))
+                                                       match_ops = false;
+//else printf("\tmatched operand e[%d] to f[%d]\n",o+opa.size()-1,o);
+                                       }
+                                       if(match_ops) break;
+//else printf("Match failed.\n");
+                               }
+                       }
+                       if(f>=fl.size()){
+                               err+="ERROR, aggregate extractor "+fl[e]->get_fcn_name()+" uses function "+ fl[e]->get_actual_fcn()+", but it can't be found.\n";
+                               retval=1;
+                               continue;
+                       }
+                       if(! fl[e]->get_fcn_dt()->equals(fl[f]->get_fcn_dt()) ){
+                               err+="ERROR, aggregate extractor "+fl[e]->get_fcn_name()+" uses function "+ fl[e]->get_actual_fcn()+", but they have different return value types.\n";
+                               retval=1;
+                               continue;
+                       }
+
+//                             Found the extractor fcn, record them in the ext fcn struct.
+                       fl[e]->set_subaggr_id(subaggr_id);
+                       fl[e]->set_actual_fcnid(f);
+               }
+         }
+
+         if(retval) return(true); else return(false);
+       };
+
+
+};
+
+
+#endif
diff --git a/src/ftacmp/parse_fta.h b/src/ftacmp/parse_fta.h
new file mode 100644 (file)
index 0000000..c1ea6ed
--- /dev/null
@@ -0,0 +1,1889 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef _FTA_PARSE_H_INCLUDED__
+#define _FTA_PARSE_H_INCLUDED__
+
+#include<stdio.h>
+#include<ctype.h>
+
+       int yyparse();
+       void yyerror(char *s);
+       int yylex();
+extern int flex_fta_lineno, flex_fta_ch;
+
+/*             Interface to FTA Parser         */
+void FtaParser_setfileinput(FILE *f);
+void FtaParser_setstringinput(char *s);
+
+
+/*             Get type defines.       */
+#include"type_objects.h"
+#include"literal_types.h"
+#include"type_indicators.h"
+
+#include <string>
+#include <vector>
+#include <map>
+#include <math.h>
+#include <string>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+//             colref_t::is_equivalent needs to understand the schema
+#include"parse_schema.h"
+class colref_t;
+
+
+
+class var_pair_t{
+public:
+  std::string name;
+  std::string val;
+
+  var_pair_t(char *n, char *v){
+       name=n; val=v;
+//printf("NEW var_pair_t(%s, %s)\n",n,v);
+       };
+
+  var_pair_t(const std::string n, const std::string v){
+       name=n; val=v;
+       };
+};
+
+typedef std::map< std::string, std::string > ss_map;
+
+class var_defs_t{
+private:
+       std::vector<var_pair_t *> namevec;
+
+public:
+       var_defs_t(var_pair_t *vp){
+               namevec.push_back(vp);
+       };
+
+       var_defs_t *add_var_pair(var_pair_t *vp){
+               namevec.push_back(vp);
+               return(this);
+       };
+
+       std::vector<var_pair_t *> get_nvec(){return namevec;};
+
+       int size(){return namevec.size();};
+
+       int find_name(std::string n){
+               int i;
+               for(i=0;i<namevec.size();i++){
+                       if(namevec[i]->name == n)
+                               return i;
+               }
+               return -1;
+       }
+       std::string get_name(int i){
+               if(i>=0 && i<namevec.size()){
+                       return(namevec[i]->name);
+               }else{
+                       return("");
+               }
+       }
+
+       std::string get_def(int i){
+               if(i>=0 && i<namevec.size()){
+                       return(namevec[i]->val);
+               }else{
+                       return("");
+               }
+       }
+
+       std::string dump(){
+               int i;
+               std::string ret;
+               for(i=0;i<namevec.size();++i){
+                       ret += "\t"+namevec[i]->name+" = "+namevec[i]->val+"\n";
+               }
+               return ret;
+       }
+
+};
+
+
+
+
+//             literal type constants are defined in literal_types.h
+//             (must share this info with type_objects.h)
+
+//             Represents a literal, as expected
+//             NOTE: this class contains some code generation methods.
+
+class literal_t{
+private:
+
+public:
+       std::string lstring;            /* literal value */
+       short int ltype;                        /* literal type */
+       int lineno, charno;
+
+       int complex_literal_id; // if this literal has a complex constructor,
+                                                       // there is a function which constructs it)
+                                                       //set to the idx in the complex literal
+                                                       // table.  (Must store this here (instead of in SE)
+                                                       // because of bare literals in the IN predicate).
+
+
+       literal_t(std::string v){
+               lstring = v;
+               ltype = LITERAL_STRING;
+               complex_literal_id = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       }
+       static literal_t *make_define_literal(const char *s, var_defs_t *d){
+               int i;
+               i=d->find_name(s);
+               if(i<0){
+                       fprintf(stderr,"ERROR at line %d, char %d; DEFINE'd literal %s referenced but not in DEFINE block.\n",flex_fta_lineno, flex_fta_ch, s);
+                       exit(1);
+               }
+               return new literal_t(d->get_def(i));
+       }
+
+       literal_t(const char *lit, int t){lstring = lit; ltype = t;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+               complex_literal_id = -1;
+
+//             For some datatypes we need to modify literal so make a copy of the string
+               char v[100];
+               strcpy(v, lit);
+
+//                     Remove UL, ULL suffix from INT constants.
+               if(ltype == LITERAL_INT || ltype == LITERAL_LONGINT){
+                       int i;
+                       int len=strlen(v);
+                       for(i=0;i<len;++i){
+                               if(v[i] == 'U') v[i] = '\0';
+                       }
+                       lstring = v;
+               }
+
+//                     HEX and LONGHEX must be converted to uint (long long uint)
+               if(ltype == LITERAL_HEX){
+                       char *c,ltmpstr[100];
+                       unsigned long tmp_l;
+                       for(c=v; (*c)!='\0';++c){
+                               if(! ( ((*c) >= '0' && (*c) <= '9') || (tolower(*c) >= 'a' && tolower(*c) <= 'f') ) ){
+                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not a HEX constant.\n",
+                                               lineno, charno, v);
+                                       exit(1);
+                               }
+                       }
+                       sscanf(v,"%lx",&tmp_l);
+                       sprintf(ltmpstr,"%lu",tmp_l);
+                       lstring = ltmpstr;
+                       ltype = LITERAL_INT;
+               }
+               if(ltype == LITERAL_LONGHEX){
+                       char *c,ltmpstr[100];
+                       unsigned long long tmp_ll;
+                       for(c=v; (*c)!='\0';++c){
+                               if(! ( ((*c) >= '0' && (*c) <= '9') || (tolower(*c) >= 'a' && tolower(*c) <= 'f') ) ){
+                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not a LHEX constant.\n",
+                                               lineno, charno, v);
+                                       exit(1);
+                               }
+                       }
+                       sscanf(v,"%llx",&tmp_ll);
+                       sprintf(ltmpstr,"%llu",tmp_ll);
+                       lstring = ltmpstr;
+                       ltype = LITERAL_LONGINT;
+               }
+//                     Convert IP to uint
+               if(ltype == LITERAL_IP){
+                       char ltmpstr[100];
+                       unsigned int o1,o2,o3,o4,tmp_l;
+                       if(sscanf(v,"%u.%u.%u.%u",&o1,&o2,&o3,&o4) != 4){
+                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not an IP constant.\n",
+                                               lineno, charno, v);
+                                       exit(1);
+                       }
+                       if( (o1>255) || (o2>255) || (o3>255) || (o4>255) ){
+                                       fprintf(stderr,"Syntax Error, line=%d, character=%d.  The literal %s is not an IP constant.\n",
+                                               lineno, charno, v);
+                                       exit(1);
+                       }
+                       tmp_l = (o1<<24)+(o2<<16)+(o3<<8)+o4;
+                       sprintf(ltmpstr,"%u",tmp_l);
+                       lstring = ltmpstr;
+                       ltype = LITERAL_IP;
+               }
+       };
+
+//                     used to create literals with a default or initial value.
+       literal_t(int type_indicator){
+               lineno=-1; charno=-1;
+               complex_literal_id = -1;
+
+               switch(type_indicator){
+               case UINT_TYPE:
+               case INT_TYPE:
+               case USHORT_TYPE:
+                       ltype = LITERAL_INT;
+                       lstring = "0";
+                       break;
+               case ULLONG_TYPE:
+               case LLONG_TYPE:
+                       ltype = LITERAL_LONGINT;
+                       lstring = "0";
+                       break;
+               case FLOAT_TYPE:
+                       ltype = LITERAL_FLOAT;
+                       lstring = "0.0";
+                       break;
+               case BOOL_TYPE:
+                       ltype = LITERAL_BOOL;
+                       lstring = "FALSE";
+                       break;
+               case VSTR_TYPE:
+                       ltype = LITERAL_STRING;
+                       lstring = ""; complex_literal_id = 0; // unregistred complex lit
+                       break;
+               case TIMEVAL_TYPE:
+                       ltype = LITERAL_TIMEVAL;
+                       lstring = "0.0";
+                       break;
+               case IPV6_TYPE:
+                       ltype = LITERAL_IPV6;
+                       lstring = "0000:0000:0000:0000:0000:0000:0000:0000";
+                       complex_literal_id = 0; // unregistered complex literal
+                       break;
+               case IP_TYPE:
+                       ltype = LITERAL_IP;
+                       lstring = "0";
+                       break;
+               default:
+                       ltype = LITERAL_UDEF;
+                       lstring=" INTERNAL ERROR, UNKNOWN TYPE INDICATOR IN literal_t::literal_t(int) ";
+               }
+       };
+
+       std::string to_string(){return lstring;};
+
+       int get_type(){return ltype;    };
+       int get_lineno(){return lineno; };
+       int get_charno(){return charno; };
+
+       bool is_equivalent(literal_t *l2){
+               if(ltype != l2->ltype)
+                       return(false);
+               if(lstring != l2->lstring)
+                       return(false);
+
+               return(true);
+       };
+
+//                     Internal function to unescape control characters.
+       static std::string gsqlstr_to_cstr(std::string s){
+               std::string retval;
+               unsigned char c, prev_c='\0';
+               int i;
+
+               for(i=0;i<s.size();++i){
+                       c = s[i];
+                       if(c=='\''){            // || c=='\\'
+                               if(prev_c==c){
+                                       retval += c;
+                                       prev_c = '\0';
+                               }else{
+                                       prev_c=c;
+                               }
+                               continue;
+                       }
+
+                       retval += c;
+                       prev_c = c;
+               }
+
+               return retval;
+       }
+
+
+
+       std::string to_hfta_C_code(std::string param){
+               std::string retval;
+               double tmp_f;
+               int secs, millisecs;
+               char tmpstr[100];
+
+               switch(ltype){
+               case LITERAL_STRING:
+                       retval.append(this->hfta_constructor_name() );
+                       retval.append("("+param+",\"");
+                       retval.append(gsqlstr_to_cstr(lstring));
+                       retval.append("\")");
+                       return(retval);
+               case LITERAL_INT:
+               case LITERAL_IP:
+                       return("((gs_uint32_t)"+lstring+")");
+               case LITERAL_LONGINT:
+                       return("((gs_uint64_t)"+lstring+")");
+               case LITERAL_FLOAT:
+                       return(lstring);
+//             case LITERAL_HEX:
+//                     return("0x"+lstring);
+               case LITERAL_BOOL:
+                       if(lstring == "TRUE"){
+                               return("1");
+                       }else{
+                               return("0");
+                       }
+               case LITERAL_TIMEVAL:
+                       retval.append(this->hfta_constructor_name() );
+                       tmp_f = atof(lstring.c_str());
+                       secs = (int)floor(tmp_f);
+                       millisecs = (int) rint((tmp_f - secs)*1000);
+                       sprintf(tmpstr,"(%d, %d)",secs,millisecs);
+                       retval.append(tmpstr);
+                       return(retval);
+               case LITERAL_IPV6:
+                       retval = this->hfta_constructor_name();
+                       retval += "("+param+",\""+lstring+"\")";
+                       return retval;
+               }
+
+               return("ERROR UNKNOWN LITERAL");
+       };
+
+
+///                    for LFTA code generation
+       std::string to_C_code(std::string param){
+               std::string retval;
+               double tmp_f;
+               int secs, millisecs;
+               char tmpstr[100];
+
+               switch(ltype){
+               case LITERAL_STRING:
+                       retval = this->constructor_name()+"("+param+",\""+gsqlstr_to_cstr(lstring)+"\")";
+                       return(retval);
+               case LITERAL_INT:
+               case LITERAL_IP:
+                       return("((gs_uint32_t)"+lstring+")");
+               case LITERAL_LONGINT:
+                       return("((gs_uint64_t)"+lstring+")");
+               case LITERAL_FLOAT:
+                       return(lstring);
+//             case LITERAL_HEX:
+//                     return("0x"+lstring);
+               case LITERAL_BOOL:
+                       if(lstring == "TRUE"){
+                               return("1");
+                       }else{
+                               return("0");
+                       }
+               case LITERAL_IPV6:
+                       retval = this->constructor_name()+"("+param+",\""+lstring+"\")";
+                       return(retval);
+               case LITERAL_TIMEVAL:
+                       retval.append(this->constructor_name() );
+                       tmp_f = atof(lstring.c_str());
+                       secs = (int)floor(tmp_f);
+                       millisecs = (int) rint((tmp_f - secs)*1000);
+                       sprintf(tmpstr,"(%d, %d)",secs,millisecs);
+                       retval.append(tmpstr);
+                       return(retval);
+               }
+
+               return("ERROR UNKNOWN LITERAL");
+       };
+
+
+       std::string to_query_string(){
+               std::string retval;
+
+               switch(ltype){
+               case LITERAL_IP:
+               {
+                       unsigned int v;
+                       sscanf(lstring.c_str(),"%u",&v);
+                       int d1 = v & 0xff;
+                       int d2 = (v & 0xff00) >> 8;
+                       int d3 = (v & 0xff0000) >> 16;
+                       int d4 = (v & 0xff000000) >> 24;
+                       char ret[200];
+                       sprintf(ret,"IP_VAL'%u.%u.%u.%u'",d4,d3,d2,d1);
+                       return ret;
+               }
+               case LITERAL_STRING:
+                       retval = "'"+lstring+"'";
+                       return(retval);
+               case LITERAL_INT:
+               case LITERAL_FLOAT:
+               case LITERAL_TIMEVAL:
+               case LITERAL_IPV6:
+               case LITERAL_BOOL:
+                       return(lstring);
+               case LITERAL_LONGINT:
+                       return(lstring+"ULL");
+               }
+
+               return("ERROR UNKNOWN LITERAL in literal_t::to_query_string");
+       };
+
+//             TODO : Use definition files instead of hardwiring these.
+
+//             constructor in LFTA code
+       std::string constructor_name(){
+
+               switch(ltype){
+               case LITERAL_TIMEVAL:
+                       return("Timeval_Constructor");
+               case LITERAL_IPV6:
+                       return("Ipv6_Constructor");
+               case LITERAL_STRING:
+                       return("str_constructor");
+               case LITERAL_INT:
+               case LITERAL_IP:
+               case LITERAL_LONGINT:
+               case LITERAL_BOOL:
+               case LITERAL_FLOAT:
+                       return("");
+               }
+               return("ERROR UNKNOWN LITERAL");
+       };
+
+       std::string hfta_constructor_name(){
+
+               switch(ltype){
+               case LITERAL_TIMEVAL:
+                       return("HFTA_Timeval_Constructor");
+               case LITERAL_IPV6:
+                       return("HFTA_Ipv6_Constructor");
+               case LITERAL_STRING:
+                       return("Vstring_Constructor");
+               case LITERAL_INT:
+               case LITERAL_IP:
+               case LITERAL_LONGINT:
+               case LITERAL_BOOL:
+               case LITERAL_FLOAT:
+                       return("");
+               }
+               return("ERROR UNKNOWN LITERAL");
+       };
+
+       std::string hfta_empty_literal_name(){
+
+               switch(ltype){
+               case LITERAL_TIMEVAL:
+                       return("EmptyTimeval");
+               case LITERAL_IPV6:
+                       return("EmptyIp6");
+               case LITERAL_STRING:
+                       return("EmptyString");
+               }
+               return("ERROR_NOT_A_COMPLEX_LITERAL");
+       };
+
+
+       void set_cpx_lit_ref(int g){complex_literal_id = g;     };
+       int get_cpx_lit_ref(){return (complex_literal_id );     };
+       bool is_cpx_lit(){return(complex_literal_id  >= 0);     };
+
+};
+
+
+/*
+               A (null terminated) list of literals.
+               Used for the IN clause
+*/
+
+class literal_list_t{
+private:
+
+public:
+       std::vector<literal_t *> lit_list;
+       int lineno, charno;
+
+       literal_list_t(literal_t *l){
+               lit_list.push_back(l);
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       literal_list_t(std::vector<literal_t *> lvec){
+               lineno = charno = 0;
+               lit_list = lvec;
+       };
+
+       literal_list_t *append_literal(literal_t *l){
+               lit_list.push_back(l);
+               return(this);
+       };
+
+       std::string to_string(){
+               int i;
+               std::string retval;
+               for(i=0;i<lit_list.size();i++){
+                       if(i>0) retval.append(", ");
+                       retval.append(lit_list[i]->to_query_string());
+               }
+           return(retval);
+       };
+
+       std::vector<literal_t *> get_literal_vector(){return(lit_list);};
+
+};
+
+
+class string_t{
+public:
+       std::string val;
+       string_t(char *s){
+               val = s;
+       }
+       string_t *append(char *s){
+               val += s;
+               return this;
+       }
+       string_t *append(char *sep, char *s){
+               val += sep;
+               val += s;
+               return this;
+       }
+       const char *c_str(){
+               return val.c_str();
+       }
+};
+
+//             A tablevar is a data source in a GSQL query.
+//             Every column ref must be bound to a tablevar,
+//             either explicitly or via imputation.
+
+
+class tablevar_t{
+public:
+//             A tablevar is a variable which binds to a named data source.
+//             the variable name might be explicit in the query, or it might be
+//             implicit in which case the variable name is imputed.  In either case
+//             the variable name is set via the set_range_var method.
+//
+//             The data source is the name of either a STREAM or a PROTOCOL.
+//             All STREAMS are unique, but a PROTOCOL must be bound to an
+//             interface.  If the interface is not given, it is imputed to be
+//             the default interface.
+
+       std::string machine;
+       std::string interface;
+       std::string schema_name;
+       std::string variable_name;
+       std::string udop_alias;         // record UDOP ID for of UDOP
+                                                               // for use by cluster manager
+
+       int schema_ref;         // index of the table in the schema (table_list)
+       int opview_idx;         // index in list of operator views (if any)
+       bool iface_is_query;    // true if iface resolves to query
+                                                       // instead of specific interface.
+
+       int properties;         // inner (0) or outer (1) join;
+                                               // labeled using FROM clause,
+                                               // determines join algorithm.
+
+       int lineno, charno;
+
+       tablevar_t(){ opview_idx = -1; schema_ref=-1; iface_is_query = false;
+                               lineno=-1; charno=-1;};
+       tablevar_t(const char *t){schema_name=t;  interface="";
+               opview_idx = -1; schema_ref = -1;
+               variable_name=""; properties = 0;
+               iface_is_query = false;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};
+
+       tablevar_t(const char *i, const char *s, int iq){interface=i; schema_name=s;
+               opview_idx = -1; schema_ref = -1;
+               variable_name=""; properties = 0;
+               if(iq) iface_is_query = true; else iface_is_query = false;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};
+
+       tablevar_t(const char *m, const char *i, const char *s){
+               machine = m; interface=i; schema_name=s;
+               opview_idx = -1; schema_ref = -1;
+               variable_name=""; properties = 0;
+               iface_is_query = false;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};
+
+       tablevar_t *duplicate(){
+               tablevar_t *ret = new tablevar_t();
+               ret->lineno = lineno; ret->charno = charno;
+               ret->schema_ref = schema_ref;
+               ret->opview_idx = opview_idx;
+               ret->machine = machine;
+               ret->interface = interface;
+               ret->schema_name = schema_name;
+               ret->variable_name = variable_name;
+               ret->properties = properties;
+               ret->iface_is_query = iface_is_query;
+               return(ret);
+       };
+
+       tablevar_t *set_range_var(const char *r){
+               variable_name = r;
+               return(this);
+       };
+       tablevar_t *set_range_var(std::string r){
+               variable_name = r;
+               return(this);
+       };
+
+       void set_schema(std::string s){schema_name = s;};
+       void set_interface(std::string i){interface=i;};
+       void set_machine(std::string m){machine = m;};
+       void set_udop_alias(std::string u){udop_alias = u;};
+
+       void set_schema_ref(int r){schema_ref = r;};
+       int get_schema_ref(){return schema_ref;};
+
+       void set_opview_idx(int i){opview_idx = i;};
+       int get_opview_idx(){return opview_idx;};
+
+       void set_property(int p){properties = p;};
+       int get_property(){return properties;};
+
+       bool get_ifq(){return iface_is_query;};
+    void set_ifq(bool b){iface_is_query = b;};
+
+       std::string to_string(){
+               std::string retval;
+
+               if(machine != "" && !iface_is_query)
+                       retval += "'"+machine+"'.";
+               if(interface != ""){
+                       if(iface_is_query){
+                        retval += '['+interface+"].";
+                       }else{
+                        retval += interface+".";
+                       }
+               }
+               retval += schema_name;
+               if(variable_name != "") retval+=" "+variable_name;
+
+               return(retval);
+       };
+
+       std::string get_schema_name(){return schema_name;};
+       void set_schema_name(std::string n){schema_name=n;};
+       std::string get_var_name(){return variable_name;};
+       std::string get_interface(){return interface;};
+       std::string get_machine(){return machine;};
+       std::string get_udop_alias(){return udop_alias;};
+
+       int get_lineno(){return(lineno);        };
+       int get_charno(){return(charno);        };
+
+};
+
+#define INNER_JOIN_PROPERTY 0
+#define LEFT_OUTER_JOIN_PROPERTY 1
+#define RIGHT_OUTER_JOIN_PROPERTY 2
+#define OUTER_JOIN_PROPERTY 3
+#define FILTER_JOIN_PROPERTY 4
+
+//             tablevar_list_t is the list of tablevars in a FROM clause
+
+struct tablevar_list_t{
+public:
+       std::vector<tablevar_t *> tlist;
+       int properties;
+       int lineno, charno;
+//             For filter join
+       colref_t *temporal_var;
+       unsigned int temporal_range;
+
+       tablevar_list_t(){properties = -1; temporal_var = NULL;}
+       tablevar_list_t(tablevar_t *t){tlist.push_back(t); properties=-1; temporal_var = NULL;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};
+       tablevar_list_t(std::vector<tablevar_t *> t){tlist = t; properties=-1; temporal_var = NULL;
+               lineno = 0; charno = 0;};
+
+       tablevar_list_t *duplicate(){
+               tablevar_list_t *ret = new tablevar_list_t();
+               ret->lineno = lineno; ret->charno = charno;
+               ret->properties = properties;
+               ret->temporal_var = temporal_var;
+               ret->temporal_range = temporal_range;
+               int i;
+               for(i=0;i<tlist.size();++i){
+                       ret->append_table(tlist[i]->duplicate());
+               }
+               return(ret);
+       }
+
+
+
+       tablevar_list_t *append_table(tablevar_t *t){
+               tlist.push_back(t);
+               return(this);
+       };
+
+       std::string to_string(){
+               int i;
+               std::string retval;
+
+               for(i=0;i<tlist.size();i++){
+                       if(i>0) retval.append(", ");
+                       retval.append(tlist[i]->to_string());
+               }
+               return(retval);
+       };
+
+       std::vector<tablevar_t *> get_table_list(){return(tlist);       };
+
+       std::vector<std::string> get_table_names(){
+               std::vector<std::string> ret;
+               int t;
+               for(t=0;t<tlist.size();++t){
+                       std::string tbl_name = tlist[t]->get_schema_name();
+                       ret.push_back(tbl_name);
+               }
+               return(ret);
+       }
+
+       std::vector<std::string> get_src_tbls(table_list *Schema){
+               std::vector<std::string> ret;
+               int t, sq;
+               for(t=0;t<tlist.size();++t){
+                       std::string tbl_name = tlist[t]->get_schema_name();
+                       int sid = Schema->find_tbl(tbl_name);
+                       if(sid < 0){ ret.push_back(tbl_name);
+                       }else
+                       if(Schema->get_schema_type(sid) != OPERATOR_VIEW_SCHEMA){
+                               ret.push_back(tbl_name);
+                       }else{
+                               std::vector<subquery_spec *> sqspec = Schema->get_subqueryspecs(sid);
+                               for(sq=0;sq<sqspec.size();++sq){
+                                       ret.push_back(sqspec[sq]->name);
+                               }
+                       }
+               }
+               return(ret);
+       };
+
+       int size(){
+               return tlist.size();
+       };
+
+//             Some accessor functions.
+
+       std::vector<std::string> get_schema_names(){
+               int i;
+               std::vector<std::string > retval;
+               for(i=0;i<tlist.size();i++){
+                       retval.push_back(tlist[i]->get_schema_name());
+               }
+               return(retval);
+       }
+
+       std::vector<int> get_schema_refs(){
+               int i;
+               std::vector<int> retval;
+               for(i=0;i<tlist.size();i++){
+                       retval.push_back(tlist[i]->get_schema_ref());
+               }
+               return(retval);
+       }
+
+
+       int get_schema_ref(int i){
+               if(i<0 || i>=tlist.size()) return(-1);
+               return tlist[i]->get_schema_ref();
+       };
+
+       std::string get_tablevar_name(int i){
+               if(i<0 || i>=tlist.size()) return("");
+               return tlist[i]->get_var_name();
+       };
+
+       void set_properties(int p){properties = p;};
+       int get_properties(){return properties;};
+
+       void set_colref(colref_t *c){temporal_var = c;};
+       void set_temporal_range(unsigned int t){temporal_range = t;};
+       void set_temporal_range(const char *t){temporal_range= atoi(t);};
+       colref_t *get_colref(){return temporal_var;};
+       unsigned int get_temporal_range(){return temporal_range;};
+
+};
+
+//                     A reference to an interface parameter.
+//                     (I need to be able to record the source
+//                      tablevar, else this would be a lot simpler).
+class ifpref_t{
+public:
+       std::string tablevar;
+       std::string pname;
+       int tablevar_ref;
+       int lineno, charno;
+
+       ifpref_t(const char *p){
+               tablevar="";
+               pname = p;
+               tablevar_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       ifpref_t(const char *t, const char *p){
+               tablevar=t;
+               pname = p;
+               tablevar_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       void set_tablevar_ref(int i){tablevar_ref = i;};
+       int get_tablevar_ref(){return tablevar_ref;};
+       std::string get_tablevar(){return tablevar;}
+       void set_tablevar(std::string t){tablevar = t;};
+       std::string get_pname(){return pname;}
+       std::string to_string(){
+               std::string ret;
+               if(tablevar != "")
+                       ret += tablevar + ".";
+               ret += "@"+pname;
+               return ret;
+       };
+       bool is_equivalent(ifpref_t *i){
+               return (tablevar_ref == i->tablevar_ref) && (pname == i->pname);
+       };
+};
+
+
+
+
+//                     A representation of a reference to a field of a
+//                     stream (or table).  This reference must be bound
+//                     to a particular schema (schema_ref) and to a
+//                     particular table variable in the FROM clause (tablevar_ref)
+//                     If the column reference was generated by the parser,
+//                     it will contain some binding text wich might need
+//                     interpretation to do the actual binding.
+class colref_t{
+public:
+       std::string interface;          // specified interface, if any.
+       std::string table_name;         // specified table name or range var, if any.
+       std::string field;                      // field name
+       bool default_table;                     // true iff. no table or range var given.
+       int schema_ref;                         // ID of the source schema.
+       int tablevar_ref;                       // ID of the tablevar (in FROM clause).
+       int lineno, charno;
+
+       colref_t(const char *f){
+               field = f; default_table = true;
+               schema_ref = -1; tablevar_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       colref_t(const char *t, const char *f){
+               table_name = t; field=f; default_table = false;
+               schema_ref = -1; tablevar_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       colref_t(const char *i, const char *t, const char *f){
+               interface=i;
+               table_name = t; field=f; default_table = false;
+               schema_ref = -1; tablevar_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       colref_t *duplicate(){
+               colref_t *retval = new colref_t(interface.c_str(), table_name.c_str(), field.c_str());
+               retval->schema_ref = schema_ref;
+               retval->tablevar_ref = tablevar_ref;
+               retval->lineno = lineno;
+               retval->charno = charno;
+               retval->default_table = default_table;
+               return(retval);
+       }
+
+       std::string to_string(){
+               if(default_table){
+                       return field;
+               }else{
+                       if(interface != "") return(interface+"."+table_name+"."+field);
+                       return(table_name + "." + field);
+               }
+       };
+
+       std::string to_query_string(){
+               if(default_table){
+                       return field;
+               }else{
+                       if(interface != "") return(interface+"."+table_name+"."+field);
+                       if(table_name != "") return(table_name + "." + field);
+                       return(field);
+               }
+       };
+
+       int get_lineno(){return lineno; };
+       int get_charno(){return charno; };
+
+       bool uses_default_table(){return default_table; };
+
+       std::string get_field(){return(field);  };
+       void set_field(std::string f){field=f;};
+       std::string get_table_name(){return(table_name);};
+       std::string get_interface(){return(interface);};
+       void set_table_name(std::string t){table_name = t; default_table=false;};
+       void set_interface(std::string i){interface=i;};
+
+       int get_schema_ref(){return schema_ref;}
+       void set_schema_ref(int s){schema_ref = s;};
+       int get_tablevar_ref(){return tablevar_ref;}
+       void set_tablevar_ref(int s){tablevar_ref = s;};
+
+//                     Should equivalence be based on tablevar_ref or schema_ref?
+       bool is_equivalent(colref_t *c2){
+               if(schema_ref == c2->schema_ref){
+                       return(field == c2->field);
+               }
+               return(false);
+       };
+
+       bool is_equivalent_base(colref_t *c2, table_list *Schema){
+               if(Schema->get_basetbl_name(schema_ref,field) ==
+                  Schema->get_basetbl_name(c2->schema_ref,c2->field)){
+                       return(field == c2->field);
+               }
+               return(false);
+       };
+};
+
+class colref_list_t{
+public:
+       std::vector<colref_t *> clist;
+
+//     colref_list_t(){};
+
+       colref_list_t(colref_t *c){
+               clist.push_back(c);
+       }
+
+       colref_list_t *append(colref_t *c){
+               clist.push_back(c);
+               return this;
+       }
+
+       std::vector<colref_t *> get_clist(){
+               return clist;
+       }
+};
+
+
+
+
+
+
+/*
+               A tree containing a scalar expression.
+                       Used for
+                               atom : a parameter or a literal
+                               scalar_exp (see the scalar_exp: rule in emf.l for details)
+                               function_ref (a function that has a value, e.g. an aggregate
+                                                               function).
+               operator_type defines the contents of the node.  If its a non-terminal,
+               then op has a meaning and defines the operation.  See the list of
+               #define'd constants following the structure definition.
+
+
+*/
+
+#define SE_LITERAL 1
+#define SE_PARAM 2
+#define SE_COLREF 3
+#define SE_UNARY_OP 4
+#define SE_BINARY_OP 5
+#define SE_AGGR_STAR 6
+#define SE_AGGR_SE 7
+#define SE_FUNC 8
+#define SE_IFACE_PARAM 9
+
+
+class scalarexp_t{
+public:
+       int operator_type;
+       std::string op;
+       union{
+               scalarexp_t *scalarp;
+               literal_t *litp;
+               colref_t *colref;
+               ifpref_t *ifp;
+       } lhs;
+       union{
+               scalarexp_t *scalarp;
+       } rhs;
+       std::vector<scalarexp_t *> param_list;
+
+//             SE node decorations -- results of query analysis.
+       data_type *dt;
+       int gb_ref;                             // set to the gb attr tbl ref, else -1
+       int aggr_id;                    // set to the aggr tbl ref, else -1
+       int fcn_id;                             // external function table ref, else -1
+       int partial_ref;                // partial fcn table ref, else -1
+       int fcn_cache_ref;              // function cache ref, else -1
+       int handle_ref;                 // Entry in pass-by-handle parameter table, else -1.
+                                                       // (might be a literal or a query param).
+       bool is_superagg;               // true if is aggregate and associated with supergroup.
+       std::string storage_state;      // storage state of stateful fcn,
+                                                               // empty o'wise.
+
+       int lineno, charno;
+
+       void default_init(){
+               operator_type = 0;
+               gb_ref = -1; aggr_id = -1;      fcn_id = -1;
+               partial_ref = -1; fcn_cache_ref=-1;
+               handle_ref = -1;
+               dt = NULL; lineno = flex_fta_lineno; charno = flex_fta_ch;
+               is_superagg = false;
+               };
+
+       scalarexp_t(){
+               default_init();};
+
+       scalarexp_t(colref_t *c){
+               default_init();
+               operator_type = SE_COLREF;
+               lhs.colref = c;
+       };
+
+       scalarexp_t(literal_t *l){
+               default_init();
+               operator_type = SE_LITERAL;
+               lhs.litp = l;
+       };
+
+       void convert_to_literal(literal_t *l){
+//             default_init();
+               if(operator_type != SE_IFACE_PARAM){
+                       fprintf(stderr,"INTERNAL ERROR in literal_t::convert_to_literal, operator type isn't SE_IFACE_PARAM.\n");
+                       exit(1);
+               }
+               operator_type = SE_LITERAL;
+               lhs.litp = l;
+       }
+
+       scalarexp_t(const char *o, scalarexp_t *operand){
+               default_init();
+               operator_type = SE_UNARY_OP;
+               op = o;
+               lhs.scalarp = operand;
+       };
+
+       scalarexp_t(const char *o, scalarexp_t *l_op, scalarexp_t *r_op){
+               default_init();
+               operator_type = SE_BINARY_OP;
+               op = o;
+               lhs.scalarp = l_op;
+               rhs.scalarp = r_op;
+       };
+
+       scalarexp_t(const char *o, std::vector<scalarexp_t *> op_list){
+               default_init();
+               operator_type = SE_FUNC;
+               op = o;
+               param_list = op_list;
+       };
+
+       static scalarexp_t *make_paramless_fcn(const char *o){
+               scalarexp_t *ret = new scalarexp_t();
+               ret->operator_type = SE_FUNC;
+               ret->op = o;
+               return(ret);
+       };
+
+       static scalarexp_t *make_star_aggr(const char *ag){
+               scalarexp_t *ret = new scalarexp_t();
+               ret->operator_type = SE_AGGR_STAR;
+               ret->op = ag;
+               return(ret);
+       };
+
+       static scalarexp_t *make_se_aggr(const char *ag, scalarexp_t *l_op){
+               scalarexp_t *ret = new scalarexp_t();
+               ret->operator_type = SE_AGGR_SE;
+               ret->op = ag;
+               ret->lhs.scalarp = l_op;
+               return(ret);
+       };
+
+       static scalarexp_t *make_param_reference(const char *param){
+               scalarexp_t *ret = new scalarexp_t();
+               ret->operator_type = SE_PARAM;
+               ret->op = param;
+               return(ret);
+       };
+
+       static scalarexp_t *make_iface_param_reference(ifpref_t *i){
+               scalarexp_t *ret = new scalarexp_t();
+               ret->operator_type = SE_IFACE_PARAM;
+               ret->lhs.ifp = i;
+               return(ret);
+       };
+
+
+       std::string to_string(){
+               if(operator_type == SE_COLREF){
+                       return lhs.colref->to_string();
+               }
+               if(operator_type == SE_LITERAL){
+                       return lhs.litp->to_string();
+               }
+               if(operator_type == SE_UNARY_OP){
+                       return op + " (" + lhs.scalarp->to_string() + ")";
+               }
+               if(operator_type == SE_BINARY_OP){
+                       return "(" + lhs.scalarp->to_string() + " " + op + " " + rhs.scalarp->to_string() + ")";
+               }
+               return("");
+       };
+
+       scalarexp_t *get_left_se(){return lhs.scalarp;  };
+       scalarexp_t *get_right_se(){return rhs.scalarp; };
+       int get_operator_type(){return operator_type;   };
+       std::string & get_op(){return op;       };
+       std::string & get_param_name(){return op;       };
+//     std::string & get_iface_param_name(){return op; };
+       colref_t *get_colref(){return lhs.colref;       };
+       ifpref_t *get_ifpref(){return lhs.ifp;  };
+       literal_t *get_literal(){return lhs.litp;       };
+
+       int get_lineno(){return lineno; };
+       int get_charno(){return charno; };
+
+       void set_data_type(data_type *d){dt=d;  };
+       data_type *get_data_type(){return dt;   };
+       void reset_temporal(){if(dt!=NULL) dt->reset_temporal();}
+
+       void set_gb_ref(int g){gb_ref = g;      };
+       int get_gb_ref(){return (gb_ref);       };
+       bool is_gb(){return(gb_ref >= 0);       };
+
+       void set_aggr_id(int a){aggr_id = a;};
+       int get_aggr_ref(){return(aggr_id);     };
+
+       void set_storage_state(std::string s){storage_state = s;};
+       std::string get_storage_state(){return storage_state;};
+
+       std::vector<scalarexp_t *> get_operands(){return param_list;};
+       void set_fcn_id(int f){fcn_id = f;      };
+       int get_fcn_id(){return fcn_id; };
+
+       void set_partial_ref(int p){partial_ref = p;    };
+       int get_partial_ref(){return partial_ref;       };
+       bool is_partial(){return partial_ref >= 0;      };
+
+       void set_fcncache_ref(int p){fcn_cache_ref = p; };
+       int get_fcncache_ref(){return fcn_cache_ref;    };
+       bool is_fcncached(){return fcn_cache_ref >= 0;  };
+
+       void set_handle_ref(int tf){handle_ref = tf;    };
+       int get_handle_ref(){return handle_ref; };
+       bool is_handle_ref(){return handle_ref>=0;      };
+
+       void set_superaggr(bool b){is_superagg=b;};
+       bool is_superaggr(){return is_superagg;};
+
+       void use_decorations_of(scalarexp_t *se){
+               if(se->get_data_type() != NULL)
+                       dt = se->get_data_type()->duplicate();
+               gb_ref = se->gb_ref;
+               aggr_id = se->aggr_id;
+               fcn_id = se->fcn_id;
+               partial_ref = se->partial_ref;
+               handle_ref = se->handle_ref;
+               lineno = se->lineno;
+               charno = se->charno;
+               is_superagg = se->is_superagg;
+       };
+};
+
+
+/*
+               A (null terminated) list of scalar expressions.
+               Used for
+                       selection, scalar_exp_commalist
+*/
+
+class se_list_t{
+public:
+       std::vector<scalarexp_t *> se_list;
+       int lineno, charno;
+
+       se_list_t(scalarexp_t *s){se_list.push_back(s);
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};
+
+       se_list_t *append(scalarexp_t *s){
+                       se_list.push_back(s);
+                       return(this);
+       };
+
+       std::string to_string(){
+               int i;
+               std::string retval;
+               for(i=0;i<se_list.size();i++){
+                       if(i>0) retval.append(", ");
+                       retval.append(se_list[i]->to_string());
+               }
+               return(retval);
+       };
+
+       std::vector<scalarexp_t *> get_se_list(){return se_list;        };
+
+
+};
+
+/*
+               select_commalist : collect some additional info about
+               the selected things -- mostly the name.
+*/
+
+struct select_element{
+       scalarexp_t *se;
+       std::string name;
+
+       select_element(){se=NULL; name="";};
+       select_element(scalarexp_t *s){se=s; name="";};
+       select_element(scalarexp_t *s, std::string n){se=s; name=n;};
+};
+
+class select_list_t{
+public:
+       std::vector<select_element *> select_list;
+       int lineno, charno;
+
+       select_list_t(){lineno = -1; charno = -1;};
+       select_list_t(scalarexp_t *s){select_list.push_back(new select_element(s));
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};
+       select_list_t(scalarexp_t *s, std::string n){
+               select_list.push_back(new select_element(s,n));
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+       select_list_t *append(scalarexp_t *s){
+                       select_list.push_back(new select_element(s));
+                       return(this);
+       };
+       select_list_t *append(scalarexp_t *s, std::string n){
+                       select_list.push_back(new select_element(s,n));
+                       return(this);
+       };
+
+       std::string to_string(){
+               int i;
+               std::string retval;
+               for(i=0;i<select_list.size();i++){
+                       if(i>0) retval.append(", ");
+                       retval.append(select_list[i]->se->to_string());
+                       if(select_list[i]->name != "")
+                               retval += " AS " + select_list[i]->name;
+
+               }
+               return(retval);
+       };
+
+       std::vector<select_element *> get_select_list(){return select_list;     };
+       std::vector<scalarexp_t *> get_select_se_list(){
+               std::vector<scalarexp_t *> ret;
+               int i;
+               for(i=0; i<select_list.size();++i) ret.push_back(select_list[i]->se);
+               return ret;
+       };
+};
+
+
+
+#define GB_COLREF 1
+#define GB_COMPUTED 2
+
+class gb_t{
+public:
+       std::string name;
+       std::string table;
+       std::string interface;
+       scalarexp_t *def;
+       int type;
+       int lineno, charno;
+
+       gb_t(const char *field_name){
+               interface="";
+               name = field_name; table=""; def=NULL; type=GB_COLREF;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       gb_t(const char *table_name, const char *field_name){
+               interface="";
+               name = field_name; table=""; def=NULL; type=GB_COLREF;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       gb_t(const char *iface, const char *table_name, const char *field_name){
+               interface=iface;
+               name = field_name; table=""; def=NULL; type=GB_COLREF;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       gb_t( scalarexp_t *s, const char *gname){
+               name = gname; table = ""; def = s; type = GB_COMPUTED;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       std::string to_string(){
+               std::string retval;
+               if(type == GB_COLREF){
+                       if(table != ""){
+                               retval = table;
+                               retval.append(".");
+                       }
+                       retval.append(name);
+               }
+               if(type == GB_COMPUTED){
+                       retval = "(scalarexp) AS ";
+                       retval.append(name);
+               }
+               return(retval);
+       };
+
+       gb_t *duplicate();
+
+};
+
+/*
+               A (null terminated) list of group by attributes
+*/
+
+class gb_list_t{
+public:
+       std::vector<gb_t *> gb_list;
+       int lineno, charno;
+
+       gb_list_t(gb_t *g){gb_list.push_back(g);
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};
+
+       gb_list_t *append(gb_t *s){
+                       gb_list.push_back(s);
+                       return(this);
+       };
+       gb_list_t(int l, int c) : lineno(l), charno(c){ }
+
+       std::string to_string(){
+               int i;
+               std::string retval;
+               for(i=0;i<gb_list.size();i++){
+                       if(i>0) retval.append(", ");
+                       retval.append(gb_list[i]->to_string());
+               }
+               return(retval);
+       };
+
+       std::vector<gb_t *> get_gb_list(){return gb_list;       };
+
+       gb_list_t *duplicate(){
+               gb_list_t *ret = new gb_list_t(lineno, charno);
+               int i;
+               for(i=0;i<gb_list.size();++i){
+                       ret->append(gb_list[i]->duplicate());
+               }
+
+               return ret;
+       }
+
+
+};
+
+class list_of_gb_list_t{
+public:
+       std::vector<gb_list_t *> gb_lists;
+
+       list_of_gb_list_t(gb_list_t *gl){
+               gb_lists.push_back(gl);
+       }
+
+       list_of_gb_list_t *append(gb_list_t *gl){
+               gb_lists.push_back(gl);
+               return this;
+       }
+};
+
+
+enum extended_gb_type {no_egb_type, gb_egb_type, rollup_egb_type,
+                       cube_egb_type, gsets_egb_type};
+class extended_gb_t{
+public:
+
+       extended_gb_type type;
+       gb_t *gb;
+       std::vector<gb_list_t *> gb_lists;
+
+       extended_gb_t(){
+               gb = NULL;
+               type = no_egb_type;
+       }
+
+       ~extended_gb_t(){
+       }
+
+       static extended_gb_t *create_from_gb(gb_t *g){
+               extended_gb_t *ret  = new extended_gb_t();
+               ret->type = gb_egb_type;
+               ret->gb = g;
+               return ret;
+       }
+
+       static extended_gb_t *extended_create_from_rollup(gb_list_t *gl){
+               extended_gb_t *ret  = new extended_gb_t();
+               ret->type = rollup_egb_type;
+               ret->gb_lists.push_back(gl);
+               return ret;
+       }
+
+       static extended_gb_t *extended_create_from_cube(gb_list_t *gl){
+               extended_gb_t *ret  = new extended_gb_t();
+               ret->type = cube_egb_type;
+               ret->gb_lists.push_back(gl);
+               return ret;
+       }
+
+       static extended_gb_t *extended_create_from_gsets(list_of_gb_list_t *lgl){
+               extended_gb_t *ret  = new extended_gb_t();
+               ret->type = gsets_egb_type;
+               ret->gb_lists = lgl->gb_lists;
+               return ret;
+       }
+
+       extended_gb_t *duplicate(){
+               extended_gb_t *ret = new extended_gb_t();
+               ret->type = type;
+               if(gb != NULL)
+                       ret->gb = gb->duplicate();
+               int i;
+               for(i=0;i<gb_lists.size();++i){
+                       ret->gb_lists.push_back(gb_lists[i]->duplicate());
+               }
+               return ret;
+       }
+
+
+       std::string to_string(){
+               std::string ret;
+               int i;
+
+               switch(type){
+               case no_egb_type:
+                       return "Error, undefined extended gb type.";
+               case gb_egb_type:
+                       return gb->to_string();
+               case rollup_egb_type:
+                       return "ROLLUP("+gb_lists[0]->to_string()+")";
+               case cube_egb_type:
+                       return "CUBE("+gb_lists[0]->to_string()+")";
+               case gsets_egb_type:
+                       ret = "GROUPING_SETS(";
+                       for(i=0;i<gb_lists.size();++i){
+                               if(i>0) ret+=", ";
+                               ret += "(" +gb_lists[i]->to_string()+")";
+                       }
+                       ret += ")";
+                       return ret;
+               default:
+                       break;
+               }
+               return "Error, unknown extended gb type.";
+       }
+
+};
+
+class extended_gb_list_t{
+public:
+       std::vector<extended_gb_t *> gb_list;
+       int lineno, charno;
+
+       extended_gb_list_t(extended_gb_t *g){gb_list.push_back(g);
+               lineno = flex_fta_lineno; charno = flex_fta_ch;};
+
+       extended_gb_list_t *append(extended_gb_t *s){
+                       gb_list.push_back(s);
+                       return(this);
+       };
+
+       std::string to_string(){
+               int i;
+               std::string retval;
+               for(i=0;i<gb_list.size();i++){
+                       if(i>0) retval.append(", ");
+                       retval.append(gb_list[i]->to_string());
+               }
+               return(retval);
+       };
+
+       std::vector<extended_gb_t *> get_gb_list(){return gb_list;      };
+};
+
+
+
+/*
+               A predicate tree.  Structure is similar to
+               a scalar expression tree but the type is always boolean.
+               Used by
+                       opt_where_clause, where_clause, opt_having_clause,
+                       search_condition, predicate, comparison_predicate, repl_predicate
+*/
+
+#define PRED_COMPARE 1
+#define PRED_UNARY_OP 2
+#define PRED_BINARY_OP 3
+#define PRED_FUNC 4
+#define PRED_IN 5
+
+class  predicate_t{
+public:
+       int operator_type;
+       std::string op;
+       union {
+               predicate_t *predp;
+               scalarexp_t *sexp;
+       }lhs;
+       union {
+               predicate_t *predp;
+               scalarexp_t *sexp;
+               literal_list_t *ll;
+       }rhs;
+       std::vector<scalarexp_t *> param_list;  /// pred fcn params
+       int fcn_id;                                                             /// external pred fcn id
+       int combinable_ref;
+       bool is_sampling_fcn;
+       int lineno, charno;
+
+       predicate_t(scalarexp_t *s, literal_list_t *litl){
+               operator_type = PRED_IN;
+               op = "in";
+               lhs.sexp = s;
+               rhs.ll = litl;
+               fcn_id = -1;
+               combinable_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       predicate_t(scalarexp_t *s, std::vector<literal_t *> litv){
+               operator_type = PRED_IN;
+               op = "in";
+               lhs.sexp = s;
+               rhs.ll = new literal_list_t(litv);
+               fcn_id = -1;
+               combinable_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+
+       predicate_t(scalarexp_t *l_op, const char *o, scalarexp_t *r_op){
+               operator_type = PRED_COMPARE;
+               op = o;
+               lhs.sexp = l_op;
+               rhs.sexp = r_op;
+               fcn_id = -1;
+               combinable_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       predicate_t(const char *o, predicate_t *p){
+               operator_type = PRED_UNARY_OP;
+               op = o;
+               lhs.predp = p;
+               fcn_id = -1;
+               combinable_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       predicate_t(const char *o, predicate_t *l_p, predicate_t *r_p){
+               operator_type = PRED_BINARY_OP;
+               op = o;
+               lhs.predp = l_p;
+               rhs.predp = r_p;
+               fcn_id = -1;
+               combinable_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       predicate_t(const char *o, std::vector<scalarexp_t *> op_list){
+               operator_type = PRED_FUNC;
+               op = o;
+               param_list = op_list;
+               fcn_id = -1;
+               combinable_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+       predicate_t(const char *o){
+               op = o;
+               fcn_id = -1;
+               combinable_ref = -1;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+
+       static predicate_t *make_paramless_fcn_predicate(const char *o){
+               predicate_t *ret = new predicate_t(o);
+               ret->operator_type = PRED_FUNC;
+               ret->fcn_id = -1;
+               ret->combinable_ref = -1;
+               return(ret);
+       };
+
+       std::string to_string(){
+               if(operator_type == PRED_IN){
+                       return( lhs.sexp->to_string() + " " + op + " [ " + rhs.ll->to_string() +" ]");
+               }
+               if(operator_type == PRED_COMPARE){
+                       return( lhs.sexp->to_string() + " " + op + " " + rhs.sexp->to_string() );
+               }
+               if(operator_type == PRED_UNARY_OP){
+                       return( op + " (" + lhs.predp->to_string() + ")" );
+               }
+               if(operator_type == PRED_BINARY_OP){
+                       return( "(" + lhs.predp->to_string() + " " + op + " " + rhs.predp->to_string() + ")" );
+               }
+               if(operator_type == PRED_FUNC){
+                       std::string ret = op + "[ ";
+                       int i;
+                       for(i=0;i<param_list.size();++i){
+                               if(i>0) ret += ", ";
+                               ret += param_list[i]->to_string();
+                       }
+                       ret += "] ";
+                       return(ret);
+               }
+               return("");
+       };
+
+       std::vector<scalarexp_t *> get_op_list(){return param_list;     };
+       int get_operator_type(){return operator_type;   };
+       std::string get_op(){return op; };
+       int get_lineno(){return lineno; };
+       int get_charno(){return charno; };
+       int get_combinable_ref(){return combinable_ref;}
+       void set_combinable_ref(int f){combinable_ref = f;};
+       predicate_t *get_left_pr(){return(lhs.predp);   };
+       predicate_t *get_right_pr(){return(rhs.predp);  };
+       scalarexp_t *get_left_se(){return(lhs.sexp);    };
+       scalarexp_t *get_right_se(){return(rhs.sexp);   };
+       std::vector<literal_t *> get_lit_vec(){return(rhs.ll->get_literal_vector());            };
+
+       void swap_scalar_operands(){
+               if(operator_type != PRED_COMPARE){
+                       fprintf(stderr,"INTERNAL ERROR: swap_scalar_operands called on predicate of type %d\n",operator_type);
+                       exit(1);
+               }
+               scalarexp_t *tmp;
+               tmp = lhs.sexp; lhs.sexp = rhs.sexp; rhs.sexp = tmp;
+               if(op == ">"){op = "<"; return;}
+               if(op == ">="){op = "<="; return;}
+               if(op == "<"){op = ">"; return;}
+               if(op == "<="){op = ">="; return;}
+       };
+       void set_fcn_id(int i){fcn_id = i;};
+       int get_fcn_id(){return fcn_id;};
+
+
+};
+
+
+/*
+               A structure that holds the components of a query.
+               This is the root type.
+               Used by manipulative_statement, select_statement, table_exp
+*/
+
+#define SELECT_QUERY 1
+#define MERGE_QUERY 2
+
+class table_exp_t{
+public:
+  int query_type;                                      // roughly, the type of the query.
+  ss_map nmap;                                         //      DEFINE block
+  std::vector<var_pair_t *> query_params;      // PARAM block (uninterpreted)
+  select_list_t *sl;                                   // SELECT
+  tablevar_list_t *fm;                                 // FROM
+  predicate_t *wh;                                     // WHERE
+  predicate_t *hv;                                     // HAVING
+  predicate_t *cleaning_when;          // CLEANING WHEN
+  predicate_t *cleaning_by;                    // CLEANING BY
+  predicate_t *closing_when;           // CLOSING WHEN
+  std::vector<extended_gb_t *> gb;                     // GROUP BY
+  std::vector<colref_t *> mergevars;           // merge colrefs.
+  std::vector<colref_t *> supergb;     // supergroup.
+  scalarexp_t *slack;                          // merge slack
+  bool exernal_visible;                                // true iff. it can be subscribed to.
+  int lineno, charno;
+
+
+  table_exp_t(tablevar_list_t *f, predicate_t *p, extended_gb_list_t *g, colref_list_t *sg, predicate_t *h, predicate_t *cw, predicate_t *cb, predicate_t *closew)
+               {fm = f; wh = p; hv = h;
+               cleaning_when = cw; cleaning_by = cb;
+               closing_when = closew;
+               if(g != NULL)
+                       gb = g->gb_list;
+               if(sg != NULL)
+                       supergb = sg->get_clist();
+               slack = NULL;
+               query_type = SELECT_QUERY;
+               exernal_visible = true;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+  table_exp_t(colref_list_t *mv, tablevar_list_t *f)
+               {fm = f; mergevars=mv->get_clist();
+                slack = NULL;
+               query_type = MERGE_QUERY;
+               exernal_visible = true;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+  table_exp_t(colref_list_t *mv, scalarexp_t *sl, tablevar_list_t *f)
+               {fm = f; mergevars=mv->get_clist();
+                slack = sl;
+               query_type = MERGE_QUERY;
+               exernal_visible = true;
+               lineno = flex_fta_lineno; charno = flex_fta_ch;
+       };
+
+//                     Figure out the temporal merge field at analyze_fta time.
+       static table_exp_t *make_deferred_merge(std::vector<std::string> src_tbls){
+               table_exp_t *ret = new table_exp_t();
+               ret->query_type = MERGE_QUERY;
+               ret->fm = new tablevar_list_t();
+               int t;
+               for(t=0;t<src_tbls.size();++t){
+                       ret->fm->append_table(new tablevar_t(src_tbls[t].c_str()));
+               }
+               ret->lineno = 0; ret->charno = 0;
+               return ret;
+       }
+
+       table_exp_t(){
+               fm = NULL; sl = NULL; wh=NULL; hv=NULL;
+               slack = NULL;
+               cleaning_when=NULL; cleaning_by = NULL;
+               closing_when = NULL;
+               exernal_visible = true;
+       };
+
+  table_exp_t *add_selection(select_list_t *s){
+         sl = s;
+         return(this);
+       };
+
+       void add_nmap(var_defs_t *vd){
+               int n;
+               if(vd != NULL){
+                       for(n=0;n<vd->size();++n){
+                               nmap[vd->get_name(n)] = vd->get_def(n);
+//printf("Adding (%s, %s) to name map.\n",vd->get_name(n).c_str(), vd->get_def(n).c_str());
+                       }
+               }
+       };
+
+       void add_param_list(var_defs_t *vd){
+               int n;
+               if(vd != NULL){
+                       query_params = vd->get_nvec();
+               }
+       };
+
+
+       std::string to_string(){
+               std::string retval;
+               if(sl != NULL){
+                       retval.append("Select " + sl->to_string() + "\n");
+               }
+               if(fm != NULL){
+                       retval.append("From " + fm->to_string() + "\n");
+               }
+               if(wh != NULL){
+                       retval.append("Where "+ wh->to_string() + "\n");
+               }
+               if(hv != NULL){
+                       retval.append("Having "+hv->to_string() + "\n");
+               }
+               return(retval);
+               };
+
+       tablevar_list_t *get_from(){return fm;  };
+       select_list_t *get_select(){return sl;  };
+       std::vector<select_element *> get_sl_vec(){return sl->get_select_list();        };
+       predicate_t *get_where(){return wh;     };
+       predicate_t *get_having(){return hv;    };
+       predicate_t *get_cleaning_by(){return cleaning_by;      };
+       predicate_t *get_cleaning_when(){return cleaning_when;  };
+       predicate_t *get_closing_when(){return closing_when;    };
+       std::vector<extended_gb_t *> get_groupby(){return(gb);  };
+    std::vector<colref_t *> get_supergb(){return supergb;};
+
+       ss_map get_name_map(){return nmap;};
+
+       bool name_exists(std::string nm){
+               return(nmap.count(nm) > 0);
+       };
+
+       std::string get_val_of_name(std::string nm){
+               if(nmap.count(nm) == 0) return("");
+               else return nmap[nm];
+       };
+
+       void set_val_of_name(const std::string n, const std::string v){
+               nmap[n]=v;
+       }
+
+       void set_visible(bool v){exernal_visible=v;};
+       bool get_visible(){return exernal_visible;};
+};
+
+struct query_list_t{
+       std::vector<table_exp_t *> qlist;
+
+       query_list_t(table_exp_t *t){
+               qlist.push_back(t);
+       };
+       query_list_t *append(table_exp_t *t){
+               qlist.push_back(t);
+               return(this);
+       };
+};
+
+
+#define TABLE_PARSE 1
+#define QUERY_PARSE 2
+#define STREAM_PARSE 3
+
+struct fta_parse_t{
+       query_list_t *parse_tree_list;
+       table_exp_t *fta_parse_tree;
+       table_list *tables;
+       int parse_type;
+};
+
+
+
+
+
+       extern table_exp_t *fta_parse_tree;
+
+
+
+
+
+#endif
+
diff --git a/src/ftacmp/parse_partn.cc b/src/ftacmp/parse_partn.cc
new file mode 100644 (file)
index 0000000..c0235e5
--- /dev/null
@@ -0,0 +1,546 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#include"parse_partn.h"
+#include "parse_schema.h"
+#include"analyze_fta.h"
+
+
+using namespace std;
+
+
+int find_field(scalarexp_t *se, string &fld){
+       vector<scalarexp_t *> operands;
+       int o,ret=0;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               return 0;
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return 100;             // force failure, but no error message.
+       case SE_UNARY_OP:
+               return find_field(se->get_left_se(), fld);
+       case SE_BINARY_OP:
+               return find_field(se->get_left_se(), fld)+find_field(se->get_right_se(), fld);
+       case SE_COLREF:
+               fld = se->get_colref()->get_field();
+               return 1;
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+//                     Should be no aggregates
+               return 0;
+       case SE_FUNC:
+               return 100;             // force failure, but no error message.
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_field, unknown operator type %d\n", se->get_operator_type());
+               return(-100);
+       }
+       return(-100);
+}
+
+
+int partn_def_t::verify(table_list *schema, string &err_msg){
+       if(schema->find_tbl(protocol) < 0){
+               err_msg += "ERROR, partition definition "+name+" uses source "+protocol+", but its not in the schema.\n";
+               return 1;
+       }
+       if(schema->get_schema_type(schema->find_tbl(protocol)) != PROTOCOL_SCHEMA){
+               err_msg += "ERROR, partition definition "+name+" uses source "+protocol+", but its not a PROTOCOL.\n";
+               return 1;
+       }
+
+       tablevar_t *fme = new tablevar_t(protocol.c_str());
+       tablevar_list_t fm(fme);
+
+//             Validate the SE and assign data types.
+       int i;
+       int retval = 0;
+       for(i=0;i<se_list.size();++i){
+               int ret = verify_colref(se_list[i],&fm,schema,NULL);
+               if(ret){
+                       err_msg += "ERROR validating entry "+int_to_string(i)+" of partition definition "+name+".\n";
+                       retval=1;
+               }
+       }
+       if(retval)
+               return 1;
+
+//             Ensure that the data type is an integer type.
+       for(i=0;i<se_list.size();++i){
+               data_type *dt = se_list[i]->get_data_type();
+               string type_s = dt->get_type_str();
+               if(! ( type_s=="UINT" || type_s=="INT" || type_s=="ULLONG" || type_s=="LLONG") ){
+                       err_msg += "ERROR, entry "+int_to_string(i)+" of partition definition "+name+" has type "+type_s+", but it must be one of UINT, INT, ULLONG, LLONG.\n";
+                       retval=1;
+               }
+       }
+       if(retval)
+               return 1;
+
+//             Ensure that each SE ref's a field only once.
+       for(i=0;i<se_list.size();++i){
+               string fld;
+               int ret = find_field(se_list[i],fld);
+               if(ret<0){
+                       err_msg += "ERROR validating entry "+int_to_string(i)+" of partition definition "+name+".\n";
+                       retval=1;
+               }
+               if(ret!=1){
+                       err_msg += "ERROR validating entry "+int_to_string(i)+" of partition definition "+name+": the expression references a field "+int_to_string(ret)+" times, but it should reference a field exactly once.\n";
+                       retval=1;
+                       field_list.push_back("");
+               }else{
+                       field_list.push_back(fld);
+               }
+       }
+       if(retval)
+               return 1;
+
+       return 0;
+
+}
+
+void find_colref_path(scalarexp_t *se, vector<scalarexp_t *> &se_stack){
+       vector<scalarexp_t *> operands;
+       int o,ret=0;
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+       case SE_PARAM:
+       case SE_IFACE_PARAM:
+               return ;
+       case SE_UNARY_OP:
+               find_colref_path(se->get_left_se(), se_stack);
+               if(se_stack.size()>0)
+                       se_stack.push_back(se);
+               return;
+       case SE_BINARY_OP:
+               find_colref_path(se->get_left_se(), se_stack);
+               if(se_stack.size()>0){
+                       se_stack.push_back(se);
+                       return;
+               }
+               find_colref_path(se->get_right_se(), se_stack);
+               if(se_stack.size()>0)
+                       se_stack.push_back(se);
+               return;
+       case SE_COLREF:
+               se_stack.push_back(se);
+               return;
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+//                     Should be no aggregates
+               return;
+       case SE_FUNC:
+               operands = se->get_operands();
+               for(o=0;o<operands.size();o++){
+                       find_colref_path(operands[o], se_stack);
+                       if(se_stack.size()>0){
+                               se_stack.push_back(se);
+                               return;
+                       }
+               }
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_colref_path, unknown operator type %d\n", se->get_operator_type());
+               return;
+       }
+       return;
+}
+
+struct param_int{
+       union{
+               long int li;
+               unsigned long int uli;
+               long long int lli;
+               unsigned long long int ulli;
+       } v;
+    dtype d;
+
+       void convert_to_final() {};
+
+       void load_val(dtype dt, const char *val){
+               d=dt;
+               switch(dt){
+               case u_int_t:
+                       sscanf(val,"%llu",&(v.ulli));
+                       break;
+               case int_t:
+                       sscanf(val,"%lld",&(v.lli));
+                       break;
+               case u_llong_t:
+                       sscanf(val,"%llu",&(v.ulli));
+                       break;
+               case llong_t:
+                       sscanf(val,"%lld",&(v.lli));
+                       break;
+               default:
+                       fprintf(stderr,"INTERNAL ERROR, data type %d passed to param_int::load_val.\n",dt);
+                       exit(1);
+               }
+       }
+
+       void add(dtype dt, param_int &l, param_int &r){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.lli+r.v.lli; else v.lli = l.v.lli+r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.ulli+r.v.lli; else v.lli = l.v.ulli+r.v.ulli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.lli+r.v.lli; else v.ulli = l.v.lli+r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.ulli+r.v.lli; else v.ulli = l.v.ulli+r.v.ulli;
+       }
+       void subtract(dtype dt, param_int &l, param_int &r){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.lli-r.v.lli; else v.lli = l.v.lli-r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.ulli-r.v.lli; else v.lli = l.v.ulli-r.v.ulli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.lli-r.v.lli; else v.ulli = l.v.lli-r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.ulli-r.v.lli; else v.ulli = l.v.ulli-r.v.ulli;
+       }
+       void mult(dtype dt, param_int &l, param_int &r){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.lli*r.v.lli; else v.lli = l.v.lli*r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.ulli*r.v.lli; else v.lli = l.v.ulli*r.v.ulli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.lli*r.v.lli; else v.ulli = l.v.lli*r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.ulli*r.v.lli; else v.ulli = l.v.ulli*r.v.ulli;
+       }
+       void div(dtype dt, param_int &l, param_int &r){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.lli/r.v.lli; else v.lli = l.v.lli/r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.ulli/r.v.lli; else v.lli = l.v.ulli/r.v.ulli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.lli/r.v.lli; else v.ulli = l.v.lli/r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.ulli/r.v.lli; else v.ulli = l.v.ulli/r.v.ulli;
+       }
+       void bit_and(dtype dt, param_int &l, param_int &r){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.lli&r.v.lli; else v.lli = l.v.lli&r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.ulli&r.v.lli; else v.lli = l.v.ulli&r.v.ulli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.lli&r.v.lli; else v.ulli = l.v.lli&r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.ulli&r.v.lli; else v.ulli = l.v.ulli&r.v.ulli;
+       }
+       void bit_or(dtype dt, param_int &l, param_int &r){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.lli|r.v.lli; else v.lli = l.v.lli|r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.ulli|r.v.lli; else v.lli = l.v.ulli|r.v.ulli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.lli|r.v.lli; else v.ulli = l.v.lli|r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.ulli|r.v.lli; else v.ulli = l.v.ulli|r.v.ulli;
+       }
+       void modulo(dtype dt, param_int &l, param_int &r){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.lli%r.v.lli; else v.lli = l.v.lli%r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.ulli%r.v.lli; else v.lli = l.v.ulli%r.v.ulli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.lli%r.v.lli; else v.ulli = l.v.lli%r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.ulli%r.v.lli; else v.ulli = l.v.ulli%r.v.ulli;
+       }
+       void shift_left(dtype dt, param_int &l, param_int &r){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.lli<<r.v.lli; else v.lli = l.v.lli<<r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.ulli<<r.v.lli; else v.lli = l.v.ulli<<r.v.ulli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.lli<<r.v.lli; else v.ulli = l.v.lli<<r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.ulli<<r.v.lli; else v.ulli = l.v.ulli<<r.v.ulli;
+       }
+       void shift_right(dtype dt, param_int &l, param_int &r){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.lli>>r.v.lli; else v.lli = l.v.lli>>r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.lli = l.v.ulli>>r.v.lli; else v.lli = l.v.ulli>>r.v.ulli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.lli>>r.v.lli; else v.ulli = l.v.lli>>r.v.ulli;
+                       else
+                               if(r.d==int_t || r.d==llong_t) v.ulli = l.v.ulli>>r.v.lli; else v.ulli = l.v.ulli>>r.v.ulli;
+       }
+
+       void plus(dtype dt, param_int &l){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               v.lli = l.v.ulli;
+                       else
+                               v.lli = l.v.lli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               v.ulli = l.v.ulli;
+                       else
+                               v.ulli = l.v.lli;
+       }
+       void minus(dtype dt, param_int &l){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               v.lli = -l.v.ulli;
+                       else
+                               v.lli = -l.v.lli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               v.ulli = -l.v.ulli;
+                       else
+                               v.ulli = -l.v.lli;
+       }
+       void abs_not(dtype dt, param_int &l){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               v.lli = !l.v.ulli;
+                       else
+                               v.lli = !l.v.lli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               v.ulli = !l.v.ulli;
+                       else
+                               v.ulli = !l.v.lli;
+       }
+       void bit_not(dtype dt, param_int &l){
+               d=dt;
+               if(dt==int_t || dt==llong_t)
+                       if(l.d==int_t || l.d==llong_t)
+                               v.lli = ~l.v.ulli;
+                       else
+                               v.lli = ~l.v.lli;
+               else
+                       if(l.d==int_t || l.d==llong_t)
+                               v.ulli = ~l.v.ulli;
+                       else
+                               v.ulli = ~l.v.lli;
+       }
+};
+
+
+bool int_operand_divides(param_int &lp, param_int &rp){
+       if( (lp.d==int_t || lp.d==llong_t)){
+               if(lp.v.lli < 0)
+                       lp.v.ulli = -lp.v.lli;
+               else
+                       lp.v.ulli = lp.v.lli;
+       }
+       if( (rp.d==int_t || rp.d==llong_t)){
+               if(rp.v.lli < 0)
+                       rp.v.ulli = -rp.v.lli;
+               else
+                       rp.v.ulli = rp.v.lli;
+       }
+    unsigned long long int d = rp.v.ulli / lp.v.ulli;
+    unsigned long long int r = rp.v.ulli - d * lp.v.ulli;
+       return d==0;
+}
+
+bool int_operand_implies(param_int &lp, param_int &rp){
+       unsigned long long int d = (lp.v.ulli & rp.v.ulli) | (!lp.v.ulli);
+       return (~d)==0;
+}
+
+
+
+
+void extract_param_int(scalarexp_t *se, param_int &p_int) {
+param_int lp, rp;
+string op_str;
+dtype dt = se->get_data_type()->get_type();
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               p_int.load_val(se->get_data_type()->get_type(),se->to_string().c_str());
+               return;
+       case SE_UNARY_OP:
+               extract_param_int(se->get_left_se(), lp);
+               op_str = se->get_op();
+               if(op_str=="+") p_int.plus(dt,lp);
+               if(op_str=="-") p_int.minus(dt,lp);
+               if(op_str=="!") p_int.abs_not(dt,lp);
+               if(op_str=="~") p_int.bit_not(dt,lp);
+               return;
+       case SE_BINARY_OP:
+               extract_param_int(se->get_left_se(), lp);
+               extract_param_int(se->get_right_se(), rp);
+               op_str = se->get_op();
+               if(op_str=="+") p_int.add(dt,lp,rp);
+               if(op_str=="-") p_int.subtract(dt,lp,rp);
+               if(op_str=="*") p_int.mult(dt,lp,rp);
+               if(op_str=="/") p_int.div(dt,lp,rp);
+               if(op_str=="&") p_int.bit_and(dt,lp,rp);
+               if(op_str=="|") p_int.bit_or(dt,lp,rp);
+               if(op_str=="%") p_int.modulo(dt,lp,rp);
+               if(op_str=="<<") p_int.shift_left(dt,lp,rp);
+               if(op_str==">>") p_int.shift_right(dt,lp,rp);
+               return;
+       default:
+               fprintf(stderr,"INTERNAL ERROR in find_field, invalid operator type %d\n", se->get_operator_type());
+               exit(1);
+       }
+       return;
+
+}
+
+
+void get_int_operand(scalarexp_t *parent, scalarexp_t *child, param_int &p_int){
+       if(parent->get_operator_type() != SE_BINARY_OP){
+               fprintf(stderr,"INTERNAL ERROR, operator type %d in get_int_operand.\n",
+parent->get_operator_type());
+               exit(1);
+       }
+       if(parent->get_right_se() == child){
+               extract_param_int(parent->get_left_se(), p_int);
+               p_int.convert_to_final();
+       }else{
+               extract_param_int(parent->get_right_se(), p_int);
+               p_int.convert_to_final();
+       }
+}
+
+
+bool partition_compatible(scalarexp_t *pse, scalarexp_t *gse){
+       vector<scalarexp_t *> pstack, gstack;
+
+       find_colref_path(pse, pstack);
+       find_colref_path(gse, gstack);
+
+       int ppos=0, gpos=0;
+       string p_op, g_op;
+       param_int p_int, g_int;
+
+       while(ppos<pstack.size()-1 && gpos<gstack.size()-1){
+
+//             first, try to raise both stack pointers.
+               if(ppos<pstack.size()-1 && gpos<gstack.size()-1){
+                       p_op = pstack[ppos+1]->get_op();
+                       g_op = gstack[gpos+1]->get_op();
+                       if(p_op==g_op){
+                               if(p_op=="/"){
+                                       get_int_operand(pstack[ppos+1],pstack[ppos],p_int);
+                                       get_int_operand(gstack[gpos+1],gstack[gpos],g_int);
+                                       if(int_operand_divides(g_int, p_int)){
+                                               ppos++;
+                                               gpos++;
+                                               continue;
+                                       }else{
+                                               return false;
+                                       }
+                               }
+                               if(p_op=="&"){
+                                       get_int_operand(pstack[ppos+1],pstack[ppos],p_int);
+                                       get_int_operand(gstack[gpos+1],gstack[gpos],g_int);
+                                       if(int_operand_implies(p_int, g_int)){
+                                               ppos++;
+                                               gpos++;
+                                               continue;
+                                       }else{
+                                               return false;
+                                       }
+                               }
+                               if(p_op=="|"){
+                                       get_int_operand(pstack[ppos+1],pstack[ppos],p_int);
+                                       get_int_operand(gstack[gpos+1],gstack[gpos],g_int);
+                                       if(int_operand_implies(g_int, p_int)){
+                                               ppos++;
+                                               gpos++;
+                                               continue;
+                                       }else{
+                                               return false;
+                                       }
+                               }
+                       }
+               }
+               if(ppos<pstack.size()-1){
+                       p_op = pstack[ppos+1]->get_op();
+                       if(p_op=="+" || p_op=="-" || p_op=="*" || p_op=="/" || p_op=="&" || p_op=="|"){
+                               ppos++;
+                               continue;
+                       }
+               }
+               if(gpos<gstack.size()-1){
+                       g_op = gstack[gpos+1]->get_op();
+                       if(g_op=="+" || g_op=="-" || g_op=="*" || g_op=="/" || g_op=="&" || g_op=="|"){
+                               gpos++;
+                               continue;
+                       }
+               }
+
+               return false;   // no reduction rule applies
+       }
+
+       return true;            // reduced both stacks.
+}
+
+
+bool partn_def_t::is_compatible(gb_table *gb_tbl){
+       vector<string> gb_flds;
+       int i,p,g;
+
+       for(i=0;i<gb_tbl->size();++i){
+               string gfld;
+               if(find_field(gb_tbl->get_def(i),gfld)==1){
+                       gb_flds.push_back(gfld);
+               }else{
+                       gb_flds.push_back("");
+               }
+       }
+
+       for(p=p;p<se_list.size();++p){
+               for(g=0;g<gb_tbl->size();++g){
+                       if(partition_compatible(se_list[p], gb_tbl->get_def(g)))
+                               break;
+               }
+               if(g==gb_tbl->size()){
+                       return false;
+               }
+       }
+       return true;
+}
diff --git a/src/ftacmp/parse_partn.h b/src/ftacmp/parse_partn.h
new file mode 100644 (file)
index 0000000..36e92d6
--- /dev/null
@@ -0,0 +1,78 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef _PARTN_PARSE_H_INCLUDED__
+#define _PARTN_PARSE_H_INCLUDED__
+
+#include<stdio.h>
+#include"parse_fta.h"
+#include"analyze_fta.h"
+
+/*             Interface to FTA Parser         */
+void PartnParser_setfileinput(FILE *f);
+void PartnParser_setstringinput(char *s);
+
+class partn_def_t{
+public:
+       std::string name;
+       std::string protocol;
+       std::vector<scalarexp_t *> se_list;
+       std::vector<std::string> field_list;
+
+       partn_def_t(const char *n, const char *p, se_list_t *sl){
+               name=n;
+               protocol=p;
+               se_list = sl->se_list;
+       }
+
+       int verify(table_list *schema, std::string &err_msg);
+       bool is_compatible(gb_table *gb_tbl);
+};
+
+class partn_def_list_t{
+public:
+       std::map<std::string, partn_def_t *> partn_map;
+
+       partn_def_list_t(partn_def_t *pd){
+               partn_map[pd->name] = pd;
+       }
+       partn_def_list_t *append(partn_def_t *pd){
+               if(partn_map.count(pd->name)){
+                       fprintf(stderr,"Warning, duplicate entry named %s in partition definitions, ignored.\n",pd->name.c_str());
+               }else{
+                       partn_map[pd->name] = pd;
+               }
+               return this;
+       }
+
+       partn_def_t *get_partn_def(std::string n){
+               if(partn_map.count(n))
+                       return partn_map[n];
+               return NULL;
+       }
+
+       int verify(table_list *schema, std::string &err_msg){
+         int retval=0;
+         std::map<std::string, partn_def_t *>::iterator mspi;
+               for(mspi=partn_map.begin(); mspi!=partn_map.end();++mspi){
+                       if((*mspi).second->verify(schema, err_msg))
+                               retval=1;
+               }
+               return retval;
+       }
+
+
+};
+
+#endif
diff --git a/src/ftacmp/parse_schema.cc b/src/ftacmp/parse_schema.cc
new file mode 100644 (file)
index 0000000..a9bc60c
--- /dev/null
@@ -0,0 +1,524 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include <string>
+#include"parse_fta.h"
+#include "parse_schema.h"
+#include "type_objects.h"
+#include <stdio.h>
+#include <stdlib.h>
+// #include <algo.h>
+#include<algorithm>
+
+using namespace std;
+
+table_list *Schema;
+
+table_def::table_def(const char *name, param_list *oprop, field_entry_list *fel,
+                       subqueryspec_list *ql, param_list *selp){
+       table_name =name;
+       fields = fel->get_list();
+       schema_type = OPERATOR_VIEW_SCHEMA;
+       qspec_list = ql->spec_list;
+
+       if(oprop == NULL) op_properties = new param_list();
+       else            op_properties = oprop;
+       if(selp == NULL) selpush = new param_list();
+       else            selpush = selp;
+       base_tables = new param_list();
+};
+
+table_def *table_def::make_shallow_copy(string n){
+       table_def *ret = new table_def();
+       ret->table_name = n;
+       ret->fields = fields;
+       ret->schema_type = schema_type;
+       ret->base_tables = base_tables;
+       ret->op_properties = op_properties;
+       ret->qspec_list = qspec_list;
+       ret->selpush = selpush;
+
+       return ret;
+}
+
+void table_def::mangle_subq_names(std::string mngl){
+       int i;
+       for(i=0;i<qspec_list.size();++i){
+               subquery_spec *s = qspec_list[i]->duplicate();
+               s->name += mngl;
+               qspec_list[i] = s;
+       }
+}
+
+
+
+bool table_def::contains_field(string f){
+  int i;
+
+  for(i=0;i<fields.size();i++){
+       if(fields[i]->get_name() == f){
+               return(true);
+       }
+  }
+  return(false);
+
+}
+
+int table_def::get_field_idx(std::string f){
+  int i;
+  for(i=0;i<fields.size();i++){
+       if(fields[i]->get_name() == f){
+               return(i);
+       }
+  }
+  return(-1);
+}
+
+
+string table_def::get_type_name(std::string f){
+  int i;
+  for(i=0;i<fields.size();i++){
+       if(fields[i]->get_name() == f){
+               return(fields[i]->get_type());
+       }
+  }
+  return("INTERNAL ERROR undefined field " + f);
+}
+
+param_list *table_def::get_modifier_list(std::string f){
+  int i;
+  for(i=0;i<fields.size();i++){
+       if(fields[i]->get_name() == f){
+               return(fields[i]->get_modifier_list());
+       }
+  }
+  fprintf(stderr,"INTERNAL ERROR, no field %s in table %s, call is get_modifier_list.\n",
+                       f.c_str(), table_name.c_str() );
+  exit(1);
+  return(NULL);
+}
+
+
+string table_def::get_fcn(std::string f){
+  int i;
+  for(i=0;i<fields.size();i++){
+       if(fields[i]->get_name() == f){
+               return(fields[i]->get_fcn());
+       }
+  }
+  return("INTERNAL ERROR undefined field " + f);
+
+}
+
+
+string table_def::get_field_basetable(std::string f){
+  int i;
+  for(i=0;i<fields.size();i++){
+       if(fields[i]->get_name() == f){
+               return(fields[i]->get_basetable());
+       }
+  }
+  return("INTERNAL ERROR undefined field " + f);
+
+}
+
+int table_def::verify_no_duplicates(std::string &err){
+
+       int f1, f2;
+       for(f1=0;f1<fields.size()-1;f1++){
+               string f1_name = fields[f1]->get_name();
+               for(f2=f1+1;f2<fields.size();f2++){
+                       if(f1_name == fields[f2]->get_name()){
+                               err.append("Error, table ");
+                               err.append(table_name);
+                               err.append(" has a duplicate field :");
+                               err.append(f1_name);
+                               err.append("\n");
+                               return(1);
+                       }
+               }
+       }
+       return(0);
+}
+
+int table_def::verify_access_fcns(std::string &err){
+       int retval = 0, f;
+
+       for(f=0;f<fields.size();++f){
+               if(fields[f]->get_fcn() == ""){
+                       err += "Error, PROTOCOL field "+table_name+"."+fields[f]->get_name()+" has an empty access function.\n";
+                       retval = 1;
+               }
+       }
+
+       return(retval);
+}
+
+int table_def::add_field(field_entry *fe){
+       string fe_name = fe->get_name();
+       int f;
+
+       for(f=0;f<fields.size();f++){
+               if(fe_name == fields[f]->get_name()){
+                       return(-1);
+               }
+       }
+       fields.push_back(fe);
+       return(0);
+}
+
+
+vector<string> table_list::get_table_names(){
+       vector<string> retval;
+       int i;
+       for(i=0;i<tbl_list.size();i++){
+               retval.push_back(tbl_list[i]->get_tbl_name());
+       }
+       return(retval);
+}
+
+
+int table_list::find_tbl(string t){
+       int i;
+       for(i=0;i<tbl_list.size();i++)
+               if(tbl_list[i]->get_tbl_name() == t)
+                       return(i);
+//     fprintf(stderr,"INTERNAL ERROR: Could not find table %s in table_list::find_tbl\n",t.c_str());
+       return(-1);
+}
+
+vector<field_entry *> table_list::get_fields(string t){
+       int pos = find_tbl(t);
+       if(pos<0){
+               vector<field_entry *> r;
+               return(r);
+       }
+       return(tbl_list[pos]->get_fields());
+}
+
+field_entry *table_list::get_field(string t, int i){
+       int pos = find_tbl(t);
+       if(pos<0){
+               return(NULL);
+       }
+       return(tbl_list[pos]->get_field(i));
+}
+
+int table_list::get_field_idx(string t, string f){
+       int pos = find_tbl(t);
+       if(pos<0){
+               return(-1);
+       }
+       return(tbl_list[pos]->get_field_idx(f));
+}
+
+
+vector<int> table_list::get_tblref_of_field(string f){
+       int i;
+       vector<int> retval;
+
+       for(i=0;i<tbl_list.size();i++){
+               if( tbl_list[i]->contains_field(f) ){
+                       retval.push_back(i);
+               }
+       }
+       return(retval);
+}
+
+//             TODO: this seems to duplicate find_tbl
+int table_list::get_table_ref(string t){
+       int i;
+       for(i=0;i<tbl_list.size();i++){
+               if(tbl_list[i]->get_tbl_name() == t ){
+                       return(i);
+               }
+       }
+       return(-1);
+}
+
+
+//                             Use to unroll hierarchically defined
+//                             tables.  Used for source tables.
+//                             Also, do some sanity checking, better
+//                             to find the errors now when its easy to report
+//                             than later when its obscure.
+//
+//                             Also, process the unpacking functions.
+//                             and verify that all field unpacking functions
+//                             are listed in the schema.
+int table_list::unroll_tables(string &err){
+//             First, verify there are no repeat field names in any
+//             of the tables.
+
+       int f, tref, p, t, ret, retval;
+
+       for(t=0;t<tbl_list.size();t++){
+         if(tbl_list[t]->get_schema_type() == UNPACK_FCNS_SCHEMA){
+               for(f=0;f<tbl_list[t]->ufcn_list.size();f++){
+                       ufcn_fcn[ tbl_list[t]->ufcn_list[f]->name ] = tbl_list[t]->ufcn_list[f]->fcn;
+                       ufcn_cost[ tbl_list[t]->ufcn_list[f]->name ] = tbl_list[t]->ufcn_list[f]->cost;
+                       
+               }
+         }
+       }
+
+       for(t=0;t<tbl_list.size();t++){
+         if(tbl_list[t]->get_schema_type() != UNPACK_FCNS_SCHEMA){
+//                     No duplicate field names
+               ret = tbl_list[t]->verify_no_duplicates(err);
+               if(ret) retval = ret;
+
+//                     every field has an access function
+               if(tbl_list[t]->get_schema_type() == PROTOCOL_SCHEMA){
+                       retval = tbl_list[t]->verify_access_fcns(err);
+                       if(ret) retval = ret;
+               }
+
+//                     Every type can be parsed
+               vector<field_entry *> flds = tbl_list[t]->get_fields();
+               for(f=0;f<flds.size();++f){
+                       data_type dt(flds[f]->get_type());
+                       if(dt.get_type() == undefined_t){
+                               err += "ERROR, field "+flds[f]->get_name()+" of table "+tbl_list[t]->get_tbl_name()+" has unrecognized type "+flds[f]->get_type()+"\n";
+                               retval = 1;
+                       }
+                       if(dt.get_type() == fstring_t){
+                               err += "ERROR, field "+flds[f]->get_name()+" of table "+tbl_list[t]->get_tbl_name()+" has unsupported type "+flds[f]->get_type()+"\n";
+                               retval = 1;
+                       }
+               }
+
+//                     Ensure that the unpack functions, if any, exist.
+               for(f=0;f<flds.size();++f){
+                       set<string> ufcns = flds[f]->get_unpack_fcns();
+                       set<string>::iterator ssi;
+                       for(ssi=ufcns.begin();ssi!=ufcns.end();ssi++){
+                               if(ufcn_fcn.count((*ssi))==0){
+                                       err += "ERROR, field "+flds[f]->get_name()+" of table "+tbl_list[t]->get_tbl_name()+" has unrecognized unpacking function "+(*ssi)+"\n";
+                                       retval = 1;
+                               }
+                       }
+               }
+
+//                     annote the original source of the field -- for prefilter
+               string tbl_name = tbl_list[t]->get_tbl_name();
+               vector<field_entry *> fev = tbl_list[t]->get_fields();
+               for(f=0;f<fev.size();++f)
+                       fev[f]->set_basetable(tbl_name);
+         }
+       }
+
+       if(retval) return(retval);
+
+//             Next, build a predecessors graph.
+//             Verify that all referenced tables exist.
+
+       vector< vector<int> > predecessors;             // list of tables inherited from.
+       vector<int> n_pred;                                             // number of (remaining) predecessors.
+                                                                                       // -1 indicates a processed table.
+
+       for(t=0;t<tbl_list.size();t++){
+         if(tbl_list[t]->get_schema_type() != UNPACK_FCNS_SCHEMA){
+               vector<string> pred_tbls = tbl_list[t]->get_pred_tbls();
+               vector<int> pred_ref;
+               for(p=0;p<pred_tbls.size();p++){
+                       tref = this->get_table_ref(pred_tbls[p]);
+                       if(tref < 0){
+                               err.append("Error: table ");
+                               err.append(tbl_list[t]->get_tbl_name());
+                               err.append(" referenced non-existent table ");
+                               err.append(pred_tbls[p]);
+                               err.append("\n");
+                               return(2);
+                       }else{
+                               pred_ref.push_back(tref);
+                       }
+               }
+               predecessors.push_back(pred_ref);
+               n_pred.push_back(pred_ref.size());
+         }else{
+               vector<int> tmp_iv;
+               predecessors.push_back(tmp_iv);
+               n_pred.push_back(0);
+         }
+       }
+
+
+       int n_remaining = predecessors.size();
+       int n_total = n_remaining;
+
+//             Run through the DAG and pull off one root at a time (n_pred == 0).
+//             there might be a cycle, so iterate until n_remaining == 0.
+
+       while(n_remaining > 0){
+
+//             Find a root
+               int root;
+               for(root=0;root < n_total;root++){
+                       if(n_pred[root] == 0)
+                               break;
+               }
+               if(root == n_total){    // didn't find a root.
+                       err.append("Error : cycle in inheritance among the following tables:");
+                       int r;
+                       for(r=0;r<n_total;r++){
+                               if(n_pred[r] > 0){
+                                       err.append(" ");
+                                       err.append(tbl_list[r]->get_tbl_name());
+                               }
+                       }
+                       return(3);
+               }
+
+//                     I'd adding fields from the root table to the
+               vector<field_entry *> pred_fields = tbl_list[root]->get_fields();
+
+
+//                     Scan for all successors of the root.
+               int s, f;
+               for(s=0;s<n_total;s++){
+                       if(find((predecessors[s]).begin(), (predecessors[s]).end(), root) !=
+                                       (predecessors[s]).end() ){
+
+//                     s is a successor : add the fields from the root.
+                               for(f=0;f<pred_fields.size();f++){
+                                       retval = tbl_list[s]->add_field(pred_fields[f]);
+                                       if(retval < 0){
+                                               err.append("Warning: field ");
+                                               err.append(pred_fields[f]->get_name());
+                                               err.append(" already exists in table ");
+                                               err.append(tbl_list[s]->get_tbl_name());
+                                               err.append(" (inheriting from table ");
+                                               err.append(tbl_list[root]->get_tbl_name());
+                                               err.append(").\n");
+                                       }
+                               }
+
+//                     s has one less predecessor.
+                               n_pred[s]--;
+                       }
+               }
+
+//                     Indicate that the root has been processed.
+               n_pred[root] = -1;
+               n_remaining--;
+       }
+
+
+//                     Done!
+       return(0);
+}
+
+int table_list::add_table(table_def *td){
+       int tref = get_table_ref(td->get_tbl_name());
+       if(tref >= 0) return(tref);
+       tbl_list.push_back(td);
+       return(tbl_list.size() - 1);
+}
+
+
+
+//////////////////////////////////////////////////////
+//////////             Serialize functions.
+//////////             The deserialize fcn is the parser.
+
+
+string param_list::to_string(){
+       string retval;
+       map<string, string>::iterator mssi;
+       bool first_exec=true;
+       for(mssi=pmap.begin();mssi!=pmap.end();++mssi){
+               if(first_exec){  first_exec=false; }
+               else{ retval+=",";  }
+               retval += (*mssi).first + " ";
+               retval += (*mssi).second;
+       }
+       return(retval);
+}
+
+string field_entry::to_string(){
+       string retval = type + " " + name + " " + function;
+       if(mod_list->size() > 0){
+               retval += " ( " + mod_list->to_string() + " ) ";
+       }
+
+       return(retval);
+}
+
+
+
+
+string table_def::to_string(){
+       int q;
+       string retval;
+       switch(schema_type){
+       case PROTOCOL_SCHEMA:
+               retval = "TABLE ";
+               break;
+       case STREAM_SCHEMA:
+               retval = "STREAM ";
+               break;
+       case OPERATOR_VIEW_SCHEMA:
+               retval += "OPERATOR_VIEW ";
+               break;
+       default:
+               retval = "ERROR UNKNOWN TABLE TYPE ";
+               break;
+       }
+
+       retval += table_name + " ";
+
+       if(base_tables->size() > 0){
+               retval += "( "+base_tables->to_string() + " ) ";
+       }
+
+       retval += "{\n";
+
+       if(schema_type == OPERATOR_VIEW_SCHEMA){
+               retval += "\tOPERATOR ("+op_properties->to_string()+")\n";
+               retval += "\tFIELDS{\n";
+       }
+
+       int f;
+       for(f=0;f<fields.size();f++){
+               retval += "\t" + fields[f]->to_string() + ";\n";
+       }
+
+       if(schema_type == OPERATOR_VIEW_SCHEMA){
+               retval += "\tSUBQUERIES{\n";
+               for(q=0;q<qspec_list.size();++q){
+                       if(q>0) retval += ";\n";
+                       retval += qspec_list[q]->to_string();
+               }
+               retval += "\t}\n";
+               retval += "\tSELECTION_PUSHDOWN ("+selpush->to_string()+")\n";
+       }
+
+       
+
+       retval += "}\n";
+
+       return(retval);
+}
+
+string table_list::to_string(){
+       string retval;
+       int t;
+       for(t=0;t<tbl_list.size();t++){
+               retval += tbl_list[t]->to_string();
+               retval += "\n";
+       }
+       return(retval);
+}
diff --git a/src/ftacmp/parse_schema.h b/src/ftacmp/parse_schema.h
new file mode 100644 (file)
index 0000000..3c009ba
--- /dev/null
@@ -0,0 +1,555 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __SCHEMA_DEF_H_INCLUDED__
+#define __SCHEMA_DEF_H_INCLUDED__
+
+#include <string>
+#include <vector>
+#include <map>
+#include<set>
+
+#include <string.h>
+#include <stdlib.h>
+
+
+//             A param_list is used to represent a list of
+//             parameters with optional values.
+
+class param_list{
+private:
+       std::map< std::string, std::string > pmap;
+
+public:
+       param_list(){};
+       param_list(const char *key){
+               pmap[key]="";
+       };
+       param_list(const char *key, const char *val){
+               pmap[key]=val;
+       };
+
+       param_list *append(const char *key){
+               pmap[key]="";
+               return(this);
+       };
+       param_list *append(const char *key, const char *val){
+               pmap[key]=val;
+               return(this);
+       };
+       param_list *append( std::string key){
+               pmap[key]="";
+               return(this);
+       };
+
+       int size(){return pmap.size();};
+
+
+       bool contains_key(std::string key){
+               return(pmap.count(key)>0);
+       }
+
+       int delete_key(std::string k){
+               return pmap.erase(k);
+       }
+
+       std::string val_of(std::string key){
+               if(pmap.count(key)>0)
+                       return(pmap[key]);
+               return(std::string(""));
+       }
+
+       std::vector<std::string> get_key_vec(){
+               std::vector<std::string> retval;
+               std::map<std::string, std::string>::iterator mssi;
+               for(mssi=pmap.begin();mssi!=pmap.end();++mssi){
+                       retval.push_back( (*mssi).first );
+               }
+               return(retval);
+       }
+
+       std::string to_string();
+};
+
+
+//             list of names, order matters.
+class name_vec{
+public:
+       std::vector<std::string> svec;
+       std::vector<std::string> nvec;
+       std::vector<param_list *> pvec;
+
+       name_vec(char *c, char *n, param_list *p){
+               svec.push_back(c);
+               nvec.push_back(n);
+               if(p) pvec.push_back(p);
+               else pvec.push_back(new param_list());
+       };
+
+       name_vec *append(char *c, char *n, param_list *p){
+               svec.push_back(c);
+               nvec.push_back(n);
+               if(p) pvec.push_back(p);
+               else pvec.push_back(new param_list());
+               return this;
+       };
+};
+
+
+
+//                     A field in a STREAM or PROTOCOL
+
+
+class field_entry{
+private:
+       std::string type;                       // data type
+       std::string name;                       // name in a query
+       std::string function;           // access function, if any (PROTOCOL only).
+       param_list *mod_list;           // special properties.
+       std::set<std::string> ufcns;    // unpacking functions, if any.
+
+       std::string base_table;         // for hierarchically structured data sources,
+                                                               // the bast table where the field is defined.
+                                                               // mostly used for computing the LFTA prefilter.
+public:
+
+       field_entry(const char *t, const char *n, const char *f, param_list *plist, param_list *ulist){
+               if(plist == NULL)
+                       mod_list = new param_list();
+               else
+                       mod_list = plist;
+               if(ulist){
+                       int u;
+                       std::vector<std::string> tmp_ufl = ulist->get_key_vec();
+                       for(u=0;u<tmp_ufl.size();++u)
+                               ufcns.insert(tmp_ufl[u]);
+               }
+
+               type=t; name=n; function=f;
+               base_table = "";
+       };
+
+       field_entry(std::string t, std::string n, std::string f, param_list *plist, const std::set<std::string> &ulist){
+               if(plist == NULL)
+                       mod_list = new param_list();
+               else
+                       mod_list = plist;
+               ufcns = ulist;
+               type=t; name=n; function=f;
+               base_table = "";
+       };
+
+       field_entry(std::string n, std::string t){
+               name = n;
+               type = t;
+               mod_list = new param_list();
+       }
+
+       void add_unpack_fcns(param_list *ufl){
+               std::vector<std::string> new_ufl = ufl->get_key_vec();
+               int u;
+               for(u=0;u<new_ufl.size();++u)
+                       ufcns.insert(new_ufl[u]);
+       }
+
+
+       param_list *get_modifier_list(){return mod_list;        };
+       std::string get_type(){return(type);};
+       std::string get_name(){return(name);};
+       std::string get_fcn(){return(function);};
+       std::set<std::string> get_unpack_fcns(){
+               return ufcns;
+       }
+
+       void set_basetable(std::string b){base_table=b;};
+       std::string get_basetable(){return base_table;};
+
+       std::string to_string();
+
+       int delete_modifier(std::string k){
+               return mod_list->delete_key(k);
+       }
+       void add_modifier(const char *k, const char *v){
+               mod_list->append(k,v);
+       }
+       void add_modifier(const char *k){
+               mod_list->append(k);
+       }
+
+};
+
+
+//             list of fields.  An intermediate parse structure.
+//             it gets loaded into table_def.fields
+
+class field_entry_list{
+private:
+       std::vector<field_entry *> fl;
+
+public:
+       field_entry_list(){};
+
+       field_entry_list(field_entry *f){
+               fl.push_back(f);
+       };
+
+       field_entry_list *append_field(field_entry *f){
+               fl.push_back(f);
+               return(this);
+       };
+
+       std::vector<field_entry *> get_list(){return fl;        };
+};
+
+class subquery_spec{
+public:
+       std::string name;
+       std::vector<std::string> types;
+       std::vector<std::string> names;
+       std::vector<param_list *> modifiers;
+
+
+       subquery_spec(){}
+
+       subquery_spec(const char *n, name_vec *t){
+               name = n;
+               types = t->svec;
+               names = t->nvec;
+               modifiers = t->pvec;
+       };
+
+       std::string to_string(){
+               std::string ret = name+" (";
+               int i;
+               for(i=0;i<types.size();++i){
+                       if(i>0) ret+=", ";
+                       ret += types[i] + " " + names[i];
+                       if(modifiers[i]->size() >0){
+                               ret+=" ("+modifiers[i]->to_string()+") ";
+                       }
+               }
+               ret += ") ";
+               return(ret);
+       };
+
+       subquery_spec *duplicate(){
+               subquery_spec *ret = new subquery_spec();
+               ret->name = name;
+               ret->types = types;
+               ret->names = names;
+
+               return ret;
+       }
+
+
+
+};
+
+class subqueryspec_list{
+public:
+       std::vector<subquery_spec *> spec_list;
+
+       subqueryspec_list(subquery_spec *ss){
+               spec_list.push_back(ss);
+       };
+       subqueryspec_list *append(subquery_spec *ss){
+               spec_list.push_back(ss);
+               return this;
+       };
+};
+
+class unpack_fcn{
+public:
+       std::string name;
+       std::string fcn;
+       int cost;
+
+       unpack_fcn(const char *n, const char *f, const char *c){
+               name = n;
+               fcn = f;
+               cost = atoi(c);
+       };
+};
+
+class unpack_fcn_list{
+public:
+       std::vector<unpack_fcn *> ufcn_v;
+
+       unpack_fcn_list(unpack_fcn *u){
+               ufcn_v.push_back(u);
+       };
+
+       unpack_fcn_list *append(unpack_fcn *u){
+               ufcn_v.push_back(u);
+               return this;
+       };
+};
+
+
+
+
+//             forward definition, needed for table_def
+class table_exp_t;
+struct query_list_t;
+
+/* ============================================
+               The schema can support several different
+               flavors of table.
+                       PROTOCOL : the base data that an FTA can retrieve.
+                       STREAM : Data created by an FTA or a stream operator.
+               More to come.  Perhaps this is better handled by
+               annotations in the schema def.
+   ============================================= */
+
+#define PROTOCOL_SCHEMA 1
+#define STREAM_SCHEMA 2
+#define OPERATOR_VIEW_SCHEMA 3
+#define UNPACK_FCNS_SCHEMA 4
+
+//                     Represent a STREAM, PROTOCOL, OPERATOR_VIEW, or UNPACK_FCN list.
+
+class table_def{
+private:
+       std::string table_name;
+       std::vector<field_entry *> fields;
+       param_list *base_tables;        // if PROTOCOL, the PROTOCOLS that
+                                                               // this PROTOCOL inherits fields from.
+       int schema_type;        // STREAM_SCHEMA, PROTOCOL_SCHEMA, OPERATOR_VIEW_SCHEMA
+//             For operator_view tables
+       param_list *op_properties;
+       std::vector<subquery_spec *> qspec_list;
+       param_list *selpush;
+
+public:
+//             for unpacking function group specs.
+       std::vector<unpack_fcn *> ufcn_list;
+
+
+
+//             Unpack functions defined at the PROTOCOL level are added to
+//             PROTOCOL fields here ... implying that ony those fields
+//             explicitly defined in the PROTOCOL (as opposed to inherited)
+//             get the PROTOCOL-wide unpack functions.
+       table_def(const char *name, param_list *plist, param_list *ufcn_l, field_entry_list *fel, int sch_t){
+       int f;
+               if(plist == NULL)
+                       base_tables = new param_list();
+               else
+                       base_tables = plist;
+               table_name =name;
+               fields = fel->get_list();
+               schema_type = sch_t;
+
+//                     fields inherit table-level unpacking functions, if any.
+               if(ufcn_l){
+                       for(f=0;f<fields.size();++f)
+                               fields[f]->add_unpack_fcns(ufcn_l);
+               }
+
+               op_properties = new param_list();
+               selpush = new param_list();
+       };
+
+       table_def(const char *name, param_list *oprop, field_entry_list *fel,
+                               subqueryspec_list *ql, param_list *selp);
+
+       table_def(unpack_fcn_list *ufcn_l){
+               schema_type = UNPACK_FCNS_SCHEMA;
+               ufcn_list = ufcn_l->ufcn_v;
+       }
+
+       table_def(){};
+
+    table_def *make_shallow_copy(std::string n);
+
+       void mangle_subq_names(std::string mngl);
+
+       std::string get_tbl_name(){return table_name;   };
+       std::vector<field_entry *> get_fields(){return(fields); };
+
+       field_entry *get_field(int i){
+                       if(i>=0 && i<fields.size()) return(fields[i]);
+                       return NULL;
+       };
+
+       std::string get_field_name(int i){
+                       if(i>=0 && i<fields.size()) return(fields[i]->get_name());
+                       return "";
+       };
+
+       bool contains_field(std::string f);
+       bool contains_field(int f);
+
+       int get_field_idx(std::string f);
+       std::string get_type_name(std::string f);
+       param_list *get_modifier_list(std::string f);
+       std::string get_fcn(std::string f);
+
+       std::string get_op_prop(std::string s){
+               return op_properties->val_of(s);
+       };
+
+//             Used in generating the LFTA prefilter
+       std::string get_field_basetable(std::string f);
+
+
+       int verify_no_duplicates(std::string &err);
+       int verify_access_fcns(std::string &err);
+
+
+       std::vector<std::string> get_pred_tbls(){
+               return base_tables->get_key_vec() ;
+       };
+
+       int add_field(field_entry *fe);
+
+       int get_schema_type(){return schema_type;};
+
+       std::vector<subquery_spec *> get_subqueryspecs(){return qspec_list;};
+
+       std::string to_string();
+       std::string to_stream_string(){
+               int tmp_sch = schema_type;
+               schema_type = STREAM_SCHEMA;
+               std::string ret = this->to_string();
+               schema_type = tmp_sch;
+               return ret;
+       }
+};
+
+
+//             A Schema -- a collection of stream layout definitions.
+
+class table_list{
+private:
+       std::vector<table_def *> tbl_list;
+       //              for an unpack_fcn_list, collect from the set of
+       //              UNPACK_FCNS_SCHEMA in the table list.
+               std::map<std::string, std::string> ufcn_fcn;
+               std::map<std::string, int> ufcn_cost;
+
+
+public:
+       table_list(table_def *td){tbl_list.push_back(td);       };
+       table_list(){};
+
+       table_list *append_table(table_def *td){
+               tbl_list.push_back(td);
+               return(this);
+       };
+
+       int add_table(table_def *td);
+       table_def *get_table(int t){
+               if(t<0 || t>tbl_list.size()) return(NULL);
+               return(tbl_list[t]);
+       };
+
+       int add_duplicate_table(std::string src, std::string dest){
+               int src_pos = this->find_tbl(src);
+               if(src_pos<0)
+                       return src_pos;
+               table_def *dest_tbl = tbl_list[src_pos]->make_shallow_copy(dest);
+               tbl_list.push_back(dest_tbl);
+               return tbl_list.size()-1;
+       }
+
+       void mangle_subq_names(int pos, std::string mngl){
+               tbl_list[pos]->mangle_subq_names(mngl);
+       }
+
+
+       int size(){return tbl_list.size();};
+
+/////////////
+//             Accessor methods : get table and field info without
+//             descending into the underlying data structures.
+//             Can specify a table by name (string), or by index (int)
+//             (e.g. returned by get_table_ref)
+
+       int get_ufcn_cost(std::string fname){
+               if(ufcn_cost.count(fname))
+                       return ufcn_cost[fname];
+               else
+                       return -1;
+       }
+       std::string get_ufcn_fcn(std::string fname){
+               if(ufcn_fcn.count(fname))
+                       return ufcn_fcn[fname];
+               else
+                       return "ERROR_ufcn_fcn_of_"+fname+"_not_found";
+       }
+
+       std::string get_table_name(int i){
+               if(i>tbl_list.size()) return("");
+               else return tbl_list[i]->get_tbl_name();
+       };
+       std::vector<std::string> get_table_names();
+
+       std::vector<field_entry *> get_fields(std::string t);
+       field_entry *get_field(std::string t, int i);
+       field_entry *get_field(int t, std::string f){
+               return tbl_list[t]->get_field(tbl_list[t]->get_field_idx(f));
+       }
+       int get_field_idx(std::string t, std::string f);
+
+       int find_tbl(std::string t);
+
+       std::vector<int> get_tblref_of_field(std::string f);
+
+       int get_table_ref(std::string t);
+
+       std::string get_type_name(int t, std::string f){
+               return(tbl_list[t]->get_type_name(f));
+       };
+
+       param_list *get_modifier_list(int t, std::string f){
+               return(tbl_list[t]->get_modifier_list(f));
+       };
+
+       std::string get_fcn(int t, std::string f){
+               return(tbl_list[t]->get_fcn(f));
+       };
+
+       int get_schema_type(int t){
+               return(tbl_list[t]->get_schema_type());
+       };
+
+       std::string get_op_prop(int t, std::string s){
+               return(tbl_list[t]->get_op_prop(s));
+       };
+
+       std::vector<subquery_spec *> get_subqueryspecs(int t){
+               return tbl_list[t]->get_subqueryspecs();
+       };
+
+
+//             Used in generating the LFTA prefilter
+       std::string get_basetbl_name(int t, std::string f){
+               return(tbl_list[t]->get_field_basetable(f));
+       };
+
+       bool contains_field(int t, std::string f){
+               return(tbl_list[t]->contains_field(f));
+       };
+
+
+//////////////
+//             Additional methods
+
+//                     Process field inheritance for PROTOCOL tables.
+       int unroll_tables(std::string &err);
+
+       std::string to_string();
+};
+#endif
diff --git a/src/ftacmp/partn.l b/src/ftacmp/partn.l
new file mode 100644 (file)
index 0000000..ab8a883
--- /dev/null
@@ -0,0 +1,217 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+/*
+       MUST COMPILE WITH
+               flex -PPartnParser -opartnlexer.cc partn.l
+       (or equivalent).
+*/     
+
+%{
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_partn.h"
+ #include <string.h>
+
+
+
+#include "partn.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int PartnParserwrap(){return(1);}
+
+extern int PartnParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_partn_lineno : the line currently being parsed when the error occurs.
+               flex_partn_ch : the character on the line where the error occurs
+               flex_partn_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_partn_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_partn_lineno = 1;
+int flex_partn_ch = 0;
+char flex_partn_linebuf[20000];
+
+char *flex_partn_stringinput = NULL;
+int flex_partn_stringinput_ptr = 0;
+FILE *flex_partn_fileinput = NULL;
+int my_PartnParser_yyinput(char *buf, int max_size);
+
+
+
+void PartnParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_partn_lineno, flex_partn_ch, s, PartnParsertext, flex_partn_linebuf );
+    for(i=0;i<flex_partn_ch;i++){
+               if(flex_partn_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_partn_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_PartnParser_yyinput(b,ms))
+
+%}
+       /* MKS needs the next line to increase the NFA table */
+%e 1200
+%option noyywrap
+
+%%
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+HEX    { flex_partn_ch+=PartnParserleng; return HEX_L;}
+LHEX   { flex_partn_ch+=PartnParserleng; return LHEX_L;}
+IP_VAL { flex_partn_ch+=PartnParserleng; return IP_L;}
+
+
+
+       /* punctuation */
+
+[;%&|!+*/:(),.\[\]$@#] { flex_partn_ch+=PartnParserleng; return yytext[0]; }
+"-"    { flex_partn_ch+=PartnParserleng; return yytext[0]; }
+"~"    { flex_partn_ch+=PartnParserleng; return yytext[0]; }
+
+       /* names */
+
+[A-Za-z_][A-Za-z0-9_]* { flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext); return NAME; }
+
+       /* numbers */
+
+[0-9]+ |
+[0-9]+UL       { flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext);  return INTNUM; }
+
+[0-9]+ULL      { flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext);  return LONGINTNUM; }
+
+
+       /* strings */
+
+ /*                                                                                                                    */
+ /*            Newline : advance the error reporting line number       */
+ /*            and grab the next line into flex_partn_linebuf                  */
+ /*                                                                                                                    */
+
+\n.*           {flex_partn_ch=0; flex_partn_lineno++;
+                          strcpy(flex_partn_linebuf,PartnParsertext+1);
+                          yyless(1);
+                          }
+
+[ \t\r]+       {flex_partn_ch+=PartnParserleng; }      /* white space */
+
+"--".*$                {flex_partn_ch+=PartnParserleng; };     /* comment */
+"//".*$                {flex_partn_ch+=PartnParserleng; };     /* comment */
+
+.|\n            {flex_partn_ch+=PartnParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  PartnParsererror(yytext);}
+
+%%
+
+int my_PartnParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_partn_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_partn_stringinput[flex_partn_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_partn_stringinput[flex_partn_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_partn_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_partn_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void PartnParser_setfileinput(FILE *f){
+       PartnParserrestart(NULL);
+
+       flex_partn_fileinput = f;
+       flex_partn_stringinput = NULL;
+       flex_partn_lineno = 1;
+       flex_partn_ch = 0;
+}
+
+void PartnParser_setstringinput(char *s){
+       PartnParserrestart(NULL);
+
+       flex_partn_fileinput = NULL;
+       flex_partn_stringinput = s;
+       flex_partn_stringinput_ptr = 0;
+       flex_partn_lineno = 1;
+       flex_partn_ch = 0;
+}
+       
+               
+
+
diff --git a/src/ftacmp/partn.tab.cc b/src/ftacmp/partn.tab.cc
new file mode 100644 (file)
index 0000000..cad33d2
--- /dev/null
@@ -0,0 +1,1342 @@
+/* A Bison parser, made from partn.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON        1
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* If NAME_PREFIX is specified substitute the variables and functions
+   names.  */
+#define yyparse PartnParserparse
+#define yylex   PartnParserlex
+#define yyerror PartnParsererror
+#define yylval  PartnParserlval
+#define yychar  PartnParserchar
+#define yydebug PartnParserdebug
+#define yynerrs PartnParsernerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259,
+     INTNUM = 260,
+     LONGINTNUM = 261,
+     UMINUS = 262,
+     HEX_L = 263,
+     LHEX_L = 264,
+     IP_L = 265
+   };
+#endif
+#define NAME 258
+#define STRING_TOKEN 259
+#define INTNUM 260
+#define LONGINTNUM 261
+#define UMINUS 262
+#define HEX_L 263
+#define LHEX_L 264
+#define IP_L 265
+
+
+
+
+/* Copy the first part of user declarations.  */
+#line 8 "partn.y"
+
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "parse_partn.h"
+
+extern partn_def_list_t *partn_parse_result;
+
+
+#define YYDEBUG 1
+
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#ifndef YYSTYPE
+#line 34 "partn.y"
+typedef union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+/*                     for FTA definition.     */
+       literal_t *litval;
+       scalarexp_t *scalarval;
+       se_list_t *se_listval;
+       colref_t *colref;
+       partn_def_list_t *pdl;
+       partn_def_t *pd;
+} yystype;
+/* Line 193 of /usr/local/share/bison/yacc.c.  */
+#line 140 "partn.tab.cc"
+# define YYSTYPE yystype
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+#ifndef YYLTYPE
+typedef struct yyltype
+{
+  int first_line;
+  int first_column;
+  int last_line;
+  int last_column;
+} yyltype;
+# define YYLTYPE yyltype
+# define YYLTYPE_IS_TRIVIAL 1
+#endif
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 213 of /usr/local/share/bison/yacc.c.  */
+#line 161 "partn.tab.cc"
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
+#    define YYSTACK_ALLOC alloca
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
+      + YYSTACK_GAP_MAX)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         register YYSIZE_T yyi;                \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];    \
+       }                                       \
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;   \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  6
+#define YYLAST   55
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  23
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  8
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  24
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  47
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   265
+
+#define YYTRANSLATE(X) \
+  ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     8,     2,
+      20,    21,    11,     9,    22,    10,     2,    12,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    19,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,    17,     2,    18,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     7,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,    13,    14,    15,    16
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned char yyprhs[] =
+{
+       0,     0,     3,     5,     7,    10,    19,    23,    27,    31,
+      35,    39,    43,    46,    49,    51,    53,    57,    59,    63,
+      65,    67,    70,    73,    76
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      24,     0,    -1,    25,    -1,    26,    -1,    25,    26,    -1,
+       3,    17,     3,    18,    19,    20,    28,    21,    -1,    27,
+       9,    27,    -1,    27,    10,    27,    -1,    27,     7,    27,
+      -1,    27,    11,    27,    -1,    27,    12,    27,    -1,    27,
+       8,    27,    -1,     9,    27,    -1,    10,    27,    -1,    29,
+      -1,    30,    -1,    20,    27,    21,    -1,    27,    -1,    28,
+      22,    27,    -1,     5,    -1,     6,    -1,    14,     4,    -1,
+      15,     4,    -1,    16,     4,    -1,     3,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned char yyrline[] =
+{
+       0,    75,    75,    81,    83,    86,    91,    93,    94,    95,
+      96,    97,    98,    99,   100,   101,   102,   105,   107,   110,
+     112,   113,   114,   115,   119
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "NAME", "STRING_TOKEN", "INTNUM", 
+  "LONGINTNUM", "'|'", "'&'", "'+'", "'-'", "'*'", "'/'", "UMINUS", 
+  "HEX_L", "LHEX_L", "IP_L", "'['", "']'", "':'", "'('", "')'", "','", 
+  "$accept", "parse_result", "partn_def_list", "partn_def", "scalar_exp", 
+  "scalar_exp_commalist", "literal", "column_ref", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   124,    38,    43,
+      45,    42,    47,   262,   263,   264,   265,    91,    93,    58,
+      40,    41,    44
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,    23,    24,    25,    25,    26,    27,    27,    27,    27,
+      27,    27,    27,    27,    27,    27,    27,    28,    28,    29,
+      29,    29,    29,    29,    30
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     1,     1,     2,     8,     3,     3,     3,     3,
+       3,     3,     2,     2,     1,     1,     3,     1,     3,     1,
+       1,     2,     2,     2,     1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       0,     0,     0,     2,     3,     0,     1,     4,     0,     0,
+       0,     0,    24,    19,    20,     0,     0,     0,     0,     0,
+       0,    17,     0,    14,    15,    12,    13,    21,    22,    23,
+       0,     0,     0,     0,     0,     0,     0,     5,     0,    16,
+       8,    11,     6,     7,     9,    10,    18
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+      -1,     2,     3,     4,    21,    22,    23,    24
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -20
+static const yysigned_char yypact[] =
+{
+       1,    13,    31,     1,   -20,    29,   -20,   -20,    18,    32,
+      17,    19,   -20,   -20,   -20,    19,    19,    34,    48,    49,
+      19,    -1,   -19,   -20,   -20,   -20,   -20,   -20,   -20,   -20,
+      33,    19,    19,    19,    19,    19,    19,   -20,    19,   -20,
+      38,     3,    15,    15,   -20,   -20,    -1
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yysigned_char yypgoto[] =
+{
+     -20,   -20,   -20,    52,   -15,   -20,   -20,   -20
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, parse error.  */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+      25,    26,    37,    38,     1,    30,    31,    32,    33,    34,
+      35,    36,    33,    34,    35,    36,    40,    41,    42,    43,
+      44,    45,    12,    46,    13,    14,    35,    36,    15,    16,
+       5,     6,     8,    17,    18,    19,     9,    11,    27,    20,
+      31,    32,    33,    34,    35,    36,    32,    33,    34,    35,
+      36,    10,    28,    29,    39,     7
+};
+
+static const unsigned char yycheck[] =
+{
+      15,    16,    21,    22,     3,    20,     7,     8,     9,    10,
+      11,    12,     9,    10,    11,    12,    31,    32,    33,    34,
+      35,    36,     3,    38,     5,     6,    11,    12,     9,    10,
+      17,     0,     3,    14,    15,    16,    18,    20,     4,    20,
+       7,     8,     9,    10,    11,    12,     8,     9,    10,    11,
+      12,    19,     4,     4,    21,     3
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,     3,    24,    25,    26,    17,     0,    26,     3,    18,
+      19,    20,     3,     5,     6,     9,    10,    14,    15,    16,
+      20,    27,    28,    29,    30,    27,    27,     4,     4,     4,
+      27,     7,     8,     9,    10,    11,    12,    21,    22,    21,
+      27,    27,    27,    27,    27,    27,    27
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT                goto yyabortlab
+#define YYERROR                goto yyerrlab1
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL         goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");                        \
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)           \
+  Current.first_line   = Rhs[1].first_line;      \
+  Current.first_column = Rhs[1].first_column;    \
+  Current.last_line    = Rhs[N].last_line;       \
+  Current.last_column  = Rhs[N].last_column;
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#define YYLEX  yylex ()
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+# define YYDSYMPRINT(Args)                     \
+do {                                           \
+  if (yydebug)                                 \
+    yysymprint Args;                           \
+} while (0)
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+\f
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+\f
+
+#if YYDEBUG
+/*-----------------------------.
+| Print this symbol on YYOUT.  |
+`-----------------------------*/
+
+static void
+#if defined (__STDC__) || defined (__cplusplus)
+yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue)
+#else
+yysymprint (yyout, yytype, yyvalue)
+    FILE* yyout;
+    int yytype;
+    YYSTYPE yyvalue;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvalue;
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyout, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+      YYPRINT (yyout, yytoknum[yytype], yyvalue);
+# endif
+    }
+  else
+    YYFPRINTF (yyout, "nterm %s (", yytname[yytype]);
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyout, ")");
+}
+#endif /* YYDEBUG. */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+static void
+#if defined (__STDC__) || defined (__cplusplus)
+yydestruct (int yytype, YYSTYPE yyvalue)
+#else
+yydestruct (yytype, yyvalue)
+    int yytype;
+    YYSTYPE yyvalue;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvalue;
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+}
+
+\f
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
+# else
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of parse errors so far.  */
+int yynerrs;
+
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule.  */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+
+                   &yystacksize);
+
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with.  */
+
+  if (yychar <= 0)             /* This means end of input.  */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more.  */
+
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE (yychar);
+
+      /* We have to keep this `#if YYDEBUG', since we use variables
+        which are defined only if `YYDEBUG' is set.  */
+      YYDPRINTF ((stderr, "Next token is "));
+      YYDSYMPRINT ((stderr, yychar1, yylval));
+      YYDPRINTF ((stderr, "\n"));
+    }
+
+  /* If the proper action on seeing token YYCHAR1 is to reduce or to
+     detect an error, take that action.  */
+  yyn += yychar1;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+             yychar, yytname[yychar1]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+
+#if YYDEBUG
+  /* We have to keep this `#if YYDEBUG', since we use variables which
+     are defined only if `YYDEBUG' is set.  */
+  if (yydebug)
+    {
+      int yyi;
+
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+                yyn - 1, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++)
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+  switch (yyn)
+    {
+        case 2:
+#line 75 "partn.y"
+    {
+               partn_parse_result = yyvsp[0].pdl;
+       }
+    break;
+
+  case 3:
+#line 82 "partn.y"
+    {yyval.pdl = new partn_def_list_t(yyvsp[0].pd);}
+    break;
+
+  case 4:
+#line 83 "partn.y"
+    {yyval.pdl=yyvsp[-1].pdl->append(yyvsp[0].pd);}
+    break;
+
+  case 5:
+#line 88 "partn.y"
+    {yyval.pd = new partn_def_t(yyvsp[-7].strval,yyvsp[-5].strval,yyvsp[-1].se_listval);}
+    break;
+
+  case 6:
+#line 92 "partn.y"
+    { yyval.scalarval=new scalarexp_t("+",yyvsp[-2].scalarval,yyvsp[0].scalarval);}
+    break;
+
+  case 7:
+#line 93 "partn.y"
+    { yyval.scalarval=new scalarexp_t("-",yyvsp[-2].scalarval,yyvsp[0].scalarval);}
+    break;
+
+  case 8:
+#line 94 "partn.y"
+    { yyval.scalarval=new scalarexp_t("|",yyvsp[-2].scalarval,yyvsp[0].scalarval);}
+    break;
+
+  case 9:
+#line 95 "partn.y"
+    { yyval.scalarval=new scalarexp_t("*",yyvsp[-2].scalarval,yyvsp[0].scalarval);}
+    break;
+
+  case 10:
+#line 96 "partn.y"
+    { yyval.scalarval=new scalarexp_t("/",yyvsp[-2].scalarval,yyvsp[0].scalarval);}
+    break;
+
+  case 11:
+#line 97 "partn.y"
+    { yyval.scalarval=new scalarexp_t("&",yyvsp[-2].scalarval,yyvsp[0].scalarval);}
+    break;
+
+  case 12:
+#line 98 "partn.y"
+    { yyval.scalarval = new scalarexp_t("+",yyvsp[0].scalarval);}
+    break;
+
+  case 13:
+#line 99 "partn.y"
+    { yyval.scalarval = new scalarexp_t("-",yyvsp[0].scalarval);}
+    break;
+
+  case 14:
+#line 100 "partn.y"
+    { yyval.scalarval= new scalarexp_t(yyvsp[0].litval);}
+    break;
+
+  case 15:
+#line 101 "partn.y"
+    { yyval.scalarval = new scalarexp_t(yyvsp[0].colref);}
+    break;
+
+  case 16:
+#line 102 "partn.y"
+    {yyval.scalarval = yyvsp[-1].scalarval;}
+    break;
+
+  case 17:
+#line 106 "partn.y"
+    {  yyval.se_listval= new se_list_t(yyvsp[0].scalarval); }
+    break;
+
+  case 18:
+#line 107 "partn.y"
+    { yyval.se_listval=yyvsp[-2].se_listval->append(yyvsp[0].scalarval); }
+    break;
+
+  case 19:
+#line 111 "partn.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_INT);}
+    break;
+
+  case 20:
+#line 112 "partn.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_LONGINT);}
+    break;
+
+  case 21:
+#line 113 "partn.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_HEX);}
+    break;
+
+  case 22:
+#line 114 "partn.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_LONGHEX);}
+    break;
+
+  case 23:
+#line 115 "partn.y"
+    {yyval.litval = new literal_t(yyvsp[0].strval,LITERAL_IP);}
+    break;
+
+  case 24:
+#line 120 "partn.y"
+    {yyval.colref = new colref_t(yyvsp[0].strval); }
+    break;
+
+
+    }
+
+/* Line 1016 of /usr/local/share/bison/yacc.c.  */
+#line 1121 "partn.tab.cc"
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         int yytype = YYTRANSLATE (yychar);
+         char *yymsg;
+         int yyx, yycount;
+
+         yycount = 0;
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         for (yyx = yyn < 0 ? -yyn : 0;
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+           if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen (yytname[yytype]);
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[yytype]);
+
+             if (yycount < 5)
+               {
+                 yycount = 0;
+                 for (yyx = yyn < 0 ? -yyn : 0;
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));
+                      yyx++)
+                   if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+                     {
+                       const char *yyq = ! yycount ? ", expecting " : " or ";
+                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yycount++;
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exhausted");
+       }
+      else
+#endif /* YYERROR_VERBOSE */
+       yyerror ("parse error");
+    }
+  goto yyerrlab1;
+
+
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action.  |
+`----------------------------------------------------*/
+yyerrlab1:
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      /* Return failure if at end of input.  */
+      if (yychar == YYEOF)
+        {
+         /* Pop the error token.  */
+          YYPOPSTACK;
+         /* Pop the rest of the stack.  */
+         while (yyssp > yyss)
+           {
+             YYDPRINTF ((stderr, "Error: popping "));
+             YYDSYMPRINT ((stderr,
+                           yystos[*yyssp],
+                           *yyvsp));
+             YYDPRINTF ((stderr, "\n"));
+             yydestruct (yystos[*yyssp], *yyvsp);
+             YYPOPSTACK;
+           }
+         YYABORT;
+        }
+
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+                 yychar, yytname[yychar1]));
+      yydestruct (yychar1, yylval);
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+
+  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+       {
+         yyn += YYTERROR;
+         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+           {
+             yyn = yytable[yyn];
+             if (0 < yyn)
+               break;
+           }
+       }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+       YYABORT;
+
+      YYDPRINTF ((stderr, "Error: popping "));
+      YYDSYMPRINT ((stderr,
+                   yystos[*yyssp], *yyvsp));
+      YYDPRINTF ((stderr, "\n"));
+
+      yydestruct (yystos[yystate], *yyvsp);
+      yyvsp--;
+      yystate = *--yyssp;
+
+
+#if YYDEBUG
+      if (yydebug)
+       {
+         short *yyssp1 = yyss - 1;
+         YYFPRINTF (stderr, "Error: state stack now");
+         while (yyssp1 != yyssp)
+           YYFPRINTF (stderr, " %d", *++yyssp1);
+         YYFPRINTF (stderr, "\n");
+       }
+#endif
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+
+
+#line 124 "partn.y"
+
+
+
diff --git a/src/ftacmp/partn.tab.cc.h b/src/ftacmp/partn.tab.cc.h
new file mode 100644 (file)
index 0000000..1daa3bc
--- /dev/null
@@ -0,0 +1,82 @@
+/* A Bison parser, made from partn.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef BISON_PARTN_TAB_CC_H
+# define BISON_PARTN_TAB_CC_H
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259,
+     INTNUM = 260,
+     LONGINTNUM = 261,
+     UMINUS = 262,
+     HEX_L = 263,
+     LHEX_L = 264,
+     IP_L = 265
+   };
+#endif
+#define NAME 258
+#define STRING_TOKEN 259
+#define INTNUM 260
+#define LONGINTNUM 261
+#define UMINUS 262
+#define HEX_L 263
+#define LHEX_L 264
+#define IP_L 265
+
+
+
+
+#ifndef YYSTYPE
+#line 34 "partn.y"
+typedef union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+/*                     for FTA definition.     */
+       literal_t *litval;
+       scalarexp_t *scalarval;
+       se_list_t *se_listval;
+       colref_t *colref;
+       partn_def_list_t *pdl;
+       partn_def_t *pd;
+} yystype;
+/* Line 1281 of /usr/local/share/bison/yacc.c.  */
+#line 75 "partn.tab.cc.h"
+# define YYSTYPE yystype
+#endif
+
+extern YYSTYPE PartnParserlval;
+
+
+#endif /* not BISON_PARTN_TAB_CC_H */
+
diff --git a/src/ftacmp/partn.y b/src/ftacmp/partn.y
new file mode 100644 (file)
index 0000000..d394b1d
--- /dev/null
@@ -0,0 +1,140 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+       MUST COMPILE WITH
+   bison --verbose --defines=partn.tab.cc.h -p PartnParser  -o partn.tab.cc partn.y
+
+        (or equivalent).
+*/
+
+%{
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "parse_partn.h"
+
+extern partn_def_list_t *partn_parse_result;
+
+
+#define YYDEBUG 1
+
+%}
+
+
+       /* symbolic tokens */
+
+%union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+/*                     for FTA definition.     */
+       literal_t *litval;
+       scalarexp_t *scalarval;
+       se_list_t *se_listval;
+       colref_t *colref;
+       partn_def_list_t *pdl;
+       partn_def_t *pd;
+}
+
+%token <strval> NAME
+%token <strval> STRING_TOKEN
+%token <strval> INTNUM
+%token <strval> LONGINTNUM
+
+/*                     for FTA definition.     */
+%type <litval> literal
+%type <colref> column_ref
+%type <scalarval> scalar_exp
+%type <se_listval> scalar_exp_commalist
+%type <pdl> partn_def_list
+%type <pd> partn_def
+
+%left '|'
+%left '&'
+%left '+' '-'
+%left '*' '/' 
+%nonassoc UMINUS
+
+       /* literal keyword tokens */
+%token HEX_L LHEX_L IP_L
+
+
+%%
+
+/*                     Union of possible results       */
+parse_result:  partn_def_list  {
+               partn_parse_result = $1;
+       }
+       ;
+
+
+partn_def_list:
+       partn_def       {$$ = new partn_def_list_t($1);}
+       | partn_def_list partn_def      {$$=$1->append($2);}
+       ;
+
+partn_def:
+       NAME '[' NAME ']' ':' '(' scalar_exp_commalist ')'
+               {$$ = new partn_def_t($1,$3,$7);}
+       ;
+
+scalar_exp:
+               scalar_exp '+' scalar_exp       { $$=new scalarexp_t("+",$1,$3);}
+       |       scalar_exp '-' scalar_exp       { $$=new scalarexp_t("-",$1,$3);}
+       |       scalar_exp '|' scalar_exp       { $$=new scalarexp_t("|",$1,$3);}
+       |       scalar_exp '*' scalar_exp       { $$=new scalarexp_t("*",$1,$3);}
+       |       scalar_exp '/' scalar_exp       { $$=new scalarexp_t("/",$1,$3);}
+       |       scalar_exp '&' scalar_exp       { $$=new scalarexp_t("&",$1,$3);}
+       |       '+' scalar_exp %prec UMINUS     { $$ = new scalarexp_t("+",$2);}
+       |       '-' scalar_exp %prec UMINUS     { $$ = new scalarexp_t("-",$2);}
+       |       literal { $$= new scalarexp_t($1);}
+       |       column_ref { $$ = new scalarexp_t($1);}
+       |       '(' scalar_exp ')'      {$$ = $2;}
+       ;
+
+scalar_exp_commalist:
+               scalar_exp      {       $$= new se_list_t($1); }
+       |       scalar_exp_commalist ',' scalar_exp     { $$=$1->append($3); }
+       ;
+
+literal:
+               INTNUM          {$$ = new literal_t($1,LITERAL_INT);}
+       |       LONGINTNUM              {$$ = new literal_t($1,LITERAL_LONGINT);}
+       |       HEX_L  STRING_TOKEN     {$$ = new literal_t($2,LITERAL_HEX);}
+       |       LHEX_L  STRING_TOKEN    {$$ = new literal_t($2,LITERAL_LONGHEX);}
+       |       IP_L  STRING_TOKEN      {$$ = new literal_t($2,LITERAL_IP);}
+       ;
+
+
+column_ref:
+               NAME    {$$ = new colref_t($1); }
+       ;
+
+
+%%
+
diff --git a/src/ftacmp/partnlexer.cc b/src/ftacmp/partnlexer.cc
new file mode 100644 (file)
index 0000000..7ad3487
--- /dev/null
@@ -0,0 +1,1773 @@
+#define yy_create_buffer PartnParser_create_buffer
+#define yy_delete_buffer PartnParser_delete_buffer
+#define yy_scan_buffer PartnParser_scan_buffer
+#define yy_scan_string PartnParser_scan_string
+#define yy_scan_bytes PartnParser_scan_bytes
+#define yy_flex_debug PartnParser_flex_debug
+#define yy_init_buffer PartnParser_init_buffer
+#define yy_flush_buffer PartnParser_flush_buffer
+#define yy_load_buffer_state PartnParser_load_buffer_state
+#define yy_switch_to_buffer PartnParser_switch_to_buffer
+#define yyin PartnParserin
+#define yyleng PartnParserleng
+#define yylex PartnParserlex
+#define yyout PartnParserout
+#define yyrestart PartnParserrestart
+#define yytext PartnParsertext
+
+#line 19 "partnlexer.cc"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /cvsroot/gscpv4/src/ftacmp/partnlexer.cc,v 1.1.1.1 2013/12/02 17:44:57 spatsch Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <unistd.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yyleng = (int) (yy_cp - yy_bp); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 16
+#define YY_END_OF_BUFFER 17
+static yyconst short int yy_accept[40] =
+    {   0,
+        0,    0,   17,   15,   12,   11,    4,    5,    4,    8,
+        7,    7,    7,    7,    6,   12,   11,    0,    0,    8,
+        0,    7,    7,    7,    7,    0,   13,    0,   14,    9,
+        1,    7,    7,   10,    7,    2,    7,    3,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    4,    1,    4,    4,    4,    4,    1,    4,
+        4,    4,    4,    4,    5,    4,    6,    7,    7,    7,
+        7,    7,    7,    7,    7,    7,    7,    4,    4,    1,
+        1,    1,    1,    4,    8,    9,    9,    9,   10,    9,
+        9,   11,   12,    9,    9,   13,    9,    9,    9,   14,
+        9,    9,    9,    9,   15,   16,    9,   17,    9,    9,
+        4,    1,    4,    1,   18,    1,    9,    9,    9,    9,
+
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,    9,    9,    9,
+        9,    9,    1,    4,    1,   19,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[20] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    1
+    } ;
+
+static yyconst short int yy_base[44] =
+    {   0,
+        0,    0,   53,   54,   50,    0,   54,   46,   44,   13,
+        0,   39,   34,   36,   54,   44,    0,   42,   41,   14,
+       30,    0,   25,   23,   30,   36,   54,   28,   54,   14,
+        0,   10,    8,   54,   16,    0,   10,    0,   54,   29,
+       19,   32,   35
+    } ;
+
+static yyconst short int yy_def[44] =
+    {   0,
+       39,    1,   39,   39,   39,   40,   39,   39,   39,   39,
+       41,   41,   41,   41,   39,   39,   40,   42,   43,   39,
+       39,   41,   41,   41,   41,   42,   39,   43,   39,   39,
+       41,   41,   41,   39,   41,   41,   41,   41,    0,   39,
+       39,   39,   39
+    } ;
+
+static yyconst short int yy_nxt[74] =
+    {   0,
+        4,    5,    6,    7,    8,    9,   10,   11,   11,   11,
+       12,   13,   14,   11,   11,   11,   11,   11,   15,   20,
+       20,   22,   38,   37,   36,   35,   34,   21,   21,   17,
+       29,   17,   26,   26,   26,   28,   28,   28,   27,   33,
+       32,   31,   30,   29,   27,   16,   25,   24,   23,   19,
+       18,   16,   39,    3,   39,   39,   39,   39,   39,   39,
+       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
+       39,   39,   39
+    } ;
+
+static yyconst short int yy_chk[74] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,   10,
+       20,   41,   37,   35,   33,   32,   30,   10,   20,   40,
+       28,   40,   42,   42,   42,   43,   43,   43,   26,   25,
+       24,   23,   21,   19,   18,   16,   14,   13,   12,    9,
+        8,    5,    3,   39,   39,   39,   39,   39,   39,   39,
+       39,   39,   39,   39,   39,   39,   39,   39,   39,   39,
+       39,   39,   39
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "partn.l"
+#define INITIAL 0
+/*
+       MUST COMPILE WITH
+               flex -PPartnParser -opartnlexer.cc partn.l
+       (or equivalent).
+*/     
+#line 9 "partn.l"
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_partn.h"
+ #include <string.h>
+
+
+
+#include "partn.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int PartnParserwrap(){return(1);}
+
+extern int PartnParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_partn_lineno : the line currently being parsed when the error occurs.
+               flex_partn_ch : the character on the line where the error occurs
+               flex_partn_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_partn_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_partn_lineno = 1;
+int flex_partn_ch = 0;
+char flex_partn_linebuf[20000];
+
+char *flex_partn_stringinput = NULL;
+int flex_partn_stringinput_ptr = 0;
+FILE *flex_partn_fileinput = NULL;
+int my_PartnParser_yyinput(char *buf, int max_size);
+
+
+
+void PartnParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_partn_lineno, flex_partn_ch, s, PartnParsertext, flex_partn_linebuf );
+    for(i=0;i<flex_partn_ch;i++){
+               if(flex_partn_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_partn_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_PartnParser_yyinput(b,ms))
+
+/* MKS needs the next line to increase the NFA table */
+#line 491 "partnlexer.cc"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( yy_current_buffer->yy_is_interactive ) \
+               { \
+               int c = '*', n; \
+               for ( n = 0; n < max_size && \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+                       buf[n] = (char) c; \
+               if ( c == '\n' ) \
+                       buf[n++] = (char) c; \
+               if ( c == EOF && ferror( yyin ) ) \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+               result = n; \
+               } \
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+                 && ferror( yyin ) ) \
+               YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+       YY_USER_ACTION
+
+YY_DECL
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp = NULL, *yy_bp = NULL;
+       register int yy_act;
+
+#line 88 "partn.l"
+
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+#line 661 "partnlexer.cc"
+
+       if ( yy_init )
+               {
+               yy_init = 0;
+
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! yy_start )
+                       yy_start = 1;   /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( ! yy_current_buffer )
+                       yy_current_buffer =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+
+               yy_load_buffer_state();
+               }
+
+       while ( 1 )             /* loops until end-of-file is reached */
+               {
+               yy_cp = yy_c_buf_p;
+
+               /* Support of yytext. */
+               *yy_cp = yy_hold_char;
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = yy_start;
+yy_match:
+               do
+                       {
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               yy_last_accepting_state = yy_current_state;
+                               yy_last_accepting_cpos = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 40 )
+                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 54 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+               if ( yy_act == 0 )
+                       { /* have to back up */
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       yy_act = yy_accept[yy_current_state];
+                       }
+
+               YY_DO_BEFORE_ACTION;
+
+
+do_action:     /* This label is used only to access EOF actions. */
+
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = yy_hold_char;
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 106 "partn.l"
+{ flex_partn_ch+=PartnParserleng; return HEX_L;}
+       YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 107 "partn.l"
+{ flex_partn_ch+=PartnParserleng; return LHEX_L;}
+       YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 108 "partn.l"
+{ flex_partn_ch+=PartnParserleng; return IP_L;}
+       YY_BREAK
+/* punctuation */
+case 4:
+YY_RULE_SETUP
+#line 114 "partn.l"
+{ flex_partn_ch+=PartnParserleng; return yytext[0]; }
+       YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 115 "partn.l"
+{ flex_partn_ch+=PartnParserleng; return yytext[0]; }
+       YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 116 "partn.l"
+{ flex_partn_ch+=PartnParserleng; return yytext[0]; }
+       YY_BREAK
+/* names */
+case 7:
+YY_RULE_SETUP
+#line 120 "partn.l"
+{ flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext); return NAME; }
+       YY_BREAK
+/* numbers */
+case 8:
+#line 125 "partn.l"
+case 9:
+YY_RULE_SETUP
+#line 125 "partn.l"
+{ flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext);  return INTNUM; }
+       YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 127 "partn.l"
+{ flex_partn_ch+=PartnParserleng; PartnParserlval.strval = strdup(yytext);  return LONGINTNUM; }
+       YY_BREAK
+/* strings */
+/*                                                                                                                     */
+/*             Newline : advance the error reporting line number       */
+/*             and grab the next line into flex_partn_linebuf                  */
+/*                                                                                                                     */
+case 11:
+YY_RULE_SETUP
+#line 137 "partn.l"
+{flex_partn_ch=0; flex_partn_lineno++;
+                          strcpy(flex_partn_linebuf,PartnParsertext+1);
+                          yyless(1);
+                          }
+       YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 142 "partn.l"
+{flex_partn_ch+=PartnParserleng; }     /* white space */
+       YY_BREAK
+case 13:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 144 "partn.l"
+{flex_partn_ch+=PartnParserleng; };    /* comment */
+       YY_BREAK
+case 14:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 145 "partn.l"
+{flex_partn_ch+=PartnParserleng; };    /* comment */
+       YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 147 "partn.l"
+{flex_partn_ch+=PartnParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  PartnParsererror(yytext);}
+       YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 149 "partn.l"
+ECHO;
+       YY_BREAK
+#line 838 "partnlexer.cc"
+case YY_STATE_EOF(INITIAL):
+       yyterminate();
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = yy_hold_char;
+               YY_RESTORE_YY_MORE_OFFSET
+
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between yy_current_buffer and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       yy_n_chars = yy_current_buffer->yy_n_chars;
+                       yy_current_buffer->yy_input_file = yyin;
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state();
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++yy_c_buf_p;
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                               yy_cp = yy_c_buf_p;
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer() )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               yy_did_buffer_switch_on_eof = 0;
+
+                               if ( yywrap() )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               yy_c_buf_p =
+                                       yytext_ptr + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               yy_c_buf_p =
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+       {
+       register char *dest = yy_current_buffer->yy_ch_buf;
+       register char *source = yytext_ptr;
+       register int number_to_move, i;
+       int ret_val;
+
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( yy_current_buffer->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a single character, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+       else
+               {
+               int num_to_read =
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+                       YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = yy_current_buffer;
+
+                       int yy_c_buf_p_offset =
+                               (int) (yy_c_buf_p - b->yy_ch_buf);
+
+                       if ( b->yy_is_our_buffer )
+                               {
+                               int new_size = b->yy_buf_size * 2;
+
+                               if ( new_size <= 0 )
+                                       b->yy_buf_size += b->yy_buf_size / 8;
+                               else
+                                       b->yy_buf_size *= 2;
+
+                               b->yy_ch_buf = (char *)
+                                       /* Include room in for 2 EOB chars. */
+                                       yy_flex_realloc( (void *) b->yy_ch_buf,
+                                                        b->yy_buf_size + 2 );
+                               }
+                       else
+                               /* Can't grow it, we don't own it. */
+                               b->yy_ch_buf = 0;
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = yy_current_buffer->yy_buf_size -
+                                               number_to_move - 1;
+#endif
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+                       yy_n_chars, num_to_read );
+
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       if ( yy_n_chars == 0 )
+               {
+               if ( number_to_move == YY_MORE_ADJ )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       yy_current_buffer->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       yy_n_chars += number_to_move;
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+       return ret_val;
+       }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp;
+
+       yy_current_state = yy_start;
+
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+               {
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       yy_last_accepting_state = yy_current_state;
+                       yy_last_accepting_cpos = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 40 )
+                               yy_c = yy_meta[(unsigned int) yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+               }
+
+       return yy_current_state;
+       }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+       {
+       register int yy_is_jam;
+       register char *yy_cp = yy_c_buf_p;
+
+       register YY_CHAR yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               yy_last_accepting_state = yy_current_state;
+               yy_last_accepting_cpos = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 40 )
+                       yy_c = yy_meta[(unsigned int) yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+       yy_is_jam = (yy_current_state == 39);
+
+       return yy_is_jam ? 0 : yy_current_state;
+       }
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+       {
+       register char *yy_cp = yy_c_buf_p;
+
+       /* undo effects of setting up yytext */
+       *yy_cp = yy_hold_char;
+
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               register int number_to_move = yy_n_chars + 2;
+               register char *dest = &yy_current_buffer->yy_ch_buf[
+                                       yy_current_buffer->yy_buf_size + 2];
+               register char *source =
+                               &yy_current_buffer->yy_ch_buf[number_to_move];
+
+               while ( source > yy_current_buffer->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += (int) (dest - source);
+               yy_bp += (int) (dest - source);
+               yy_current_buffer->yy_n_chars =
+                       yy_n_chars = yy_current_buffer->yy_buf_size;
+
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       *--yy_cp = (char) c;
+
+
+       yytext_ptr = yy_bp;
+       yy_hold_char = *yy_cp;
+       yy_c_buf_p = yy_cp;
+       }
+#endif /* ifndef YY_NO_UNPUT */
+
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+       {
+       int c;
+
+       *yy_c_buf_p = yy_hold_char;
+
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       /* This was really a NUL. */
+                       *yy_c_buf_p = '\0';
+
+               else
+                       { /* need more input */
+                       int offset = yy_c_buf_p - yytext_ptr;
+                       ++yy_c_buf_p;
+
+                       switch ( yy_get_next_buffer() )
+                               {
+                               case EOB_ACT_LAST_MATCH:
+                                       /* This happens because yy_g_n_b()
+                                        * sees that we've accumulated a
+                                        * token and flags that we need to
+                                        * try matching the token before
+                                        * proceeding.  But for input(),
+                                        * there's no matching to consider.
+                                        * So convert the EOB_ACT_LAST_MATCH
+                                        * to EOB_ACT_END_OF_FILE.
+                                        */
+
+                                       /* Reset buffer status. */
+                                       yyrestart( yyin );
+
+                                       /* fall through */
+
+                               case EOB_ACT_END_OF_FILE:
+                                       {
+                                       if ( yywrap() )
+                                               return EOF;
+
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+#ifdef __cplusplus
+                                       return yyinput();
+#else
+                                       return input();
+#endif
+                                       }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       yy_c_buf_p = yytext_ptr + offset;
+                                       break;
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
+       *yy_c_buf_p = '\0';     /* preserve yytext */
+       yy_hold_char = *++yy_c_buf_p;
+
+
+       return c;
+       }
+#endif /* YY_NO_INPUT */
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+       {
+       if ( ! yy_current_buffer )
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+       yy_init_buffer( yy_current_buffer, input_file );
+       yy_load_buffer_state();
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+       {
+       if ( yy_current_buffer == new_buffer )
+               return;
+
+       if ( yy_current_buffer )
+               {
+               /* Flush out information for old buffer. */
+               *yy_c_buf_p = yy_hold_char;
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       yy_current_buffer = new_buffer;
+       yy_load_buffer_state();
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       yy_did_buffer_switch_on_eof = 1;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+       {
+       yy_n_chars = yy_current_buffer->yy_n_chars;
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+       yyin = yy_current_buffer->yy_input_file;
+       yy_hold_char = *yy_c_buf_p;
+       }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_is_our_buffer = 1;
+
+       yy_init_buffer( b, file );
+
+       return b;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+       {
+       if ( ! b )
+               return;
+
+       if ( b == yy_current_buffer )
+               yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+       if ( b->yy_is_our_buffer )
+               yy_flex_free( (void *) b->yy_ch_buf );
+
+       yy_flex_free( (void *) b );
+       }
+
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+       {
+       yy_flush_buffer( b );
+
+       b->yy_input_file = file;
+       b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+       b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+       b->yy_is_interactive = 0;
+#else
+       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+       {
+       if ( ! b )
+               return;
+
+       b->yy_n_chars = 0;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[0];
+
+       b->yy_at_bol = 1;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       if ( b == yy_current_buffer )
+               yy_load_buffer_state();
+       }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       if ( size < 2 ||
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||
+            base[size-1] != YY_END_OF_BUFFER_CHAR )
+               /* They forgot to leave room for the EOB's. */
+               return 0;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+       b->yy_buf_pos = b->yy_ch_buf = base;
+       b->yy_is_our_buffer = 0;
+       b->yy_input_file = 0;
+       b->yy_n_chars = b->yy_buf_size;
+       b->yy_is_interactive = 0;
+       b->yy_at_bol = 1;
+       b->yy_fill_buffer = 0;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       yy_switch_to_buffer( b );
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+       {
+       int len;
+       for ( len = 0; yy_str[len]; ++len )
+               ;
+
+       return yy_scan_bytes( yy_str, len );
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+       {
+       YY_BUFFER_STATE b;
+       char *buf;
+       yy_size_t n;
+       int i;
+
+       /* Get memory for full buffer, including space for trailing EOB's. */
+       n = len + 2;
+       buf = (char *) yy_flex_alloc( n );
+       if ( ! buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+       for ( i = 0; i < len; ++i )
+               buf[i] = bytes[i];
+
+       buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+       b = yy_scan_buffer( buf, n );
+       if ( ! b )
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+       /* It's okay to grow etc. this buffer, and we should throw it
+        * away when we're done.
+        */
+       b->yy_is_our_buffer = 1;
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+       {
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )
+               {
+               yy_size_t new_size;
+
+               yy_start_stack_depth += YY_START_STACK_INCR;
+               new_size = yy_start_stack_depth * sizeof( int );
+
+               if ( ! yy_start_stack )
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+               else
+                       yy_start_stack = (int *) yy_flex_realloc(
+                                       (void *) yy_start_stack, new_size );
+
+               if ( ! yy_start_stack )
+                       YY_FATAL_ERROR(
+                       "out of memory expanding start-condition stack" );
+               }
+
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+       BEGIN(new_state);
+       }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+       {
+       if ( --yy_start_stack_ptr < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);
+       }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+       {
+       return yy_start_stack[yy_start_stack_ptr - 1];
+       }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+       {
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+       }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               yytext[yyleng] = yy_hold_char; \
+               yy_c_buf_p = yytext + n; \
+               yy_hold_char = *yy_c_buf_p; \
+               *yy_c_buf_p = '\0'; \
+               yyleng = n; \
+               } \
+       while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+       {
+       register int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+       }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+       {
+       register int n;
+       for ( n = 0; s[n]; ++n )
+               ;
+
+       return n;
+       }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+       {
+       return (void *) malloc( size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+       {
+       /* The cast to (char *) in the following accommodates both
+        * implementations that use char* generic pointers, and those
+        * that use void* generic pointers.  It works with the latter
+        * because both ANSI C and C++ allow castless assignment from
+        * any pointer type to void*, and deal with argument conversions
+        * as though doing an assignment.
+        */
+       return (void *) realloc( (char *) ptr, size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+       {
+       free( ptr );
+       }
+
+#if YY_MAIN
+int main()
+       {
+       yylex();
+       return 0;
+       }
+#endif
+#line 149 "partn.l"
+
+
+int my_PartnParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_partn_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_partn_stringinput[flex_partn_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_partn_stringinput[flex_partn_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_partn_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_partn_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void PartnParser_setfileinput(FILE *f){
+       PartnParserrestart(NULL);
+
+       flex_partn_fileinput = f;
+       flex_partn_stringinput = NULL;
+       flex_partn_lineno = 1;
+       flex_partn_ch = 0;
+}
+
+void PartnParser_setstringinput(char *s){
+       PartnParserrestart(NULL);
+
+       flex_partn_fileinput = NULL;
+       flex_partn_stringinput = s;
+       flex_partn_stringinput_ptr = 0;
+       flex_partn_lineno = 1;
+       flex_partn_ch = 0;
+}
+       
+               
+
+
diff --git a/src/ftacmp/print_plan.h b/src/ftacmp/print_plan.h
new file mode 100644 (file)
index 0000000..adb039c
--- /dev/null
@@ -0,0 +1,107 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef __PRINT_PLAN_H
+#define __PRINT_PLAN_H
+
+
+#include <stdio.h>
+#include <vector>
+#include <set>
+#include <stdlib.h>
+using namespace std;
+
+
+int print_qp_node(FILE* fd, int i, stream_query* query, map<string, int>& lfta_names, map<string, int>& fta_names) {
+
+       int j;
+
+       qp_node* node = query->query_plan[i];
+
+       string ntype = node->node_type();
+
+       fprintf(fd, "\tNODE %s, type %s\n", node->node_name.c_str(), ntype.c_str());
+
+       if (!node->predecessors.empty()) {
+               for (j = 0; j < node->predecessors.size(); ++j)
+                       fprintf(fd, "\t\tCHILD_NODE %s\n", query->query_plan[query->query_plan[i]->predecessors[j]]->node_name.c_str());
+       }
+
+
+
+       // print input tables
+       vector<tablevar_t *> input_tables = node->get_input_tbls();
+
+       for (j = 0; j <  input_tables.size(); ++j) {
+               tablevar_t * table = input_tables[j];
+
+               if (lfta_names.count(table->schema_name))
+                       fprintf(fd, "\t\tSOURCE_LFTA %s\n", table->schema_name.c_str());
+               else if (fta_names.count(table->schema_name))
+                       fprintf(fd, "\t\tSOURCE_HFTA %s\n", table->schema_name.c_str());
+       }
+
+       fprintf(fd, "\n");
+
+
+
+       return 0;
+
+}
+
+int print_query(FILE* fd, stream_query* query, map<string, int>& lfta_names) {
+
+       fprintf(fd, "HFTA %s\n", query->query_name.c_str());
+
+
+       vector<tablevar_t *> tmp_tv = query->get_input_tables();
+       int itv;
+       map<string, int> fta_names;
+
+       for(itv=0;itv<tmp_tv.size();++itv) {
+               fta_names[tmp_tv[itv]->get_schema_name()] = 0;
+       }
+
+       for (int i = 0; i < query->query_plan.size(); ++i) {
+               if (query->query_plan[i])
+                       print_qp_node(fd, i, query, lfta_names, fta_names);
+       }
+
+       return 0;
+
+}
+
+int print_hftas(const char* fname, vector<stream_query *>& hfta_list, map<string, int>& lfta_names, vector<string>& query_names, vector<string>& interface_names) {
+
+       FILE* f = fopen(fname, "w");
+       for (int i = 0; i < hfta_list.size(); ++i) {
+               print_query(f, hfta_list[i], lfta_names);
+       }
+
+
+       for (int mi = 0; mi < query_names.size(); ++mi) {
+               fprintf(f,"LFTA %s\n",query_names[mi].c_str());
+               fprintf(f,"\tINTERFACE %s\n",interface_names[mi].c_str());
+
+       }
+
+       fclose(f);
+
+
+       return 0;
+
+}
+
+#endif         // __PRINT_PLAN_H
diff --git a/src/ftacmp/query_plan.cc b/src/ftacmp/query_plan.cc
new file mode 100644 (file)
index 0000000..c84edb9
--- /dev/null
@@ -0,0 +1,13571 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+//             Create, manipulate, and dump query plans.
+
+#include "query_plan.h"
+#include "analyze_fta.h"
+#include "generate_utils.h"
+
+#include<vector>
+
+using namespace std;
+
+extern string hash_nums[NRANDS];       // for fast hashing
+
+
+char tmpstr[1000];
+
+void untaboo(string &s){
+       int c;
+       for(c=0;c<s.size();++c){
+               if(s[c] == '.'){
+                       s[c] = '_';
+               }
+       }
+}
+
+//                     mrg_qpn constructor, define here to avoid
+//                     circular references in the .h file
+mrg_qpn::mrg_qpn(filter_join_qpn *spx, std::string n_name, std::vector<std::string> &sources, std::vector<std::pair<std::string, std::string> > &ifaces, ifq_t *ifdb){
+               param_tbl = spx->param_tbl;
+               int i;
+               node_name = n_name;
+               field_entry_list *fel = new field_entry_list();
+               merge_fieldpos = -1;
+
+               disorder = 1;
+
+               for(i=0;i<spx->select_list.size();++i){
+                       data_type *dt = spx->select_list[i]->se->get_data_type()->duplicate();
+                       if(dt->is_temporal()){
+                               if(merge_fieldpos < 0){
+                                       merge_fieldpos = i;
+                               }else{
+                                       fprintf(stderr,"Warning: Merge subquery %s found two temporal fields (%s, %s), using %s\n", n_name.c_str(), spx->select_list[merge_fieldpos]->name.c_str(), spx->select_list[i]->name.c_str(), spx->select_list[merge_fieldpos]->name.c_str() );
+                                       dt->reset_temporal();
+                               }
+                       }
+
+                       field_entry *fe = dt->make_field_entry(spx->select_list[i]->name);
+                       fel->append_field(fe);
+                       delete dt;
+               }
+               if(merge_fieldpos<0){
+                       fprintf(stderr,"ERROR, no temporal attribute for merge subquery %s\n",n_name.c_str());
+                               exit(1);
+               }
+               table_layout = new table_def( n_name.c_str(), NULL, NULL, fel, STREAM_SCHEMA);
+
+//                             NEED TO HANDLE USER_SPECIFIED SLACK
+               this->resolve_slack(spx->select_list[merge_fieldpos]->se,
+                               spx->select_list[merge_fieldpos]->name, ifaces, ifdb,NULL);
+//     if(this->slack == NULL)
+//             fprintf(stderr,"Zero slack.\n");
+//     else
+//             fprintf(stderr,"slack is %s\n",slack->to_string().c_str());
+
+               for(i=0;i<sources.size();i++){
+                       std::string rvar = "_m"+int_to_string(i);
+                       mvars.push_back(new colref_t(rvar.c_str(), spx->select_list[merge_fieldpos]->name.c_str()));
+                       mvars[i]->set_tablevar_ref(i);
+                       fm.push_back(new tablevar_t(sources[i].c_str()));
+                       fm[i]->set_range_var(rvar);
+               }
+
+               param_tbl = new param_table();
+               std::vector<std::string> param_names = spx->param_tbl->get_param_names();
+               int pi;
+               for(pi=0;pi<param_names.size();pi++){
+                       data_type *dt = spx->param_tbl->get_data_type(param_names[pi]);
+                       param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                       spx->param_tbl->handle_access(param_names[pi]));
+               }
+               definitions = spx->definitions;
+
+}
+
+
+
+//             This function translates an analyzed parse tree
+//             into one or more query nodes (qp_node).
+//             Currently only one node is created, but some query
+//             fragments might create more than one query node,
+//             e.g. aggregation over a joim, or nested subqueries
+//             in the FROM clause (unless this is handles at parse tree
+//             analysis time).  At this stage, they will be linked
+//             by the names in the FROM clause.
+//             INVARIANT : if mroe than one query node is returned,
+//             the last one represents the output of the query.
+vector<qp_node *> create_query_nodes(query_summary_class *qs,table_list *Schema){
+
+//             Classify the query.
+
+       vector <qp_node *> local_plan;
+       qp_node *plan_root;
+
+//                     TODO
+//                     I should probably move a lot of this code
+//                     into the qp_node constructors,
+//                     and have this code focus on building the query plan tree.
+
+//             MERGE node
+       if(qs->query_type == MERGE_QUERY){
+               mrg_qpn *merge_node = new mrg_qpn(qs,Schema);
+
+//                     Done
+               plan_root = merge_node;
+               local_plan.push_back(merge_node);
+
+               /*
+               Do not split sources until we are done with optimizations
+               vector<mrg_qpn *> split_merge = merge_node->split_sources();
+               local_plan.insert(local_plan.begin(), split_merge.begin(), split_merge.end());
+               */
+//                     If children are created, add them to the schema.
+/*
+               int i;
+printf("split_merge size is %d\n",split_merge.size());
+               for(i=1;i<split_merge.size();++i){
+                       Schema->add_table(split_merge[i]->get_fields());
+printf("Adding split merge table %d\n",i);
+               }
+*/
+
+/*
+printf("Did split sources on %s:\n",qs->query_name.c_str());
+int ss;
+for(ss=0;ss<local_plan.size();ss++){
+printf("node %d, name=%s, sources=",ss,local_plan[ss]->get_node_name().c_str());
+vector<tablevar_t *> inv = local_plan[ss]->get_input_tbls();
+int nn;
+for(nn=0;nn<inv.size();nn++){
+printf("%s ",inv[nn]->to_string().c_str());
+}
+printf("\n");
+}
+*/
+
+
+       } else{
+
+//             Select / Aggregation / Join
+         if(qs->gb_tbl->size() == 0 && qs->aggr_tbl->size() == 0){
+
+               if(qs->fta_tree->get_from()->size() == 1){
+                       spx_qpn *spx_node = new spx_qpn(qs,Schema);
+
+                       plan_root = spx_node;
+                       local_plan.push_back(spx_node);
+               }else{
+                       if(qs->fta_tree->get_from()->get_properties() == FILTER_JOIN_PROPERTY){
+                               filter_join_qpn *join_node = new filter_join_qpn(qs,Schema);
+                               plan_root = join_node;
+                               local_plan.push_back(join_node);
+                       }else{
+                               join_eq_hash_qpn *join_node = new join_eq_hash_qpn(qs,Schema);
+                               plan_root = join_node;
+                               local_plan.push_back(join_node);
+                       }
+               }
+         }else{
+//                     aggregation
+
+               if(qs->states_refd.size() || qs->sg_tbl.size() || qs->cb_cnf.size()){
+                       sgahcwcb_qpn *sgahcwcb_node = new sgahcwcb_qpn(qs,Schema);
+                       plan_root = sgahcwcb_node;
+                       local_plan.push_back(sgahcwcb_node);
+               }else{
+                       if(qs->closew_cnf.size()){
+                               rsgah_qpn *rsgah_node = new rsgah_qpn(qs,Schema);
+                               plan_root = rsgah_node;
+                               local_plan.push_back(rsgah_node);
+                       }else{
+                               sgah_qpn *sgah_node = new sgah_qpn(qs,Schema);
+                               plan_root = sgah_node;
+                               local_plan.push_back(sgah_node);
+                       }
+               }
+         }
+       }
+
+
+//             Get the query name and other definitions.
+       plan_root->set_node_name( qs->query_name);
+       plan_root->set_definitions( qs->definitions) ;
+
+
+//     return(plan_root);
+       return(local_plan);
+
+}
+
+
+string se_to_query_string(scalarexp_t *se, aggregate_table *aggr_tbl){
+  string l_str;
+  string r_str;
+  string ret;
+  int p;
+  vector<scalarexp_t *> operand_list;
+  string su_ind = "";
+
+  if(se->is_superaggr())
+       su_ind = "$";
+
+  switch(se->get_operator_type()){
+    case SE_LITERAL:
+               l_str = se->get_literal()->to_query_string();
+               return l_str;
+    case SE_PARAM:
+               l_str = "$" + se->get_op();
+               return l_str;
+    case SE_COLREF:
+               l_str =  se->get_colref()->to_query_string() ;
+               return l_str;
+    case SE_UNARY_OP:
+                l_str = se_to_query_string(se->get_left_se(),aggr_tbl);
+
+               return se->get_op()+"( "+l_str+" )";;
+    case SE_BINARY_OP:
+               l_str = se_to_query_string(se->get_left_se(),aggr_tbl);
+               r_str = se_to_query_string(se->get_right_se(),aggr_tbl);
+               return( "("+l_str+")"+se->get_op()+"("+r_str+")" );
+    case SE_AGGR_STAR:
+               return( se->get_op() + su_ind + "(*)");
+    case SE_AGGR_SE:
+               l_str = se_to_query_string(aggr_tbl->get_aggr_se(se->get_aggr_ref()),aggr_tbl);
+               return( se->get_op() + su_ind + "(" + l_str + ")" );
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0)
+                       operand_list = aggr_tbl->get_operand_list(se->get_aggr_ref());
+               else
+                       operand_list = se->get_operands();
+
+               ret = se->get_op() + su_ind + "(";
+               for(p=0;p<operand_list.size();p++){
+                       l_str = se_to_query_string(operand_list[p],aggr_tbl);
+                       if(p>0) ret += ", ";
+                       ret += l_str;
+               }
+               ret += ")";
+               return(ret);
+       break;
+  }
+  return "ERROR SE op type not recognized in se_to_query_string.\n";
+}
+
+
+string pred_to_query_str(predicate_t *pr, aggregate_table *aggr_tbl){
+  string l_str;
+  string r_str;
+  string ret;
+  int o,l;
+  vector<literal_t *> llist;
+  vector<scalarexp_t *> op_list;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               l_str = se_to_query_string(pr->get_left_se(),aggr_tbl);
+               ret = l_str + " IN [";
+               llist = pr->get_lit_vec();
+               for(l=0;l<llist.size();l++){
+                       if(l>0) ret += ", ";
+                       ret += llist[l]->to_query_string();
+               }
+               ret += "]";
+
+               return(ret);
+       case PRED_COMPARE:
+               l_str = se_to_query_string(pr->get_left_se(),aggr_tbl);
+               r_str = se_to_query_string(pr->get_right_se(),aggr_tbl);
+               return( l_str + " " + pr->get_op() + " " + r_str );
+       case PRED_UNARY_OP:
+               l_str = pred_to_query_str(pr->get_left_pr(),aggr_tbl);
+               return(pr->get_op() + "( " + l_str + " )");
+       case PRED_BINARY_OP:
+               l_str = pred_to_query_str(pr->get_left_pr(),aggr_tbl);
+               r_str = pred_to_query_str(pr->get_right_pr(),aggr_tbl);
+               return("( " + r_str + " )" + pr->get_op() + "( " + l_str + " )");
+       case PRED_FUNC:
+               ret = pr->get_op()+"[";
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       if(o>0) ret += ", ";
+                       ret += se_to_query_string(op_list[o],aggr_tbl);
+               }
+               ret += "]";
+               return(ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in pred_to_query_str, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return(0);
+}
+
+
+
+//                     Build a selection list,
+//                     but avoid adding duplicate SEs.
+
+
+int add_select_list_nodup(vector<select_element *> &lfta_select_list, scalarexp_t *se,
+                               bool &new_element){
+       new_element = false;
+       int s;
+       for(s=0;s<lfta_select_list.size();s++){
+               if(is_equivalent_se(lfta_select_list[s]->se, se)){
+                       return(s);
+               }
+       }
+       new_element = true;
+       lfta_select_list.push_back(new select_element(se,"NoNameIn:add_select_list_nodup"));
+       return(lfta_select_list.size()-1);
+}
+
+
+
+//             TODO: The generated colref should be tied to the tablevar
+//             representing the lfta output.  For now, always 0.
+
+scalarexp_t *make_fta_se_ref(vector<select_element *> &lfta_select_list, scalarexp_t *se, int h_tvref){
+       bool new_element;
+       int fta_se_nbr = add_select_list_nodup(lfta_select_list, se, new_element);
+       string colname;
+       if(!new_element){
+               colname = lfta_select_list[fta_se_nbr]->name;
+       }else{
+               colname = impute_colname(lfta_select_list, se);
+               lfta_select_list[fta_se_nbr]->name = colname;
+       }
+//
+//             TODO: fill in the tablevar and schema of the colref here.
+       colref_t *new_cr = new colref_t(colname.c_str());
+       new_cr->set_tablevar_ref(h_tvref);
+
+
+       scalarexp_t *new_se= new scalarexp_t(new_cr);
+       new_se->use_decorations_of(se);
+
+       return(new_se);
+}
+
+
+//                     Build a selection list,
+//                     but avoid adding duplicate SEs.
+
+
+int add_select_list_nodup(vector<select_element *> *lfta_select_list, scalarexp_t *se,
+                               bool &new_element){
+       new_element = false;
+       int s;
+       for(s=0;s<lfta_select_list->size();s++){
+               if(is_equivalent_se((*lfta_select_list)[s]->se, se)){
+                       return(s);
+               }
+       }
+       new_element = true;
+       lfta_select_list->push_back(new select_element(se,"NoNameIn:add_select_list_nodup"));
+       return(lfta_select_list->size()-1);
+}
+
+
+
+//             TODO: The generated colref should be tied to the tablevar
+//             representing the lfta output.  For now, always 0.
+
+scalarexp_t *make_fta_se_ref(vector<vector<select_element *> *> &lfta_select_list, scalarexp_t *se, int h_tvref){
+       bool new_element;
+    vector<select_element *> *the_sel_list = lfta_select_list[h_tvref];
+       int fta_se_nbr = add_select_list_nodup(the_sel_list, se, new_element);
+       string colname;
+       if(!new_element){
+               colname = (*the_sel_list)[fta_se_nbr]->name;
+       }else{
+               colname = impute_colname(*the_sel_list, se);
+               (*the_sel_list)[fta_se_nbr]->name = colname;
+       }
+//
+//             TODO: fill in the tablevar and schema of the colref here.
+       colref_t *new_cr = new colref_t(colname.c_str());
+       new_cr->set_tablevar_ref(h_tvref);
+
+
+       scalarexp_t *new_se= new scalarexp_t(new_cr);
+       new_se->use_decorations_of(se);
+
+       return(new_se);
+}
+
+
+
+
+//
+//                     Test if a se can be evaluated at the fta.
+//                     check forbidden types (e.g. float), forbidden operations
+//                     between types (e.g. divide a long long), forbidden operations
+//                     (too expensive, not implemented).
+//
+//                     Return true if not forbidden, false if forbidden
+//
+//                     TODO: the parameter aggr_tbl is not used, delete it.
+
+bool check_fta_forbidden_se(scalarexp_t *se,
+                                                aggregate_table *aggr_tbl,
+                                                ext_fcn_list *Ext_fcns
+                                                ){
+
+  int p, fcn_id;
+  vector<scalarexp_t *> operand_list;
+  vector<data_type *> dt_signature;
+  data_type *dt = se->get_data_type();
+
+
+
+  switch(se->get_operator_type()){
+    case SE_LITERAL:
+    case SE_PARAM:
+    case SE_COLREF:
+               return( se->get_data_type()->fta_legal_type() );
+       case SE_IFACE_PARAM:
+               return true;
+    case SE_UNARY_OP:
+               if(!check_fta_forbidden_se(se->get_left_se(), aggr_tbl, Ext_fcns))
+                        return(false);
+               return(
+                  dt->fta_legal_operation(se->get_left_se()->get_data_type(), se->get_op())
+               );
+    case SE_BINARY_OP:
+                if(!check_fta_forbidden_se(se->get_left_se(),aggr_tbl, Ext_fcns))
+                        return(false);
+                if(!check_fta_forbidden_se(se->get_right_se(),aggr_tbl, Ext_fcns))
+                        return(false);
+                return(dt->fta_legal_operation(se->get_left_se()->get_data_type(),
+                                                                       se->get_right_se()->get_data_type(),
+                                                                       se->get_op()
+                                                                       )
+               );
+
+//                     return true, aggregate fta-safeness is determined elsewhere.
+    case SE_AGGR_STAR:
+               return(true);
+    case SE_AGGR_SE:
+               return(true);
+
+       case SE_FUNC:
+               if(se->get_aggr_ref() >= 0) return true;
+
+               operand_list = se->get_operands();
+               for(p=0;p<operand_list.size();p++){
+                       if(!check_fta_forbidden_se(operand_list[p],aggr_tbl, Ext_fcns))
+                               return(false);
+                       dt_signature.push_back(operand_list[p]->get_data_type() );
+               }
+               fcn_id = Ext_fcns->lookup_fcn(se->get_op(), dt_signature);
+               if( fcn_id < 0 ){
+                       fprintf(stderr,"ERROR, no external function %s(",se->get_op().c_str());
+                       int o;
+                       for(o=0;o<operand_list.size();o++){
+                               if(o>0) fprintf(stderr,", ");
+                               fprintf(stderr,"%s",operand_list[o]->get_data_type()->to_string().c_str());
+                       }
+                       fprintf(stderr,") is defined, line %d, char %d\n", se->get_lineno(), se->get_charno() );
+                       if(fcn_id == -2) fprintf(stderr,"(multiple subsuming functions found)\n");
+                       return(false);
+               }
+
+               return(Ext_fcns->fta_legal(fcn_id) );
+       default:
+               printf("INTERNAL ERROR in check_fta_forbidden_se: operator type %d\n",se->get_operator_type());
+               exit(1);
+       break;
+  }
+  return(false);
+
+}
+
+
+//             test if a pr can be executed at the fta.
+//
+//                     Return true if not forbidden, false if forbidden
+
+bool check_fta_forbidden_pr(predicate_t *pr,
+                                                aggregate_table *aggr_tbl,
+                                                ext_fcn_list *Ext_fcns
+                                                ){
+
+  vector<literal_t *> llist;
+  data_type *dt;
+  int l,o, fcn_id;
+  vector<scalarexp_t *> op_list;
+  vector<data_type *> dt_signature;
+
+
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               if(! check_fta_forbidden_se(pr->get_left_se(), aggr_tbl, Ext_fcns) )
+                       return(false);
+               llist = pr->get_lit_vec();
+               for(l=0;l<llist.size();l++){
+                       dt = new data_type(llist[l]->get_type());
+                       if(! dt->fta_legal_type()){
+                               delete dt;
+                               return(false);
+                       }
+                       delete dt;
+               }
+               return(true);
+       case PRED_COMPARE:
+               if(! check_fta_forbidden_se(pr->get_left_se(), aggr_tbl, Ext_fcns))
+                       return(false);
+               if(! check_fta_forbidden_se(pr->get_right_se(), aggr_tbl, Ext_fcns))
+                       return(false);
+               return(true);
+       case PRED_UNARY_OP:
+               return( check_fta_forbidden_pr(pr->get_left_pr(), aggr_tbl, Ext_fcns) );
+       case PRED_BINARY_OP:
+               if(! check_fta_forbidden_pr(pr->get_left_pr(), aggr_tbl, Ext_fcns))
+                       return(false);
+               if(! check_fta_forbidden_pr(pr->get_right_pr(), aggr_tbl, Ext_fcns))
+                       return(false);
+               return(true);
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();o++){
+                       if(!check_fta_forbidden_se(op_list[o],aggr_tbl, Ext_fcns))
+                               return(false);
+                       dt_signature.push_back(op_list[o]->get_data_type() );
+               }
+               fcn_id = Ext_fcns->lookup_pred(pr->get_op(), dt_signature);
+               if( fcn_id < 0 ){
+                       fprintf(stderr,"ERROR, no external predicate %s(",pr->get_op().c_str());
+                       int o;
+                       for(o=0;o<op_list.size();o++){
+                               if(o>0) fprintf(stderr,", ");
+                               fprintf(stderr,"%s",op_list[o]->get_data_type()->to_string().c_str());
+                       }
+                       fprintf(stderr,") is defined, line %d, char %d\n", pr->get_lineno(), pr->get_charno() );
+                       if(fcn_id == -2) fprintf(stderr,"(multiple subsuming predicates found)\n");
+                       return(false);
+               }
+
+               return(Ext_fcns->fta_legal(fcn_id) );
+       default:
+               fprintf(stderr,"INTERNAL ERROR in check_fta_forbidden_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return(0);
+
+}
+
+
+//             Split the aggregates in orig_aggr_tbl, into superaggregates and
+//             subaggregates.
+//             (the value of the HFTA aggregate might be a SE of several LFTA
+//              subaggregates, e.g. avg : sum / count )
+//             Register the superaggregates in hfta_aggr_tbl, and the
+//             subaggregates in lfta_aggr_tbl.
+//             Insert references to the subaggregates into lfta_select_list.
+//             (and record their names in the currnames list)
+//             Create a SE for the superaggregate, put it in hfta_aggr_se,
+//             keyed on agr_id.
+
+void split_fta_aggr(aggregate_table *orig_aggr_tbl, int agr_id,
+                                       aggregate_table *hfta_aggr_tbl,
+                                       aggregate_table *lfta_aggr_tbl,
+                                       vector<select_element *> &lfta_select_list,
+                                       map<int,scalarexp_t *> &hfta_aggr_se,
+                                   ext_fcn_list *Ext_fcns
+                                       ){
+       bool new_element;
+       scalarexp_t *subaggr_se;
+       int fta_se_nbr;
+       string colname;
+       int ano;
+       colref_t *new_cr;
+       scalarexp_t *new_se, *l_se;
+       vector<scalarexp_t *> subaggr_ref_se;
+
+//             UDAF processing
+       if(! orig_aggr_tbl->is_builtin(agr_id)){
+//                     Construct the subaggregate
+               int fcn_id = orig_aggr_tbl->get_fcn_id(agr_id);
+               vector<scalarexp_t *> opl = orig_aggr_tbl->get_operand_list(agr_id);
+               vector<scalarexp_t *> subopl;
+               int o;
+               for(o=0;o<opl.size();++o){
+                       subopl.push_back(dup_se(opl[o], NULL));
+               }
+               int sub_id = Ext_fcns->get_subaggr_id(fcn_id);
+               subaggr_se = new scalarexp_t(Ext_fcns->get_fcn_name(sub_id).c_str(), subopl);
+               subaggr_se->set_fcn_id(sub_id);
+               subaggr_se->set_data_type(Ext_fcns->get_fcn_dt(sub_id));
+//                     Add it to the lfta select list.
+               fta_se_nbr = add_select_list_nodup(lfta_select_list, subaggr_se,new_element);
+               if(!new_element){
+                       colname = lfta_select_list[fta_se_nbr]->name;
+               }else{
+                       colname = impute_colname(lfta_select_list, subaggr_se);
+                       lfta_select_list[fta_se_nbr]->name = colname;
+                       ano = lfta_aggr_tbl->add_aggr(Ext_fcns->get_fcn_name(sub_id), sub_id, subopl,Ext_fcns->get_storage_dt(sub_id), false, false,Ext_fcns->has_lfta_bailout(sub_id));
+                       subaggr_se->set_aggr_id(ano);
+               }
+
+//                     Construct a reference to the subaggregate
+               new_cr = new colref_t(colname.c_str());
+               new_se = new scalarexp_t(new_cr);
+//                             I'm not certain what the types should be ....
+//                             This will need to be filled in by later analysis.
+//                             NOTE: this might not capture all the meaning of data_type ...
+               new_se->set_data_type(Ext_fcns->get_fcn_dt(sub_id));
+               subaggr_ref_se.push_back(new_se);
+
+//                     Construct the superaggregate
+               int super_id = Ext_fcns->get_superaggr_id(fcn_id);
+               scalarexp_t *ret_se = new scalarexp_t(Ext_fcns->get_fcn_name(super_id).c_str(), subaggr_ref_se);
+               ret_se->set_fcn_id(super_id);
+               ret_se->set_data_type(Ext_fcns->get_fcn_dt(super_id));
+//                     Register it in the hfta aggregate table
+               ano = hfta_aggr_tbl->add_aggr(ret_se->get_op(), super_id, subaggr_ref_se,Ext_fcns->get_storage_dt(super_id), false, Ext_fcns->is_running_aggr(sub_id),false);
+               ret_se->set_aggr_id(ano);
+               hfta_aggr_se[agr_id] = ret_se;
+
+               return;
+       }
+
+
+//             builtin aggregate processing
+       bool l_forbid;
+
+       vector<bool> use_se;
+       vector<string> subaggr_names = orig_aggr_tbl->get_subaggr_fcns(agr_id, use_se);
+       vector<data_type *> subaggr_dt = orig_aggr_tbl->get_subaggr_dt(agr_id);
+       int sa;
+
+       if(orig_aggr_tbl->is_star_aggr(agr_id)){
+         for(sa=0;sa<subaggr_names.size();sa++){
+               subaggr_se = scalarexp_t::make_star_aggr(subaggr_names[sa].c_str());
+               subaggr_se->set_data_type(subaggr_dt[sa]);
+
+//                     The following sequence is similar to the code in make_fta_se_ref,
+//                     but there is special processing for the aggregate tables.
+               int fta_se_nbr = add_select_list_nodup(lfta_select_list, subaggr_se,new_element);
+               if(!new_element){
+                       colname = lfta_select_list[fta_se_nbr]->name;
+               }else{
+                       colname = impute_colname(lfta_select_list, subaggr_se);
+                       lfta_select_list[fta_se_nbr]->name = colname;
+                       ano = lfta_aggr_tbl->add_aggr(subaggr_names[sa].c_str(),NULL, false);
+                       subaggr_se->set_aggr_id(ano);
+               }
+               new_cr = new colref_t(colname.c_str());
+               new_cr->set_tablevar_ref(0);
+               new_se = new scalarexp_t(new_cr);
+
+//                                     I'm not certain what the types should be ....
+//                                     This will need to be filled in by later analysis.
+//                                             Actually, this is causing a problem.
+//                                             I will assume a UINT data type. / change to INT
+//                                             (consistent with assign_data_types in analyze_fta.cc)
+//                     TODO: why can't I use subaggr_dt, as I do in the other IF branch?
+               data_type *ndt = new data_type("Int");  // used to be Uint
+               new_se->set_data_type(ndt);
+
+               subaggr_ref_se.push_back(new_se);
+         }
+       }else{
+         for(sa=0;sa<subaggr_names.size();sa++){
+               if(use_se[sa]){
+                       scalarexp_t *aggr_operand = orig_aggr_tbl->get_aggr_se(agr_id);
+                       l_se = dup_se(aggr_operand,  NULL);
+                       subaggr_se = scalarexp_t::make_se_aggr(subaggr_names[sa].c_str(),l_se);
+               }else{
+                       subaggr_se = scalarexp_t::make_star_aggr(subaggr_names[sa].c_str());
+               }
+               subaggr_se->set_data_type(subaggr_dt[sa]);
+
+//                     again, similar to make_fta_se_ref.
+               fta_se_nbr = add_select_list_nodup(lfta_select_list, subaggr_se,new_element);
+               if(!new_element){
+                       colname = lfta_select_list[fta_se_nbr]->name;
+               }else{
+                       colname = impute_colname(lfta_select_list, subaggr_se);
+                       lfta_select_list[fta_se_nbr]->name = colname;
+                       if(use_se[sa])
+                               ano = lfta_aggr_tbl->add_aggr(subaggr_names[sa].c_str(),l_se, false);
+                       else
+                               ano = lfta_aggr_tbl->add_aggr(subaggr_names[sa].c_str(),NULL,false);
+                       subaggr_se->set_aggr_id(ano);
+               }
+               new_cr = new colref_t(colname.c_str());
+               new_se = new scalarexp_t(new_cr);
+//                             I'm not certain what the types should be ....
+//                             This will need to be filled in by later analysis.
+//                             NOTE: this might not capture all the meaning of data_type ...
+               new_se->set_data_type(subaggr_dt[sa]);
+               subaggr_ref_se.push_back(new_se);
+         }
+       }
+       scalarexp_t *ret_se = orig_aggr_tbl->make_superaggr_se(agr_id, subaggr_ref_se);
+       ret_se->set_data_type(orig_aggr_tbl->get_data_type(agr_id));
+
+// ASSUME either the return value is an aggregation,
+// or a binary_op between two aggregations
+       if(ret_se->get_operator_type() == SE_AGGR_SE || ret_se->get_operator_type() == SE_AGGR_SE){
+               ano = hfta_aggr_tbl->add_aggr(ret_se->get_op(), ret_se->get_left_se(), false );
+               ret_se->set_aggr_id(ano);
+       }else{
+// Basically processing for AVG. 
+// set the data type of the superagg to that of the subagg.
+               scalarexp_t *left_se = ret_se->get_left_se();
+               left_se->set_data_type(subaggr_dt[0]);
+               ano = hfta_aggr_tbl->add_aggr(left_se->get_op(), left_se->get_left_se(), false );
+               left_se->set_aggr_id(ano);
+
+               scalarexp_t *right_se = ret_se->get_right_se();
+               right_se->set_data_type(subaggr_dt[1]);
+               ano = hfta_aggr_tbl->add_aggr(right_se->get_op(), right_se->get_left_se(), false );
+               right_se->set_aggr_id(ano);
+       }
+
+       hfta_aggr_se[agr_id] = ret_se;
+
+}
+
+
+//             Split the aggregates in orig_aggr_tbl, into hfta_superaggregates and
+//             hfta_subaggregates.
+//             Register the superaggregates in hi_aggr_tbl, and the
+//             subaggregates in loq_aggr_tbl.
+//             Insert references to the subaggregates into low_select_list.
+//             (and record their names in the currnames list)
+//             Create a SE for the superaggregate, put it in hfta_aggr_se,
+//             keyed on agr_id.
+
+void split_hfta_aggr(aggregate_table *orig_aggr_tbl, int agr_id,
+                                       aggregate_table *hi_aggr_tbl,
+                                       aggregate_table *low_aggr_tbl,
+                                       vector<select_element *> &low_select_list,
+                                       map<int,scalarexp_t *> &hi_aggr_se,
+                                   ext_fcn_list *Ext_fcns
+                                       ){
+       bool new_element;
+       scalarexp_t *subaggr_se;
+       int fta_se_nbr;
+       string colname;
+       int ano;
+       colref_t *new_cr;
+       scalarexp_t *new_se, *l_se;
+       vector<scalarexp_t *> subaggr_ref_se;
+
+//             UDAF processing
+       if(! orig_aggr_tbl->is_builtin(agr_id)){
+//                     Construct the subaggregate
+               int fcn_id = orig_aggr_tbl->get_fcn_id(agr_id);
+               vector<scalarexp_t *> opl = orig_aggr_tbl->get_operand_list(agr_id);
+               vector<scalarexp_t *> subopl;
+               int o;
+               for(o=0;o<opl.size();++o){
+                       subopl.push_back(dup_se(opl[o], NULL));
+               }
+               int sub_id = Ext_fcns->get_hfta_subaggr_id(fcn_id);
+               subaggr_se = new scalarexp_t(Ext_fcns->get_fcn_name(sub_id).c_str(), subopl);
+               subaggr_se->set_fcn_id(sub_id);
+               subaggr_se->set_data_type(Ext_fcns->get_fcn_dt(sub_id));
+//                     Add it to the low select list.
+               fta_se_nbr = add_select_list_nodup(low_select_list, subaggr_se,new_element);
+               if(!new_element){
+                       colname = low_select_list[fta_se_nbr]->name;
+               }else{
+                       colname = impute_colname(low_select_list, subaggr_se);
+                       low_select_list[fta_se_nbr]->name = colname;
+                       ano = low_aggr_tbl->add_aggr(Ext_fcns->get_fcn_name(sub_id), sub_id, subopl,Ext_fcns->get_storage_dt(sub_id), false, false,false);
+                       subaggr_se->set_aggr_id(ano);
+               }
+
+//                     Construct a reference to the subaggregate
+               new_cr = new colref_t(colname.c_str());
+               new_se = new scalarexp_t(new_cr);
+//                             I'm not certain what the types should be ....
+//                             This will need to be filled in by later analysis.
+//                             NOTE: this might not capture all the meaning of data_type ...
+               new_se->set_data_type(Ext_fcns->get_fcn_dt(sub_id));
+               subaggr_ref_se.push_back(new_se);
+
+//                     Construct the superaggregate
+               int super_id = Ext_fcns->get_hfta_superaggr_id(fcn_id);
+               scalarexp_t *ret_se = new scalarexp_t(Ext_fcns->get_fcn_name(super_id).c_str(), subaggr_ref_se);
+               ret_se->set_fcn_id(super_id);
+               ret_se->set_data_type(Ext_fcns->get_fcn_dt(super_id));
+//                     Register it in the high aggregate table
+               ano = hi_aggr_tbl->add_aggr(ret_se->get_op(), super_id, subaggr_ref_se,Ext_fcns->get_storage_dt(super_id), false, false,false);
+               ret_se->set_aggr_id(ano);
+               hi_aggr_se[agr_id] = ret_se;
+
+               return;
+       }
+
+
+//             builtin aggregate processing
+       bool l_forbid;
+
+       vector<bool> use_se;
+       vector<string> subaggr_names = orig_aggr_tbl->get_subaggr_fcns(agr_id, use_se);
+       vector<data_type *> subaggr_dt = orig_aggr_tbl->get_subaggr_dt(agr_id);
+       int sa;
+
+       if(orig_aggr_tbl->is_star_aggr(agr_id)){
+         for(sa=0;sa<subaggr_names.size();sa++){
+               subaggr_se = scalarexp_t::make_star_aggr(subaggr_names[sa].c_str());
+               subaggr_se->set_data_type(subaggr_dt[sa]);
+
+//                     The following sequence is similar to the code in make_fta_se_ref,
+//                     but there is special processing for the aggregate tables.
+               int fta_se_nbr = add_select_list_nodup(low_select_list, subaggr_se,new_element);
+               if(!new_element){
+                       colname = low_select_list[fta_se_nbr]->name;
+               }else{
+                       colname = impute_colname(low_select_list, subaggr_se);
+                       low_select_list[fta_se_nbr]->name = colname;
+                       ano = low_aggr_tbl->add_aggr(subaggr_names[sa].c_str(),NULL, false);
+                       subaggr_se->set_aggr_id(ano);
+               }
+               new_cr = new colref_t(colname.c_str());
+               new_cr->set_tablevar_ref(0);
+               new_se = new scalarexp_t(new_cr);
+
+//                                     I'm not certain what the types should be ....
+//                                     This will need to be filled in by later analysis.
+//                                             Actually, this is causing a problem.
+//                                             I will assume a UINT data type.
+//                                             (consistent with assign_data_types in analyze_fta.cc)
+//                     TODO: why can't I use subaggr_dt, as I do in the other IF branch?
+               data_type *ndt = new data_type("Int");  // was Uint
+               new_se->set_data_type(ndt);
+
+               subaggr_ref_se.push_back(new_se);
+         }
+       }else{
+         for(sa=0;sa<subaggr_names.size();sa++){
+               if(use_se[sa]){
+                       scalarexp_t *aggr_operand = orig_aggr_tbl->get_aggr_se(agr_id);
+                       l_se = dup_se(aggr_operand,  NULL);
+                       subaggr_se = scalarexp_t::make_se_aggr(subaggr_names[sa].c_str(),l_se);
+               }else{
+                       subaggr_se = scalarexp_t::make_star_aggr(subaggr_names[sa].c_str());
+               }
+               subaggr_se->set_data_type(subaggr_dt[sa]);
+
+//                     again, similar to make_fta_se_ref.
+               fta_se_nbr = add_select_list_nodup(low_select_list, subaggr_se,new_element);
+               if(!new_element){
+                       colname = low_select_list[fta_se_nbr]->name;
+               }else{
+                       colname = impute_colname(low_select_list, subaggr_se);
+                       low_select_list[fta_se_nbr]->name = colname;
+                       if(use_se[sa])
+                               ano = low_aggr_tbl->add_aggr(subaggr_names[sa].c_str(),l_se, false);
+                       else
+                               ano = low_aggr_tbl->add_aggr(subaggr_names[sa].c_str(),NULL,false);
+                       subaggr_se->set_aggr_id(ano);
+               }
+               new_cr = new colref_t(colname.c_str());
+               new_se = new scalarexp_t(new_cr);
+//                             I'm not certain what the types should be ....
+//                             This will need to be filled in by later analysis.
+//                             NOTE: this might not capture all the meaning of data_type ...
+               new_se->set_data_type(subaggr_dt[sa]);
+               subaggr_ref_se.push_back(new_se);
+         }
+       }
+       scalarexp_t *ret_se = orig_aggr_tbl->make_superaggr_se(agr_id, subaggr_ref_se);
+// ASSUME either the return value is an aggregation,
+// or a binary_op between two aggregations
+       if(ret_se->get_operator_type() == SE_AGGR_SE || ret_se->get_operator_type() == SE_AGGR_SE){
+               ret_se->set_data_type(orig_aggr_tbl->get_data_type(agr_id));
+               ano = hi_aggr_tbl->add_aggr(ret_se->get_op(), ret_se->get_left_se(), false );
+       }else{
+// Basically processing for AVG. 
+// set the data type of the superagg to that of the subagg.
+               scalarexp_t *left_se = ret_se->get_left_se();
+               left_se->set_data_type(subaggr_dt[0]);
+               ano = hi_aggr_tbl->add_aggr(left_se->get_op(), left_se->get_left_se(), false );
+               left_se->set_aggr_id(ano);
+
+               scalarexp_t *right_se = ret_se->get_right_se();
+               right_se->set_data_type(subaggr_dt[1]);
+               ano = hi_aggr_tbl->add_aggr(right_se->get_op(), right_se->get_left_se(), false );
+               right_se->set_aggr_id(ano);
+       }
+
+       ret_se->set_aggr_id(ano);
+       hi_aggr_se[agr_id] = ret_se;
+
+}
+
+
+
+
+
+//             Split a scalar expression into one part which executes
+//             at the stream and another set of parts which execute
+//             at the FTA.
+//             Because I'm actually modifying the SEs, I will make
+//             copies.  But I will assume that literals, params, and
+//             colrefs are immutable at this point.
+//             (if there is ever a need to change one, must make a
+//              new value).
+//             NOTE : if se is constant (only refrences literals),
+//                     avoid making the fta compute it.
+//
+//             NOTE : This will need to be generalized to
+//             handle join expressions, namely to handle a vector
+//             of lftas.
+//
+//             Return value is the HFTA se.
+//             Add lftas select_elements to the fta_select_list.
+//             set fta_forbidden if this node or any child cannot
+//             execute at the lfta.
+
+/*
+
+scalarexp_t *split_fta_se(scalarexp_t *se,
+                                 bool &fta_forbidden,
+                                 vector<select_element *> &lfta_select_list,
+                                 ext_fcn_list *Ext_fcns
+                                ){
+
+  int p, fcn_id;
+  vector<scalarexp_t *> operand_list;
+  vector<data_type *> dt_signature;
+  scalarexp_t *ret_se, *l_se, *r_se;
+  bool l_forbid, r_forbid, this_forbid;
+  colref_t *new_cr;
+  scalarexp_t *new_se;
+  data_type *dt = se->get_data_type();
+
+  switch(se->get_operator_type()){
+    case SE_LITERAL:
+               fta_forbidden = ! se->get_data_type()->fta_legal_type();
+               ret_se = new scalarexp_t(se->get_literal());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_PARAM:
+               fta_forbidden = ! se->get_data_type()->fta_legal_type();
+               ret_se = scalarexp_t::make_param_reference(se->get_op().c_str());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_COLREF:
+//                     No colref should be forbidden,
+//                     the schema is wrong, the fta_legal_type() fcn is wrong,
+//                     or the source table is actually a stream.
+//                     Issue a warning, but proceed with processing.
+//                     Also, should not be a ref to a gbvar.
+//                     (a gbvar ref only occurs in an aggregation node,
+//                     and these SEs are rehomed, not split.
+               fta_forbidden = ! se->get_data_type()->fta_legal_type();
+
+               if(fta_forbidden){
+                       fprintf(stderr,"WARNING, a colref is a forbidden data type in split_fta_se,"
+                                                       " colref is %s,"
+                                                       " type is %s, line=%d, col=%d\n",
+                                                       se->get_colref()->to_string().c_str(),
+                                                       se->get_data_type()->get_type_str().c_str(),
+                                                       se->lineno, se->charno
+                                       );
+               }
+
+               if(se->is_gb()){
+                       fprintf(stderr,"INTERNAL ERROR, a colref is a gbvar ref in split_fta_se,"
+                                                       " type is %s, line=%d, col=%d\n",
+                                                       se->get_data_type()->get_type_str().c_str(),
+                                                       se->lineno, se->charno
+                                       );
+                       exit(1);
+               }
+
+               ret_se = new scalarexp_t(se->get_colref());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_UNARY_OP:
+                l_se = split_fta_se(se->get_left_se(), l_forbid, lfta_select_list, Ext_fcns);
+
+                this_forbid = ! dt->fta_legal_operation(l_se->get_data_type(), se->get_op());
+
+//                     If this operation is forbidden but the child SE is not,
+//                     put the child se on the lfta_select_list, create a colref
+//                     which accesses this se, and make it the child of this op.
+//                     Exception : the child se is constant (only literal refs).
+                if(this_forbid && !l_forbid){
+                        if(!is_literal_or_param_only(l_se)){
+                                new_se = make_fta_se_ref(lfta_select_list, l_se,0);
+                                ret_se = new scalarexp_t(se->get_op().c_str(), new_se);
+                        }
+                }else{
+                        ret_se = new scalarexp_t(se->get_op().c_str(), l_se);
+                }
+                ret_se->use_decorations_of(se);
+                fta_forbidden = this_forbid | l_forbid;
+                return(ret_se);
+
+    case SE_BINARY_OP:
+                l_se = split_fta_se(se->get_left_se(), l_forbid, lfta_select_list, Ext_fcns);
+                r_se = split_fta_se(se->get_right_se(), r_forbid, lfta_select_list, Ext_fcns);
+
+                this_forbid = ! dt->fta_legal_operation(l_se->get_data_type(), r_se->get_data_type(), se->get_op());
+
+//                     Replace the left se if it is not forbidden, but something else is.
+                if((this_forbid || r_forbid) & !l_forbid){
+                        if(!is_literal_or_param_only(l_se)){
+                                new_se = make_fta_se_ref(lfta_select_list, l_se,0);
+                                l_se = new_se;
+                        }
+                }
+
+//                     Replace the right se if it is not forbidden, but something else is.
+                if((this_forbid || l_forbid) & !r_forbid){
+                        if(!is_literal_or_param_only(r_se)){
+                                new_se = make_fta_se_ref(lfta_select_list, r_se,0);
+                                r_se = new_se;
+                        }
+                }
+
+                ret_se = new scalarexp_t(se->get_op().c_str(), l_se, r_se);
+                ret_se->use_decorations_of(se);
+                fta_forbidden = this_forbid || r_forbid || l_forbid;
+
+                return(ret_se);
+
+    case SE_AGGR_STAR:
+    case SE_AGGR_SE:
+
+               fprintf(stderr,"INTERNAL ERROR, aggregate ref (%s) in split_fta_se."
+                                               " line=%d, col=%d\n",
+                                               se->get_op().c_str(),
+                                               se->lineno, se->charno
+                               );
+               exit(1);
+               break;
+
+       case SE_FUNC:
+               {
+                       fta_forbidden = false;
+                       operand_list = se->get_operands();
+                       vector<scalarexp_t *> new_operands;
+                       vector<bool> forbidden_op;
+                       for(p=0;p<operand_list.size();p++){
+                               l_se = split_fta_se(operand_list[p], l_forbid, lfta_select_list, Ext_fcns);
+
+                               fta_forbidden |= l_forbid;
+                               new_operands.push_back(l_se);
+                               forbidden_op.push_back(l_forbid);
+                               dt_signature.push_back(operand_list[p]->get_data_type() );
+                       }
+
+                       fcn_id = Ext_fcns->lookup_fcn(se->get_op(), dt_signature);
+                       if( fcn_id < 0 ){
+                               fprintf(stderr,"ERROR, no external function %s(",se->get_op().c_str());
+                               int o;
+                               for(o=0;o<operand_list.size();o++){
+                                       if(o>0) fprintf(stderr,", ");
+                                       fprintf(stderr,"%s",operand_list[o]->get_data_type()->get_type_str().c_str());
+                               }
+                               fprintf(stderr,") is defined, line %d, char %d\n", se->get_lineno(), se->get_charno() );
+                       if(fcn_id == -2) fprintf(stderr,"(multiple subsuming functions found)\n");
+                               return(false);
+                       }
+
+                       fta_forbidden |= (! Ext_fcns->fta_legal(fcn_id));
+
+//                             Replace the non-forbidden operands.
+//                             the forbidden ones are already replaced.
+                       if(fta_forbidden){
+                               for(p=0;p<new_operands.size();p++){
+                                       if(! forbidden_op[p]){
+//                                       if(new_operands[p]->get_data_type()->get_temporal() != constant_t){
+                                               if(!is_literal_or_param_only(new_operands[p])){
+                                               new_se = make_fta_se_ref(lfta_select_list, new_operands[p],0);
+                                               new_operands[p] = new_se;
+                                         }
+                                       }
+                               }
+                       }
+
+                       ret_se = new scalarexp_t(se->get_op().c_str(), new_operands);
+                       ret_se->use_decorations_of(se);
+
+                       return(ret_se);
+
+               }
+       default:
+               printf("INTERNAL ERROR in check_fta_forbidden_se: operator type %d\n",se->get_operator_type());
+               exit(1);
+       break;
+  }
+  return(false);
+
+}
+
+*/
+
+
+//             The predicates have already been
+//             broken into conjunctions.
+//             If any part of a conjunction is fta-forbidden,
+//             it must be executed in the stream operator.
+//             Else it is executed in the FTA.
+//             A pre-analysis should determine whether this
+//             predicate is fta-safe.  This procedure will
+//             assume that it is fta-forbidden and will
+//             prepare it for execution in the stream.
+
+/*
+
+predicate_t *split_fta_pr(predicate_t *pr,
+                                                vector<select_element *> &lfta_select_list,
+                                                ext_fcn_list *Ext_fcns
+                                                ){
+
+  vector<literal_t *> llist;
+  scalarexp_t *se_l, *se_r;
+  bool l_forbid, r_forbid;
+  predicate_t *ret_pr, *pr_l, *pr_r;
+  vector<scalarexp_t *> op_list, new_op_list;
+  int o;
+  vector<data_type *> dt_signature;
+
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               se_l = split_fta_se(pr->get_left_se(), l_forbid, lfta_select_list, Ext_fcns);
+
+               if(!l_forbid){
+                 if(!is_literal_or_param_only(se_l)){
+                       scalarexp_t *new_se = make_fta_se_ref(lfta_select_list, se_l,0);
+                       se_l = new_se;
+                 }
+               }
+               ret_pr = new predicate_t(se_l, pr->get_lit_vec());
+
+               return(ret_pr);
+
+       case PRED_COMPARE:
+               se_l = split_fta_se(pr->get_left_se(), l_forbid, lfta_select_list, Ext_fcns);
+               if(!l_forbid){
+                 if(!is_literal_or_param_only(se_l)){
+                       scalarexp_t *new_se = make_fta_se_ref(lfta_select_list, se_l,0);
+                       se_l = new_se;
+                 }
+               }
+
+               se_r = split_fta_se(pr->get_right_se(), r_forbid, lfta_select_list, Ext_fcns);
+               if(!r_forbid){
+                 if(!is_literal_or_param_only(se_r)){
+                       scalarexp_t *new_se = make_fta_se_ref(lfta_select_list, se_r,0);
+                       se_r = new_se;
+                 }
+               }
+
+               ret_pr = new predicate_t(se_l, pr->get_op().c_str(), se_r);
+               return(ret_pr);
+
+       case PRED_UNARY_OP:
+               pr_l = split_fta_pr(pr->get_left_pr(), lfta_select_list, Ext_fcns);
+               ret_pr = new predicate_t(pr->get_op().c_str(), pr_l);
+               return(ret_pr);
+
+       case PRED_BINARY_OP:
+               pr_l = split_fta_pr(pr->get_left_pr(), lfta_select_list, Ext_fcns);
+               pr_r = split_fta_pr(pr->get_right_pr(), lfta_select_list, Ext_fcns);
+               ret_pr = new predicate_t(pr->get_op().c_str(), pr_l, pr_r);
+               return(ret_pr);
+
+       case PRED_FUNC:
+//                     I can't push the predicate into the lfta, except by
+//                     returning a bool value, and that is not worth the trouble,
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       se_l = split_fta_se(op_list[o],l_forbid,lfta_select_list,Ext_fcns);
+                       if(!l_forbid){
+                         if(!is_literal_or_param_only(se_l)){
+                               scalarexp_t *new_se = make_fta_se_ref(lfta_select_list, se_l,0);
+                               se_l = new_se;
+                         }
+                       }
+                       new_op_list.push_back(se_l);
+               }
+
+               ret_pr =  new predicate_t(pr->get_op().c_str(), new_op_list);
+               ret_pr->set_fcn_id(pr->get_fcn_id());
+               return(ret_pr);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in split_fta_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return(0);
+
+}
+
+*/
+
+
+//--------------------------------------------------------------------
+
+
+
+//             Split a scalar expression into one part which executes
+//             at the stream and another set of parts which execute
+//             at the FTA.
+//             Because I'm actually modifying the SEs, I will make
+//             copies.  But I will assume that literals, params, and
+//             colrefs are immutable at this point.
+//             (if there is ever a need to change one, must make a
+//              new value).
+//             NOTE : if se is constant (only refrences literals),
+//                     avoid making the fta compute it.
+//
+//             NOTE : This will need to be generalized to
+//             handle join expressions, namely to handle a vector
+//             of lftas.
+//
+//             Return value is the HFTA se.
+//             Add lftas select_elements to the fta_select_list.
+//             set fta_forbidden if this node or any child cannot
+//             execute at the lfta.
+
+#define SPLIT_FTAVEC_NOTBLVAR -1
+#define SPLIT_FTAVEC_MIXED -2
+
+bool is_PROTOCOL_source(int colref_source,
+                       vector< vector<select_element *> *> &lfta_select_list){
+       if(colref_source>=0 && lfta_select_list[colref_source]!=NULL) return true;
+       return false;
+}
+
+int combine_colref_source(int s1, int s2){
+       if(s1==s2) return(s1);
+       if(s1==SPLIT_FTAVEC_NOTBLVAR) return s2;
+       if(s2==SPLIT_FTAVEC_NOTBLVAR) return s1;
+       return SPLIT_FTAVEC_MIXED;
+}
+
+scalarexp_t *split_ftavec_se(
+                                 scalarexp_t *se,      // the SE to split
+                                 bool &fta_forbidden,  // return true if some part of se
+                                                                               // is fta-unsafe
+                                 int &colref_source,   // the tblvar which sources the
+                                                                               // colref, or NOTBLVAR, or MIXED
+                                 vector< vector<select_element *> *> &lfta_select_list,
+                                                                               // NULL if the tblvar is not PROTOCOL,
+                                                                               // else build the select list.
+                                 ext_fcn_list *Ext_fcns // is the fcn lfta-safe?
+                                ){
+//             Return value is the HFTA SE, unless fta_forbidden is true and
+//             colref_source>=0 and the indicated source is PROTOCOL.
+//             In that case no split was done, the make_fta_se_ref must
+//             be done by the caller.
+
+  int p, fcn_id;
+  vector<scalarexp_t *> operand_list;
+  vector<data_type *> dt_signature;
+  scalarexp_t *ret_se, *l_se, *r_se;
+  bool l_forbid, r_forbid, this_forbid;
+  int l_csource, r_csource, this_csource;
+  colref_t *new_cr;
+  scalarexp_t *new_se;
+  data_type *dt = se->get_data_type();
+
+  switch(se->get_operator_type()){
+    case SE_LITERAL:
+               fta_forbidden = ! se->get_data_type()->fta_legal_type();
+               colref_source = SPLIT_FTAVEC_NOTBLVAR;
+               ret_se = new scalarexp_t(se->get_literal());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_PARAM:
+               fta_forbidden = ! se->get_data_type()->fta_legal_type();
+               colref_source = SPLIT_FTAVEC_NOTBLVAR;
+               ret_se = scalarexp_t::make_param_reference(se->get_op().c_str());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+       case SE_IFACE_PARAM:
+               fta_forbidden = false;
+               colref_source = se->get_ifpref()->get_tablevar_ref();
+               ret_se = scalarexp_t::make_iface_param_reference(se->get_ifpref());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_COLREF:
+//                     No colref should be forbidden,
+//                     the schema is wrong, the fta_legal_type() fcn is wrong,
+//                     or the source table is actually a stream.
+//                     Issue a warning, but proceed with processing.
+//                     Also, should not be a ref to a gbvar.
+//                     (a gbvar ref only occurs in an aggregation node,
+//                     and these SEs are rehomed, not split.
+               fta_forbidden = ! se->get_data_type()->fta_legal_type();
+               colref_source = se->get_colref()->get_tablevar_ref();
+
+               if(fta_forbidden && is_PROTOCOL_source(colref_source, lfta_select_list)){
+                       fprintf(stderr,"WARNING, a PROTOCOL colref is a forbidden data type in split_ftavec_se,"
+                                                       " colref is %s,"
+                                                       " type is %s, line=%d, col=%d\n",
+                                                       se->get_colref()->to_string().c_str(),
+                                                       se->get_data_type()->to_string().c_str(),
+                                                       se->lineno, se->charno
+                                       );
+               }
+
+               if(se->is_gb()){
+                       fta_forbidden = true;   // eval in hfta.  ASSUME make copy as below.
+               }
+
+               ret_se = new scalarexp_t(se->get_colref());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_UNARY_OP:
+                l_se = split_ftavec_se(se->get_left_se(), l_forbid, colref_source, lfta_select_list, Ext_fcns);
+
+                this_forbid = ! dt->fta_legal_operation(l_se->get_data_type(), se->get_op());
+
+//                     If this operation is forbidden but the child SE is not,
+//                     AND the colref source in the se is a single PROTOCOL source
+//                     put the child se on the lfta_select_list, create a colref
+//                     which accesses this se, and make it the child of this op.
+//                     Exception : the child se is constant (only literal refs).
+//                     TODO: I think the exception is expressed by is_PROTOCOL_source
+                if(this_forbid && !l_forbid && is_PROTOCOL_source(colref_source, lfta_select_list)){
+                        if(!is_literal_or_param_only(l_se)){
+                                new_se = make_fta_se_ref(lfta_select_list, l_se,colref_source);
+                                ret_se = new scalarexp_t(se->get_op().c_str(), new_se);
+                        }
+                }else{
+                        ret_se = new scalarexp_t(se->get_op().c_str(), l_se);
+                }
+                ret_se->use_decorations_of(se);
+                fta_forbidden = this_forbid | l_forbid;
+                return(ret_se);
+
+    case SE_BINARY_OP:
+                l_se = split_ftavec_se(se->get_left_se(), l_forbid, l_csource, lfta_select_list, Ext_fcns);
+                r_se = split_ftavec_se(se->get_right_se(), r_forbid, r_csource, lfta_select_list, Ext_fcns);
+
+                this_forbid = ! dt->fta_legal_operation(l_se->get_data_type(), r_se->get_data_type(), se->get_op());
+                colref_source=combine_colref_source(l_csource, r_csource);
+
+//                     Replace the left se if the parent must be hfta but the child can
+//                     be lfta. This translates to
+//                     a) result is PROTOCOL and forbidden, but left SE is not forbidden
+//                     OR b) if result is mixed but the left se is PROTOCOL, not forbidden
+                if( ((this_forbid || r_forbid) && !l_forbid && is_PROTOCOL_source(colref_source, lfta_select_list) ) ||
+                               (colref_source==SPLIT_FTAVEC_MIXED && !l_forbid &&
+                                is_PROTOCOL_source(l_csource, lfta_select_list)) ){
+                        if(!is_literal_or_param_only(l_se)){
+                                new_se = make_fta_se_ref(lfta_select_list, l_se,l_csource);
+                                l_se = new_se;
+                        }
+                }
+
+//                     same logic as for right se.
+                if( ((this_forbid || l_forbid) && !r_forbid && is_PROTOCOL_source(colref_source, lfta_select_list) ) ||
+                               (colref_source==SPLIT_FTAVEC_MIXED && !r_forbid &&
+                                is_PROTOCOL_source(r_csource, lfta_select_list)) ){
+                        if(!is_literal_or_param_only(r_se)){
+                                new_se = make_fta_se_ref(lfta_select_list, r_se,r_csource);
+                                r_se = new_se;
+                        }
+                }
+
+                ret_se = new scalarexp_t(se->get_op().c_str(), l_se, r_se);
+                ret_se->use_decorations_of(se);
+                fta_forbidden = this_forbid || r_forbid || l_forbid;
+
+                return(ret_se);
+
+    case SE_AGGR_STAR:
+    case SE_AGGR_SE:
+
+               fprintf(stderr,"INTERNAL ERROR, aggregate ref (%s) in split_ftavec_se."
+                                               " line=%d, col=%d\n",
+                                               se->get_op().c_str(),
+                                               se->lineno, se->charno
+                               );
+               exit(1);
+               break;
+
+       case SE_FUNC:
+               {
+                       operand_list = se->get_operands();
+                       vector<scalarexp_t *> new_operands;
+                       vector<bool> forbidden_op;
+                       vector<int> csource;
+
+                       fta_forbidden = false;
+                       colref_source = SPLIT_FTAVEC_NOTBLVAR;
+                       for(p=0;p<operand_list.size();p++){
+                               l_se = split_ftavec_se(operand_list[p], l_forbid, l_csource, lfta_select_list, Ext_fcns);
+
+                               fta_forbidden |= l_forbid;
+                               colref_source = combine_colref_source(colref_source, l_csource);
+                               new_operands.push_back(l_se);
+                               forbidden_op.push_back(l_forbid);
+                               csource.push_back(l_csource);
+                               dt_signature.push_back(operand_list[p]->get_data_type() );
+                       }
+
+                       fcn_id = Ext_fcns->lookup_fcn(se->get_op(), dt_signature);
+                       if( fcn_id < 0 ){
+                               fprintf(stderr,"ERROR, no external function %s(",se->get_op().c_str());
+                               int o;
+                               for(o=0;o<operand_list.size();o++){
+                                       if(o>0) fprintf(stderr,", ");
+                                       fprintf(stderr,"%s",operand_list[o]->get_data_type()->to_string().c_str());
+                               }
+                               fprintf(stderr,") is defined, line %d, char %d\n", se->get_lineno(), se->get_charno() );
+                       if(fcn_id == -2) fprintf(stderr,"(multiple subsuming functions found)\n");
+                               return NULL;
+                       }
+
+                       fta_forbidden |= (! Ext_fcns->fta_legal(fcn_id));
+
+//                             Replace the non-forbidden operands.
+//                             the forbidden ones are already replaced.
+                       if(fta_forbidden || colref_source == SPLIT_FTAVEC_MIXED){
+                               for(p=0;p<new_operands.size();p++){
+                                       if(! forbidden_op[p] && is_PROTOCOL_source(csource[p], lfta_select_list)){
+                                               if(!is_literal_or_param_only(new_operands[p])){
+                                               new_se = make_fta_se_ref(lfta_select_list, new_operands[p],csource[p]);
+                                               new_operands[p] = new_se;
+                                         }
+                                       }
+                               }
+                       }
+
+                       ret_se = new scalarexp_t(se->get_op().c_str(), new_operands);
+                       ret_se->use_decorations_of(se);
+
+                       return(ret_se);
+
+               }
+       default:
+               printf("INTERNAL ERROR in split_ftavec_se: operator type %d\n",se->get_operator_type());
+               exit(1);
+       break;
+  }
+  return(NULL);
+
+}
+
+
+//             The predicates have already been
+//             broken into conjunctions.
+//             If any part of a conjunction is fta-forbidden,
+//             it must be executed in the stream operator.
+//             Else it is executed in the FTA.
+//             A pre-analysis should determine whether this
+//             predicate is fta-safe.  This procedure will
+//             assume that it is fta-forbidden and will
+//             prepare it for execution in the stream.
+
+predicate_t *split_ftavec_pr(predicate_t *pr,
+                                 vector< vector<select_element *> *> &lfta_select_list,
+                                                ext_fcn_list *Ext_fcns
+                                                ){
+
+  vector<literal_t *> llist;
+  scalarexp_t *se_l, *se_r;
+  bool l_forbid, r_forbid;
+  int l_csource, r_csource;
+  predicate_t *ret_pr, *pr_l, *pr_r;
+  vector<scalarexp_t *> op_list, new_op_list;
+  int o;
+  vector<data_type *> dt_signature;
+
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               se_l = split_ftavec_se(pr->get_left_se(), l_forbid, l_csource, lfta_select_list, Ext_fcns);
+
+//                             TODO: checking that the se is a PROTOCOL source should
+//                             take care of literal_or_param_only.
+               if(!l_forbid && is_PROTOCOL_source(l_csource, lfta_select_list)){
+                 if(!is_literal_or_param_only(se_l)){
+                       scalarexp_t *new_se = make_fta_se_ref(lfta_select_list, se_l,l_csource);
+                       se_l = new_se;
+                 }
+               }
+               ret_pr = new predicate_t(se_l, pr->get_lit_vec());
+
+               return(ret_pr);
+
+       case PRED_COMPARE:
+               se_l = split_ftavec_se(pr->get_left_se(), l_forbid, l_csource, lfta_select_list, Ext_fcns);
+               if(!l_forbid  && is_PROTOCOL_source(l_csource, lfta_select_list)){
+                 if(!is_literal_or_param_only(se_l)){
+                       scalarexp_t *new_se = make_fta_se_ref(lfta_select_list, se_l,l_csource);
+                       se_l = new_se;
+                 }
+               }
+
+               se_r = split_ftavec_se(pr->get_right_se(), r_forbid, r_csource, lfta_select_list, Ext_fcns);
+               if(!r_forbid  && is_PROTOCOL_source(r_csource, lfta_select_list)){
+                 if(!is_literal_or_param_only(se_r)){
+                       scalarexp_t *new_se = make_fta_se_ref(lfta_select_list, se_r,r_csource);
+                       se_r = new_se;
+                 }
+               }
+
+               ret_pr = new predicate_t(se_l, pr->get_op().c_str(), se_r);
+               return(ret_pr);
+
+       case PRED_UNARY_OP:
+               pr_l = split_ftavec_pr(pr->get_left_pr(), lfta_select_list, Ext_fcns);
+               ret_pr = new predicate_t(pr->get_op().c_str(), pr_l);
+               return(ret_pr);
+
+       case PRED_BINARY_OP:
+               pr_l = split_ftavec_pr(pr->get_left_pr(), lfta_select_list, Ext_fcns);
+               pr_r = split_ftavec_pr(pr->get_right_pr(), lfta_select_list, Ext_fcns);
+               ret_pr = new predicate_t(pr->get_op().c_str(), pr_l, pr_r);
+               return(ret_pr);
+
+       case PRED_FUNC:
+//                     I can't push the predicate into the lfta, except by
+//                     returning a bool value, and that is not worth the trouble,
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       se_l = split_ftavec_se(op_list[o],l_forbid,l_csource,lfta_select_list,Ext_fcns);
+                       if(!l_forbid && is_PROTOCOL_source(l_csource, lfta_select_list)){
+                         if(!is_literal_or_param_only(se_l)){
+                               scalarexp_t *new_se = make_fta_se_ref(lfta_select_list, se_l,l_csource);
+                               se_l = new_se;
+                         }
+                       }
+                       new_op_list.push_back(se_l);
+               }
+
+               ret_pr =  new predicate_t(pr->get_op().c_str(), new_op_list);
+               ret_pr->set_fcn_id(pr->get_fcn_id());
+               return(ret_pr);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in split_fta_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return(0);
+
+}
+
+
+
+////////////////////////////////////////////////////////////////////////
+///            rehome_hfta_se rehome_hfta_pr
+///            This is use to split an sgah operator (aggregation),
+///            I just need to make gb, aggr references point to the
+///            new gb, aggr table entries.
+
+
+scalarexp_t *rehome_fta_se(scalarexp_t *se,
+                                 map< int, scalarexp_t * > *aggr_map
+                                ){
+
+  int p, fcn_id;
+  int agr_id;
+  vector<scalarexp_t *> operand_list;
+  scalarexp_t *ret_se, *l_se, *r_se;
+  colref_t *new_cr;
+  scalarexp_t *new_se;
+  data_type *dt = se->get_data_type();
+  vector<scalarexp_t *> new_operands;
+
+  switch(se->get_operator_type()){
+    case SE_LITERAL:
+               ret_se = new scalarexp_t(se->get_literal());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+    case SE_PARAM:
+               ret_se = scalarexp_t::make_param_reference(se->get_op().c_str());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+       case SE_IFACE_PARAM:
+               ret_se = scalarexp_t::make_iface_param_reference(se->get_ifpref());
+               ret_se->use_decorations_of(se);
+               return(ret_se);
+
+
+
+    case SE_COLREF:
+//                     Must be a GB REF ...
+//                     I'm assuming that the hfta gbvar table has the
+//                     same sequence of entries as the input query's gbvar table.
+//                     Else I'll need some kind of translation table.
+
+               if(! se->is_gb()){
+                       fprintf(stderr,"WARNING, a colref is not a gbver ref in rehome_hfta_se"
+                                                       " type is %s, line=%d, col=%d\n",
+                                                       se->get_data_type()->to_string().c_str(),
+                                                       se->lineno, se->charno
+                                       );
+               }
+
+               ret_se = new scalarexp_t(se->get_colref());
+               ret_se->use_decorations_of(se);         // just inherit the gbref
+               return(ret_se);
+
+    case SE_UNARY_OP:
+                l_se = rehome_fta_se(se->get_left_se(), aggr_map);
+
+                ret_se = new scalarexp_t(se->get_op().c_str(), l_se);
+                ret_se->use_decorations_of(se);
+                return(ret_se);
+
+    case SE_BINARY_OP:
+                l_se = rehome_fta_se(se->get_left_se(), aggr_map);
+                r_se = rehome_fta_se(se->get_right_se(), aggr_map);
+
+                ret_se = new scalarexp_t(se->get_op().c_str(), l_se, r_se);
+                ret_se->use_decorations_of(se);
+
+                return(ret_se);
+
+    case SE_AGGR_STAR:
+    case SE_AGGR_SE:
+               agr_id = se->get_aggr_ref();
+               return (*aggr_map)[agr_id];
+               break;
+
+       case SE_FUNC:
+               agr_id = se->get_aggr_ref();
+               if(agr_id >= 0) return (*aggr_map)[agr_id];
+
+               operand_list = se->get_operands();
+               for(p=0;p<operand_list.size();p++){
+                       l_se = rehome_fta_se(operand_list[p], aggr_map);
+
+                       new_operands.push_back(l_se);
+               }
+
+
+               ret_se = new scalarexp_t(se->get_op().c_str(), new_operands);
+               ret_se->use_decorations_of(se);
+
+               return(ret_se);
+
+       default:
+               printf("INTERNAL ERROR in rehome_fta_se: operator type %d\n",se->get_operator_type());
+               exit(1);
+       break;
+  }
+  return(NULL);
+
+}
+
+
+//             The predicates have already been
+//             broken into conjunctions.
+//             If any part of a conjunction is fta-forbidden,
+//             it must be executed in the stream operator.
+//             Else it is executed in the FTA.
+//             A pre-analysis should determine whether this
+//             predicate is fta-safe.  This procedure will
+//             assume that it is fta-forbidden and will
+//             prepare it for execution in the stream.
+
+predicate_t *rehome_fta_pr(predicate_t *pr,
+                                                map<int, scalarexp_t *> *aggr_map
+                                                ){
+
+  vector<literal_t *> llist;
+  scalarexp_t *se_l, *se_r;
+  predicate_t *ret_pr, *pr_l, *pr_r;
+  vector<scalarexp_t *> op_list, new_op_list;
+  int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+               se_l = rehome_fta_se(pr->get_left_se(), aggr_map);
+               ret_pr = new predicate_t(se_l, pr->get_lit_vec());
+               return(ret_pr);
+
+       case PRED_COMPARE:
+               se_l = rehome_fta_se(pr->get_left_se(), aggr_map);
+               se_r = rehome_fta_se(pr->get_right_se(), aggr_map);
+               ret_pr = new predicate_t(se_l, pr->get_op().c_str(), se_r);
+               return(ret_pr);
+
+       case PRED_UNARY_OP:
+               pr_l = rehome_fta_pr(pr->get_left_pr(), aggr_map);
+               ret_pr = new predicate_t(pr->get_op().c_str(), pr_l);
+               return(ret_pr);
+
+       case PRED_BINARY_OP:
+               pr_l = rehome_fta_pr(pr->get_left_pr(), aggr_map);
+               pr_r = rehome_fta_pr(pr->get_right_pr(), aggr_map);
+               ret_pr = new predicate_t(pr->get_op().c_str(), pr_l, pr_r);
+               return(ret_pr);
+
+       case PRED_FUNC:
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       se_l = rehome_fta_se(op_list[o], aggr_map);
+                       new_op_list.push_back(se_l);
+               }
+               ret_pr=  new predicate_t(pr->get_op().c_str(), new_op_list);
+               ret_pr->set_fcn_id(pr->get_fcn_id());
+               return(ret_pr);
+
+       default:
+               fprintf(stderr,"INTERNAL ERROR in rehome_fta_pr, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               exit(1);
+       }
+
+       return(0);
+
+}
+
+
+////////////////////////////////////////////////////////////////////
+/////////////////              Create a STREAM table to represent the FTA output.
+
+table_def *create_attributes(string tname, vector<select_element *> &select_list){
+       int s;
+
+
+//                     Create a new STREAM schema for the output of the FTA.
+
+       field_entry_list *fel = new field_entry_list();
+       set<string> ufcns;
+       for(s=0;s<select_list.size();s++){
+               scalarexp_t *sel_se = select_list[s]->se;
+               data_type *dt = sel_se->get_data_type();
+
+//                     Grab the annotations of the field.
+//                     As of this writing, the only meaningful annotations
+//                     are whether or not the attribute is temporal.
+//                     There can be an annotation of constant_t, but
+//                     I'll ignore this, it feels like an unsafe assumption
+               param_list *plist = new param_list();
+//             if(dt->is_temporal()){
+                       vector<string> param_strings = dt->get_param_keys();
+                       int p;
+                       for(p=0;p<param_strings.size();++p){
+                               string v = dt->get_param_val(param_strings[p]);
+                               if(v != "")
+                                       plist->append(param_strings[p].c_str(),v.c_str());
+                               else
+                                       plist->append(param_strings[p].c_str());
+                       }
+//             }
+
+//             char access_fcn_name[500];
+               string colname = select_list[s]->name;
+//             sprintf(access_fcn_name,"get_field_%s",colname.c_str());
+               string access_fcn_name = "get_field_"+colname;
+               field_entry *fe = new field_entry(
+                       dt->get_type_str(), colname, access_fcn_name, plist, ufcns
+               );
+
+               fel->append_field(fe);
+       }
+
+       table_def *fta_tbl = new table_def(
+               tname.c_str(), NULL, NULL, fel, STREAM_SCHEMA
+       );
+
+       return(fta_tbl);
+
+}
+
+//------------------------------------------------------------------
+//             Textual representation of the query node.
+
+
+
+string spx_qpn::to_query_string(){
+
+       string ret = "Select ";
+       int s;
+       for(s=0;s<select_list.size();s++){
+               if(s>0) ret+=", ";
+               ret += se_to_query_string(select_list[s]->se, NULL);
+               if(select_list[s]->name != "") ret += " AS "+select_list[s]->name;
+       }
+       ret += "\n";
+
+       ret += "From "+table_name->to_string()+"\n";
+
+       if(where.size() > 0){
+               ret += "Where ";
+               int w;
+               for(w=0;w<where.size();w++){
+                       if(w>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(where[w]->pr,NULL) + ")";
+               }
+               ret += "\n";
+       }
+
+       return(ret);
+}
+
+
+
+
+string sgah_qpn::to_query_string(){
+
+       string ret = "Select ";
+       int s;
+       for(s=0;s<select_list.size();s++){
+               if(s>0) ret+=", ";
+               ret += se_to_query_string(select_list[s]->se, &aggr_tbl);
+               if(select_list[s]->name != "") ret += " AS "+select_list[s]->name;
+       }
+       ret += "\n";
+
+       ret += "From "+table_name->to_string()+"\n";
+
+       if(where.size() > 0){
+               ret += "Where ";
+               int w;
+               for(w=0;w<where.size();w++){
+                       if(w>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(where[w]->pr,&aggr_tbl) + ")";
+               }
+               ret += "\n";
+       }
+
+       if(gb_tbl.size() > 0){
+               ret += "Group By ";
+               int g;
+               if(gb_tbl.gb_patterns.size() <= 1 || gb_tbl.gb_entry_type.size()==0){
+                       for(g=0;g<gb_tbl.size();g++){
+                               if(g>0) ret += ", ";
+//                     if(gb_tbl.get_reftype(g) == GBVAR_SE){
+                                       ret += se_to_query_string(gb_tbl.get_def(g), &aggr_tbl) + " AS ";
+//                     }
+                               ret += gb_tbl.get_name(g);
+                       }
+               }else{
+                       int gb_pos = 0;
+                       for(g=0;g<gb_tbl.gb_entry_type.size();++g){
+                               if(g>0) ret += ", ";
+                               if(gb_tbl.gb_entry_type[g] == ""){
+                                       ret += se_to_query_string(gb_tbl.get_def(gb_pos),&aggr_tbl)+
+                                               " AS "+ gb_tbl.get_name(gb_pos);
+                                       gb_pos++;
+                               }
+                               if(gb_tbl.gb_entry_type[g] == "CUBE" ||
+                                               gb_tbl.gb_entry_type[g] == "ROLLUP"){
+                                       ret += gb_tbl.gb_entry_type[g] + "(";
+                                       int gg = 0;
+                                       for(gg=0;gg<gb_tbl.gb_entry_count[g];++gg){
+                                               if(gg>0) ret += ", ";
+                                               ret += se_to_query_string(gb_tbl.get_def(gb_pos),&aggr_tbl)+ " AS "+ gb_tbl.get_name(gb_pos);
+                                               gb_pos++;
+                                       }
+                                       ret += ")";
+                               }
+                               if(gb_tbl.gb_entry_type[g] == "GROUPING_SETS"){
+                                       ret += gb_tbl.gb_entry_type[g] + "(";
+                                       int g1, g2;
+                                       vector<vector<bool> > &local_components = gb_tbl.pattern_components[g];
+                                       for(g1=0;g1<local_components.size();++g1){
+                                               if(g1>0) ret+=",";
+                                               bool first_field = true;
+                                               ret += "\n\t\t(";
+                                               for(g2=0;g2<=gb_tbl.gb_entry_count[g];g2++){
+                                                       if(local_components[g1][g2]){
+                                                               if(!first_field) ret+=", ";
+                                                               else first_field = false;
+                                                               ret +=  gb_tbl.get_name(gb_pos+g2);
+                                                       }
+                                               }
+                                               ret += ")";
+                                       }
+                                       ret += ") ";
+                                       gb_pos += gb_tbl.gb_entry_count[g];
+                               }
+                       }
+               }
+               ret += "\n";
+       }
+
+       if(having.size() > 0){
+               ret += "Having ";
+               int h;
+               for(h=0;h<having.size();h++){
+                       if(h>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(having[h]->pr,&aggr_tbl) + ")";
+               }
+               ret += "\n";
+       }
+
+       return(ret);
+}
+
+
+string rsgah_qpn::to_query_string(){
+
+       string ret = "Select ";
+       int s;
+       for(s=0;s<select_list.size();s++){
+               if(s>0) ret+=", ";
+               ret += se_to_query_string(select_list[s]->se, &aggr_tbl);
+               if(select_list[s]->name != "") ret += " AS "+select_list[s]->name;
+       }
+       ret += "\n";
+
+       ret += "From "+table_name->to_string()+"\n";
+
+       if(where.size() > 0){
+               ret += "Where ";
+               int w;
+               for(w=0;w<where.size();w++){
+                       if(w>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(where[w]->pr,&aggr_tbl) + ")";
+               }
+               ret += "\n";
+       }
+
+       if(gb_tbl.size() > 0){
+               ret += "Group By ";
+               int g;
+               for(g=0;g<gb_tbl.size();g++){
+                       if(g>0) ret += ", ";
+//                     if(gb_tbl.get_reftype(g) == GBVAR_SE){
+                               ret += se_to_query_string(gb_tbl.get_def(g), &aggr_tbl)+" AS ";
+//                     }
+                       ret += gb_tbl.get_name(g);
+               }
+               ret += "\n";
+       }
+
+       if(having.size() > 0){
+               ret += "Having ";
+               int h;
+               for(h=0;h<having.size();h++){
+                       if(h>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(having[h]->pr,&aggr_tbl) + ")";
+               }
+               ret += "\n";
+       }
+
+       if(closing_when.size() > 0){
+               ret += "Closing_When ";
+               int h;
+               for(h=0;h<closing_when.size();h++){
+                       if(h>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(closing_when[h]->pr,&aggr_tbl) + ")";
+               }
+               ret += "\n";
+       }
+
+       return(ret);
+}
+
+
+string sgahcwcb_qpn::to_query_string(){
+
+       string ret = "Select ";
+       int s;
+       for(s=0;s<select_list.size();s++){
+               if(s>0) ret+=", ";
+               ret += se_to_query_string(select_list[s]->se, &aggr_tbl);
+               if(select_list[s]->name != "") ret += " AS "+select_list[s]->name;
+       }
+       ret += "\n";
+
+       ret += "From "+table_name->to_string()+"\n";
+
+       if(where.size() > 0){
+               ret += "Where ";
+               int w;
+               for(w=0;w<where.size();w++){
+                       if(w>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(where[w]->pr,&aggr_tbl) + ")";
+               }
+               ret += "\n";
+       }
+
+       if(gb_tbl.size() > 0){
+               ret += "Group By ";
+               int g;
+               for(g=0;g<gb_tbl.size();g++){
+                       if(g>0) ret += ", ";
+//                     if(gb_tbl.get_reftype(g) == GBVAR_SE){
+                               ret += se_to_query_string(gb_tbl.get_def(g), &aggr_tbl) + " AS ";
+//                     }
+                       ret += gb_tbl.get_name(g);
+               }
+               ret += "\n";
+       }
+
+       if(sg_tbl.size() > 0){
+               ret += "Supergroup ";
+               int g;
+               bool first_elem = true;
+               for(g=0;g<gb_tbl.size();g++){
+                       if(sg_tbl.count(g)){
+                               if(first_elem){
+                                       ret += ", ";
+                                       first_elem = false;
+                               }
+                               ret += gb_tbl.get_name(g);
+                       }
+               }
+               ret += "\n";
+       }
+
+       if(having.size() > 0){
+               ret += "Having ";
+               int h;
+               for(h=0;h<having.size();h++){
+                       if(h>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(having[h]->pr,&aggr_tbl) + ")";
+               }
+               ret += "\n";
+       }
+
+
+       if(cleanwhen.size() > 0){
+               ret += "Cleaning_When ";
+               int h;
+               for(h=0;h<cleanwhen.size();h++){
+                       if(h>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(cleanwhen[h]->pr,&aggr_tbl) + ")";
+               }
+               ret += "\n";
+       }
+
+       if(cleanby.size() > 0){
+               ret += "Cleaning_By ";
+               int h;
+               for(h=0;h<cleanby.size();h++){
+                       if(h>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(cleanby[h]->pr,&aggr_tbl) + ")";
+               }
+               ret += "\n";
+       }
+
+       return(ret);
+}
+
+
+string mrg_qpn::to_query_string(){
+
+       string ret="Merge ";
+       ret += mvars[0]->to_query_string() + " : " + mvars[1]->to_query_string();
+       if(slack != NULL){
+               ret += " SLACK "+se_to_query_string(slack, NULL);
+       }
+
+       ret += "\nFrom ";
+       int t;
+       for(t=0;t<fm.size();++t){
+               if(t>0) ret += ", ";
+               ret += fm[t]->to_string();
+       }
+       ret += "\n";
+
+       return(ret);
+}
+
+string join_eq_hash_qpn::to_query_string(){
+
+       string ret = "Select ";
+       int s;
+       for(s=0;s<select_list.size();s++){
+               if(s>0) ret+=", ";
+               ret += se_to_query_string(select_list[s]->se, NULL);
+               if(select_list[s]->name != "") ret += " AS "+select_list[s]->name;
+       }
+       ret += "\n";
+
+//                     NOTE: assuming binary join.
+       int properties = from[0]->get_property()+2*from[1]->get_property();
+       switch(properties){
+       case 0:
+               ret += "INNER_JOIN ";
+               break;
+       case 1:
+               ret += "LEFT_OUTER_JOIN ";
+               break;
+       case 2:
+               ret += "RIGHT_OUTER_JOIN ";
+               break;
+       case 3:
+               ret += "OUTER_JOIN ";
+               break;
+       }
+
+       ret += "From ";
+       int f;
+       for(f=0;f<from.size();++f){
+               if(f>0) ret+=", ";
+               ret += from[f]->to_string();
+       }
+       ret += "\n";
+
+       if(where.size() > 0){
+               ret += "Where ";
+               int w;
+               for(w=0;w<where.size();w++){
+                       if(w>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(where[w]->pr,NULL) + ")";
+               }
+               ret += "\n";
+       }
+
+       return(ret);
+}
+
+string filter_join_qpn::to_query_string(){
+
+       string ret = "Select ";
+       int s;
+       for(s=0;s<select_list.size();s++){
+               if(s>0) ret+=", ";
+               ret += se_to_query_string(select_list[s]->se, NULL);
+               if(select_list[s]->name != "") ret += " AS "+select_list[s]->name;
+       }
+       ret += "\n";
+
+//                     NOTE: assuming binary join.
+       ret += "FILTER_JOIN("+temporal_var->field+","+int_to_string(temporal_range)+") ";
+
+       ret += "From ";
+       int f;
+       for(f=0;f<from.size();++f){
+               if(f>0) ret+=", ";
+               ret += from[f]->to_string();
+       }
+       ret += "\n";
+
+       if(where.size() > 0){
+               ret += "Where ";
+               int w;
+               for(w=0;w<where.size();w++){
+                       if(w>0) ret += " AND ";
+                       ret += "(" + pred_to_query_str(where[w]->pr,NULL) + ")";
+               }
+               ret += "\n";
+       }
+
+       return(ret);
+}
+
+
+// -----------------------------------------------------------------
+//             Query node subclass specific processing.
+
+
+vector<mrg_qpn *> mrg_qpn::split_sources(){
+  vector<mrg_qpn *> ret;
+  int i;
+
+//                     sanity check
+       if(fm.size() != mvars.size()){
+               fprintf(stderr,"INTERNAL ERROR in mrg_qpn::split_sources.  fm.size() = %lu, mvars.size() = %lu\n",fm.size(),mvars.size());
+               exit(1);
+       }
+       if(fm.size() == 1){
+               fprintf(stderr,"INTERNAL ERROR in mrg_qpn::split_sources, fm size is 1.\n");
+               exit(1);
+       }
+
+/*
+int ff;
+printf("spliting sources merge node, name = %s, %d sources.\n\t",node_name.c_str(), fm.size());
+for(ff=0;ff<fm.size();++ff){
+printf("%s ",fm[ff]->to_string().c_str());
+}
+printf("\n");
+*/
+
+//             Handle special cases.
+       if(fm.size() == 2){
+               ret.push_back(this);
+               return ret;
+       }
+
+       if(fm.size() == 3){
+               mrg_qpn *new_mrg = (mrg_qpn *)this->make_copy("_cH1");
+               new_mrg->fm.push_back(this->fm[0]);
+               new_mrg->fm.push_back(this->fm[1]);
+               new_mrg->mvars.push_back(this->mvars[0]);
+               new_mrg->mvars.push_back(this->mvars[1]);
+
+               this->fm.erase(this->fm.begin());
+               this->mvars.erase(this->mvars.begin());
+               string vname = fm[0]->get_var_name();
+               this->fm[0] = new tablevar_t(new_mrg->node_name.c_str());
+               this->fm[0]->set_range_var(vname);
+               this->mvars[0]->set_field(table_layout->get_field_name(merge_fieldpos));
+               this->mvars[0]->set_tablevar_ref(0);
+               this->mvars[1]->set_tablevar_ref(1);
+
+               ret.push_back(new_mrg);
+               ret.push_back(this);
+
+/*
+printf("split sources %s (%s %s)\n",node_name.c_str(),new_mrg->node_name.c_str(),this->node_name.c_str());
+for(i=0;i<new_mrg->fm.size();++i)
+printf("\tsource %s var %d (%s, %s) \n",new_mrg->node_name.c_str(),i,new_mrg->fm[i]->to_string().c_str(), new_mrg->mvars[i]->to_string().c_str());
+for(i=0;i<this->fm.size();++i)
+printf("\tsource %s var %d (%s, %s) \n",this->node_name.c_str(),i,this->fm[i]->to_string().c_str(), this->mvars[i]->to_string().c_str());
+*/
+
+               return ret;
+       }
+
+//             General case.
+//             divide up the sources between two children.
+//             Then, recurse on the children.
+
+               mrg_qpn *new_mrg1 = (mrg_qpn *)this->make_copy("_cH1");
+               mrg_qpn *new_mrg2 = (mrg_qpn *)this->make_copy("_cH2");
+               for(i=0;i<this->fm.size()/2;++i){
+                       new_mrg1->fm.push_back(this->fm[i]);
+                       new_mrg1->mvars.push_back(this->mvars[i]);
+//printf("Pushing %d (%s, %s) to new_mrg1\n",i,fm[i]->to_string().c_str(), mvars[i]->to_string().c_str());
+               }
+               for(;i<this->fm.size();++i){
+                       new_mrg2->fm.push_back(this->fm[i]);
+                       new_mrg2->mvars.push_back(this->mvars[i]);
+//printf("Pushing %d (%s, %s) to new_mrg2\n",i,fm[i]->to_string().c_str(), mvars[i]->to_string().c_str());
+               }
+               for(i=0;i<new_mrg1->mvars.size();++i)
+                       new_mrg1->mvars[i]->set_tablevar_ref(i);
+               for(i=0;i<new_mrg2->mvars.size();++i)
+                       new_mrg2->mvars[i]->set_tablevar_ref(i);
+
+//                     Children created, make this merge them.
+               fm.clear();
+               mvars.clear();
+//                     var 1
+               tablevar_t *tmp_tblvar = new tablevar_t(new_mrg1->node_name.c_str());
+               tmp_tblvar->set_range_var("_mrg_var_1");
+               fm.push_back(tmp_tblvar);
+               colref_t *tmp_cref = new colref_t("_mrg_var_1",table_layout->get_field_name(merge_fieldpos).c_str());
+               tmp_cref->set_tablevar_ref(0);
+               mvars.push_back(tmp_cref);
+//                     var 2
+               tmp_tblvar = new tablevar_t(new_mrg2->node_name.c_str());
+               tmp_tblvar->set_range_var("_mrg_var_2");
+               fm.push_back(tmp_tblvar);
+               tmp_cref = new colref_t("_mrg_var_2",table_layout->get_field_name(merge_fieldpos).c_str());
+               tmp_cref->set_tablevar_ref(1);
+               mvars.push_back(tmp_cref);
+
+
+/*
+printf("split sources %s (%s %s)\n",node_name.c_str(),new_mrg1->node_name.c_str(),new_mrg2->node_name.c_str());
+for(i=0;i<new_mrg1->fm.size();++i)
+printf("\tsource %s var %d (%s, %s) \n",new_mrg1->node_name.c_str(),i,new_mrg1->fm[i]->to_string().c_str(), new_mrg1->mvars[i]->to_string().c_str());
+for(i=0;i<new_mrg2->fm.size();++i)
+printf("\tsource %s var %d (%s, %s) \n",new_mrg2->node_name.c_str(),i,new_mrg2->fm[i]->to_string().c_str(), new_mrg2->mvars[i]->to_string().c_str());
+*/
+
+//             Recurse and put them together
+               vector<mrg_qpn *> st1 = new_mrg1->split_sources();
+               ret.insert(ret.end(), st1.begin(), st1.end());
+               vector<mrg_qpn *> st2 = new_mrg2->split_sources();
+               ret.insert(ret.end(), st2.begin(), st2.end());
+
+               ret.push_back(this);
+
+               return(ret);
+
+}
+
+
+
+////////       Split helper function : resolve interfaces
+
+vector<pair<string,string> > get_ifaces(tablevar_t *table, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx){
+       vector<pair<string,string> > basic_ifaces;
+       int ierr;
+       if(table->get_ifq()){
+               basic_ifaces= ifdb->eval(table->get_interface(),ierr);
+               if(ierr==1){
+               fprintf(stderr,"ERROR, Interface set %s not found.\n",table->get_interface().c_str());
+               }
+               if(ierr==2){
+                       fprintf(stderr,"ERROR, interface definition file didn't parse.\n");
+               }
+       }else{
+               basic_ifaces.push_back(make_pair(table->get_machine(), table->get_interface()));
+       }
+
+       if(n_virtual_ifaces == 1)
+               return basic_ifaces;
+
+       int stride = n_virtual_ifaces / hfta_parallelism;
+       int i,s;
+       vector<pair<string,string> > ifaces;
+
+       for(i=0;i<basic_ifaces.size();++i){
+               string mach = basic_ifaces[i].first;
+               string iface = basic_ifaces[i].second;
+               for(s=hfta_idx*stride;s<(hfta_idx+1)*stride;++s){
+                       ifaces.push_back(pair<string, string>(mach,iface+"X"+int_to_string(2*s)));
+               }
+       }
+
+       return ifaces;
+}
+
+
+/////////      Split helper function : compute slack in a generated
+/////////      merge.
+
+void mrg_qpn::resolve_slack(scalarexp_t *t_se, string fname, vector<pair<string, string> > &sources, ifq_t *ifdb, gb_table *gbt){
+       int s,e,v;
+       string es;
+
+//             Find slack divisor, if any.
+       string fnm;
+       long long int slack_divisor = find_temporal_divisor(t_se,gbt, fnm);
+       if(slack_divisor <= 0){
+               slack = NULL;
+               return;
+       }
+
+//             find max slack in the iface spec
+       long long int max_slacker = 0, this_slacker;
+       string rname = "Slack_"+fnm;
+       for(s=0;s<sources.size();++s){
+               string src_machine = sources[s].first;
+               string src_iface = sources[s].second;
+               vector<string> slack_vec = ifdb->get_iface_vals(src_machine, src_iface,rname,e,es);
+               for(v=0;v<slack_vec.size();++v){
+                       if(sscanf(slack_vec[v].c_str(),"%qd",&this_slacker)){
+                               if(this_slacker > max_slacker)
+                                       max_slacker = this_slacker;
+                       }
+               }
+       }
+
+       if(max_slacker <= 0){
+               slack = NULL;
+               return;
+       }
+
+//             convert to SE
+       long long int the_slack=(long long int)(ceil(((double)max_slacker)/((double)slack_divisor)));
+       char tmps[256];
+       sprintf(tmps,"%lld",the_slack);
+       literal_t *slack_lit = new literal_t(tmps, LITERAL_LONGINT);
+       slack = new scalarexp_t(slack_lit);
+}
+
+
+//------------------------------------------------------------------
+//             split a node to extract LFTA components.
+
+
+vector<qp_node *> mrg_qpn::split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx){
+       // nothing to do, nothing to split, return copy of self.
+
+       hfta_returned = 1;
+
+       vector<qp_node *> ret_vec;
+
+       ret_vec.push_back(this);
+       return(ret_vec);
+
+}
+
+vector<qp_node *> filter_join_qpn::split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx){
+       vector<qp_node *> ret_vec;
+
+//             First check if the query can be pushed to the FTA.
+       bool fta_ok = true;
+       int s;
+       for(s=0;s<select_list.size();s++){
+               fta_ok &= check_fta_forbidden_se(select_list[s]->se,NULL, Ext_fcns);
+       }
+       int p;
+       for(p=0;p<where.size();p++){
+               fta_ok &= check_fta_forbidden_pr(where[p]->pr,NULL, Ext_fcns);
+       }
+
+       if(!fta_ok){
+               fprintf(stderr,"ERROR, filter join %s is fta-unsafe.\n",node_name.c_str());
+               exit(1);
+       }
+
+//             Can it be done in a single lfta?
+//                     Get the set of interfaces it accesses.
+       int ierr;
+       int si;
+       vector<string> sel_names;
+       vector<pair<string,string> > ifaces = get_ifaces(from[0], ifdb, n_virtual_ifaces, hfta_parallelism, hfta_idx);
+       if (ifaces.empty()) {
+               fprintf(stderr,"INTERNAL ERROR in filter_join_qpn::split_node_for_fta - empty interface set\n");
+               exit(1);
+       }
+
+       if(ifaces.size() == 1){
+//                             Single interface, no need to merge.
+               hfta_returned = 0;
+               ret_vec.push_back(this);
+               int i;
+               for(i=0;i<from.size();i++){
+                       from[i]->set_machine(ifaces[0].first);
+                       from[i]->set_interface(ifaces[0].second);
+                       from[i]->set_ifq(false);
+               }
+               return(ret_vec);
+       }else{
+//                             Multiple interfaces, generate the interface-specific queries plus
+//                             the merge.
+               hfta_returned = 1;
+
+               vector<string> sel_names;
+               for(si=0;si<ifaces.size();++si){
+                       filter_join_qpn *fta_node = new filter_join_qpn();
+
+//                     Name the fta
+                       if(ifaces.size()==1)
+                               fta_node->set_node_name( node_name );
+                       else{
+                               string new_name =  "_"+node_name+"_"+ifaces[si].first+"_"+ifaces[si].second;
+                               untaboo(new_name);
+                               fta_node->set_node_name(new_name);
+                       }
+                       sel_names.push_back(fta_node->get_node_name());
+
+//                     Assign the table
+                       int f;
+                       for(f=0;f<from.size();f++){
+                               fta_node->from.push_back(from[f]->duplicate());
+                               fta_node->from[f]->set_machine(ifaces[si].first);
+                               fta_node->from[f]->set_interface(ifaces[si].second);
+                               fta_node->from[f]->set_ifq(false);
+                       }
+                       fta_node->temporal_var = temporal_var;
+                       fta_node->temporal_range = temporal_range;
+
+                       fta_node->use_bloom = use_bloom;
+
+                       for(s=0;s<select_list.size();s++){
+                               fta_node->select_list.push_back( dup_select(select_list[s], NULL) );
+                       }
+
+                       for(p=0;p<shared_pred.size();p++){
+                               predicate_t *new_pr = dup_pr(where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+                               fta_node->shared_pred.push_back(new_cnf);
+                               fta_node->where.push_back(new_cnf);
+                       }
+                       for(p=0;p<pred_t0.size();p++){
+                               predicate_t *new_pr = dup_pr(where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+                               fta_node->pred_t0.push_back(new_cnf);
+                               fta_node->where.push_back(new_cnf);
+                       }
+                       for(p=0;p<pred_t1.size();p++){
+                               predicate_t *new_pr = dup_pr(where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+                               fta_node->pred_t1.push_back(new_cnf);
+                               fta_node->where.push_back(new_cnf);
+                       }
+                       for(p=0;p<hash_eq.size();p++){
+                               predicate_t *new_pr = dup_pr(where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+                               fta_node->hash_eq.push_back(new_cnf);
+                               fta_node->where.push_back(new_cnf);
+                       }
+                       for(p=0;p<postfilter.size();p++){
+                               predicate_t *new_pr = dup_pr(where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+                               fta_node->postfilter.push_back(new_cnf);
+                               fta_node->where.push_back(new_cnf);
+                       }
+
+//                     Xfer all of the parameters.
+//                     Use existing handle annotations.
+                       vector<string> param_names = param_tbl->get_param_names();
+                       int pi;
+                       for(pi=0;pi<param_names.size();pi++){
+                               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                               fta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+                       }
+                       fta_node->definitions = definitions;
+                       if(fta_node->resolve_if_params(ifdb, this->err_str)){
+                               this->error_code = 3;
+                               return ret_vec;
+                       }
+
+                       ret_vec.push_back(fta_node);
+               }
+
+               mrg_qpn *mrg_node = new mrg_qpn((filter_join_qpn *)ret_vec[0],
+                        node_name,  sel_names,ifaces, ifdb);
+               ret_vec.push_back(mrg_node);
+
+               return(ret_vec);
+       }
+
+}
+
+//             Use to search for unresolved interface param refs in an hfta.
+
+int spx_qpn::count_ifp_refs(set<string> &ifpnames){
+       int ret = 0;
+       int i;
+       for(i=0;i<select_list.size();++i)
+               ret += count_se_ifp_refs(select_list[i]->se,ifpnames);
+       for(i=0;i<where.size();++i)
+               ret += count_pr_ifp_refs(where[i]->pr,ifpnames);
+       return ret;
+}
+
+int sgah_qpn::count_ifp_refs(set<string> &ifpnames){
+       int ret = 0;
+       int i,j;
+       for(i=0;i<select_list.size();++i)
+               ret += count_se_ifp_refs(select_list[i]->se,ifpnames);
+       for(i=0;i<where.size();++i)
+               ret += count_pr_ifp_refs(where[i]->pr,ifpnames);
+       for(i=0;i<having.size();++i)
+               ret += count_pr_ifp_refs(having[i]->pr,ifpnames);
+       for(i=0;i<aggr_tbl.size();++i){
+               if(aggr_tbl.is_builtin(i) && !aggr_tbl.is_star_aggr(i)){
+                       ret += count_se_ifp_refs(aggr_tbl.get_aggr_se(i),ifpnames);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(i);
+                       for(j=0;j<opl.size();++j)
+                               ret += count_se_ifp_refs(opl[j],ifpnames);
+               }
+       }
+       for(i=0;i<gb_tbl.size();++i){
+               ret += count_se_ifp_refs(gb_tbl.get_def(i), ifpnames);
+       }
+       return ret;
+}
+
+
+int rsgah_qpn::count_ifp_refs(set<string> &ifpnames){
+       int ret = 0;
+       int i,j;
+       for(i=0;i<select_list.size();++i)
+               ret += count_se_ifp_refs(select_list[i]->se,ifpnames);
+       for(i=0;i<where.size();++i)
+               ret += count_pr_ifp_refs(where[i]->pr,ifpnames);
+       for(i=0;i<having.size();++i)
+               ret += count_pr_ifp_refs(having[i]->pr,ifpnames);
+       for(i=0;i<closing_when.size();++i)
+               ret += count_pr_ifp_refs(closing_when[i]->pr,ifpnames);
+       for(i=0;i<aggr_tbl.size();++i){
+               if(aggr_tbl.is_builtin(i) && !aggr_tbl.is_star_aggr(i)){
+                       ret += count_se_ifp_refs(aggr_tbl.get_aggr_se(i),ifpnames);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(i);
+                       for(j=0;j<opl.size();++j)
+                               ret += count_se_ifp_refs(opl[j],ifpnames);
+               }
+       }
+       for(i=0;i<gb_tbl.size();++i){
+               ret += count_se_ifp_refs(gb_tbl.get_def(i), ifpnames);
+       }
+       return ret;
+}
+
+int mrg_qpn::count_ifp_refs(set<string> &ifpnames){
+       return 0;
+}
+
+int join_eq_hash_qpn::count_ifp_refs(set<string> &ifpnames){
+       int ret = 0;
+       int i;
+       for(i=0;i<select_list.size();++i)
+               ret += count_se_ifp_refs(select_list[i]->se,ifpnames);
+       for(i=0;i<prefilter[0].size();++i)
+               ret += count_pr_ifp_refs(prefilter[0][i]->pr,ifpnames);
+       for(i=0;i<prefilter[1].size();++i)
+               ret += count_pr_ifp_refs(prefilter[1][i]->pr,ifpnames);
+       for(i=0;i<temporal_eq.size();++i)
+               ret += count_pr_ifp_refs(temporal_eq[i]->pr,ifpnames);
+       for(i=0;i<hash_eq.size();++i)
+               ret += count_pr_ifp_refs(hash_eq[i]->pr,ifpnames);
+       for(i=0;i<postfilter.size();++i)
+               ret += count_pr_ifp_refs(postfilter[i]->pr,ifpnames);
+       return ret;
+}
+
+int filter_join_qpn::count_ifp_refs(set<string> &ifpnames){
+       int ret = 0;
+       int i;
+       for(i=0;i<select_list.size();++i)
+               ret += count_se_ifp_refs(select_list[i]->se,ifpnames);
+       for(i=0;i<where.size();++i)
+               ret += count_pr_ifp_refs(where[i]->pr,ifpnames);
+       return ret;
+}
+
+
+//             Resolve interface params to string literals
+int filter_join_qpn::resolve_if_params( ifq_t *ifdb, string &err){
+       int ret = 0;
+       int i;
+       string ifname = from[0]->get_interface();
+       string ifmach = from[0]->get_machine();
+       for(i=0;i<select_list.size();++i)
+               if( resolve_se_ifp_refs(select_list[i]->se,ifmach, ifname, ifdb, err) )
+                       ret = 1;
+       for(i=0;i<where.size();++i)
+               if( resolve_pr_ifp_refs(where[i]->pr,ifmach, ifname, ifdb, err))
+                       ret = 1;
+       return ret;
+}
+
+
+int spx_qpn::resolve_if_params( ifq_t *ifdb, string &err){
+       int ret = 0;
+       int i;
+       string ifname = table_name->get_interface();
+       string ifmach = table_name->get_machine();
+       for(i=0;i<select_list.size();++i)
+               if( resolve_se_ifp_refs(select_list[i]->se,ifmach, ifname, ifdb, err) )
+                       ret = 1;
+       for(i=0;i<where.size();++i)
+               if( resolve_pr_ifp_refs(where[i]->pr,ifmach, ifname, ifdb, err))
+                       ret = 1;
+       return ret;
+}
+
+int sgah_qpn::resolve_if_params( ifq_t *ifdb, string &err){
+       int ret = 0;
+       int i,j;
+       string ifname = table_name->get_interface();
+       string ifmach = table_name->get_machine();
+
+//printf("Select list has %d elements\n",select_list.size());
+       for(i=0;i<select_list.size();++i){
+//printf("\tresolving elemet %d\n",i);
+               if( resolve_se_ifp_refs(select_list[i]->se,ifmach, ifname, ifdb, err) ){
+                       ret = 1;
+               }
+       }
+       for(i=0;i<where.size();++i){
+               if( resolve_pr_ifp_refs(where[i]->pr,ifmach, ifname, ifdb, err) )
+                       ret = 1;
+       }
+       for(i=0;i<having.size();++i){
+               if( resolve_pr_ifp_refs(having[i]->pr,ifmach, ifname, ifdb, err) )
+                       ret = 1;
+       }
+//printf("aggr list has %d elements\n",select_list.size());
+       for(i=0;i<aggr_tbl.size();++i){
+//printf("\tresolving elemet %d\n",i);
+               if(aggr_tbl.is_builtin(i) && !aggr_tbl.is_star_aggr(i)){
+//printf("\t\t\tbuiltin\n");
+                       if( resolve_se_ifp_refs(aggr_tbl.get_aggr_se(i),ifmach, ifname, ifdb, err) )
+                                       ret = 1;
+               }else{
+//printf("\t\t\tudaf\n");
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(i);
+                       for(j=0;j<opl.size();++j)
+                               if( resolve_se_ifp_refs(opl[j],ifmach, ifname, ifdb, err) )
+                                       ret = 1;
+               }
+       }
+       for(i=0;i<gb_tbl.size();++i){
+               if( resolve_se_ifp_refs(gb_tbl.get_def(i), ifmach, ifname, ifdb, err) )
+                       ret = 1;
+       }
+       return ret;
+}
+
+
+
+/*
+       SPLITTING A SELECTION_PROJECTION OPERATOR
+
+       An SPX node may reference:
+               literals, parameters, colrefs, functions, operators
+       An SPX node may not reference:
+               group-by variables, aggregates
+
+       An SPX node contains
+               selection list of SEs
+               where list of CNF predicates
+
+       Algorithm:
+               If each selection SE and each where predicate is fta-safe
+                       execute entire operator as an LFTA.
+               Else
+                       for each predicate in the where clause
+                         if it is fta safe, execute it in the lfta
+                         else, split each SE in the predicate, evaluate the
+                               top-level SEs in the hfta and eval the predicate on that.
+                       For each SE in the se list
+                         Split the SE, eval the high level part, push onto hfta
+                               selection list
+
+       Splitting an SE:
+               A SE represents a value which must be computed.  The LFTA
+               must provide sub-values from which the HFTA can compute the
+               desired value.
+               1) the SE is fta-safe
+                       Create an entry in the selection list of the LFTA which is
+                       the SE itself.  Reference this LFTA selection list entry in
+                       the HFTA (via a field name assigned to the lfta selection
+                       list entry).
+               2) The SE is not fta-safe
+                       Determine the boundary between the fta-safe and the fta-unsafe
+                       portions of the SE.  The result is a rooted tree (which is
+                       evaluated at the HFTA) which references sub-SEs (which are
+                       evaluated at the LFTA).  Each of the sub-SEs is placed on
+                       the selection list of the LFTA and assigned field names,
+                       the top part is evaluated at the HFTA and references the
+                       sub-SEs through their assigned field names.
+               The only SEs on the LFTA selection list are those created by
+               the above mechanism.  The collection of assigned field names becomes
+               the schema of the LFTA.
+
+               TODO: insert tablevar names into the colrefs.
+
+*/
+
+vector<qp_node *> spx_qpn::split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx){
+
+       int i;
+       vector<qp_node *> ret_vec;
+
+//                     If the node reads from a stream, don't split.
+//     int t = Schema->get_table_ref(table_name->get_schema_name());
+       int t = table_name->get_schema_ref();
+       if(Schema->get_schema_type(t) != PROTOCOL_SCHEMA){
+               hfta_returned = 1;
+               ret_vec.push_back(this);
+               return(ret_vec);
+       }
+
+
+//                     Get the set of interfaces it accesses.
+       int ierr;
+       int si;
+       vector<string> sel_names;
+       vector<pair<string,string> > ifaces = get_ifaces(table_name, ifdb, n_virtual_ifaces, hfta_parallelism, hfta_idx);
+       if (ifaces.empty()) {
+               fprintf(stderr,"INTERNAL ERROR in spx_qpn::split_node_for_fta - empty interface set\n");
+               exit(1);
+       }
+
+
+//                     The FTA node, it is always returned.
+
+       spx_qpn *fta_node = new spx_qpn();
+               fta_node->table_name = table_name;
+
+//                     for colname imputation
+//     vector<string> fta_flds, stream_flds;
+
+
+//             First check if the query can be pushed to the FTA.
+       bool fta_ok = true;
+       int s;
+       for(s=0;s<select_list.size();s++){
+               fta_ok &= check_fta_forbidden_se(select_list[s]->se,NULL, Ext_fcns);
+       }
+       int p;
+       for(p=0;p<where.size();p++){
+               fta_ok &= check_fta_forbidden_pr(where[p]->pr,NULL, Ext_fcns);
+       }
+
+       if(fta_ok){
+////////////////////////////////////////////////////////////
+//                     The query can be executed entirely in the FTA.
+               hfta_returned = 0;
+
+               for(si=0;si<ifaces.size();++si){
+                       fta_node = new spx_qpn();
+
+//                     Name the fta
+                       if(ifaces.size()==1)
+                               fta_node->set_node_name( node_name );
+                       else{
+                               string new_name =  "_"+node_name+"_"+ifaces[si].first+"_"+ifaces[si].second;
+                               untaboo(new_name);
+                               fta_node->set_node_name(new_name);
+                       }
+                       sel_names.push_back(fta_node->get_node_name());
+
+//                     Assign the table
+                       fta_node->table_name = table_name->duplicate();
+                       fta_node->table_name->set_machine(ifaces[si].first);
+                       fta_node->table_name->set_interface(ifaces[si].second);
+                       fta_node->table_name->set_ifq(false);
+
+                       for(s=0;s<select_list.size();s++){
+                               fta_node->select_list.push_back( dup_select(select_list[s], NULL) );
+                       }
+                       for(p=0;p<where.size();p++){
+                               predicate_t *new_pr = dup_pr(where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+
+                               fta_node->where.push_back(new_cnf);
+                       }
+
+//                     Xfer all of the parameters.
+//                     Use existing handle annotations.
+                       vector<string> param_names = param_tbl->get_param_names();
+                       int pi;
+                       for(pi=0;pi<param_names.size();pi++){
+                               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                               fta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+                       }
+                       fta_node->definitions = definitions;
+                       if(fta_node->resolve_if_params(ifdb, this->err_str)){
+                               this->error_code = 3;
+                               return ret_vec;
+                       }
+
+                       ret_vec.push_back(fta_node);
+               }
+
+               if(ifaces.size() > 1){
+               spx_qpn *tmp_spx = (spx_qpn *)(ret_vec[0]);
+                       mrg_qpn *mrg_node = new mrg_qpn(tmp_spx,
+                                node_name,  sel_names,ifaces, ifdb);
+                       /*
+                       Do not split sources until we are done with optimizations
+                       vector<mrg_qpn *> split_merge = mrg_node->split_sources();
+                       for(i=0;i<split_merge.size();++i){
+                               ret_vec.push_back(split_merge[i]);
+                       }
+                       hfta_returned = split_merge.size();
+                       */
+                       ret_vec.push_back(mrg_node);
+                       hfta_returned = 1;
+               }
+
+
+// printf("OK as FTA.\n");
+// printf("FTA node is:\n%s\n\n",fta_node->to_query_string().c_str() );
+
+               return(ret_vec);
+       }
+
+////////////////////////////////////////////////////
+//                     The fta must be split.  Create a stream node.
+//                     NOTE : I am counting on the single
+//                     table in the from list.  (Joins handled in a different operator).
+
+       hfta_returned = 1;
+
+       spx_qpn *stream_node = new spx_qpn();
+       stream_node->set_node_name( node_name );
+//             Create the tablevar in the stream's FROM clause.
+//             set the schema name to the name of the LFTA,
+//             and use the same tablevar name.
+       stream_node->table_name = new tablevar_t(
+                        ("_fta_"+node_name).c_str()
+        );
+       stream_node->table_name->set_range_var(table_name->get_var_name());
+
+//                     Name the fta
+       fta_node->set_node_name( "_fta_"+node_name );
+
+//                     table var names of fta, stream.
+    string fta_var = fta_node->table_name->get_var_name();
+    string stream_var = stream_node->table_name->get_var_name();
+
+//                     Set up select list vector
+       vector< vector<select_element *> *> select_vec;
+       select_vec.push_back(&(fta_node->select_list)); // only one child
+
+
+//                     Split the select list into its FTA and stream parts.
+//                     If any part of the SE is fta-unsafe, it will return
+//                     a SE to execute at the stream ref'ing SE's evaluated
+//                     at the fta (which are put on the FTA's select list as a side effect).
+//                     If the SE is fta-safe, put it on the fta select list, make
+//                     a ref to it and put the ref on the stream select list.
+       for(s=0;s<select_list.size();s++){
+               bool fta_forbidden = false;
+               int se_src = SPLIT_FTAVEC_NOTBLVAR;
+//             scalarexp_t *root_se = split_fta_se(
+//                     select_list[s]->se,fta_forbidden, fta_node->select_list, Ext_fcns
+//             );
+               scalarexp_t *root_se = split_ftavec_se( select_list[s]->se,
+                                       fta_forbidden, se_src, select_vec, Ext_fcns
+               );
+//             if(fta_forbidden){
+               if(fta_forbidden || se_src == SPLIT_FTAVEC_NOTBLVAR){
+                       stream_node->select_list.push_back(
+                               new select_element(root_se, select_list[s]->name)
+                       );
+               }else{
+                       scalarexp_t *new_se=make_fta_se_ref(fta_node->select_list,root_se,0);
+                       stream_node->select_list.push_back(
+                               new select_element(new_se, select_list[s]->name)
+                       );
+               }
+       }
+
+
+//             The WHERE clause has already been split into a set of clauses
+//             that are ANDED together.  For each clause, check if its FTA-safe.
+//             If not, split its SE's into fta-safe and stream-executing parts,
+//             then put a clause which ref's the SEs into the stream.
+//             Else put it into the LFTA.
+       predicate_t *pr_root;
+       bool fta_forbidden;
+       for(p=0;p<where.size();p++){
+               if(! check_fta_forbidden_pr(where[p]->pr, NULL, Ext_fcns) ){
+                       pr_root = split_ftavec_pr(where[p]->pr,select_vec,Ext_fcns);
+//                     pr_root = split_fta_pr( where[p]->pr, fta_node->select_list, Ext_fcns);
+                       fta_forbidden = true;
+               }else{
+                       pr_root = dup_pr(where[p]->pr, NULL);
+                       fta_forbidden = false;
+               }
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               if(fta_forbidden){
+                       stream_node->where.push_back(cnf_root);
+               }else{
+                       fta_node->where.push_back(cnf_root);
+               }
+       }
+
+
+
+//                     Divide the parameters among the stream, FTA.
+//                     Currently : assume that the stream receives all parameters
+//                     and parameter updates, incorporates them, then passes
+//                     all of the parameters to the FTA.
+//                     This will need to change (tables, fta-unsafe types. etc.)
+
+//                     I will pass on the use_handle_access marking, even
+//                     though the fcn call that requires handle access might
+//                     exist in only one of the parts of the query.
+//                     Parameter manipulation and handle access determination will
+//                     need to be revisited anyway.
+       vector<string> param_names = param_tbl->get_param_names();
+       int pi;
+       for(pi=0;pi<param_names.size();pi++){
+               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+               fta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+               stream_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+       }
+
+       fta_node->definitions = definitions; fta_node->definitions.erase("_referenced_ifaces");
+       stream_node->definitions = definitions;
+
+//             Now split by interfaces
+       if(ifaces.size() > 1){
+               for(si=0;si<ifaces.size();++si){
+                       spx_qpn *subq_node = new spx_qpn();
+
+//                     Name the subquery
+                       string new_name =  "_"+node_name+"_"+ifaces[si].first+"_"+ifaces[si].second;
+                       untaboo(new_name);
+                       subq_node->set_node_name( new_name) ;
+                       sel_names.push_back(subq_node->get_node_name());
+
+//                     Assign the table
+                       subq_node->table_name = fta_node->table_name->duplicate();
+                       subq_node->table_name->set_machine(ifaces[si].first);
+                       subq_node->table_name->set_interface(ifaces[si].second);
+                       subq_node->table_name->set_ifq(false);
+
+                       for(s=0;s<fta_node->select_list.size();s++){
+                               subq_node->select_list.push_back( dup_select(fta_node->select_list[s], NULL) );
+                       }
+                       for(p=0;p<fta_node->where.size();p++){
+                               predicate_t *new_pr = dup_pr(fta_node->where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+
+                               subq_node->where.push_back(new_cnf);
+                       }
+//                     Xfer all of the parameters.
+//                     Use existing handle annotations.
+                       vector<string> param_names = param_tbl->get_param_names();
+                       int pi;
+                       for(pi=0;pi<param_names.size();pi++){
+                               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                               subq_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+                       }
+                       if(subq_node->resolve_if_params(ifdb, this->err_str)){
+                               this->error_code = 3;
+                               return ret_vec;
+                       }
+                       subq_node->definitions = definitions; subq_node->definitions.erase("_referenced_ifaces");
+
+                       ret_vec.push_back(subq_node);
+               }
+
+               mrg_qpn *mrg_node = new mrg_qpn((spx_qpn *)(ret_vec[0]),
+                        fta_node->node_name, sel_names, ifaces, ifdb);
+               /*
+               Do not split sources until we are done with optimizations
+               vector<mrg_qpn *> split_merge = mrg_node->split_sources();
+               for(i=0;i<split_merge.size();++i){
+                       ret_vec.push_back(split_merge[i]);
+               }
+               */
+               ret_vec.push_back(mrg_node);
+               ret_vec.push_back(stream_node);
+               hfta_returned = 1/*split_merge.size()*/ + 1;
+
+       }else{
+               fta_node->table_name->set_machine(ifaces[0].first);
+               fta_node->table_name->set_interface(ifaces[0].second);
+               fta_node->table_name->set_ifq(false);
+               if(fta_node->resolve_if_params(ifdb, this->err_str)){
+                       this->error_code = 3;
+                       return ret_vec;
+               }
+               ret_vec.push_back(fta_node);
+               ret_vec.push_back(stream_node);
+               hfta_returned = 1;
+       }
+
+// printf("FTA node is:\n%s\n\n",fta_node->to_query_string().c_str() );
+// printf("Stream node is:\n%s\n\n",stream_node->to_query_string().c_str() );
+
+
+       return(ret_vec);
+}
+
+
+/*
+       Splitting a aggregation+sampling operator.
+    right now, return an error if any splitting is required.
+*/
+
+vector<qp_node *> sgahcwcb_qpn::split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx){
+
+       hfta_returned = 1;
+
+       vector<qp_node *> ret_vec;
+       int s, p, g, a, o, i;
+       int si;
+
+       vector<string> fta_flds, stream_flds;
+
+//                     If the node reads from a stream, don't split.
+//     int t = Schema->get_table_ref(table_name->get_schema_name());
+       int t = table_name->get_schema_ref();
+       if(Schema->get_schema_type(t) != PROTOCOL_SCHEMA){
+               ret_vec.push_back(this);
+               return(ret_vec);
+       }
+
+       fprintf(stderr,"ERROR : cannot split a sampling operator (not yet implemented).\n");
+       exit(1);
+
+       return ret_vec;
+
+
+}
+
+
+/*
+       Splitting a running aggregation operator.
+    The code is almost identical to that of the the sgah operator
+    except that
+       - there is no lfta-only option.
+          - the stream node is rsagh_qpn (lfta is sgah or spx)
+          - need to handle the closing when (similar to having)
+*/
+
+vector<qp_node *> rsgah_qpn::split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx){
+
+       hfta_returned = 1;
+
+       vector<qp_node *> ret_vec;
+       int s, p, g, a, o, i;
+       int si;
+
+       vector<string> fta_flds, stream_flds;
+
+//                     If the node reads from a stream, don't split.
+//     int t = Schema->get_table_ref(table_name->get_schema_name());
+       int t = table_name->get_schema_ref();
+       if(Schema->get_schema_type(t) != PROTOCOL_SCHEMA){
+               ret_vec.push_back(this);
+               return(ret_vec);
+       }
+
+//                     Get the set of interfaces it accesses.
+       int ierr;
+       vector<string> sel_names;
+       vector<pair<string,string> > ifaces = get_ifaces(table_name, ifdb, n_virtual_ifaces, hfta_parallelism, hfta_idx);
+       if (ifaces.empty()) {
+               fprintf(stderr,"INTERNAL ERROR in rsgah_qpn::split_node_for_fta - empty interface set\n");
+               exit(1);
+       }
+
+
+
+
+//////////////////////////////////////////////////////////////
+///                    Split into lfta, hfta.
+
+//                     A rsgah node must always be split,
+//                     if for no other reason than to complete the
+//                     partial aggregation.
+
+//                     First, determine if the query can be spit into aggr/aggr,
+//                     or if it must be selection/aggr.
+//                     Splitting into selection/aggr is allowed only
+//                     if select_lfta is set.
+
+
+       bool select_allowed = definitions.count("select_lfta")>0;
+       bool select_rqd = false;
+
+       set<int> unsafe_gbvars;         // for processing where clause
+       for(g=0;g<gb_tbl.size();g++){
+               if(! check_fta_forbidden_se(gb_tbl.get_def(g), &aggr_tbl, Ext_fcns)){
+                       if(!select_allowed){
+                         sprintf(tmpstr,"ERROR in rsgah_qpn::split_node_for_fta : group by attribute (%s) has LFTA-unsafe definition but select_lfta is not enabled (%s).\n",
+                               gb_tbl.get_name(g).c_str(), se_to_query_string(gb_tbl.get_def(g), &aggr_tbl).c_str()
+                         );
+                         this->error_code = 1;
+                         this->err_str = tmpstr;
+                         return(ret_vec);
+                       }else{
+                         select_rqd = true;
+                         unsafe_gbvars.insert(g);
+                       }
+               }
+       }
+
+//                     Verify that the SEs in the aggregate definitions are fta-safe
+       for(a=0;a<aggr_tbl.size();++a){
+               scalarexp_t *ase = aggr_tbl.get_aggr_se(a);
+               if(ase != NULL){        // COUNT(*) does not have a SE.
+                 if(!select_allowed){
+                   if(! check_fta_forbidden_se(aggr_tbl.get_aggr_se(a), &aggr_tbl, Ext_fcns)){
+                         sprintf(tmpstr,"ERROR in rsgah_qpn::split_node_for_fta : aggregate (%s) has FTA-unsafe scalar expression but select_lfta is not enabled (%s).\n",
+                               aggr_tbl.get_op(a).c_str(), se_to_query_string(aggr_tbl.get_aggr_se(a), &aggr_tbl).c_str()
+                         );
+                         this->error_code = 1;
+                         this->err_str = tmpstr;
+                         return(ret_vec);
+                   }
+                 }else{
+                       select_rqd = true;
+                 }
+               }
+       }
+
+//                     Verify that all of the ref'd UDAFs can be split.
+
+       for(a=0;a<aggr_tbl.size();++a){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn = aggr_tbl.get_fcn_id(a);
+                       int super_id = Ext_fcns->get_superaggr_id(afcn);
+                       int sub_id = Ext_fcns->get_subaggr_id(afcn);
+                       if(super_id < 0 || sub_id < 0){
+                         if(!select_allowed){
+                               this->err_str += "ERROR in rsgah_qpn::split_node_for_fta : UDAF "+aggr_tbl.get_op(a)+" doesn't have sub/super UDAFS so it can't be split, but select_lfta is not enabled.\n";
+                               this->error_code = 1;
+                               return(ret_vec);
+                         }else{
+                               select_rqd = true;
+                         }
+                       }
+               }
+    }
+
+       for(p=0;p<where.size();p++){
+               if(! check_fta_forbidden_pr(where[p]->pr, &aggr_tbl, Ext_fcns) ){
+                 if(!select_allowed){
+                       sprintf(tmpstr,"ERROR in rsgah_qpn::split_node_for_fta : all of the WHERE predicate must be FTA-safe, but select_lfta is not enabled (%s).\n",
+                               pred_to_query_str(where[p]->pr,&aggr_tbl).c_str()
+                       );
+                       this->error_code = 1;
+                       this->err_str = tmpstr;
+                       return(ret_vec);
+                 }else{
+                       select_rqd = true;
+                 }
+               }
+       }
+
+
+       if(! select_rqd){
+
+/////////////////////////////////////////////////////
+//                     Split into  aggr/aggr.
+
+
+
+
+
+       sgah_qpn *fta_node = new sgah_qpn();
+               fta_node->table_name = table_name;
+               fta_node->set_node_name( "_fta_"+node_name );
+               fta_node->table_name->set_range_var(table_name->get_var_name());
+
+
+       rsgah_qpn *stream_node = new rsgah_qpn();
+               stream_node->table_name = new tablevar_t(  ("_fta_"+node_name).c_str());
+               stream_node->set_node_name( node_name );
+               stream_node->table_name->set_range_var(table_name->get_var_name());
+
+//                     First, process the group-by variables.
+//                     The fta must supply the values of all the gbvars.
+//                     If a gb is computed, the computation must be
+//                     performed at the FTA, so the SE must be FTA-safe.
+//                     Nice side effect : the gbvar table contains
+//                     matching entries for the original query, the lfta query,
+//                     and the hfta query.  So gbrefs in the new queries are set
+//                     correctly just by inheriting the gbrefs from the old query.
+//                     If this property changed, I'll need translation tables.
+
+
+       for(g=0;g<gb_tbl.size();g++){
+//                     Insert the gbvar into the lfta.
+               scalarexp_t *gbvar_def = dup_se(gb_tbl.get_def(g), &aggr_tbl);
+               fta_node->gb_tbl.add_gb_var(
+                       gb_tbl.get_name(g), gb_tbl.get_tblvar_ref(g), gbvar_def, gb_tbl.get_reftype(g)
+               );
+
+//                     Insert a ref to the value of the gbvar into the lfta select list.
+               colref_t *new_cr = new colref_t(gb_tbl.get_name(g).c_str() );
+               scalarexp_t *gbvar_fta = new scalarexp_t(new_cr);
+               gbvar_fta->set_gb_ref(g);
+               gbvar_fta->set_data_type( gb_tbl.get_def(g)->get_data_type() );
+               scalarexp_t *gbvar_stream = make_fta_se_ref(fta_node->select_list, gbvar_fta,0);
+
+//                     Insert the corresponding gbvar ref (gbvar_stream) into the stream.
+               gbvar_stream->set_gb_ref(-1);   // used as GBvar def
+               stream_node->gb_tbl.add_gb_var(
+                       gbvar_stream->get_colref()->get_field(), -1, gbvar_stream,  gb_tbl.get_reftype(g)
+               );
+
+       }
+
+//                     SEs in the aggregate definitions.
+//                     They are all safe, so split them up for later processing.
+       map<int, scalarexp_t *> hfta_aggr_se;
+       for(a=0;a<aggr_tbl.size();++a){
+               split_fta_aggr( &(aggr_tbl), a,
+                                               &(stream_node->aggr_tbl), &(fta_node->aggr_tbl)  ,
+                                               fta_node->select_list,
+                                               hfta_aggr_se,
+                                               Ext_fcns
+                                       );
+       }
+
+
+//                     Next, the select list.
+
+       for(s=0;s<select_list.size();s++){
+               bool fta_forbidden = false;
+               scalarexp_t *root_se = rehome_fta_se(select_list[s]->se, &hfta_aggr_se);
+               stream_node->select_list.push_back(
+                       new select_element(root_se, select_list[s]->name));
+       }
+
+
+
+//                     All the predicates in the where clause must execute
+//                     in the fta.
+
+       for(p=0;p<where.size();p++){
+               predicate_t *new_pr = dup_pr(where[p]->pr, &aggr_tbl);
+               cnf_elem *new_cnf = new cnf_elem(new_pr);
+               analyze_cnf(new_cnf);
+
+               fta_node->where.push_back(new_cnf);
+       }
+
+//                     All of the predicates in the having clause must
+//                     execute in the stream node.
+
+       for(p=0;p<having.size();p++){
+               predicate_t *pr_root = rehome_fta_pr( having[p]->pr,  &hfta_aggr_se);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               stream_node->having.push_back(cnf_root);
+       }
+
+//                     All of the predicates in the closing when clause must
+//                     execute in the stream node.
+
+       for(p=0;p<closing_when.size();p++){
+               predicate_t *pr_root=rehome_fta_pr(closing_when[p]->pr,&hfta_aggr_se);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               stream_node->closing_when.push_back(cnf_root);
+       }
+
+
+//                     Divide the parameters among the stream, FTA.
+//                     Currently : assume that the stream receives all parameters
+//                     and parameter updates, incorporates them, then passes
+//                     all of the parameters to the FTA.
+//                     This will need to change (tables, fta-unsafe types. etc.)
+
+//                     I will pass on the use_handle_access marking, even
+//                     though the fcn call that requires handle access might
+//                     exist in only one of the parts of the query.
+//                     Parameter manipulation and handle access determination will
+//                     need to be revisited anyway.
+       vector<string> param_names = param_tbl->get_param_names();
+       int pi;
+       for(pi=0;pi<param_names.size();pi++){
+               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+               fta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+               stream_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+       }
+       fta_node->definitions = definitions; fta_node->definitions.erase("_referenced_ifaces");
+       stream_node->definitions = definitions;
+
+//             Now split by interfaces XXXX
+       if(ifaces.size() > 1){
+               for(si=0;si<ifaces.size();++si){
+                       sgah_qpn *subq_node = new sgah_qpn();
+
+//                     Name the subquery
+                       string new_name =  "_"+node_name+"_"+ifaces[si].first+"_"+ifaces[si].second;
+                       untaboo(new_name);
+                       subq_node->set_node_name( new_name) ;
+                       sel_names.push_back(subq_node->get_node_name());
+
+//                     Assign the table
+                       subq_node->table_name = fta_node->table_name->duplicate();
+                       subq_node->table_name->set_machine(ifaces[si].first);
+                       subq_node->table_name->set_interface(ifaces[si].second);
+                       subq_node->table_name->set_ifq(false);
+
+//                     the GB vars.
+                       for(g=0;g<fta_node->gb_tbl.size();g++){
+//                     Insert the gbvar into the lfta.
+                               scalarexp_t *gbvar_def = dup_se(fta_node->gb_tbl.get_def(g), NULL);
+                               subq_node->gb_tbl.add_gb_var(
+                                       fta_node->gb_tbl.get_name(g), fta_node->gb_tbl.get_tblvar_ref(g), gbvar_def, fta_node->gb_tbl.get_reftype(g)
+                               );
+                       }
+
+//                     Insert the aggregates
+                       for(a=0;a<fta_node->aggr_tbl.size();++a){
+                               subq_node->aggr_tbl.add_aggr(fta_node->aggr_tbl.duplicate(a));
+                       }
+
+                       for(s=0;s<fta_node->select_list.size();s++){
+                               subq_node->select_list.push_back( dup_select(fta_node->select_list[s], NULL) );
+                       }
+                       for(p=0;p<fta_node->where.size();p++){
+                               predicate_t *new_pr = dup_pr(fta_node->where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+
+                               subq_node->where.push_back(new_cnf);
+                       }
+                       for(p=0;p<fta_node->having.size();p++){
+                               predicate_t *new_pr = dup_pr(fta_node->having[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+
+                               subq_node->having.push_back(new_cnf);
+                       }
+//                     Xfer all of the parameters.
+//                     Use existing handle annotations.
+                       vector<string> param_names = param_tbl->get_param_names();
+                       int pi;
+                       for(pi=0;pi<param_names.size();pi++){
+                               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                               subq_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+                       }
+                       subq_node->definitions = definitions; subq_node->definitions.erase("_referenced_ifaces");
+                       if(subq_node->resolve_if_params(ifdb, this->err_str)){
+                               this->error_code = 3;
+                               return ret_vec;
+                       }
+
+                       ret_vec.push_back(subq_node);
+               }
+
+               mrg_qpn *mrg_node = new mrg_qpn((sgah_qpn *)(ret_vec[0]),
+                        fta_node->node_name, sel_names, ifaces, ifdb);
+
+               /*
+               Do not split sources until we are done with optimizations
+               vector<mrg_qpn *> split_merge = mrg_node->split_sources();
+               for(i=0;i<split_merge.size();++i){
+                       ret_vec.push_back(split_merge[i]);
+               }
+               */
+               ret_vec.push_back(mrg_node);
+               ret_vec.push_back(stream_node);
+               hfta_returned = 1/*split_merge.size()*/+1;
+
+       }else{
+               fta_node->table_name->set_machine(ifaces[0].first);
+               fta_node->table_name->set_interface(ifaces[0].second);
+               fta_node->table_name->set_ifq(false);
+               if(fta_node->resolve_if_params(ifdb, this->err_str)){
+                       this->error_code = 3;
+                       return ret_vec;
+               }
+               ret_vec.push_back(fta_node);
+               ret_vec.push_back(stream_node);
+               hfta_returned = 1;
+       }
+
+
+//     ret_vec.push_back(fta_node);
+//     ret_vec.push_back(stream_node);
+
+
+       return(ret_vec);
+
+       }
+
+/////////////////////////////////////////////////////////////////////
+///            Split into selection LFTA, aggregation HFTA.
+
+       spx_qpn *fta_node = new spx_qpn();
+               fta_node->table_name = table_name;
+               fta_node->set_node_name( "_fta_"+node_name );
+               fta_node->table_name->set_range_var(table_name->get_var_name());
+
+
+       rsgah_qpn *stream_node = new rsgah_qpn();
+               stream_node->table_name = new tablevar_t( ("_fta_"+node_name).c_str());
+               stream_node->set_node_name( node_name );
+               stream_node->table_name->set_range_var(table_name->get_var_name());
+
+
+       vector< vector<select_element *> *> select_vec;
+       select_vec.push_back(&(fta_node->select_list)); // only one child
+
+//                     Process the gbvars.  Split their defining SEs.
+       for(g=0;g<gb_tbl.size();g++){
+               bool fta_forbidden = false;
+               int se_src = SPLIT_FTAVEC_NOTBLVAR;
+
+               scalarexp_t *gbvar_se = split_ftavec_se( gb_tbl.get_def(g),
+                                       fta_forbidden, se_src, select_vec, Ext_fcns
+               );
+//             if(fta_forbidden) (
+               if(fta_forbidden || se_src == SPLIT_FTAVEC_NOTBLVAR){
+                       stream_node->gb_tbl.add_gb_var(
+                         gb_tbl.get_name(g),gb_tbl.get_tblvar_ref(g),gbvar_se,gb_tbl.get_reftype(g)
+                       );
+               }else{
+                       scalarexp_t *new_se=make_fta_se_ref(fta_node->select_list,gbvar_se,0);
+                       stream_node->gb_tbl.add_gb_var(
+                         gb_tbl.get_name(g),gb_tbl.get_tblvar_ref(g),new_se,gb_tbl.get_reftype(g)
+                       );
+               }
+       }
+
+//             Process the aggregate table.
+//             Copy to stream, split the SEs.
+       map<int, scalarexp_t *> hfta_aggr_se;   // for rehome
+       for(a=0;a<aggr_tbl.size();++a){
+               scalarexp_t *hse;
+               if(aggr_tbl.is_builtin(a)){
+                       if(aggr_tbl.is_star_aggr(a)){
+                               stream_node->aggr_tbl.add_aggr(aggr_tbl.get_op(a),NULL, false);
+                               hse=scalarexp_t::make_star_aggr(aggr_tbl.get_op(a).c_str());
+                       }else{
+                               bool fta_forbidden = false;
+                               int se_src = SPLIT_FTAVEC_NOTBLVAR;
+
+                               scalarexp_t *agg_se = split_ftavec_se( aggr_tbl.get_aggr_se(a),
+                                       fta_forbidden, se_src, select_vec, Ext_fcns
+                               );
+//                             if(fta_forbidden) (
+                               if(fta_forbidden || se_src == SPLIT_FTAVEC_NOTBLVAR){
+                                       stream_node->aggr_tbl.add_aggr(aggr_tbl.get_op(a), agg_se,false);
+                                       hse=scalarexp_t::make_se_aggr(aggr_tbl.get_op(a).c_str(),agg_se);
+                               }else{
+                                       scalarexp_t *new_se=make_fta_se_ref(fta_node->select_list,agg_se,0);
+                                       stream_node->aggr_tbl.add_aggr(aggr_tbl.get_op(a), new_se,false);
+                                       hse=scalarexp_t::make_se_aggr(aggr_tbl.get_op(a).c_str(),new_se);
+                               }
+                       }
+                       hse->set_data_type(aggr_tbl.get_data_type(a));
+                       hse->set_aggr_id(a);
+                       hfta_aggr_se[a]=hse;
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(a);
+                       vector<scalarexp_t *> new_opl;
+                       for(o=0;o<opl.size();++o){
+                               bool fta_forbidden = false;
+                               int se_src = SPLIT_FTAVEC_NOTBLVAR;
+                               scalarexp_t *agg_se = split_ftavec_se( opl[o],
+                                       fta_forbidden, se_src, select_vec, Ext_fcns
+                               );
+//                             scalarexp_t *agg_se = split_ftavec_se( aggr_tbl.get_aggr_se(a),
+//                                     fta_forbidden, se_src, select_vec, Ext_fcns
+//                             );
+//                             if(fta_forbidden) (
+                               if(fta_forbidden || se_src == SPLIT_FTAVEC_NOTBLVAR){
+                                       new_opl.push_back(agg_se);
+                               }else{
+                                       scalarexp_t *new_se=make_fta_se_ref(fta_node->select_list,agg_se,0);
+                                       new_opl.push_back(new_se);
+                               }
+                       }
+                       stream_node->aggr_tbl.add_aggr(aggr_tbl.get_op(a), aggr_tbl.get_fcn_id(a), new_opl, aggr_tbl.get_storage_type(a),false, false,aggr_tbl.has_bailout(a));
+                       hse = new scalarexp_t(aggr_tbl.get_op(a).c_str(),new_opl);
+                       hse->set_data_type(Ext_fcns->get_fcn_dt(aggr_tbl.get_fcn_id(a)));
+                       hse->set_fcn_id(aggr_tbl.get_fcn_id(a));
+                       hse->set_aggr_id(a);
+                       hfta_aggr_se[a]=hse;
+               }
+       }
+
+
+//             Process the WHERE clause.
+//             If it is fta-safe AND it refs only fta-safe gbvars,
+//             then expand the gbvars and put it into the lfta.
+//             Else, split it into an hfta predicate ref'ing
+//             se's computed partially in the lfta.
+
+       predicate_t *pr_root;
+       bool fta_forbidden;
+       for(p=0;p<where.size();p++){
+               if(! check_fta_forbidden_pr(where[p]->pr, NULL, Ext_fcns) || contains_gb_pr(where[p]->pr, unsafe_gbvars) ){
+                       pr_root = split_ftavec_pr(where[p]->pr,select_vec,Ext_fcns);
+                       fta_forbidden = true;
+               }else{
+                       pr_root = dup_pr(where[p]->pr, NULL);
+                       expand_gbvars_pr(pr_root, gb_tbl);
+                       fta_forbidden = false;
+               }
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               if(fta_forbidden){
+                       stream_node->where.push_back(cnf_root);
+               }else{
+                       fta_node->where.push_back(cnf_root);
+               }
+       }
+
+
+//             Process the Select clause, rehome it on the
+//             new defs.
+       for(s=0;s<select_list.size();s++){
+               bool fta_forbidden = false;
+               scalarexp_t *root_se = rehome_fta_se(select_list[s]->se, &hfta_aggr_se);
+               stream_node->select_list.push_back(
+                       new select_element(root_se, select_list[s]->name));
+       }
+
+
+// Process the Having clause
+
+//                     All of the predicates in the having clause must
+//                     execute in the stream node.
+
+       for(p=0;p<having.size();p++){
+               predicate_t *pr_root = rehome_fta_pr( having[p]->pr,  &hfta_aggr_se);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               stream_node->having.push_back(cnf_root);
+       }
+//                     Same for closing when
+       for(p=0;p<closing_when.size();p++){
+               predicate_t *pr_root=rehome_fta_pr(closing_when[p]->pr,&hfta_aggr_se);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               stream_node->closing_when.push_back(cnf_root);
+       }
+
+
+//             Handle parameters and a few last details.
+       vector<string> param_names = param_tbl->get_param_names();
+       int pi;
+       for(pi=0;pi<param_names.size();pi++){
+               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+               fta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+               stream_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+       }
+
+       fta_node->definitions = definitions; fta_node->definitions.erase("_referenced_ifaces");
+       stream_node->definitions = definitions;
+
+//             Now split by interfaces YYYY
+       if(ifaces.size() > 1){
+               for(si=0;si<ifaces.size();++si){
+                       spx_qpn *subq_node = new spx_qpn();
+
+//                     Name the subquery
+                       string new_name =  "_"+node_name+"_"+ifaces[si].first+"_"+ifaces[si].second;
+                       untaboo(new_name);
+                       subq_node->set_node_name( new_name) ;
+                       sel_names.push_back(subq_node->get_node_name());
+
+//                     Assign the table
+                       subq_node->table_name = fta_node->table_name->duplicate();
+                       subq_node->table_name->set_machine(ifaces[si].first);
+                       subq_node->table_name->set_interface(ifaces[si].second);
+                       subq_node->table_name->set_ifq(false);
+
+                       for(s=0;s<fta_node->select_list.size();s++){
+                               subq_node->select_list.push_back( dup_select(fta_node->select_list[s], NULL) );
+                       }
+                       for(p=0;p<fta_node->where.size();p++){
+                               predicate_t *new_pr = dup_pr(fta_node->where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+
+                               subq_node->where.push_back(new_cnf);
+                       }
+//                     Xfer all of the parameters.
+//                     Use existing handle annotations.
+                       vector<string> param_names = param_tbl->get_param_names();
+                       int pi;
+                       for(pi=0;pi<param_names.size();pi++){
+                               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                               subq_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+                       }
+                       subq_node->definitions = definitions; subq_node->definitions.erase("_referenced_ifaces");
+                       if(subq_node->resolve_if_params(ifdb, this->err_str)){
+                               this->error_code = 3;
+                               return ret_vec;
+                       }
+
+                       ret_vec.push_back(subq_node);
+               }
+
+               mrg_qpn *mrg_node = new mrg_qpn((spx_qpn *)(ret_vec[0]),
+                        fta_node->node_name, sel_names, ifaces, ifdb);
+               /*
+               Do not split sources until we are done with optimizations
+               vector<mrg_qpn *> split_merge = mrg_node->split_sources();
+               for(i=0;i<split_merge.size();++i){
+                       ret_vec.push_back(split_merge[i]);
+               }
+               */
+               ret_vec.push_back(mrg_node);
+               ret_vec.push_back(stream_node);
+               hfta_returned = 1/*split_merge.size()*/+1;
+
+       }else{
+               fta_node->table_name->set_machine(ifaces[0].first);
+               fta_node->table_name->set_interface(ifaces[0].second);
+               fta_node->table_name->set_ifq(false);
+               if(fta_node->resolve_if_params(ifdb, this->err_str)){
+                       this->error_code = 3;
+                       return ret_vec;
+               }
+               ret_vec.push_back(fta_node);
+               ret_vec.push_back(stream_node);
+               hfta_returned = 1;
+       }
+
+       return(ret_vec);
+
+}
+
+
+/*
+               Splitting an aggregation operator
+
+               An aggregation operator can reference
+                       literals, parameters, colrefs, group-by vars, aggregates,
+                       operators, functions
+
+               an aggregation contains
+                       A selection list of SEs
+                       A where list of predicates
+                       A list group-by variable definition
+                       A list of aggregates to be computed
+                       A HAVING list of predicates.
+
+               Aggregation involves two phases:
+                       1) given an input tuple, determine if it satisfies all of
+                               the WHERE predicates.  If so, compute the group.
+                               Look up the group, update its aggregates.
+                       2) given a closed group and its aggregates, determine
+                               if these values satisfy all of the HAVING predicates.
+                               If so, evaluate the SEs on the selection list from the
+                               group and its aggregates.
+               The two-phase nature of aggregation places restrictions on
+               what can be referenced by different components of the operator
+               (in addition to functions and operators).
+               - group-by variables : literals, parameters, colrefs
+               - WHERE predicates : group-by vars, literals, params, colrefs
+               - HAVING predicates : group-by vars, literals, params, aggregates
+               - Selection list SEs : group-by vars, literals, params, aggregates
+
+               Splitting an aggregation operator into an LFTA/HFTA part
+               involves performing partial aggregation at the LFTA and
+               completing the aggregation at the HFTA.
+               - given a tuple, the LFTA part evaluates the WHERE clause,
+                 and if it is satisfied, computes the group.  lookup the group
+                 and update the aggregates.  output the group and its partial
+                 aggregates
+               - Given a partial aggregate from the LFTA, look up the group and
+                 update its aggregates.  When the group is closed, evalute
+                 the HAVING clause and the SEs on the selection list.
+               THEREFORE the selection list of the LFTA must consist of the
+               group-by variables and the set of (bare) subaggregate values
+               necessary to compute the super aggregates.
+               Unlike the case with the SPX operator, the SE splitting point
+               is at the GBvar and the aggregate value level.
+
+               ALGORITHM:
+               For each group-by variable
+                       Put the GB variable definition in the LFTA GBVAR list.
+                       Put the GBVAR in the LFTA selection list (as an SE).
+                       Put a reference to that GBVAR in the HFTA GBVAR list.
+               For each aggregate
+                       Split the aggregate into a superaggregate and a subaggregate.
+                               The SE of the superaggregate references the subaggregate value.
+                               (this will need modifications for MF aggregation)
+               For each SE in the selection list, HAVING predicate
+                       Make GBVAR references point to the new GBVAR
+                       make the aggregate value references point to the new aggregates.
+
+               SEs are not so much split as their ref's are changed.
+
+               TODO: insert tablevar names into the colrefs.
+*/
+
+
+
+vector<qp_node *> sgah_qpn::split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx){
+
+       hfta_returned = 1;
+
+       vector<qp_node *> ret_vec;
+       int s, p, g, a, o, i;
+       int si;
+
+       vector<string> fta_flds, stream_flds;
+
+//                     If the node reads from a stream, don't split.
+//     int t = Schema->get_table_ref(table_name->get_schema_name());
+       int t = table_name->get_schema_ref();
+       if(Schema->get_schema_type(t) != PROTOCOL_SCHEMA){
+               ret_vec.push_back(this);
+               return(ret_vec);
+       }
+
+//                     Get the set of interfaces it accesses.
+       int ierr;
+       vector<string> sel_names;
+       vector<pair<string,string> > ifaces = get_ifaces(table_name, ifdb, n_virtual_ifaces, hfta_parallelism, hfta_idx);
+       if (ifaces.empty()) {
+               fprintf(stderr,"INTERNAL ERROR in sgah_qpn::split_node_for_fta - empty interface set\n");
+               exit(1);
+       }
+
+
+
+//////////////////////////////////////////////
+//             Is this LFTA-only?
+       if(definitions.count("lfta_aggregation")>0){
+//                     Yes.  Ensure that everything is lfta-safe.
+
+//                     Check only one interface is accessed.
+               if(ifaces.size()>1){
+                       this->err_str = "ERROR, group-by query "+node_name+" is lfta-only, but it accesses more than one interface:\n";
+                       for(si=0;si<ifaces.size();++si)
+                               this->err_str += "\t"+ifaces[si].first+"."+ifaces[si].second+"\n";
+                       this->error_code = 2;
+                       return(ret_vec);
+               }
+
+//                     Check the group-by attributes
+               for(g=0;g<gb_tbl.size();g++){
+                       if(! check_fta_forbidden_se(gb_tbl.get_def(g), &aggr_tbl, Ext_fcns)){
+                               sprintf(tmpstr,"ERROR in sgah_qpn::split_node_for_fta : group by attribute (%s) has LFTA-unsafe definition and the query is lfta-only (%s).\n",
+                                       gb_tbl.get_name(g).c_str(), se_to_query_string(gb_tbl.get_def(g), &aggr_tbl).c_str()
+                               );
+                               this->error_code = 1;
+                               this->err_str = tmpstr;
+                               return(ret_vec);
+                       }
+               }
+
+//                     Verify that the SEs in the aggregate definitions are fta-safe
+               for(a=0;a<aggr_tbl.size();++a){
+                       scalarexp_t *ase = aggr_tbl.get_aggr_se(a);
+                       if(ase != NULL){        // COUNT(*) does not have a SE.
+                               if(! check_fta_forbidden_se(aggr_tbl.get_aggr_se(a), &aggr_tbl, Ext_fcns)){
+                                       sprintf(tmpstr,"ERROR in sgah_qpn::split_node_for_fta : aggregate (%s) has LFTA-unsafe scalar expression and the query is lfta-only (%s).\n",
+                                               aggr_tbl.get_op(a).c_str(), se_to_query_string(aggr_tbl.get_aggr_se(a), &aggr_tbl).c_str()
+                                       );
+                                       this->error_code = 1;
+                                       this->err_str = tmpstr;
+                                       return(ret_vec);
+                               }
+                       }
+                       if(! aggr_tbl.fta_legal(a,Ext_fcns)){
+                         if(! check_fta_forbidden_se(aggr_tbl.get_aggr_se(a), &aggr_tbl, Ext_fcns)){
+                               sprintf(tmpstr,"ERROR in sgah_qpn::split_node_for_fta : aggregate (%s) has LFTA-unsafe aggregate and the query is lfta-only (%s).\n",
+                                       aggr_tbl.get_op(a).c_str(), se_to_query_string(aggr_tbl.get_aggr_se(a), &aggr_tbl).c_str()
+                               );
+                               this->error_code = 1;
+                               this->err_str = tmpstr;
+                               return(ret_vec);
+                               }
+                       }
+               }
+
+//             Ensure that all the aggregates are fta-safe ....
+
+//             select list
+
+               for(s=0;s<select_list.size();s++){
+                       if(! check_fta_forbidden_se(select_list[s]->se,NULL, Ext_fcns)){
+                               sprintf(tmpstr,"ERROR in sgah_qpn::split_node_for_fta : all of the WHERE predicate must be LFTA-safe and the query is lfta-only (%s).\n",
+                                       pred_to_query_str(where[p]->pr,&aggr_tbl).c_str()
+                               );
+                               this->error_code = 1;
+                               this->err_str = tmpstr;
+                               return(ret_vec);
+                       }
+               }
+
+//             where predicate
+
+               for(p=0;p<where.size();p++){
+                       if(! check_fta_forbidden_pr(where[p]->pr, &aggr_tbl, Ext_fcns) ){
+                               sprintf(tmpstr,"ERROR in sgah_qpn::split_node_for_fta : all of the WHERE predicate must be LFTA-safe and the query is lfta-only (%s).\n",
+                                       pred_to_query_str(where[p]->pr,&aggr_tbl).c_str()
+                               );
+                               this->error_code = 1;
+                               this->err_str = tmpstr;
+                               return(ret_vec);
+                       }
+               }
+
+
+//             having predicate
+               if(having.size()>0){
+                       sprintf(tmpstr,"ERROR in sgah_qpn::split_node_for_fta :  the query is lfta-only, so it can't have a HAVING clause.(%s).\n",
+                               pred_to_query_str(where[p]->pr,&aggr_tbl).c_str()
+                       );
+                       this->error_code = 1;
+                       this->err_str = tmpstr;
+                       return(ret_vec);
+               }
+//                     The query is lfta safe, return it.
+
+               hfta_returned = 0;
+               ret_vec.push_back(this);
+               return(ret_vec);
+       }
+
+//////////////////////////////////////////////////////////////
+///                    Split into lfta, hfta.
+
+//                     A sgah node must always be split,
+//                     if for no other reason than to complete the
+//                     partial aggregation.
+
+//                     First, determine if the query can be spit into aggr/aggr,
+//                     or if it must be selection/aggr.
+//                     Splitting into selection/aggr is allowed only
+//                     if select_lfta is set.
+
+
+       bool select_allowed = definitions.count("select_lfta")>0;
+       bool select_rqd = false;
+
+       set<int> unsafe_gbvars;         // for processing where clause
+       for(g=0;g<gb_tbl.size();g++){
+               if(! check_fta_forbidden_se(gb_tbl.get_def(g), &aggr_tbl, Ext_fcns)){
+                       if(!select_allowed){
+                         sprintf(tmpstr,"ERROR in sgah_qpn::split_node_for_fta : group by attribute (%s) has LFTA-unsafe definition but select_lfta is not enabled (%s).\n",
+                               gb_tbl.get_name(g).c_str(), se_to_query_string(gb_tbl.get_def(g), &aggr_tbl).c_str()
+                         );
+                         this->error_code = 1;
+                         this->err_str = tmpstr;
+                         return(ret_vec);
+                       }else{
+                         select_rqd = true;
+                         unsafe_gbvars.insert(g);
+                       }
+               }
+       }
+
+//                     Verify that the SEs in the aggregate definitions are fta-safe
+       for(a=0;a<aggr_tbl.size();++a){
+               scalarexp_t *ase = aggr_tbl.get_aggr_se(a);
+               if(ase != NULL){        // COUNT(*) does not have a SE.
+                 if(!select_allowed){
+                   if(! check_fta_forbidden_se(aggr_tbl.get_aggr_se(a), &aggr_tbl, Ext_fcns)){
+                         sprintf(tmpstr,"ERROR in sgah_qpn::split_node_for_fta : aggregate (%s) has FTA-unsafe scalar expression but select_lfta is not enabled (%s).\n",
+                               aggr_tbl.get_op(a).c_str(), se_to_query_string(aggr_tbl.get_aggr_se(a), &aggr_tbl).c_str()
+                         );
+                         this->error_code = 1;
+                         this->err_str = tmpstr;
+                         return(ret_vec);
+                   }
+                 }else{
+                       select_rqd = true;
+                 }
+               }
+       }
+
+//                     Verify that all of the ref'd UDAFs can be split.
+
+       for(a=0;a<aggr_tbl.size();++a){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn = aggr_tbl.get_fcn_id(a);
+                       int super_id = Ext_fcns->get_superaggr_id(afcn);
+                       int sub_id = Ext_fcns->get_subaggr_id(afcn);
+                       if(super_id < 0 || sub_id < 0){
+                         if(!select_allowed){
+                               this->err_str += "ERROR in sgah_qpn::split_node_for_fta : UDAF "+aggr_tbl.get_op(a)+" doesn't have sub/super UDAFS so it can't be split, but select_lfta is not enabled.\n";
+                               this->error_code = 1;
+                               return(ret_vec);
+                         }else{
+                               select_rqd = true;
+                         }
+                       }
+               }
+    }
+
+       for(p=0;p<where.size();p++){
+               if(! check_fta_forbidden_pr(where[p]->pr, &aggr_tbl, Ext_fcns) ){
+                 if(!select_allowed){
+                       sprintf(tmpstr,"ERROR in sgah_qpn::split_node_for_fta : all of the WHERE predicate must be FTA-safe, but select_lfta is not enabled (%s).\n",
+                               pred_to_query_str(where[p]->pr,&aggr_tbl).c_str()
+                       );
+                       this->error_code = 1;
+                       this->err_str = tmpstr;
+                       return(ret_vec);
+                 }else{
+                       select_rqd = true;
+                 }
+               }
+       }
+
+
+       if(! select_rqd){
+
+/////////////////////////////////////////////////////
+//                     Split into  aggr/aggr.
+
+
+
+
+
+       sgah_qpn *fta_node = new sgah_qpn();
+               fta_node->table_name = table_name;
+               fta_node->set_node_name( "_fta_"+node_name );
+               fta_node->table_name->set_range_var(table_name->get_var_name());
+
+
+       sgah_qpn *stream_node = new sgah_qpn();
+               stream_node->table_name = new tablevar_t(  ("_fta_"+node_name).c_str());
+               stream_node->set_node_name( node_name );
+               stream_node->table_name->set_range_var(table_name->get_var_name());
+
+//                     allowed stream disorder.  Default is 2,
+//                     can override with max_lfta_disorder setting.
+//                     Also limit the hfta disorder, set to lfta disorder + 1.
+//                     can override with max_hfta_disorder.
+
+       fta_node->lfta_disorder = 2;
+       if(this->get_val_of_def("max_lfta_disorder") != ""){
+               int d = atoi(this->get_val_of_def("max_lfta_disorder").c_str() );
+               if(d<1){
+                       fprintf(stderr,"Warning, max_lfta_disorder in node %s is %d, must be at least 1, ignoring.\n",node_name.c_str(), d);
+               }else{
+                       fta_node->lfta_disorder = d;
+printf("node %s setting lfta_disorder = %d\n",node_name.c_str(),fta_node->lfta_disorder);
+               }
+       }
+       if(fta_node->lfta_disorder > 1)
+               stream_node->hfta_disorder = fta_node->lfta_disorder + 1;
+       else
+               stream_node->hfta_disorder =  1;
+
+       if(this->get_val_of_def("max_hfta_disorder") != ""){
+               int d = atoi(this->get_val_of_def("max_hfta_disorder").c_str() );
+               if(d<fta_node->lfta_disorder){
+                       fprintf(stderr,"Warning, max_hfta_disorder in node %s is %d, must be at least the max lfta disorder %d, ignoring.\n",node_name.c_str(), d,fta_node->lfta_disorder);
+               }else{
+                       fta_node->lfta_disorder = d;
+               }
+               if(fta_node->lfta_disorder < fta_node->hfta_disorder){
+                       fta_node->hfta_disorder = fta_node->lfta_disorder + 1;
+               }
+       }
+
+//                     First, process the group-by variables.
+//                     The fta must supply the values of all the gbvars.
+//                     If a gb is computed, the computation must be
+//                     performed at the FTA, so the SE must be FTA-safe.
+//                     Nice side effect : the gbvar table contains
+//                     matching entries for the original query, the lfta query,
+//                     and the hfta query.  So gbrefs in the new queries are set
+//                     correctly just by inheriting the gbrefs from the old query.
+//                     If this property changed, I'll need translation tables.
+
+
+       for(g=0;g<gb_tbl.size();g++){
+//                     Insert the gbvar into the lfta.
+               scalarexp_t *gbvar_def = dup_se(gb_tbl.get_def(g), &aggr_tbl);
+               fta_node->gb_tbl.add_gb_var(
+                       gb_tbl.get_name(g), gb_tbl.get_tblvar_ref(g), gbvar_def, gb_tbl.get_reftype(g)
+               );
+
+//                     Insert a ref to the value of the gbvar into the lfta select list.
+               colref_t *new_cr = new colref_t(gb_tbl.get_name(g).c_str() );
+               scalarexp_t *gbvar_fta = new scalarexp_t(new_cr);
+               gbvar_fta->set_gb_ref(g);
+               gbvar_fta->set_data_type( gb_tbl.get_def(g)->get_data_type() );
+               scalarexp_t *gbvar_stream = make_fta_se_ref(fta_node->select_list, gbvar_fta,0);
+
+//                     Insert the corresponding gbvar ref (gbvar_stream) into the stream.
+               gbvar_stream->set_gb_ref(-1);   // used as GBvar def
+               stream_node->gb_tbl.add_gb_var(
+                       gbvar_stream->get_colref()->get_field(), -1, gbvar_stream,  gb_tbl.get_reftype(g)
+               );
+       }
+//                     multiple aggregation patterns, if any, go with the hfta
+       stream_node->gb_tbl.set_pattern_info( &gb_tbl);
+
+//                     SEs in the aggregate definitions.
+//                     They are all safe, so split them up for later processing.
+       map<int, scalarexp_t *> hfta_aggr_se;
+       for(a=0;a<aggr_tbl.size();++a){
+               split_fta_aggr( &(aggr_tbl), a,
+                                               &(stream_node->aggr_tbl), &(fta_node->aggr_tbl)  ,
+                                               fta_node->select_list,
+                                               hfta_aggr_se,
+                                               Ext_fcns
+                                       );
+/*
+//             OLD TRACING CODE
+
+int ii;
+for(ii=0;ii<fta_flds.size() || ii < fta_node->select_list.size();++ii){
+       if(ii<fta_flds.size())
+               printf("\t%s : ",fta_flds[ii].c_str());
+       else
+               printf("\t. : ");
+       if(ii<fta_node->select_list.size())
+               printf("%s\n",fta_node->select_list[ii]->to_string().c_str());
+       else
+               printf(".\n");
+}
+printf("hfta aggregates are:");
+for(ii=0;ii<stream_node->aggr_tbl.size();++ii){
+       printf(" %s",stream_node->aggr_tbl.get_op(ii).c_str());
+}
+printf("\nlfta aggregates are:");
+for(ii=0;ii<fta_node->aggr_tbl.size();++ii){
+       printf(" %s",fta_node->aggr_tbl.get_op(ii).c_str());
+}
+printf("\n\n");
+*/
+
+       }
+
+
+//                     Next, the select list.
+
+       for(s=0;s<select_list.size();s++){
+               bool fta_forbidden = false;
+               scalarexp_t *root_se = rehome_fta_se(select_list[s]->se, &hfta_aggr_se);
+               stream_node->select_list.push_back(
+                       new select_element(root_se, select_list[s]->name));
+       }
+
+
+
+//                     All the predicates in the where clause must execute
+//                     in the fta.
+
+       for(p=0;p<where.size();p++){
+               predicate_t *new_pr = dup_pr(where[p]->pr, &aggr_tbl);
+               cnf_elem *new_cnf = new cnf_elem(new_pr);
+               analyze_cnf(new_cnf);
+
+               fta_node->where.push_back(new_cnf);
+       }
+
+//                     All of the predicates in the having clause must
+//                     execute in the stream node.
+
+       for(p=0;p<having.size();p++){
+               predicate_t *pr_root = rehome_fta_pr( having[p]->pr,  &hfta_aggr_se);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               stream_node->having.push_back(cnf_root);
+       }
+
+
+//                     Divide the parameters among the stream, FTA.
+//                     Currently : assume that the stream receives all parameters
+//                     and parameter updates, incorporates them, then passes
+//                     all of the parameters to the FTA.
+//                     This will need to change (tables, fta-unsafe types. etc.)
+
+//                     I will pass on the use_handle_access marking, even
+//                     though the fcn call that requires handle access might
+//                     exist in only one of the parts of the query.
+//                     Parameter manipulation and handle access determination will
+//                     need to be revisited anyway.
+       vector<string> param_names = param_tbl->get_param_names();
+       int pi;
+       for(pi=0;pi<param_names.size();pi++){
+               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+               fta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+               stream_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+       }
+       fta_node->definitions = definitions; fta_node->definitions.erase("_referenced_ifaces");
+       stream_node->definitions = definitions;
+
+//             Now split by interfaces XXXX
+       if(ifaces.size() > 1){
+               for(si=0;si<ifaces.size();++si){
+                       sgah_qpn *subq_node = new sgah_qpn();
+
+//                     Name the subquery
+                       string new_name =  "_"+node_name+"_"+ifaces[si].first+"_"+ifaces[si].second;
+                       untaboo(new_name);
+                       subq_node->set_node_name( new_name) ;
+                       sel_names.push_back(subq_node->get_node_name());
+
+//                     Assign the table
+                       subq_node->table_name = fta_node->table_name->duplicate();
+                       subq_node->table_name->set_machine(ifaces[si].first);
+                       subq_node->table_name->set_interface(ifaces[si].second);
+                       subq_node->table_name->set_ifq(false);
+
+//                     the GB vars.
+                       for(g=0;g<fta_node->gb_tbl.size();g++){
+//                     Insert the gbvar into the lfta.
+                               scalarexp_t *gbvar_def = dup_se(fta_node->gb_tbl.get_def(g), NULL);
+                               subq_node->gb_tbl.add_gb_var(
+                                       fta_node->gb_tbl.get_name(g), fta_node->gb_tbl.get_tblvar_ref(g), gbvar_def, fta_node->gb_tbl.get_reftype(g)
+                               );
+                       }
+
+//                     Insert the aggregates
+                       for(a=0;a<fta_node->aggr_tbl.size();++a){
+                               subq_node->aggr_tbl.add_aggr(fta_node->aggr_tbl.duplicate(a));
+                       }
+
+                       for(s=0;s<fta_node->select_list.size();s++){
+                               subq_node->select_list.push_back( dup_select(fta_node->select_list[s], NULL) );
+                       }
+                       for(p=0;p<fta_node->where.size();p++){
+                               predicate_t *new_pr = dup_pr(fta_node->where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+
+                               subq_node->where.push_back(new_cnf);
+                       }
+                       for(p=0;p<fta_node->having.size();p++){
+                               predicate_t *new_pr = dup_pr(fta_node->having[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+
+                               subq_node->having.push_back(new_cnf);
+                       }
+//                     Xfer all of the parameters.
+//                     Use existing handle annotations.
+                       vector<string> param_names = param_tbl->get_param_names();
+                       int pi;
+                       for(pi=0;pi<param_names.size();pi++){
+                               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                               subq_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+                       }
+                       subq_node->definitions = definitions; subq_node->definitions.erase("_referenced_ifaces");
+                       if(subq_node->resolve_if_params(ifdb, this->err_str)){
+                               this->error_code = 3;
+                               return ret_vec;
+                       }
+
+//                     THe disorder
+                       subq_node->lfta_disorder = fta_node->lfta_disorder;
+
+                       ret_vec.push_back(subq_node);
+               }
+
+               mrg_qpn *mrg_node = new mrg_qpn((sgah_qpn *)(ret_vec[0]),
+                        fta_node->node_name, sel_names, ifaces, ifdb);
+               mrg_node->set_disorder(fta_node->lfta_disorder);
+
+               /*
+               Do not split sources until we are done with optimizations
+               vector<mrg_qpn *> split_merge = mrg_node->split_sources();
+               for(i=0;i<split_merge.size();++i){
+                       ret_vec.push_back(split_merge[i]);
+               }
+               */
+               ret_vec.push_back(mrg_node);
+               ret_vec.push_back(stream_node);
+               hfta_returned = 1/*split_merge.size()*/+1;
+
+       }else{
+               fta_node->table_name->set_machine(ifaces[0].first);
+               fta_node->table_name->set_interface(ifaces[0].second);
+               fta_node->table_name->set_ifq(false);
+               if(fta_node->resolve_if_params(ifdb, this->err_str)){
+                       this->error_code = 3;
+                       return ret_vec;
+               }
+               ret_vec.push_back(fta_node);
+               ret_vec.push_back(stream_node);
+               hfta_returned = 1;
+       }
+
+
+//     ret_vec.push_back(fta_node);
+//     ret_vec.push_back(stream_node);
+
+
+       return(ret_vec);
+
+       }
+
+/////////////////////////////////////////////////////////////////////
+///            Split into selection LFTA, aggregation HFTA.
+
+       spx_qpn *fta_node = new spx_qpn();
+               fta_node->table_name = table_name;
+               fta_node->set_node_name( "_fta_"+node_name );
+               fta_node->table_name->set_range_var(table_name->get_var_name());
+
+
+       sgah_qpn *stream_node = new sgah_qpn();
+               stream_node->table_name = new tablevar_t( ("_fta_"+node_name).c_str());
+               stream_node->set_node_name( node_name );
+               stream_node->table_name->set_range_var(table_name->get_var_name());
+
+
+       vector< vector<select_element *> *> select_vec;
+       select_vec.push_back(&(fta_node->select_list)); // only one child
+
+//                     Process the gbvars.  Split their defining SEs.
+       for(g=0;g<gb_tbl.size();g++){
+               bool fta_forbidden = false;
+               int se_src = SPLIT_FTAVEC_NOTBLVAR;
+
+               scalarexp_t *gbvar_se = split_ftavec_se( gb_tbl.get_def(g),
+                                       fta_forbidden, se_src, select_vec, Ext_fcns
+               );
+//             if(fta_forbidden) (
+               if(fta_forbidden || se_src == SPLIT_FTAVEC_NOTBLVAR){
+                       stream_node->gb_tbl.add_gb_var(
+                         gb_tbl.get_name(g),gb_tbl.get_tblvar_ref(g),gbvar_se,gb_tbl.get_reftype(g)
+                       );
+               }else{
+                       scalarexp_t *new_se=make_fta_se_ref(fta_node->select_list,gbvar_se,0);
+                       stream_node->gb_tbl.add_gb_var(
+                         gb_tbl.get_name(g),gb_tbl.get_tblvar_ref(g),new_se,gb_tbl.get_reftype(g)
+                       );
+               }
+       }
+       stream_node->gb_tbl.set_pattern_info( &gb_tbl);
+
+//             Process the aggregate table.
+//             Copy to stream, split the SEs.
+       map<int, scalarexp_t *> hfta_aggr_se;   // for rehome
+       for(a=0;a<aggr_tbl.size();++a){
+               scalarexp_t *hse;
+               if(aggr_tbl.is_builtin(a)){
+                       if(aggr_tbl.is_star_aggr(a)){
+                               stream_node->aggr_tbl.add_aggr(aggr_tbl.get_op(a),NULL, false);
+                               hse=scalarexp_t::make_star_aggr(aggr_tbl.get_op(a).c_str());
+                       }else{
+                               bool fta_forbidden = false;
+                               int se_src = SPLIT_FTAVEC_NOTBLVAR;
+
+                               scalarexp_t *agg_se = split_ftavec_se( aggr_tbl.get_aggr_se(a),
+                                       fta_forbidden, se_src, select_vec, Ext_fcns
+                               );
+//                             if(fta_forbidden) (
+                               if(fta_forbidden || se_src == SPLIT_FTAVEC_NOTBLVAR){
+                                       stream_node->aggr_tbl.add_aggr(aggr_tbl.get_op(a), agg_se,false);
+                                       hse=scalarexp_t::make_se_aggr(aggr_tbl.get_op(a).c_str(),agg_se);
+                               }else{
+                                       scalarexp_t *new_se=make_fta_se_ref(fta_node->select_list,agg_se,0);
+                                       stream_node->aggr_tbl.add_aggr(aggr_tbl.get_op(a), new_se,false);
+                                       hse=scalarexp_t::make_se_aggr(aggr_tbl.get_op(a).c_str(),new_se);
+                               }
+                       }
+                       hse->set_data_type(aggr_tbl.get_data_type(a));
+                       hse->set_aggr_id(a);
+                       hfta_aggr_se[a]=hse;
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(a);
+                       vector<scalarexp_t *> new_opl;
+                       for(o=0;o<opl.size();++o){
+                               bool fta_forbidden = false;
+                               int se_src = SPLIT_FTAVEC_NOTBLVAR;
+                               scalarexp_t *agg_se = split_ftavec_se( opl[o],
+                                       fta_forbidden, se_src, select_vec, Ext_fcns
+                               );
+//                             scalarexp_t *agg_se = split_ftavec_se( aggr_tbl.get_aggr_se(a),
+//                                     fta_forbidden, se_src, select_vec, Ext_fcns
+//                             );
+//                             if(fta_forbidden) (
+                               if(fta_forbidden || se_src == SPLIT_FTAVEC_NOTBLVAR){
+                                       new_opl.push_back(agg_se);
+                               }else{
+                                       scalarexp_t *new_se=make_fta_se_ref(fta_node->select_list,agg_se,0);
+                                       new_opl.push_back(new_se);
+                               }
+                       }
+                       stream_node->aggr_tbl.add_aggr(aggr_tbl.get_op(a), aggr_tbl.get_fcn_id(a), new_opl, aggr_tbl.get_storage_type(a),false, false,aggr_tbl.has_bailout(a));
+                       hse = new scalarexp_t(aggr_tbl.get_op(a).c_str(),new_opl);
+                       hse->set_data_type(Ext_fcns->get_fcn_dt(aggr_tbl.get_fcn_id(a)));
+                       hse->set_fcn_id(aggr_tbl.get_fcn_id(a));
+                       hse->set_aggr_id(a);
+                       hfta_aggr_se[a]=hse;
+               }
+       }
+
+
+//             Process the WHERE clause.
+//             If it is fta-safe AND it refs only fta-safe gbvars,
+//             then expand the gbvars and put it into the lfta.
+//             Else, split it into an hfta predicate ref'ing
+//             se's computed partially in the lfta.
+
+       predicate_t *pr_root;
+       bool fta_forbidden;
+       for(p=0;p<where.size();p++){
+               if(! check_fta_forbidden_pr(where[p]->pr, NULL, Ext_fcns) || contains_gb_pr(where[p]->pr, unsafe_gbvars) ){
+                       pr_root = split_ftavec_pr(where[p]->pr,select_vec,Ext_fcns);
+                       fta_forbidden = true;
+               }else{
+                       pr_root = dup_pr(where[p]->pr, NULL);
+                       expand_gbvars_pr(pr_root, gb_tbl);
+                       fta_forbidden = false;
+               }
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               if(fta_forbidden){
+                       stream_node->where.push_back(cnf_root);
+               }else{
+                       fta_node->where.push_back(cnf_root);
+               }
+       }
+
+
+//             Process the Select clause, rehome it on the
+//             new defs.
+       for(s=0;s<select_list.size();s++){
+               bool fta_forbidden = false;
+               scalarexp_t *root_se = rehome_fta_se(select_list[s]->se, &hfta_aggr_se);
+               stream_node->select_list.push_back(
+                       new select_element(root_se, select_list[s]->name));
+       }
+
+
+// Process the Having clause
+
+//                     All of the predicates in the having clause must
+//                     execute in the stream node.
+
+       for(p=0;p<having.size();p++){
+               predicate_t *pr_root = rehome_fta_pr( having[p]->pr,  &hfta_aggr_se);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               stream_node->having.push_back(cnf_root);
+       }
+
+//             Handle parameters and a few last details.
+       vector<string> param_names = param_tbl->get_param_names();
+       int pi;
+       for(pi=0;pi<param_names.size();pi++){
+               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+               fta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+               stream_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+       }
+
+       fta_node->definitions = definitions; fta_node->definitions.erase("_referenced_ifaces");
+       stream_node->definitions = definitions;
+
+//             Now split by interfaces YYYY
+       if(ifaces.size() > 1){
+               for(si=0;si<ifaces.size();++si){
+                       spx_qpn *subq_node = new spx_qpn();
+
+//                     Name the subquery
+                       string new_name =  "_"+node_name+"_"+ifaces[si].first+"_"+ifaces[si].second;
+                       untaboo(new_name);
+                       subq_node->set_node_name( new_name) ;
+                       sel_names.push_back(subq_node->get_node_name());
+
+//                     Assign the table
+                       subq_node->table_name = fta_node->table_name->duplicate();
+                       subq_node->table_name->set_machine(ifaces[si].first);
+                       subq_node->table_name->set_interface(ifaces[si].second);
+                       subq_node->table_name->set_ifq(false);
+
+                       for(s=0;s<fta_node->select_list.size();s++){
+                               subq_node->select_list.push_back( dup_select(fta_node->select_list[s], NULL) );
+                       }
+                       for(p=0;p<fta_node->where.size();p++){
+                               predicate_t *new_pr = dup_pr(fta_node->where[p]->pr, NULL);
+                               cnf_elem *new_cnf = new cnf_elem(new_pr);
+                               analyze_cnf(new_cnf);
+
+                               subq_node->where.push_back(new_cnf);
+                       }
+//                     Xfer all of the parameters.
+//                     Use existing handle annotations.
+                       vector<string> param_names = param_tbl->get_param_names();
+                       int pi;
+                       for(pi=0;pi<param_names.size();pi++){
+                               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                               subq_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+                       }
+                       subq_node->definitions = definitions; subq_node->definitions.erase("_referenced_ifaces");
+                       if(subq_node->resolve_if_params(ifdb, this->err_str)){
+                               this->error_code = 3;
+                               return ret_vec;
+                       }
+
+                       ret_vec.push_back(subq_node);
+               }
+
+               mrg_qpn *mrg_node = new mrg_qpn((spx_qpn *)(ret_vec[0]),
+                        fta_node->node_name, sel_names, ifaces, ifdb);
+               /*
+               Do not split sources until we are done with optimizations
+               vector<mrg_qpn *> split_merge = mrg_node->split_sources();
+               for(i=0;i<split_merge.size();++i){
+                       ret_vec.push_back(split_merge[i]);
+               }
+               */
+               ret_vec.push_back(mrg_node);
+               ret_vec.push_back(stream_node);
+               hfta_returned = 1/*split_merge.size()*/+1;
+
+       }else{
+               fta_node->table_name->set_machine(ifaces[0].first);
+               fta_node->table_name->set_interface(ifaces[0].second);
+               fta_node->table_name->set_ifq(false);
+               if(fta_node->resolve_if_params(ifdb, this->err_str)){
+                       this->error_code = 3;
+                       return ret_vec;
+               }
+               ret_vec.push_back(fta_node);
+               ret_vec.push_back(stream_node);
+               hfta_returned = 1;
+       }
+
+
+//     ret_vec.push_back(fta_node);
+//     ret_vec.push_back(stream_node);
+
+
+       return(ret_vec);
+
+}
+
+
+/*
+       SPLITTING A EQ-TEMPORAL, HASH JOIN OPERATOR
+
+       An JOIN_EQ_HASH_QPN node may reference:
+               literals, parameters, colrefs, functions, operators
+       An JOIN_EQ_HASH_QPN node may not reference:
+               group-by variables, aggregates
+
+       An JOIN_EQ_HASH_QPN node contains
+               selection list of SEs
+               where list of CNF predicates, broken into:
+                       prefilter[2]
+                       temporal_eq
+                       hash_eq
+                       postfilter
+
+       Algorithm:
+               For each tablevar whose source is a PROTOCOL
+                       Create a LFTA for that tablevar
+                       Push as many prefilter[..] predicates to that tablevar as is
+                               possible.
+                       Split the SEs in the select list, and the predicates not
+                               pushed to the LFTA.
+
+*/
+
+vector<qp_node *> join_eq_hash_qpn::split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx){
+
+       vector<qp_node *> ret_vec;
+       int f,p,s;
+
+//                     If the node reads from streams only, don't split.
+       bool stream_only = true;
+       for(f=0;f<from.size();++f){
+//             int t = Schema->get_table_ref(from[f]->get_schema_name());
+               int t = from[f]->get_schema_ref();
+               if(Schema->get_schema_type(t) == PROTOCOL_SCHEMA) stream_only = false;
+       }
+       if(stream_only){
+               hfta_returned = 1;
+               ret_vec.push_back(this);
+               return(ret_vec);
+       }
+
+
+//                     The HFTA node, it is always returned.
+
+       join_eq_hash_qpn *stream_node = new join_eq_hash_qpn();
+       for(f=0;f<from.size();++f){
+//             tablevar_t *tmp_tblvar = new tablevar_t( from[f]->get_interface().c_str(), from[f]->get_schema_name().c_str());
+               tablevar_t *tmp_tblvar =  from[f]->duplicate();
+//             tmp_tblvar->set_range_var(from[f]->get_var_name());
+
+               stream_node->from.push_back(tmp_tblvar);
+       }
+       stream_node->set_node_name(node_name);
+
+//                     Create spx (selection) children for each PROTOCOL source.
+       vector<spx_qpn *> child_vec;
+       vector< vector<select_element *> *> select_vec;
+       for(f=0;f<from.size();++f){
+//             int t = Schema->get_table_ref(from[f]->get_schema_name());
+               int t = from[f]->get_schema_ref();
+               if(Schema->get_schema_type(t) == PROTOCOL_SCHEMA){
+                       spx_qpn *child_qpn = new spx_qpn();
+                       sprintf(tmpstr,"_fta_%d_%s",f,node_name.c_str());
+                       child_qpn->set_node_name(string(tmpstr));
+                       child_qpn->table_name = new tablevar_t(
+                          from[f]->get_interface().c_str(), from[f]->get_schema_name().c_str(), from[f]->get_ifq());
+                       child_qpn->table_name->set_range_var(from[f]->get_var_name());
+
+                       child_vec.push_back(child_qpn);
+                       select_vec.push_back(&(child_qpn->select_list));
+
+//                     Update the stream's FROM clause to read from this child
+                       stream_node->from[f]->set_interface("");
+                       stream_node->from[f]->set_schema(tmpstr);
+               }else{
+                       child_vec.push_back(NULL);
+                       select_vec.push_back(NULL);
+               }
+       }
+
+//             Push lfta-safe prefilter to the lfta
+//             TODO: I'm not copying the preds, I dont *think* it will be a problem.
+       predicate_t *pr_root;
+
+       for(f=0;f<from.size();++f){
+         vector<cnf_elem *> pred_vec = prefilter[f];
+         if(child_vec[f] != NULL){
+               for(p=0;p<pred_vec.size();++p){
+                       if(check_fta_forbidden_pr(pred_vec[p]->pr,NULL, Ext_fcns)){
+                               child_vec[f]->where.push_back(pred_vec[p]);
+                       }else{
+                               pr_root = split_ftavec_pr(pred_vec[p]->pr,select_vec,Ext_fcns);
+                               cnf_elem *cnf_root = new cnf_elem(pr_root);
+                               analyze_cnf(cnf_root);
+                               stream_node->prefilter[f].push_back(cnf_root);
+                       }
+               }
+         }else{
+               for(p=0;p<pred_vec.size();++p){
+                       stream_node->prefilter[f].push_back(pred_vec[p]);
+               }
+         }
+
+       }
+
+//             Process the other predicates
+       for(p=0;p<temporal_eq.size();++p){
+               pr_root = split_ftavec_pr(temporal_eq[p]->pr,select_vec,Ext_fcns);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+               stream_node->temporal_eq.push_back(cnf_root);
+       }
+       for(p=0;p<hash_eq.size();++p){
+               pr_root = split_ftavec_pr(hash_eq[p]->pr,select_vec,Ext_fcns);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+               stream_node->hash_eq.push_back(cnf_root);
+       }
+       for(p=0;p<postfilter.size();++p){
+               pr_root = split_ftavec_pr(postfilter[p]->pr,select_vec,Ext_fcns);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+               stream_node->postfilter.push_back(cnf_root);
+       }
+
+//             Process the SEs
+       for(s=0;s<select_list.size();s++){
+               bool fta_forbidden = false;
+               int se_src = SPLIT_FTAVEC_NOTBLVAR;
+               scalarexp_t *root_se = split_ftavec_se( select_list[s]->se,
+                                       fta_forbidden, se_src, select_vec, Ext_fcns
+               );
+               if(fta_forbidden || !is_PROTOCOL_source(se_src, select_vec)){
+                       stream_node->select_list.push_back(
+                               new select_element(root_se, select_list[s]->name) );
+               }else{
+                       scalarexp_t *new_se=make_fta_se_ref(select_vec,root_se,se_src);
+                       stream_node->select_list.push_back(
+                               new select_element(new_se, select_list[s]->name)
+                       );
+               }
+       }
+
+
+//             I need to "rehome" the colrefs -- make the annotations in the colrefs
+//             agree with their tablevars.
+       for(f=0;f<child_vec.size();++f){
+         if(child_vec[f]!=NULL){
+               vector<tablevar_t *> fm; fm.push_back(child_vec[f]->table_name);
+
+               for(s=0;s<child_vec[f]->select_list.size();++s)
+                       bind_colref_se(child_vec[f]->select_list[s]->se, fm,0,0);
+               for(p=0;p<child_vec[f]->where.size();++p)
+//                     bind_colref_pr(child_vec[f]->where[p]->pr, fm,f,0);
+                       bind_colref_pr(child_vec[f]->where[p]->pr, fm,0,0);
+         }
+       }
+
+//             rehome the colrefs in the hfta node.
+       for(f=0;f<stream_node->from.size();++f){
+         stream_node->where.clear();
+         for(s=0;s<stream_node->from.size();++s){
+               for(p=0;p<stream_node->prefilter[s].size();++p){
+                 bind_colref_pr((stream_node->prefilter[s])[p]->pr,stream_node->from,f,f);
+               }
+         }
+         for(p=0;p<stream_node->temporal_eq.size();++p){
+               bind_colref_pr(stream_node->temporal_eq[p]->pr,stream_node->from,f,f);
+         }
+         for(p=0;p<stream_node->hash_eq.size();++p){
+               bind_colref_pr(stream_node->hash_eq[p]->pr,stream_node->from,f,f);
+         }
+         for(p=0;p<stream_node->postfilter.size();++p){
+               bind_colref_pr(stream_node->postfilter[p]->pr,stream_node->from,f,f);
+         }
+         for(s=0;s<stream_node->select_list.size();++s){
+               bind_colref_se(stream_node->select_list[s]->se,stream_node->from,f,f);
+         }
+       }
+
+//                     Rebuild the WHERE clause
+       stream_node->where.clear();
+       for(s=0;s<stream_node->from.size();++s){
+               for(p=0;p<stream_node->prefilter[s].size();++p){
+                 stream_node->where.push_back((stream_node->prefilter[s])[p]);
+               }
+       }
+       for(p=0;p<stream_node->temporal_eq.size();++p){
+               stream_node->where.push_back(stream_node->temporal_eq[p]);
+       }
+       for(p=0;p<stream_node->hash_eq.size();++p){
+               stream_node->where.push_back(stream_node->hash_eq[p]);
+       }
+       for(p=0;p<stream_node->postfilter.size();++p){
+               stream_node->where.push_back(stream_node->postfilter[p]);
+       }
+
+
+//             Build the return list
+       vector<qp_node *> hfta_nodes;
+       hfta_returned = 1;
+       for(f=0;f<from.size();++f){
+               if(child_vec[f] != NULL){
+                       spx_qpn *c_node = child_vec[f];
+                       vector<pair<string, string> > ifaces = get_ifaces(c_node->table_name, ifdb, n_virtual_ifaces, hfta_parallelism, hfta_idx);
+                       if (ifaces.empty()) {
+                               fprintf(stderr,"INTERNAL ERROR in join_eq_hash_qpn::split_node_for_fta - empty interface set\n");
+                               exit(1);
+                       }
+
+                       if(ifaces.size() == 1){
+                               c_node->table_name->set_machine(ifaces[0].first);
+                               c_node->table_name->set_interface(ifaces[0].second);
+                               c_node->table_name->set_ifq(false);
+                               if(c_node->resolve_if_params(ifdb, this->err_str)){
+                                       this->error_code = 3;
+                                       return ret_vec;
+                               }
+                               ret_vec.push_back(c_node);
+                       }else{
+                               vector<string> sel_names;
+                               int si;
+                               for(si=0;si<ifaces.size();++si){
+                                       spx_qpn *subq_node = new spx_qpn();
+
+//                     Name the subquery
+                                       string new_name =  "_"+c_node->node_name+"_"+ifaces[si].first+"_"+ifaces[si].second;
+                                       untaboo(new_name);
+                                       subq_node->set_node_name( new_name) ;
+                                       sel_names.push_back(subq_node->get_node_name());
+
+//                     Assign the table
+                                       subq_node->table_name = c_node->table_name->duplicate();
+                                       subq_node->table_name->set_machine(ifaces[si].first);
+                                       subq_node->table_name->set_interface(ifaces[si].second);
+                                       subq_node->table_name->set_ifq(false);
+
+                                       for(s=0;s<c_node->select_list.size();s++){
+                                         subq_node->select_list.push_back(dup_select(c_node->select_list[s], NULL));
+                                       }
+                                       for(p=0;p<c_node->where.size();p++){
+                                         predicate_t *new_pr = dup_pr(c_node->where[p]->pr, NULL);
+                                         cnf_elem *new_cnf = new cnf_elem(new_pr);
+                                         analyze_cnf(new_cnf);
+
+printf("table name is %s\n",subq_node->table_name->to_string().c_str());
+                                         subq_node->where.push_back(new_cnf);
+                                       }
+//                     Xfer all of the parameters.
+//                     Use existing handle annotations.
+//                                     vector<string> param_names = param_tbl->get_param_names();
+//                                     int pi;
+//                                     for(pi=0;pi<param_names.size();pi++){
+//                                             data_type *dt = param_tbl->get_data_type(param_names[pi]);
+//                                             subq_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+//                                                                     param_tbl->handle_access(param_names[pi]));
+//                                     }
+//                                     subq_node->definitions = definitions;
+
+                               if(subq_node->resolve_if_params(ifdb, this->err_str)){
+                                       this->error_code = 3;
+                                       return ret_vec;
+                               }
+
+                                       ret_vec.push_back(subq_node);
+                               }
+                               int lpos = ret_vec.size()-1     ;
+                               mrg_qpn *mrg_node = new mrg_qpn((spx_qpn *)(ret_vec[lpos]),c_node->node_name,sel_names, ifaces, ifdb);
+                               /*
+                               Do not split sources until we are done with optimizations
+                               vector<mrg_qpn *> split_merge = mrg_node->split_sources();
+                               int i;
+                               for(i=0;i<split_merge.size();++i){
+                                       hfta_nodes.push_back(split_merge[i]);
+                               }
+                               */
+                               hfta_nodes.push_back(mrg_node);
+                       }
+               }
+       }
+       int i;
+       for(i=0;i<hfta_nodes.size();++i) ret_vec.push_back(hfta_nodes[i]);
+       ret_vec.push_back(stream_node);
+       hfta_returned = hfta_nodes.size()+1;
+
+//                     Currently : assume that the stream receives all parameters
+//                     and parameter updates, incorporates them, then passes
+//                     all of the parameters to the FTA.
+//                     This will need to change (tables, fta-unsafe types. etc.)
+
+//                     I will pass on the use_handle_access marking, even
+//                     though the fcn call that requires handle access might
+//                     exist in only one of the parts of the query.
+//                     Parameter manipulation and handle access determination will
+//                     need to be revisited anyway.
+       vector<string> param_names = param_tbl->get_param_names();
+       int pi;
+       for(pi=0;pi<param_names.size();pi++){
+               int ri;
+               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+               for(ri=0;ri<ret_vec.size();++ri){
+                       ret_vec[ri]->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+                       ret_vec[ri]->definitions = definitions; ret_vec[ri]->definitions.erase("_referenced_ifaces");
+               }
+       }
+
+
+
+       return(ret_vec);
+
+}
+
+
+/////////////////////////////////////////////////////////////
+////                   extract_opview
+
+//             Common processing
+int process_opview(tablevar_t *fmtbl, int pos, string node_name,
+                                table_list *Schema,
+                               vector<query_node *> &qnodes,
+                               opview_set &opviews,
+                               vector<table_exp_t *> &ret, string rootnm, string silo_nm){
+
+       int s,f,q,m;
+
+       int schref = fmtbl->get_schema_ref();
+       if(schref <= 0)
+               return 0;
+
+       if(Schema->get_schema_type(schref) == OPERATOR_VIEW_SCHEMA){
+               opview_entry *opv = new opview_entry();
+               opv->parent_qname = node_name;
+               opv->root_name = rootnm;
+               opv->view_name = fmtbl->get_schema_name();
+               opv->pos = pos;
+               sprintf(tmpstr,"%s_UDOP%d_%s",node_name.c_str(),pos,opv->view_name.c_str());
+               opv->udop_alias = tmpstr;
+               fmtbl->set_udop_alias(opv->udop_alias);
+
+               opv->exec_fl = Schema->get_op_prop(schref, string("file"));
+               opv->liveness_timeout = atoi(Schema->get_op_prop(schref, string("liveness_timeout")).c_str());
+
+               vector<subquery_spec *> subq = Schema->get_subqueryspecs(schref);
+               for(s=0;s<subq.size();++s){
+//                             Validate that the fields match.
+                       subquery_spec *sqs = subq[s];
+                       vector<field_entry *> flds = Schema->get_fields(sqs->name+silo_nm);
+                       if(flds.size() == 0){
+                               fprintf(stderr,"INTERNAL ERROR: subquery %s of view %s not found in Schema.\n",sqs->name.c_str(), opv->view_name.c_str());
+                               return(1);
+                       }
+                       if(flds.size() < sqs->types.size()){
+                               fprintf(stderr,"ERROR: subquery %s of view %s does not have enough fields (%lu found, %lu expected).\n",sqs->name.c_str(), opv->view_name.c_str(),flds.size(), sqs->types.size());
+                               return(1);
+                       }
+                       bool failed = false;
+                       for(f=0;f<sqs->types.size();++f){
+                               data_type dte(sqs->types[f],sqs->modifiers[f]);
+                               data_type dtf(flds[f]->get_type(),flds[f]->get_modifier_list());
+                               if(! dte.subsumes_type(&dtf) ){
+                                       fprintf(stderr,"ERROR: subquery %s of view %s does not have the correct type for field %d (%s found, %s expected).\n",sqs->name.c_str(), opv->view_name.c_str(),f,dtf.to_string().c_str(), dte.to_string().c_str());
+                                       failed = true;
+                               }
+/*
+                               if(dte.is_temporal() && (dte.get_temporal() != dtf.get_temporal()) ){
+                                       string pstr = dte.get_temporal_string();
+                                       fprintf(stderr,"ERROR: subquery %s of view %s does not have the expected temporal value %s of field %d.\n",sqs->name.c_str(), opv->view_name.c_str(),pstr.c_str(),f);
+                                       failed = true;
+                               }
+*/
+                       }
+                       if(failed)
+                               return(1);
+///                            Validation done, find the subquery, make a copy of the
+///                            parse tree, and add it to the return list.
+                       for(q=0;q<qnodes.size();++q)
+                               if(qnodes[q]->name == sqs->name)
+                                       break;
+                       if(q==qnodes.size()){
+                               fprintf(stderr,"INTERNAL ERROR: subquery %s of view %s not found in list of query names.\n",sqs->name.c_str(), opv->view_name.c_str());
+                               return(1);
+                       }
+
+                       table_exp_t *newq = dup_table_exp(qnodes[q]->parse_tree);
+                       sprintf(tmpstr,"%s_OP%d_%s_SUBQ%d",node_name.c_str(),pos,opv->view_name.c_str(),s);
+                       string newq_name = tmpstr;
+                       newq->nmap["query_name"] = newq_name;
+                       ret.push_back(newq);
+                       opv->subq_names.push_back(newq_name);
+               }
+               fmtbl->set_opview_idx(opviews.append(opv));
+       }
+
+       return 0;
+}
+
+vector<table_exp_t *> spx_qpn::extract_opview(table_list *Schema, vector<query_node *> &qnodes, opview_set &opviews, string rootnm, string silo_name){
+       vector<table_exp_t *> ret;
+
+       int retval = process_opview(table_name,0,node_name,
+                                                               Schema,qnodes,opviews,ret, rootnm, silo_name);
+       if(retval) exit(1);
+    return(ret);
+}
+
+
+vector<table_exp_t *> sgah_qpn::extract_opview(table_list *Schema,  vector<query_node *> &qnodes, opview_set &opviews, string rootnm, string silo_name){
+       vector<table_exp_t *> ret;
+
+       int retval = process_opview(table_name,0,node_name,
+                                                               Schema,qnodes,opviews,ret, rootnm, silo_name);
+       if(retval) exit(1);
+    return(ret);
+}
+
+vector<table_exp_t *> rsgah_qpn::extract_opview(table_list *Schema,  vector<query_node *> &qnodes, opview_set &opviews, string rootnm, string silo_name){
+       vector<table_exp_t *> ret;
+
+       int retval = process_opview(table_name,0,node_name,
+                                                               Schema,qnodes,opviews,ret, rootnm, silo_name);
+       if(retval) exit(1);
+    return(ret);
+}
+
+
+vector<table_exp_t *> sgahcwcb_qpn::extract_opview(table_list *Schema,  vector<query_node *> &qnodes, opview_set &opviews, string rootnm, string silo_name){
+       vector<table_exp_t *> ret;
+
+       int retval = process_opview(table_name,0,node_name,
+                                                               Schema,qnodes,opviews,ret, rootnm, silo_name);
+       if(retval) exit(1);
+    return(ret);
+}
+
+
+
+vector<table_exp_t *> mrg_qpn::extract_opview(table_list *Schema,  vector<query_node *> &qnodes, opview_set &opviews, string rootnm, string silo_name){
+       vector<table_exp_t *> ret;
+       int f;
+       for(f=0;f<fm.size();++f){
+               int retval = process_opview(fm[f],f,node_name,
+                                                               Schema,qnodes,opviews,ret, rootnm, silo_name);
+               if(retval) exit(1);
+       }
+    return(ret);
+}
+
+
+
+
+vector<table_exp_t *> join_eq_hash_qpn::extract_opview(table_list *Schema,  vector<query_node *> &qnodes, opview_set &opviews, string rootnm, string silo_name){
+       vector<table_exp_t *> ret;
+       int f;
+       for(f=0;f<from.size();++f){
+               int retval = process_opview(from[f],f,node_name,
+                                                               Schema,qnodes,opviews,ret, rootnm, silo_name);
+               if(retval) exit(1);
+       }
+    return(ret);
+}
+
+vector<table_exp_t *> filter_join_qpn::extract_opview(table_list *Schema,  vector<query_node *> &qnodes, opview_set &opviews, string rootnm, string silo_name){
+       vector<table_exp_t *> ret;
+       int f;
+       for(f=0;f<from.size();++f){
+               int retval = process_opview(from[f],f,node_name,
+                                                               Schema,qnodes,opviews,ret, rootnm, silo_name);
+               if(retval) exit(1);
+       }
+    return(ret);
+}
+
+
+
+//////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////
+///////                        Additional methods
+
+
+
+//////////////////////////////////////////////////////////////////
+//             Get schema of operator output
+
+table_def *mrg_qpn::get_fields(){
+       return(table_layout);
+}
+
+
+table_def *spx_qpn::get_fields(){
+       return(create_attributes(node_name, select_list));
+}
+
+table_def *sgah_qpn::get_fields(){
+       return(create_attributes(node_name, select_list));
+}
+
+table_def *rsgah_qpn::get_fields(){
+       return(create_attributes(node_name, select_list));
+}
+
+table_def *sgahcwcb_qpn::get_fields(){
+       return(create_attributes(node_name, select_list));
+}
+
+table_def *filter_join_qpn::get_fields(){
+       return(create_attributes(node_name, select_list));
+}
+
+
+table_def *join_eq_hash_qpn::get_fields(){
+       int i, h, s, t;
+
+//                     First, gather temporal colrefs and SEs.
+       map<col_id, temporal_type> temporal_cids;
+       vector<scalarexp_t *> temporal_se;
+       for(h=0;h<temporal_eq.size();++h){
+               scalarexp_t *sel = temporal_eq[h]->pr->get_left_se();
+               scalarexp_t *ser = temporal_eq[h]->pr->get_right_se();
+
+               if(sel->get_operator_type() == SE_COLREF){
+                       col_id tcol(sel->get_colref());
+                       if(temporal_cids.count(tcol) == 0){
+                               temporal_cids[tcol] = sel->get_data_type()->get_temporal();
+                       }
+               }else{
+                       temporal_se.push_back(sel);
+               }
+
+               if(ser->get_operator_type() == SE_COLREF){
+                       col_id tcol(ser->get_colref());
+                       if(temporal_cids.count(tcol) == 0){
+                               temporal_cids[tcol] = ser->get_data_type()->get_temporal();
+                       }
+               }else{
+                       temporal_se.push_back(ser);
+               }
+       }
+
+//             Mark select elements as nontemporal, then deduce which
+//             ones are temporal.
+       for(s=0;s<select_list.size();++s){
+               select_list[s]->se->get_data_type()->set_temporal(
+                       compute_se_temporal(select_list[s]->se, temporal_cids)
+               );
+//                             Second chance if it is an exact match to an SE.
+//     for(s=0;s<select_list.size();++s){
+               if(! select_list[s]->se->get_data_type()->is_temporal() ){
+                       for(t=0;t<temporal_se.size();++t){
+                               if(is_equivalent_se(temporal_se[t], select_list[s]->se)){
+                                       select_list[s]->se->get_data_type()->set_temporal(
+                                               temporal_se[t]->get_data_type()->get_temporal()
+                                       );
+                               }
+                       }
+               }
+//     }
+       }
+
+//                     If there is an outer join, verify that
+//                     the temporal attributes are actually temporal.
+//                     NOTE: this code must be synchronized with the
+//                     equivalence finding in join_eq_hash_qpn::generate_functor
+//                     (and also, the join_eq_hash_qpn constructor)
+  if(from[0]->get_property() || from[1]->get_property()){
+       set<string> l_equiv, r_equiv;
+       for(i=0;i<temporal_eq.size();i++){
+               scalarexp_t *lse =      temporal_eq[i]->pr->get_left_se();
+               scalarexp_t *rse =      temporal_eq[i]->pr->get_right_se();
+               if(lse->get_operator_type()==SE_COLREF){
+                       l_equiv.insert(lse->get_colref()->get_field());
+               }
+               if(rse->get_operator_type()==SE_COLREF){
+                       r_equiv.insert(rse->get_colref()->get_field());
+               }
+       }
+
+       for(s=0;s<select_list.size();++s){
+               if(select_list[s]->se->get_data_type()->is_temporal()){
+                       col_id_set cid_set;
+                       col_id_set::iterator ci;
+                       bool failed = false;
+                       gather_se_col_ids(select_list[s]->se,cid_set, NULL);
+                       for(ci=cid_set.begin();ci!=cid_set.end();++ci){
+                               if((*ci).tblvar_ref == 0){
+                                        if(from[0]->get_property()){
+                                               if(l_equiv.count((*ci).field) == 0){
+                                                       failed = true;
+                                               }
+                                       }
+                               }else{
+                                        if(from[1]->get_property()){
+                                               if(r_equiv.count((*ci).field) == 0){
+                                                       failed = true;
+                                               }
+                                       }
+                               }
+                       }
+                       if(failed){
+                               select_list[s]->se->get_data_type()->reset_temporal();
+                       }
+               }
+       }
+  }
+
+
+       return create_attributes(node_name, select_list);
+}
+
+
+
+//-----------------------------------------------------------------
+//                     get output tables
+
+
+//                     Get tablevar_t names of input and output tables
+
+//     output_file_qpn::output_file_qpn(){source_op_name = ""; }
+       vector<tablevar_t *> output_file_qpn::get_input_tbls(){
+               return(fm);
+       }
+
+       vector<tablevar_t *> mrg_qpn::get_input_tbls(){
+               return(fm);
+       }
+
+       vector<tablevar_t *> spx_qpn::get_input_tbls(){
+               vector<tablevar_t *> retval(1,table_name);
+               return(retval);
+       }
+
+       vector<tablevar_t *> sgah_qpn::get_input_tbls(){
+               vector<tablevar_t *> retval(1,table_name);
+               return(retval);
+       }
+
+       vector<tablevar_t *> rsgah_qpn::get_input_tbls(){
+               vector<tablevar_t *> retval(1,table_name);
+               return(retval);
+       }
+
+       vector<tablevar_t *> sgahcwcb_qpn::get_input_tbls(){
+               vector<tablevar_t *> retval(1,table_name);
+               return(retval);
+       }
+
+       vector<tablevar_t *> join_eq_hash_qpn::get_input_tbls(){
+               return(from);
+       }
+
+       vector<tablevar_t *> filter_join_qpn::get_input_tbls(){
+               return(from);
+       }
+
+//-----------------------------------------------------------------
+//                     get output tables
+
+
+//             This does not make sense, this fcn returns the output table *name*,
+//             not its schema, and then there is another fcn to rturn the schema.
+       vector<tablevar_t *> output_file_qpn::get_output_tbls(){
+               vector<tablevar_t *> retval(1,new tablevar_t(node_name.c_str()));
+               return(retval);
+       }
+
+       vector<tablevar_t *> mrg_qpn::get_output_tbls(){
+               vector<tablevar_t *> retval(1,new tablevar_t(node_name.c_str()));
+               return(retval);
+       }
+
+       vector<tablevar_t *> spx_qpn::get_output_tbls(){
+               vector<tablevar_t *> retval(1,new tablevar_t(node_name.c_str()));
+               return(retval);
+       }
+
+       vector<tablevar_t *> sgah_qpn::get_output_tbls(){
+               vector<tablevar_t *> retval(1,new tablevar_t(node_name.c_str()));
+               return(retval);
+       }
+
+       vector<tablevar_t *> rsgah_qpn::get_output_tbls(){
+               vector<tablevar_t *> retval(1,new tablevar_t(node_name.c_str()));
+               return(retval);
+       }
+
+       vector<tablevar_t *> sgahcwcb_qpn::get_output_tbls(){
+               vector<tablevar_t *> retval(1,new tablevar_t(node_name.c_str()));
+               return(retval);
+       }
+
+       vector<tablevar_t *> join_eq_hash_qpn::get_output_tbls(){
+               vector<tablevar_t *> retval(1,new tablevar_t(node_name.c_str()));
+               return(retval);
+       }
+
+       vector<tablevar_t *> filter_join_qpn::get_output_tbls(){
+               vector<tablevar_t *> retval(1,new tablevar_t(node_name.c_str()));
+               return(retval);
+       }
+
+
+
+//-----------------------------------------------------------------
+//                     Bind to schema
+
+//             Associate colrefs with this schema.
+//             Also, use this opportunity to create table_layout (the output schema).
+//             If the output schema is ever needed before
+void mrg_qpn::bind_to_schema(table_list *Schema){
+       int t;
+       for(t=0;t<fm.size();++t){
+               int tblref = Schema->get_table_ref(fm[t]->get_schema_name());
+               if(tblref>=0)
+               fm[t]->set_schema_ref(tblref );
+       }
+
+//             Here I assume that the colrefs have been reorderd
+//             during analysis so that mvars line up with fm.
+       mvars[0]->set_schema_ref(fm[0]->get_schema_ref());
+       mvars[1]->set_schema_ref(fm[1]->get_schema_ref());
+
+
+}
+
+
+
+//             Associate colrefs in SEs with this schema.
+void spx_qpn::bind_to_schema(table_list *Schema){
+//                     Bind the tablevars in the From clause to the Schema
+//                     (it might have changed from analysis time)
+       int t = Schema->get_table_ref(table_name->get_schema_name() );
+       if(t>=0)
+       table_name->set_schema_ref(t );
+
+//                     Get the "from" clause
+       tablevar_list_t fm(table_name);
+
+//                     Bind all SEs to this schema
+       int p;
+       for(p=0;p<where.size();++p){
+               bind_to_schema_pr(where[p]->pr, &fm, Schema);
+       }
+       int s;
+       for(s=0;s<select_list.size();++s){
+               bind_to_schema_se(select_list[s]->se, &fm, Schema);
+       }
+
+//             Collect set of tuples referenced in this HFTA
+//             input, internal, or output.
+
+}
+
+col_id_set spx_qpn::get_colrefs(bool ext_fcns_only,table_list *Schema){
+       col_id_set retval, tmp_cset;
+       int p;
+       for(p=0;p<where.size();++p){
+               gather_pr_col_ids(where[p]->pr, tmp_cset, NULL);
+       }
+       int s;
+       for(s=0;s<select_list.size();++s){
+               gather_se_col_ids(select_list[s]->se, tmp_cset, NULL);
+       }
+       col_id_set::iterator  cisi;
+       if(ext_fcns_only){
+               for(cisi=tmp_cset.begin();cisi!=tmp_cset.end();++cisi){
+                       field_entry *fe = Schema->get_field((*cisi).schema_ref, (*cisi).field);
+                       if(fe->get_unpack_fcns().size()>0)
+                               retval.insert((*cisi));
+               }
+               return retval;
+       }
+
+       return tmp_cset;
+}
+
+col_id_set filter_join_qpn::get_colrefs(bool ext_fcns_only,table_list *Schema){
+       col_id_set retval, tmp_cset;
+       int p;
+       for(p=0;p<where.size();++p){
+               gather_pr_col_ids(where[p]->pr, tmp_cset, NULL);
+       }
+       int s;
+       for(s=0;s<select_list.size();++s){
+               gather_se_col_ids(select_list[s]->se, tmp_cset, NULL);
+       }
+       col_id_set::iterator  cisi;
+       if(ext_fcns_only){
+               for(cisi=tmp_cset.begin();cisi!=tmp_cset.end();++cisi){
+                       field_entry *fe = Schema->get_field((*cisi).schema_ref, (*cisi).field);
+                       if(fe->get_unpack_fcns().size()>0)
+                               retval.insert((*cisi));
+               }
+               return retval;
+       }
+
+       return tmp_cset;
+}
+
+
+
+//             Associate colrefs in SEs with this schema.
+void join_eq_hash_qpn::bind_to_schema(table_list *Schema){
+//                     Bind the tablevars in the From clause to the Schema
+//                     (it might have changed from analysis time)
+       int f;
+       for(f=0;f<from.size();++f){
+               string snm = from[f]->get_schema_name();
+               int tbl_ref = Schema->get_table_ref(snm);
+               if(tbl_ref >= 0)
+               from[f]->set_schema_ref(tbl_ref);
+       }
+
+//                     Bind all SEs to this schema
+       tablevar_list_t fm(from);
+
+       int p;
+       for(p=0;p<where.size();++p){
+               bind_to_schema_pr(where[p]->pr, &fm, Schema);
+       }
+       int s;
+       for(s=0;s<select_list.size();++s){
+               bind_to_schema_se(select_list[s]->se, &fm, Schema);
+       }
+
+//             Collect set of tuples referenced in this HFTA
+//             input, internal, or output.
+
+}
+
+void filter_join_qpn::bind_to_schema(table_list *Schema){
+//                     Bind the tablevars in the From clause to the Schema
+//                     (it might have changed from analysis time)
+       int f;
+       for(f=0;f<from.size();++f){
+               string snm = from[f]->get_schema_name();
+               int tbl_ref = Schema->get_table_ref(snm);
+               if(tbl_ref >= 0)
+               from[f]->set_schema_ref(tbl_ref);
+       }
+
+//                     Bind all SEs to this schema
+       tablevar_list_t fm(from);
+
+       int p;
+       for(p=0;p<where.size();++p){
+               bind_to_schema_pr(where[p]->pr, &fm, Schema);
+       }
+       int s;
+       for(s=0;s<select_list.size();++s){
+               bind_to_schema_se(select_list[s]->se, &fm, Schema);
+       }
+
+//             Collect set of tuples referenced in this HFTA
+//             input, internal, or output.
+
+}
+
+
+
+
+void sgah_qpn::bind_to_schema(table_list *Schema){
+//                     Bind the tablevars in the From clause to the Schema
+//                     (it might have changed from analysis time)
+
+
+       int t = Schema->get_table_ref(table_name->get_schema_name() );
+       if(t>=0)
+       table_name->set_schema_ref(t );
+
+//                     Get the "from" clause
+       tablevar_list_t fm(table_name);
+
+
+
+//                     Bind all SEs to this schema
+       int p;
+       for(p=0;p<where.size();++p){
+               bind_to_schema_pr(where[p]->pr, &fm, Schema);
+       }
+       for(p=0;p<having.size();++p){
+               bind_to_schema_pr(having[p]->pr, &fm, Schema);
+       }
+       int s;
+       for(s=0;s<select_list.size();++s){
+               bind_to_schema_se(select_list[s]->se, &fm, Schema);
+       }
+       int g;
+       for(g=0;g<gb_tbl.size();++g){
+               bind_to_schema_se(gb_tbl.get_def(g), &fm, Schema);
+       }
+       int a;
+       for(a=0;a<aggr_tbl.size();++a){
+               if(aggr_tbl.is_builtin(a)){
+                       bind_to_schema_se(aggr_tbl.get_aggr_se(a), &fm, Schema);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(a);
+                       int o;
+                       for(o=0;o<opl.size();++o){
+                               bind_to_schema_se(opl[o],&fm,Schema);
+                       }
+               }
+       }
+}
+
+col_id_set sgah_qpn::get_colrefs(bool ext_fcns_only,table_list *Schema){
+       col_id_set retval, tmp_cset;
+       int p;
+       for(p=0;p<where.size();++p){
+               gather_pr_col_ids(where[p]->pr, tmp_cset, &gb_tbl);
+       }
+       int g;
+       for(g=0;g<gb_tbl.size();++g){
+               gather_se_col_ids(gb_tbl.get_def(g), tmp_cset, &gb_tbl);
+       }
+       int a;
+       for(a=0;a<aggr_tbl.size();++a){
+               if(aggr_tbl.is_builtin(a)){
+                       gather_se_col_ids(aggr_tbl.get_aggr_se(a), tmp_cset, &gb_tbl);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(a);
+                       int o;
+                       for(o=0;o<opl.size();++o){
+                               gather_se_col_ids(opl[o], tmp_cset, &gb_tbl);
+                       }
+               }
+       }
+
+       col_id_set::iterator  cisi;
+       if(ext_fcns_only){
+               for(cisi=tmp_cset.begin();cisi!=tmp_cset.end();++cisi){
+                       field_entry *fe = Schema->get_field((*cisi).schema_ref, (*cisi).field);
+                       if(fe->get_unpack_fcns().size()>0)
+                               retval.insert((*cisi));
+               }
+               return retval;
+       }
+
+       return tmp_cset;
+}
+
+
+void rsgah_qpn::bind_to_schema(table_list *Schema){
+//                     Bind the tablevars in the From clause to the Schema
+//                     (it might have changed from analysis time)
+       int t = Schema->get_table_ref(table_name->get_schema_name() );
+       if(t>=0)
+       table_name->set_schema_ref(t );
+
+//                     Get the "from" clause
+       tablevar_list_t fm(table_name);
+
+//                     Bind all SEs to this schema
+       int p;
+       for(p=0;p<where.size();++p){
+               bind_to_schema_pr(where[p]->pr, &fm, Schema);
+       }
+       for(p=0;p<having.size();++p){
+               bind_to_schema_pr(having[p]->pr, &fm, Schema);
+       }
+       for(p=0;p<closing_when.size();++p){
+               bind_to_schema_pr(closing_when[p]->pr, &fm, Schema);
+       }
+       int s;
+       for(s=0;s<select_list.size();++s){
+               bind_to_schema_se(select_list[s]->se, &fm, Schema);
+       }
+       int g;
+       for(g=0;g<gb_tbl.size();++g){
+               bind_to_schema_se(gb_tbl.get_def(g), &fm, Schema);
+       }
+       int a;
+       for(a=0;a<aggr_tbl.size();++a){
+               if(aggr_tbl.is_builtin(a)){
+                       bind_to_schema_se(aggr_tbl.get_aggr_se(a), &fm, Schema);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(a);
+                       int o;
+                       for(o=0;o<opl.size();++o){
+                               bind_to_schema_se(opl[o],&fm,Schema);
+                       }
+               }
+       }
+}
+
+
+void sgahcwcb_qpn::bind_to_schema(table_list *Schema){
+//                     Bind the tablevars in the From clause to the Schema
+//                     (it might have changed from analysis time)
+       int t = Schema->get_table_ref(table_name->get_schema_name() );
+       if(t>=0)
+       table_name->set_schema_ref(t );
+
+//                     Get the "from" clause
+       tablevar_list_t fm(table_name);
+
+//                     Bind all SEs to this schema
+       int p;
+       for(p=0;p<where.size();++p){
+               bind_to_schema_pr(where[p]->pr, &fm, Schema);
+       }
+       for(p=0;p<having.size();++p){
+               bind_to_schema_pr(having[p]->pr, &fm, Schema);
+       }
+       for(p=0;p<having.size();++p){
+               bind_to_schema_pr(cleanby[p]->pr, &fm, Schema);
+       }
+       for(p=0;p<having.size();++p){
+               bind_to_schema_pr(cleanwhen[p]->pr, &fm, Schema);
+       }
+       int s;
+       for(s=0;s<select_list.size();++s){
+               bind_to_schema_se(select_list[s]->se, &fm, Schema);
+       }
+       int g;
+       for(g=0;g<gb_tbl.size();++g){
+               bind_to_schema_se(gb_tbl.get_def(g), &fm, Schema);
+       }
+       int a;
+       for(a=0;a<aggr_tbl.size();++a){
+               if(aggr_tbl.is_builtin(a)){
+                       bind_to_schema_se(aggr_tbl.get_aggr_se(a), &fm, Schema);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(a);
+                       int o;
+                       for(o=0;o<opl.size();++o){
+                               bind_to_schema_se(opl[o],&fm,Schema);
+                       }
+               }
+       }
+}
+
+
+
+
+
+
+///////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////
+///            Functions for code generation.
+
+
+//-----------------------------------------------------------------
+//             get_cplx_lit_tbl
+
+cplx_lit_table *mrg_qpn::get_cplx_lit_tbl(ext_fcn_list *Ext_fcns){
+       return(new cplx_lit_table());
+}
+
+cplx_lit_table *spx_qpn::get_cplx_lit_tbl(ext_fcn_list *Ext_fcns){
+       int i;
+       cplx_lit_table *complex_literals = new cplx_lit_table();
+
+       for(i=0;i<select_list.size();i++){
+               find_complex_literal_se(select_list[i]->se, Ext_fcns, complex_literals);
+       }
+       for(i=0;i<where.size();++i){
+               find_complex_literal_pr(where[i]->pr,Ext_fcns, complex_literals);
+       }
+
+       return(complex_literals);
+}
+
+cplx_lit_table *sgah_qpn::get_cplx_lit_tbl(ext_fcn_list *Ext_fcns){
+       int i,j;
+       cplx_lit_table *complex_literals = new cplx_lit_table();
+
+       for(i=0;i<aggr_tbl.size();++i){
+               if(aggr_tbl.is_builtin(i) && !aggr_tbl.is_star_aggr(i)){
+                       find_complex_literal_se(aggr_tbl.get_aggr_se(i), Ext_fcns, complex_literals);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(i);
+                       for(j=0;j<opl.size();++j)
+                               find_complex_literal_se(opl[j], Ext_fcns, complex_literals);
+               }
+       }
+
+       for(i=0;i<select_list.size();i++){
+               find_complex_literal_se(select_list[i]->se, Ext_fcns, complex_literals);
+       }
+    for(i=0;i<gb_tbl.size();i++){
+        find_complex_literal_se(gb_tbl.get_def(i), Ext_fcns, complex_literals);
+    }
+       for(i=0;i<where.size();++i){
+               find_complex_literal_pr(where[i]->pr,Ext_fcns, complex_literals);
+       }
+       for(i=0;i<having.size();++i){
+                       find_complex_literal_pr(having[i]->pr,Ext_fcns, complex_literals);
+       }
+
+       return(complex_literals);
+}
+
+
+cplx_lit_table *rsgah_qpn::get_cplx_lit_tbl(ext_fcn_list *Ext_fcns){
+       int i,j;
+       cplx_lit_table *complex_literals = new cplx_lit_table();
+
+       for(i=0;i<aggr_tbl.size();++i){
+               if(aggr_tbl.is_builtin(i) && !aggr_tbl.is_star_aggr(i)){
+                       find_complex_literal_se(aggr_tbl.get_aggr_se(i), Ext_fcns, complex_literals);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(i);
+                       for(j=0;j<opl.size();++j)
+                               find_complex_literal_se(opl[j], Ext_fcns, complex_literals);
+               }
+       }
+
+       for(i=0;i<select_list.size();i++){
+               find_complex_literal_se(select_list[i]->se, Ext_fcns, complex_literals);
+       }
+    for(i=0;i<gb_tbl.size();i++){
+        find_complex_literal_se(gb_tbl.get_def(i), Ext_fcns, complex_literals);
+    }
+       for(i=0;i<where.size();++i){
+               find_complex_literal_pr(where[i]->pr,Ext_fcns, complex_literals);
+       }
+       for(i=0;i<having.size();++i){
+                       find_complex_literal_pr(having[i]->pr,Ext_fcns, complex_literals);
+       }
+       for(i=0;i<closing_when.size();++i){
+                       find_complex_literal_pr(closing_when[i]->pr,Ext_fcns, complex_literals);
+       }
+
+       return(complex_literals);
+}
+
+
+cplx_lit_table *sgahcwcb_qpn::get_cplx_lit_tbl(ext_fcn_list *Ext_fcns){
+       int i,j;
+       cplx_lit_table *complex_literals = new cplx_lit_table();
+
+       for(i=0;i<aggr_tbl.size();++i){
+               if(aggr_tbl.is_builtin(i) && !aggr_tbl.is_star_aggr(i)){
+                       find_complex_literal_se(aggr_tbl.get_aggr_se(i), Ext_fcns, complex_literals);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(i);
+                       for(j=0;j<opl.size();++j)
+                               find_complex_literal_se(opl[j], Ext_fcns, complex_literals);
+               }
+       }
+
+       for(i=0;i<select_list.size();i++){
+               find_complex_literal_se(select_list[i]->se, Ext_fcns, complex_literals);
+       }
+    for(i=0;i<gb_tbl.size();i++){
+        find_complex_literal_se(gb_tbl.get_def(i), Ext_fcns, complex_literals);
+    }
+       for(i=0;i<where.size();++i){
+               find_complex_literal_pr(where[i]->pr,Ext_fcns, complex_literals);
+       }
+       for(i=0;i<having.size();++i){
+                       find_complex_literal_pr(having[i]->pr,Ext_fcns, complex_literals);
+       }
+       for(i=0;i<cleanwhen.size();++i){
+                       find_complex_literal_pr(cleanwhen[i]->pr,Ext_fcns, complex_literals);
+       }
+       for(i=0;i<cleanby.size();++i){
+                       find_complex_literal_pr(cleanby[i]->pr,Ext_fcns, complex_literals);
+       }
+
+       return(complex_literals);
+}
+
+cplx_lit_table *join_eq_hash_qpn::get_cplx_lit_tbl(ext_fcn_list *Ext_fcns){
+       int i;
+       cplx_lit_table *complex_literals = new cplx_lit_table();
+
+       for(i=0;i<select_list.size();i++){
+               find_complex_literal_se(select_list[i]->se, Ext_fcns, complex_literals);
+       }
+       for(i=0;i<where.size();++i){
+               find_complex_literal_pr(where[i]->pr,Ext_fcns, complex_literals);
+       }
+
+       return(complex_literals);
+}
+
+cplx_lit_table *filter_join_qpn::get_cplx_lit_tbl(ext_fcn_list *Ext_fcns){
+       int i;
+       cplx_lit_table *complex_literals = new cplx_lit_table();
+
+       for(i=0;i<select_list.size();i++){
+               find_complex_literal_se(select_list[i]->se, Ext_fcns, complex_literals);
+       }
+       for(i=0;i<where.size();++i){
+               find_complex_literal_pr(where[i]->pr,Ext_fcns, complex_literals);
+       }
+
+       return(complex_literals);
+}
+
+
+
+
+//-----------------------------------------------------------------
+//             get_handle_param_tbl
+
+vector<handle_param_tbl_entry *> mrg_qpn::get_handle_param_tbl(ext_fcn_list *Ext_fcns){
+    vector<handle_param_tbl_entry *> retval;
+       return(retval);
+}
+
+
+vector<handle_param_tbl_entry *> spx_qpn::get_handle_param_tbl(ext_fcn_list *Ext_fcns){
+       int i;
+    vector<handle_param_tbl_entry *> retval;
+
+       for(i=0;i<select_list.size();i++){
+               find_param_handles_se(select_list[i]->se, Ext_fcns, retval);
+       }
+       for(i=0;i<where.size();++i){
+               find_param_handles_pr(where[i]->pr,Ext_fcns, retval);
+       }
+
+       return(retval);
+}
+
+
+vector<handle_param_tbl_entry *> sgah_qpn::get_handle_param_tbl(ext_fcn_list *Ext_fcns){
+       int i,j;
+    vector<handle_param_tbl_entry *> retval;
+
+
+       for(i=0;i<aggr_tbl.size();++i){
+               if(aggr_tbl.is_builtin(i) && !aggr_tbl.is_star_aggr(i)){
+                       find_param_handles_se(aggr_tbl.get_aggr_se(i), Ext_fcns, retval);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(i);
+                       for(j=0;j<opl.size();++j)
+                               find_param_handles_se(opl[j], Ext_fcns, retval);
+               }
+       }
+       for(i=0;i<select_list.size();i++){
+               find_param_handles_se(select_list[i]->se, Ext_fcns, retval);
+       }
+    for(i=0;i<gb_tbl.size();i++){
+        find_param_handles_se(gb_tbl.get_def(i), Ext_fcns, retval);
+    }
+       for(i=0;i<where.size();++i){
+               find_param_handles_pr(where[i]->pr,Ext_fcns, retval);
+       }
+       for(i=0;i<having.size();++i){
+                       find_param_handles_pr(having[i]->pr,Ext_fcns, retval);
+       }
+
+       return(retval);
+}
+
+
+vector<handle_param_tbl_entry *> rsgah_qpn::get_handle_param_tbl(ext_fcn_list *Ext_fcns){
+       int i,j;
+    vector<handle_param_tbl_entry *> retval;
+
+
+       for(i=0;i<aggr_tbl.size();++i){
+               if(aggr_tbl.is_builtin(i) && !aggr_tbl.is_star_aggr(i)){
+                       find_param_handles_se(aggr_tbl.get_aggr_se(i), Ext_fcns, retval);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(i);
+                       for(j=0;j<opl.size();++j)
+                               find_param_handles_se(opl[j], Ext_fcns, retval);
+               }
+       }
+       for(i=0;i<select_list.size();i++){
+               find_param_handles_se(select_list[i]->se, Ext_fcns, retval);
+       }
+    for(i=0;i<gb_tbl.size();i++){
+        find_param_handles_se(gb_tbl.get_def(i), Ext_fcns, retval);
+    }
+       for(i=0;i<where.size();++i){
+               find_param_handles_pr(where[i]->pr,Ext_fcns, retval);
+       }
+       for(i=0;i<having.size();++i){
+                       find_param_handles_pr(having[i]->pr,Ext_fcns, retval);
+       }
+       for(i=0;i<closing_when.size();++i){
+                       find_param_handles_pr(closing_when[i]->pr,Ext_fcns, retval);
+       }
+
+       return(retval);
+}
+
+
+vector<handle_param_tbl_entry *> sgahcwcb_qpn::get_handle_param_tbl(ext_fcn_list *Ext_fcns){
+       int i,j;
+    vector<handle_param_tbl_entry *> retval;
+
+
+       for(i=0;i<aggr_tbl.size();++i){
+               if(aggr_tbl.is_builtin(i) && !aggr_tbl.is_star_aggr(i)){
+                       find_param_handles_se(aggr_tbl.get_aggr_se(i), Ext_fcns, retval);
+               }else{
+                       vector<scalarexp_t *> opl = aggr_tbl.get_operand_list(i);
+                       for(j=0;j<opl.size();++j)
+                               find_param_handles_se(opl[j], Ext_fcns, retval);
+               }
+       }
+       for(i=0;i<select_list.size();i++){
+               find_param_handles_se(select_list[i]->se, Ext_fcns, retval);
+       }
+    for(i=0;i<gb_tbl.size();i++){
+        find_param_handles_se(gb_tbl.get_def(i), Ext_fcns, retval);
+    }
+       for(i=0;i<where.size();++i){
+               find_param_handles_pr(where[i]->pr,Ext_fcns, retval);
+       }
+       for(i=0;i<having.size();++i){
+                       find_param_handles_pr(having[i]->pr,Ext_fcns, retval);
+       }
+       for(i=0;i<cleanwhen.size();++i){
+                       find_param_handles_pr(cleanwhen[i]->pr,Ext_fcns, retval);
+       }
+       for(i=0;i<cleanby.size();++i){
+                       find_param_handles_pr(cleanby[i]->pr,Ext_fcns, retval);
+       }
+
+       return(retval);
+}
+
+vector<handle_param_tbl_entry *> join_eq_hash_qpn::get_handle_param_tbl(ext_fcn_list *Ext_fcns){
+       int i;
+    vector<handle_param_tbl_entry *> retval;
+
+       for(i=0;i<select_list.size();i++){
+               find_param_handles_se(select_list[i]->se, Ext_fcns, retval);
+       }
+       for(i=0;i<where.size();++i){
+               find_param_handles_pr(where[i]->pr,Ext_fcns, retval);
+       }
+
+       return(retval);
+}
+
+
+vector<handle_param_tbl_entry *> filter_join_qpn::get_handle_param_tbl(ext_fcn_list *Ext_fcns){
+       int i;
+    vector<handle_param_tbl_entry *> retval;
+
+       for(i=0;i<select_list.size();i++){
+               find_param_handles_se(select_list[i]->se, Ext_fcns, retval);
+       }
+       for(i=0;i<where.size();++i){
+               find_param_handles_pr(where[i]->pr,Ext_fcns, retval);
+       }
+
+       return(retval);
+}
+
+///////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////
+///            Functions for operator output rates estimations
+
+
+//-----------------------------------------------------------------
+//             get_rate_estimate
+
+double spx_qpn::get_rate_estimate() {
+
+       // dummy method for now
+       return SPX_SELECTIVITY * DEFAULT_INTERFACE_RATE;
+}
+
+double sgah_qpn::get_rate_estimate() {
+
+       // dummy method for now
+       return SGAH_SELECTIVITY * DEFAULT_INTERFACE_RATE;
+}
+
+double rsgah_qpn::get_rate_estimate() {
+
+       // dummy method for now
+       return RSGAH_SELECTIVITY * DEFAULT_INTERFACE_RATE;
+}
+
+double sgahcwcb_qpn::get_rate_estimate() {
+
+       // dummy method for now
+       return SGAHCWCB_SELECTIVITY * DEFAULT_INTERFACE_RATE;
+}
+
+double mrg_qpn::get_rate_estimate() {
+
+       // dummy method for now
+       return MRG_SELECTIVITY * DEFAULT_INTERFACE_RATE;
+}
+
+double join_eq_hash_qpn::get_rate_estimate() {
+
+       // dummy method for now
+       return JOIN_EQ_HASH_SELECTIVITY * DEFAULT_INTERFACE_RATE;
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////
+/////          Generate functors
+
+
+
+
+//-------------------------------------------------------------------------
+//                     Code generation utilities.
+//-------------------------------------------------------------------------
+
+//             Globals referenced by generate utilities
+
+static gb_table *segen_gb_tbl;            // Table of all group-by attributes.
+
+
+
+//                     Generate code that makes reference
+//                     to the tuple, and not to any aggregates.
+//                             NEW : it might reference a stateful function.
+static string generate_se_code(scalarexp_t *se,table_list *schema){
+       string ret;
+    data_type *ldt, *rdt;
+       int o;
+       vector<scalarexp_t *> operands;
+
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               if(se->is_handle_ref()){
+                       sprintf(tmpstr,"handle_param_%d",se->get_handle_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               if(se->get_literal()->is_cpx_lit()){
+                       sprintf(tmpstr,"complex_literal_%d",se->get_literal()->get_cpx_lit_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               return(se->get_literal()->to_hfta_C_code("")); // not complex no constr.
+       case SE_PARAM:
+               if(se->is_handle_ref()){
+                       sprintf(tmpstr,"handle_param_%d",se->get_handle_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               ret.append("param_");
+               ret.append(se->get_param_name());
+               return(ret);
+       case SE_UNARY_OP:
+        ldt = se->get_left_se()->get_data_type();
+        if(ldt->complex_operator(se->get_op()) ){
+                       ret.append( ldt->get_complex_operator(se->get_op()) );
+                       ret.append("(");
+                       ret.append(generate_se_code(se->get_left_se(),schema));
+            ret.append(")");
+               }else{
+                       ret.append("(");
+                       ret.append(se->get_op());
+                       ret.append(generate_se_code(se->get_left_se(),schema));
+                       ret.append(")");
+               }
+               return(ret);
+       case SE_BINARY_OP:
+        ldt = se->get_left_se()->get_data_type();
+        rdt = se->get_right_se()->get_data_type();
+
+        if(ldt->complex_operator(rdt, se->get_op()) ){
+                       ret.append( ldt->get_complex_operator(rdt, se->get_op()) );
+                       ret.append("(");
+                       ret.append(generate_se_code(se->get_left_se(),schema));
+                       ret.append(", ");
+                       ret.append(generate_se_code(se->get_right_se(),schema));
+                       ret.append(")");
+               }else{
+                       ret.append("(");
+                       ret.append(generate_se_code(se->get_left_se(),schema));
+                       ret.append(se->get_op());
+                       ret.append(generate_se_code(se->get_right_se(),schema));
+                       ret.append(")");
+               }
+               return(ret);
+       case SE_COLREF:
+               if(se->is_gb()){                // OK to ref gb attrs, but they're not yet unpacked ...
+                                                       // so return the defining code.
+                       int gref = se->get_gb_ref();
+                       scalarexp_t *gdef_se = segen_gb_tbl->get_def(gref);
+                       ret = generate_se_code(gdef_se, schema );
+
+               }else{
+               sprintf(tmpstr,"unpack_var_%s_%d",
+                 se->get_colref()->get_field().c_str(), se->get_colref()->get_tablevar_ref() );
+               ret = tmpstr;
+               }
+               return(ret);
+       case SE_FUNC:
+               if(se->is_partial()){
+                       sprintf(tmpstr,"partial_fcn_result_%d",se->get_partial_ref());
+                       ret = tmpstr;
+               }else{
+                       ret += se->op + "(";
+                       operands = se->get_operands();
+                       bool first_elem = true;
+                       if(se->get_storage_state() != ""){
+                               ret += "&(stval->state_var_"+se->get_storage_state()+"),cd";
+                               first_elem = false;
+                       }
+                       for(o=0;o<operands.size();o++){
+                               if(first_elem) first_elem=false; else ret += ", ";
+                               if(operands[o]->get_data_type()->is_buffer_type() &&
+                                       (! (operands[o]->is_handle_ref()) ) )
+                                       ret.append("&");
+                               ret += generate_se_code(operands[o], schema);
+                       }
+                       ret += ")";
+               }
+               return(ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in generate_se_code (hfta), line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               return("ERROR in generate_se_code");
+       }
+}
+
+//             generate code that refers only to aggregate data and constants.
+//                     NEW : modified to handle superaggregates and stateful fcn refs.
+//                     Assume that the state is in *stval
+static string generate_se_code_fm_aggr(scalarexp_t *se, string gbvar, string aggvar, table_list *schema){
+
+       string ret;
+    data_type *ldt, *rdt;
+       int o;
+       vector<scalarexp_t *> operands;
+
+
+       switch(se->get_operator_type()){
+       case SE_LITERAL:
+               if(se->is_handle_ref()){
+                       sprintf(tmpstr,"handle_param_%d",se->get_handle_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               if(se->get_literal()->is_cpx_lit()){
+                       sprintf(tmpstr,"complex_literal_%d",se->get_literal()->get_cpx_lit_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               return(se->get_literal()->to_hfta_C_code("")); // not complex no constr.
+       case SE_PARAM:
+               if(se->is_handle_ref()){
+                       sprintf(tmpstr,"handle_param_%d",se->get_handle_ref() );
+                       ret = tmpstr;
+                       return(ret);
+               }
+               ret.append("param_");
+               ret.append(se->get_param_name());
+               return(ret);
+       case SE_UNARY_OP:
+        ldt = se->get_left_se()->get_data_type();
+        if(ldt->complex_operator(se->get_op()) ){
+                       ret.append( ldt->get_complex_operator(se->get_op()) );
+                       ret.append("(");
+                       ret.append(generate_se_code_fm_aggr(se->get_left_se(),gbvar,aggvar,schema));
+            ret.append(")");
+               }else{
+                       ret.append("(");
+                       ret.append(se->get_op());
+                       ret.append(generate_se_code_fm_aggr(se->get_left_se(),gbvar,aggvar,schema));
+                       ret.append(")");
+               }
+               return(ret);
+       case SE_BINARY_OP:
+        ldt = se->get_left_se()->get_data_type();
+        rdt = se->get_right_se()->get_data_type();
+
+        if(ldt->complex_operator(rdt, se->get_op()) ){
+                       ret.append( ldt->get_complex_operator(rdt, se->get_op()) );
+                       ret.append("(");
+                       ret.append(generate_se_code_fm_aggr(se->get_left_se(),gbvar,aggvar,schema));
+                       ret.append(", ");
+                       ret.append(generate_se_code_fm_aggr(se->get_right_se(),gbvar,aggvar,schema));
+                       ret.append(")");
+               }else{
+                       ret.append("(");
+                       ret.append(generate_se_code_fm_aggr(se->get_left_se(),gbvar,aggvar,schema));
+                       ret.append(se->get_op());
+                       ret.append(generate_se_code_fm_aggr(se->get_right_se(),gbvar,aggvar,schema));
+                       ret.append(")");
+               }
+               return(ret);
+       case SE_COLREF:
+               if(se->is_gb()){                // OK to ref gb attrs, but they're not yet unpacked ...
+                                                       // so return the defining code.
+                       sprintf(tmpstr,"%s%d",gbvar.c_str(),se->get_gb_ref());
+                       ret = tmpstr;
+
+               }else{
+               fprintf(stderr,"ERROR reference to non-GB column ref not permitted here,"
+                               "error in query_plan.cc:generate_se_code_fm_aggr, line %d, character %d.\n",
+                               se->get_lineno(), se->get_charno());
+               ret = tmpstr;
+               }
+               return(ret);
+       case SE_AGGR_STAR:
+       case SE_AGGR_SE:
+               if(se->is_superaggr()){
+                       sprintf(tmpstr,"stval->aggr_var%d",se->get_aggr_ref());
+               }else{
+                       sprintf(tmpstr,"%saggr_var%d",aggvar.c_str(),se->get_aggr_ref());
+               }
+               ret = tmpstr;
+               return(ret);
+       case SE_FUNC:
+//                             Is it a UDAF?
+               if(se->get_aggr_ref() >= 0){
+                       sprintf(tmpstr,"udaf_ret_%d",se->get_aggr_ref());
+                       ret = tmpstr;
+                       return(ret);
+               }
+
+               if(se->is_partial()){
+                       sprintf(tmpstr,"partial_fcn_result_%d",se->get_partial_ref());
+                       ret = tmpstr;
+               }else{
+                       ret += se->op + "(";
+                       bool first_elem = true;
+                       if(se->get_storage_state() != ""){
+                               ret += "&(stval->state_var_"+se->get_storage_state()+"),cd";
+                               first_elem = false;
+                       }
+                       operands = se->get_operands();
+                       for(o=0;o<operands.size();o++){
+                               if(first_elem) first_elem=false; else ret += ", ";
+                               if(operands[o]->get_data_type()->is_buffer_type() &&
+                                       (! (operands[o]->is_handle_ref()) ) )
+                                       ret.append("&");
+                               ret += generate_se_code_fm_aggr(operands[o], gbvar,aggvar, schema);
+                       }
+                       ret += ")";
+               }
+               return(ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in query_plan.cc::generate_se_code_fm_aggr, line %d, character %d: unknown operator type %d\n",
+                               se->get_lineno(), se->get_charno(),se->get_operator_type());
+               return("ERROR in generate_se_code_fm_aggr");
+       }
+
+}
+
+
+static string unpack_partial_fcn_fm_aggr(scalarexp_t *se, int pfn_id, string gbvar, string aggvar, table_list *schema){
+       string ret;
+       int o;
+       vector<scalarexp_t *> operands;
+
+
+       if(se->get_operator_type() != SE_FUNC){
+               fprintf(stderr,"INTERNAL ERROR, non-function SE passed to unpack_partial_fcn_fm_aggr. line %d, character %d\n",
+                               se->get_lineno(), se->get_charno());
+               return("ERROR in unpack_partial_fcn_fm_aggr");
+       }
+
+       ret = "\tretval = " + se->get_op() + "( ",
+       sprintf(tmpstr, "&partial_fcn_result_%d",pfn_id);
+       ret += tmpstr;
+
+       if(se->get_storage_state() != ""){
+               ret += ",&(stval->state_var_"+se->get_storage_state()+"),cd";
+       }
+
+       operands = se->get_operands();
+       for(o=0;o<operands.size();o++){
+               ret += ", ";
+               if(operands[o]->get_data_type()->is_buffer_type() &&
+                                       (! (operands[o]->is_handle_ref()) ) )
+                       ret.append("&");
+               ret += generate_se_code_fm_aggr(operands[o], gbvar,aggvar, schema);
+       }
+       ret += ");\n";
+
+       return(ret);
+}
+
+
+static string unpack_partial_fcn(scalarexp_t *se, int pfn_id, table_list *schema){
+       string ret;
+       int o;
+       vector<scalarexp_t *> operands;
+
+       if(se->get_operator_type() != SE_FUNC){
+               fprintf(stderr,"INTERNAL ERROR, non-function SE passed to unpack_partial_fcn. line %d, character %d\n",
+                               se->get_lineno(), se->get_charno());
+               return("ERROR in unpack_partial_fcn");
+       }
+
+       ret = "\tretval = " + se->get_op() + "( ",
+       sprintf(tmpstr, "&partial_fcn_result_%d",pfn_id);
+       ret += tmpstr;
+
+       if(se->get_storage_state() != ""){
+               ret += ",&(stval->state_var_"+se->get_storage_state()+"),cd";
+       }
+
+       operands = se->get_operands();
+       for(o=0;o<operands.size();o++){
+               ret += ", ";
+               if(operands[o]->get_data_type()->is_buffer_type() &&
+                                       (! (operands[o]->is_handle_ref()) ) )
+                       ret.append("&");
+               ret += generate_se_code(operands[o], schema);
+       }
+       ret += ");\n";
+
+       return(ret);
+}
+
+static string generate_cached_fcn(scalarexp_t *se, int pfn_id, table_list *schema){
+       string ret;
+       int o;
+       vector<scalarexp_t *> operands;
+
+       if(se->get_operator_type() != SE_FUNC){
+               fprintf(stderr,"INTERNAL ERROR, non-function SE passed to generate_cached_fcn. line %d, character %d\n",
+                               se->get_lineno(), se->get_charno());
+               return("ERROR in generate_cached_fcn");
+       }
+
+       ret = se->get_op()+"(";
+
+       if(se->get_storage_state() != ""){
+               ret += "&(stval->state_var_"+se->get_storage_state()+"),cd,";
+       }
+
+       operands = se->get_operands();
+       for(o=0;o<operands.size();o++){
+               if(o) ret += ", ";
+               if(operands[o]->get_data_type()->is_buffer_type() &&
+                                       (! (operands[o]->is_handle_ref()) ) )
+                       ret.append("&");
+               ret += generate_se_code(operands[o], schema);
+       }
+       ret += ");\n";
+
+       return(ret);
+}
+
+
+
+
+
+static string generate_C_comparison_op(string op){
+  if(op == "=") return("==");
+  if(op == "<>") return("!=");
+  return(op);
+}
+
+static string generate_C_boolean_op(string op){
+       if( (op == "AND") || (op == "And") || (op == "and") ){
+               return("&&");
+       }
+       if( (op == "OR") || (op == "Or") || (op == "or") ){
+               return("||");
+       }
+       if( (op == "NOT") || (op == "Not") || (op == "not") ){
+               return("!");
+       }
+
+       return("ERROR UNKNOWN BOOLEAN OPERATOR");
+}
+
+
+static string generate_predicate_code(predicate_t *pr,table_list *schema){
+       string ret;
+       vector<literal_t *>  litv;
+       int i;
+    data_type *ldt, *rdt;
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+        ldt = pr->get_left_se()->get_data_type();
+
+               ret.append("( ");
+               litv = pr->get_lit_vec();
+               for(i=0;i<litv.size();i++){
+                       if(i>0) ret.append(" || ");
+                       ret.append("( ");
+
+               if(ldt->complex_comparison(ldt) ){
+                               ret.append( ldt->get_hfta_comparison_fcn(ldt) );
+                               ret.append("( ");
+                               if(ldt->is_buffer_type() )
+                                       ret.append("&");
+                               ret.append(generate_se_code(pr->get_left_se(), schema));
+                               ret.append(", ");
+                               if(ldt->is_buffer_type() )
+                                       ret.append("&");
+                               if(litv[i]->is_cpx_lit()){
+                                       sprintf(tmpstr,"complex_literal_%d",litv[i]->get_cpx_lit_ref() );
+                                       ret += tmpstr;
+                               }else{
+                                       ret.append(litv[i]->to_C_code(""));
+                               }
+                               ret.append(") == 0");
+                       }else{
+                               ret.append(generate_se_code(pr->get_left_se(), schema));
+                               ret.append(" == ");
+                               ret.append(litv[i]->to_hfta_C_code(""));
+                       }
+
+                       ret.append(" )");
+               }
+               ret.append(" )");
+               return(ret);
+
+       case PRED_COMPARE:
+        ldt = pr->get_left_se()->get_data_type();
+        rdt = pr->get_right_se()->get_data_type();
+
+               ret.append("( ");
+        if(ldt->complex_comparison(rdt) ){
+                       ret.append(ldt->get_hfta_comparison_fcn(rdt));
+                       ret.append("(");
+                       if(ldt->is_buffer_type() )
+                               ret.append("&");
+                       ret.append(generate_se_code(pr->get_left_se(),schema) );
+                       ret.append(", ");
+                       if(rdt->is_buffer_type() )
+                               ret.append("&");
+                       ret.append(generate_se_code(pr->get_right_se(),schema) );
+                       ret.append(") ");
+                       ret.append( generate_C_comparison_op(pr->get_op()));
+                       ret.append("0");
+               }else{
+                       ret.append(generate_se_code(pr->get_left_se(),schema) );
+                       ret.append( generate_C_comparison_op(pr->get_op()));
+                       ret.append(generate_se_code(pr->get_right_se(),schema) );
+               }
+               ret.append(" )");
+               return(ret);
+       case PRED_UNARY_OP:
+               ret.append("( ");
+               ret.append( generate_C_boolean_op(pr->get_op()) );
+               ret.append(generate_predicate_code(pr->get_left_pr(),schema) );
+               ret.append(" )");
+               return(ret);
+       case PRED_BINARY_OP:
+               ret.append("( ");
+               ret.append(generate_predicate_code(pr->get_left_pr(),schema) );
+               ret.append( generate_C_boolean_op(pr->get_op()) );
+               ret.append(generate_predicate_code(pr->get_right_pr(),schema) );
+               ret.append(" )");
+               return(ret);
+       case PRED_FUNC:
+               ret += pr->get_op() + "( ";
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       if(o>0) ret += ", ";
+                       if(op_list[o]->get_data_type()->is_buffer_type() && (! (op_list[o]->is_handle_ref()) ) )
+                                       ret.append("&");
+                       ret += generate_se_code(op_list[o], schema);
+               }
+               ret += " )";
+               return(ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in generate_predicate_code, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               return("ERROR in generate_predicate_code");
+       }
+}
+
+static string generate_predicate_code_fm_aggr(predicate_t *pr, string gbvar, string aggvar,table_list *schema){
+       string ret;
+       vector<literal_t *>  litv;
+       int i;
+    data_type *ldt, *rdt;
+       vector<scalarexp_t *> op_list;
+       int o;
+
+       switch(pr->get_operator_type()){
+       case PRED_IN:
+        ldt = pr->get_left_se()->get_data_type();
+
+               ret.append("( ");
+               litv = pr->get_lit_vec();
+               for(i=0;i<litv.size();i++){
+                       if(i>0) ret.append(" || ");
+                       ret.append("( ");
+
+               if(ldt->complex_comparison(ldt) ){
+                               ret.append( ldt->get_hfta_comparison_fcn(ldt) );
+                               ret.append("( ");
+                               if(ldt->is_buffer_type() )
+                                       ret.append("&");
+                               ret.append(generate_se_code_fm_aggr(pr->get_left_se(), gbvar, aggvar, schema));
+                               ret.append(", ");
+                               if(ldt->is_buffer_type() )
+                                       ret.append("&");
+                               if(litv[i]->is_cpx_lit()){
+                                       sprintf(tmpstr,"complex_literal_%d",litv[i]->get_cpx_lit_ref() );
+                                       ret += tmpstr;
+                               }else{
+                                       ret.append(litv[i]->to_C_code(""));
+                               }
+                               ret.append(") == 0");
+                       }else{
+                               ret.append(generate_se_code_fm_aggr(pr->get_left_se(), gbvar, aggvar, schema));
+                               ret.append(" == ");
+                               ret.append(litv[i]->to_hfta_C_code(""));
+                       }
+
+                       ret.append(" )");
+               }
+               ret.append(" )");
+               return(ret);
+
+       case PRED_COMPARE:
+        ldt = pr->get_left_se()->get_data_type();
+        rdt = pr->get_right_se()->get_data_type();
+
+               ret.append("( ");
+        if(ldt->complex_comparison(rdt) ){
+                       ret.append(ldt->get_hfta_comparison_fcn(rdt));
+                       ret.append("(");
+                       if(ldt->is_buffer_type() )
+                               ret.append("&");
+                       ret.append(generate_se_code_fm_aggr(pr->get_left_se(), gbvar, aggvar,schema) );
+                       ret.append(", ");
+                       if(rdt->is_buffer_type() )
+                               ret.append("&");
+                       ret.append(generate_se_code_fm_aggr(pr->get_right_se(), gbvar, aggvar,schema) );
+                       ret.append(") ");
+                       ret.append( generate_C_comparison_op(pr->get_op()));
+                       ret.append("0");
+               }else{
+                       ret.append(generate_se_code_fm_aggr(pr->get_left_se(), gbvar, aggvar,schema) );
+                       ret.append( generate_C_comparison_op(pr->get_op()));
+                       ret.append(generate_se_code_fm_aggr(pr->get_right_se(), gbvar, aggvar,schema) );
+               }
+               ret.append(" )");
+               return(ret);
+       case PRED_UNARY_OP:
+               ret.append("( ");
+               ret.append( generate_C_boolean_op(pr->get_op()) );
+               ret.append(generate_predicate_code_fm_aggr(pr->get_left_pr(), gbvar, aggvar,schema) );
+               ret.append(" )");
+               return(ret);
+       case PRED_BINARY_OP:
+               ret.append("( ");
+               ret.append(generate_predicate_code_fm_aggr(pr->get_left_pr(), gbvar, aggvar,schema) );
+               ret.append( generate_C_boolean_op(pr->get_op()) );
+               ret.append(generate_predicate_code_fm_aggr(pr->get_right_pr(), gbvar, aggvar,schema) );
+               ret.append(" )");
+               return(ret);
+       case PRED_FUNC:
+               ret += pr->get_op() + "( ";
+               op_list = pr->get_op_list();
+               for(o=0;o<op_list.size();++o){
+                       if(o>0) ret += ", ";
+                       if(op_list[o]->get_data_type()->is_buffer_type() && (! (op_list[o]->is_handle_ref()) ) )
+                                       ret.append("&");
+                       ret += generate_se_code_fm_aggr(op_list[o], gbvar, aggvar, schema);
+               }
+               ret += " )";
+               return(ret);
+       default:
+               fprintf(stderr,"INTERNAL ERROR in generate_predicate_code, line %d, character %d, unknown predicate operator type %d\n",
+                       pr->get_lineno(), pr->get_charno(), pr->get_operator_type() );
+               return("ERROR in generate_predicate_code");
+       }
+}
+
+
+//                             Aggregation code
+
+
+static string generate_equality_test(string &lhs_op, string &rhs_op, data_type *dt){
+       string ret;
+
+    if(dt->complex_comparison(dt) ){
+               ret.append(dt->get_hfta_comparison_fcn(dt));
+               ret.append("(");
+                       if(dt->is_buffer_type() )
+                               ret.append("&");
+               ret.append(lhs_op);
+               ret.append(", ");
+                       if(dt->is_buffer_type() )
+                               ret.append("&");
+               ret.append(rhs_op );
+               ret.append(") == 0");
+       }else{
+               ret.append(lhs_op );
+               ret.append(" == ");
+               ret.append(rhs_op );
+       }
+
+       return(ret);
+}
+
+static string generate_comparison(string &lhs_op, string &rhs_op, data_type *dt){
+       string ret;
+
+    if(dt->complex_comparison(dt) ){
+               ret.append(dt->get_hfta_comparison_fcn(dt));
+               ret.append("(");
+                       if(dt->is_buffer_type() )
+                               ret.append("&");
+               ret.append(lhs_op);
+               ret.append(", ");
+                       if(dt->is_buffer_type() )
+                               ret.append("&");
+               ret.append(rhs_op );
+               ret.append(") == 0");
+       }else{
+               ret.append(lhs_op );
+               ret.append(" == ");
+               ret.append(rhs_op );
+       }
+
+       return(ret);
+}
+
+
+//             Here I assume that only MIN and MAX aggregates can be computed
+//             over BUFFER data types.
+
+static string generate_aggr_update(string var, aggregate_table *atbl,int aidx, table_list *schema){
+       string retval = "\t\t";
+       string op = atbl->get_op(aidx);
+
+//             Is it a UDAF
+       if(! atbl->is_builtin(aidx)) {
+               int o;
+               retval += op+"_HFTA_AGGR_UPDATE_(";
+               if(atbl->get_storage_type(aidx)->get_type() != fstring_t) retval+="&";
+               retval+="("+var+")";
+               vector<scalarexp_t *> opl = atbl->get_operand_list(aidx);
+               for(o=0;o<opl.size();++o){{
+                       retval += ",";
+                       if(opl[o]->get_data_type()->is_buffer_type() && (! (opl[o]->is_handle_ref()) ) )
+                                       retval.append("&");
+                               retval += generate_se_code(opl[o], schema);
+                       }
+               }
+               retval += ");\n";
+
+               return retval;
+       }
+
+
+//                     builtin processing
+       data_type *dt = atbl->get_data_type(aidx);
+
+       if(op == "COUNT"){
+               retval.append(var);
+               retval.append("++;\n");
+               return(retval);
+       }
+       if(op == "SUM"){
+               retval.append(var);
+               retval.append(" += ");
+               retval.append(generate_se_code(atbl->get_aggr_se(aidx), schema) );
+               retval.append(";\n");
+               return(retval);
+       }
+       if(op == "MIN"){
+               sprintf(tmpstr,"aggr_tmp_%d",aidx);
+               retval += dt->make_host_cvar(tmpstr);
+               retval += " = ";
+               retval += generate_se_code(atbl->get_aggr_se(aidx), schema )+";\n";
+               if(dt->complex_comparison(dt)){
+                       if(dt->is_buffer_type())
+                         sprintf(tmpstr,"\t\tif(%s(&aggr_tmp_%d,&(%s)) < 0)\n",dt->get_hfta_comparison_fcn(dt).c_str(), aidx, var.c_str());
+                       else
+                         sprintf(tmpstr,"\t\tif(%s(aggr_tmp_%d,%s) < 0)\n",dt->get_hfta_comparison_fcn(dt).c_str(), aidx, var.c_str());
+               }else{
+                       sprintf(tmpstr,"\t\tif(aggr_tmp_%d < %s)\n",aidx,var.c_str());
+               }
+               retval.append(tmpstr);
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t\t%s(&(%s),&aggr_tmp_%d);\n",dt->get_hfta_buffer_replace().c_str(),var.c_str(),aidx);
+               }else{
+                       sprintf(tmpstr,"\t\t\t%s = aggr_tmp_%d;\n",var.c_str(),aidx);
+               }
+               retval.append(tmpstr);
+
+               return(retval);
+       }
+       if(op == "MAX"){
+               sprintf(tmpstr,"aggr_tmp_%d",aidx);
+               retval+=dt->make_host_cvar(tmpstr);
+               retval+=" = ";
+               retval+=generate_se_code(atbl->get_aggr_se(aidx), schema )+";\n";
+               if(dt->complex_comparison(dt)){
+                       if(dt->is_buffer_type())
+                        sprintf(tmpstr,"\t\tif(%s(&aggr_tmp_%d,&(%s)) > 0)\n",dt->get_hfta_comparison_fcn(dt).c_str(), aidx, var.c_str());
+                       else
+                        sprintf(tmpstr,"\t\tif(%s(aggr_tmp_%d,%s) > 0)\n",dt->get_hfta_comparison_fcn(dt).c_str(), aidx, var.c_str());
+               }else{
+                       sprintf(tmpstr,"\t\tif(aggr_tmp_%d > %s)\n",aidx,var.c_str());
+               }
+               retval.append(tmpstr);
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t\t%s(&(%s),&aggr_tmp_%d);\n",dt->get_hfta_buffer_replace().c_str(),var.c_str(),aidx);
+               }else{
+                       sprintf(tmpstr,"\t\t\t%s = aggr_tmp_%d;\n",var.c_str(),aidx);
+               }
+               retval.append(tmpstr);
+
+               return(retval);
+
+       }
+       if(op == "AND_AGGR"){
+               retval.append(var);
+               retval.append(" &= ");
+               retval.append(generate_se_code(atbl->get_aggr_se(aidx), schema) );
+               retval.append(";\n");
+               return(retval);
+       }
+       if(op == "OR_AGGR"){
+               retval.append(var);
+               retval.append(" |= ");
+               retval.append(generate_se_code(atbl->get_aggr_se(aidx), schema) );
+               retval.append(";\n");
+               return(retval);
+       }
+       if(op == "XOR_AGGR"){
+               retval.append(var);
+               retval.append(" ^= ");
+               retval.append(generate_se_code(atbl->get_aggr_se(aidx), schema) );
+               retval.append(";\n");
+               return(retval);
+       }
+       if(op=="AVG"){
+               retval += var+"_sum += "+generate_se_code(atbl->get_aggr_se(aidx), schema)+";\n";
+               retval += "\t\t"+var+"_cnt += 1;\n";
+               retval += "\t\t"+var+" = "+var+"_sum / "+var+"_cnt;\n";
+               return retval;
+       }
+
+       fprintf(stderr,"INTERNAL ERROR : aggregate %s not recognized in query_plan::generate_aggr_update.\n",op.c_str());
+       exit(1);
+       return(retval);
+
+}
+
+
+//             superaggr minus.
+
+static string generate_superaggr_minus(string var, string supervar, aggregate_table *atbl,int aidx, table_list *schema){
+       string retval = "\t\t";
+       string op = atbl->get_op(aidx);
+
+//             Is it a UDAF
+       if(! atbl->is_builtin(aidx)) {
+               int o;
+               retval += op+"_HFTA_AGGR_MINUS_(";
+               if(atbl->get_storage_type(aidx)->get_type() != fstring_t) retval+="&";
+               retval+="("+supervar+"),";
+               if(atbl->get_storage_type(aidx)->get_type() != fstring_t) retval+="&";
+               retval+="("+var+");\n";
+
+               return retval;
+       }
+
+
+       if(op == "COUNT" || op == "SUM"){
+               retval += supervar + "-=" +var + ";\n";
+               return(retval);
+       }
+
+       if(op == "XOR_AGGR"){
+               retval += supervar + "^=" +var + ";\n";
+               return(retval);
+       }
+
+       if(op=="MIN" || op == "MAX")
+               return "";
+
+       fprintf(stderr,"INTERNAL ERROR : aggregate %s not recognized in generate_superaggr_minus.\n",op.c_str());
+       exit(1);
+       return(retval);
+
+}
+
+
+
+
+static string generate_aggr_init(string var, aggregate_table *atbl,int aidx, table_list *schema){
+       string retval;
+       string op = atbl->get_op(aidx);
+
+//                     UDAF processing
+       if(! atbl->is_builtin(aidx)){
+//                     initialize
+               retval += "\t"+atbl->get_op(aidx)+"_HFTA_AGGR_INIT_(";
+               if(atbl->get_storage_type(aidx)->get_type() != fstring_t) retval+="&";
+               retval+="("+var+"));\n";
+//                     Add 1st tupl
+               retval += "\t"+atbl->get_op(aidx)+"_HFTA_AGGR_UPDATE_(";
+               if(atbl->get_storage_type(aidx)->get_type() != fstring_t) retval+="&";
+               retval+="("+var+")";
+               vector<scalarexp_t *> opl = atbl->get_operand_list(aidx);
+               int o;
+               for(o=0;o<opl.size();++o){
+                       retval += ",";
+                       if(opl[o]->get_data_type()->is_buffer_type() && (! (opl[o]->is_handle_ref()) ) )
+                                       retval.append("&");
+                               retval += generate_se_code(opl[o],schema);
+                       }
+               retval += ");\n";
+               return(retval);
+       }
+
+//                     builtin aggregate processing
+       data_type *dt = atbl->get_data_type(aidx);
+
+       if(op == "COUNT"){
+               retval = var;
+               retval.append(" = 1;\n");
+               return(retval);
+       }
+
+       if(op == "SUM" || op == "MIN" || op == "MAX" || op == "AND_AGGR" ||
+                                       op=="AVG" || op == "OR_AGGR" || op == "XOR_AGGR"){
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\taggr_tmp_%d = %s;\n",aidx,generate_se_code(atbl->get_aggr_se(aidx), schema ).c_str() );
+                       retval.append(tmpstr);
+                       sprintf(tmpstr,"\t\t%s(&(%s),&aggr_tmp_%d);\n",dt->get_hfta_buffer_assign_copy().c_str(),var.c_str(),aidx);
+                       retval.append(tmpstr);
+               }else{
+                       if(op=="AVG"){
+                               retval += var+"_sum = "+generate_se_code(atbl->get_aggr_se(aidx), schema)+";\n";
+                               retval += "\t"+var+"_cnt = 1;\n";
+                               retval += "\t"+var+" = "+var+"_sum;\n";
+                       }else{
+                               retval = var;
+                               retval += " = ";
+                               retval.append(generate_se_code(atbl->get_aggr_se(aidx), schema));
+                               retval.append(";\n");
+                       }
+               }
+               return(retval);
+       }
+
+       fprintf(stderr,"INTERNAL ERROR : aggregate %s not recognized in query_plan::generate_aggr_init.\n",op.c_str());
+       exit(1);
+       return(retval);
+
+}
+
+
+
+static string generate_aggr_reinitialize(string var, aggregate_table *atbl,int aidx, table_list *schema){
+       string retval;
+       string op = atbl->get_op(aidx);
+
+//                     UDAF processing
+       if(! atbl->is_builtin(aidx)){
+//                     initialize
+               retval +=  "\t"+atbl->get_op(aidx);
+               if(atbl->is_running_aggr(aidx)){
+                       retval += "_HFTA_AGGR_REINIT_(";
+               }else{
+                       retval += "_HFTA_AGGR_INIT_(";
+               }
+               if(atbl->get_storage_type(aidx)->get_type() != fstring_t) retval+="&";
+               retval+="("+var+"));\n";
+               return(retval);
+       }
+
+//                     builtin aggregate processing
+       data_type *dt = atbl->get_data_type(aidx);
+
+       if(op == "COUNT"){
+               retval = var;
+               retval.append(" = 0;\n");
+               return(retval);
+       }
+
+       if(op == "SUM" ||  op == "AND_AGGR" ||
+                                                                       op == "OR_AGGR" || op == "XOR_AGGR"){
+               if(dt->is_buffer_type()){
+                       return("ERROR, cannot yet handle reinitialization of builtin aggregates over strings.");
+               }else{
+                       retval = var;
+                       retval += " = ";
+                       literal_t l(dt->type_indicator());
+                       retval.append(l.to_string());
+                       retval.append(";\n");
+               }
+               return(retval);
+       }
+
+       if(op == "MIN"){
+               if(dt->is_buffer_type()){
+                       return("ERROR, cannot yet handle reinitialization of builtin aggregates over strings.");
+               }else{
+                       retval = var;
+                       retval += " = ";
+                       retval.append(dt->get_max_literal());
+                       retval.append(";\n");
+               }
+               return(retval);
+       }
+
+       if(op == "MAX"){
+               if(dt->is_buffer_type()){
+                       return("ERROR, cannot yet handle reinitialization of builtin aggregates over strings.");
+               }else{
+                       retval = var;
+                       retval += " = ";
+                       retval.append(dt->get_min_literal());
+                       retval.append(";\n");
+               }
+               return(retval);
+       }
+
+       fprintf(stderr,"INTERNAL ERROR : aggregate %s not recognized in generate_aggr_reinitialize.\n",op.c_str());
+       exit(1);
+       return(retval);
+
+}
+
+
+//                     Generate parameter holding vars from a param table.
+static string generate_param_vars(param_table *param_tbl){
+       string ret;
+       int p;
+       vector<string> param_vec = param_tbl->get_param_names();
+       for(p=0;p<param_vec.size();p++){
+               data_type *dt = param_tbl->get_data_type(param_vec[p]);
+               sprintf(tmpstr,"param_%s;\n", param_vec[p].c_str());
+               ret += "\t"+dt->make_host_cvar(tmpstr)+";\n";
+               if(param_tbl->handle_access(param_vec[p])){
+                       ret += "\tstruct search_handle *param_handle_"+param_vec[p]+";\n";
+               }
+       }
+       return(ret);
+}
+
+//                     Parameter manipulation routines
+static string generate_load_param_block(string functor_name,
+                                                       param_table *param_tbl,
+                                                       vector<handle_param_tbl_entry *> param_handle_table
+                                                       ){
+       int p;
+       vector<string> param_names = param_tbl->get_param_names();
+
+       string ret = "int load_params_"+functor_name+"(gs_int32_t sz, void *value){\n";
+    ret.append("\tint pos=0;\n");
+    ret.append("\tint data_pos;\n");
+
+       for(p=0;p<param_names.size();p++){
+               data_type *dt = param_tbl->get_data_type(param_names[p]);
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"tmp_var_%s;\n", param_names[p].c_str());
+                       ret += "\t"+dt->make_host_cvar(tmpstr)+";\n";
+               }
+       }
+
+
+//             Verify that the block is of minimum size
+       if(param_names.size() > 0){
+               ret += "//\tVerify that the value block is large enough */\n";
+               ret.append("\n\tdata_pos = ");
+               for(p=0;p<param_names.size();p++){
+                       if(p>0) ret.append(" + ");
+                       data_type *dt = param_tbl->get_data_type(param_names[p]);
+                       ret.append("sizeof( ");
+                       ret.append( dt->get_host_cvar_type() );
+                       ret.append(" )");
+               }
+               ret.append(";\n");
+               ret.append("\tif(data_pos > sz) return 1;\n\n");
+       }
+
+///////////////////////
+///            Verify that all strings can be unpacked.
+
+       ret += "//\tVerify that the strings can be unpacked */\n";
+       for(p=0;p<param_names.size();p++){
+               data_type *dt = param_tbl->get_data_type(param_names[p]);
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"\ttmp_var_%s =  *( (%s *)((gs_sp_t )value+pos) );\n",param_names[p].c_str(), dt->get_host_cvar_type().c_str() );
+                       ret.append(tmpstr);
+                       switch( dt->get_type() ){
+                       case v_str_t:
+//                             ret += "\ttmp_var_"+param_names[p]+".offset = ntohl( tmp_var_"+param_names[p]+".offset );\n";           // ntoh conversion
+//                             ret += "\ttmp_var_"+param_names[p]+".length = ntohl( tmp_var_"+param_names[p]+".length );\n";   // ntoh conversion
+                               sprintf(tmpstr,"\tif( (int)(tmp_var_%s.offset) + tmp_var_%s.length > sz) return 1;\n",param_names[p].c_str(), param_names[p].c_str() );
+                               ret.append(tmpstr);
+                               sprintf(tmpstr,"\ttmp_var_%s.offset = (gs_p_t)( (gs_sp_t )value + (gs_p_t)(tmp_var_%s.offset) );\n",param_names[p].c_str(), param_names[p].c_str() );
+                               ret.append(tmpstr);
+                       break;
+                       default:
+                               fprintf(stderr,"ERROR: parameter %s is of type %s, a buffered type, but I don't know how to unpack it as a parameter.\n",param_names[p].c_str(), dt->to_string().c_str() );
+                               exit(1);
+                       break;
+                       }
+               }
+               ret += "\tpos += sizeof( "+dt->get_host_cvar_type()+" );\n";
+       }
+
+
+/////////////////////////
+
+       ret += "/*\tThe block is OK, do the unpacking.  */\n";
+       ret += "\tpos = 0;\n";
+
+       for(p=0;p<param_names.size();p++){
+               data_type *dt = param_tbl->get_data_type(param_names[p]);
+               if(dt->is_buffer_type()){
+            sprintf(tmpstr,"\t%s(&param_%s, &tmp_var_%s);\n", dt->get_hfta_buffer_assign_copy().c_str(),param_names[p].c_str(),param_names[p].c_str() );
+            ret.append(tmpstr);
+               }else{
+//                     if(dt->needs_hn_translation()){
+//                             sprintf(tmpstr,"\tparam_%s =  %s( *( (%s *)( (gs_sp_t )value+pos) ) );\n",
+//                               param_names[p].c_str(), dt->ntoh_translation().c_str(), dt->get_host_cvar_type().c_str() );
+//                     }else{
+                               sprintf(tmpstr,"\tparam_%s =  *( (%s *)( (gs_sp_t )value+pos) );\n",
+                                 param_names[p].c_str(), dt->get_host_cvar_type().c_str() );
+//                     }
+                       ret.append(tmpstr);
+               }
+               ret += "\tpos += sizeof( "+dt->get_host_cvar_type()+" );\n";
+       }
+
+//                     TODO: I think this method of handle registration is obsolete
+//                     and should be deleted.
+//                        some examination reveals that handle_access is always false.
+       for(p=0;p<param_names.size();p++){
+               if(param_tbl->handle_access(param_names[p]) ){
+                       data_type *pdt = param_tbl->get_data_type(param_names[p]);
+//                                     create the new.
+                       ret += "\tt->param_handle_"+param_names[p]+" = " +
+                               pdt->handle_registration_name() +
+                               "((struct FTA *)t, &(t->param_"+param_names[p]+"));\n";
+               }
+       }
+//                     Register the pass-by-handle parameters
+
+       ret += "/* register the pass-by-handle parameters */\n";
+
+    int ph;
+    for(ph=0;ph<param_handle_table.size();++ph){
+               data_type pdt(param_handle_table[ph]->type_name);
+               switch(param_handle_table[ph]->val_type){
+               case cplx_lit_e:
+                       break;
+               case litval_e:
+                       break;
+               case param_e:
+                       sprintf(tmpstr,"\thandle_param_%d = %s(",ph,param_handle_table[ph]->lfta_registration_fcn().c_str());
+                       ret += tmpstr;
+                       if(pdt.is_buffer_type()) ret += "&(";
+                       ret += "param_"+param_handle_table[ph]->param_name;
+                       if(pdt.is_buffer_type()) ret += ")";
+                   ret += ");\n";
+                       break;
+               default:
+                       fprintf(stderr, "INTERNAL ERROR unknown case found when processing pass-by-handle parameter table.\n");
+                       exit(1);
+               }
+       }
+
+
+       ret += "\treturn(0);\n";
+       ret.append("}\n\n");
+
+       return(ret);
+
+}
+
+static string generate_delete_param_block(string functor_name,
+                                               param_table *param_tbl,
+                                               vector<handle_param_tbl_entry *> param_handle_table
+                               ){
+
+       int p;
+       vector<string> param_names = param_tbl->get_param_names();
+
+       string ret = "void destroy_params_"+functor_name+"(){\n";
+
+       for(p=0;p<param_names.size();p++){
+               data_type *dt = param_tbl->get_data_type(param_names[p]);
+               if(dt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&param_%s);\n",dt->get_hfta_buffer_destroy().c_str(),param_names[p].c_str());
+                       ret.append(tmpstr);
+               }
+               if(param_tbl->handle_access(param_names[p]) ){
+                       ret += "\t\t" + dt->get_handle_destructor() +
+                               "(t->param_handle_" + param_names[p] + ");\n";
+               }
+       }
+
+       ret += "//\t\tDeregister handles.\n";
+    int ph;
+    for(ph=0;ph<param_handle_table.size();++ph){
+               if(param_handle_table[ph]->val_type == param_e){
+                 sprintf(tmpstr, "\t\t%s(handle_param_%d);\n",
+                       param_handle_table[ph]->lfta_deregistration_fcn().c_str(),ph);
+                 ret += tmpstr;
+               }
+       }
+
+       ret += "}\n\n";
+       return ret;
+}
+
+// ---------------------------------------------------------------------
+//             functions for creating functor variables.
+
+static string generate_access_vars(col_id_set &cid_set, table_list *schema){
+       string ret;
+       col_id_set::iterator csi;
+
+       for(csi=cid_set.begin(); csi!=cid_set.end();++csi){
+       int schref = (*csi).schema_ref;
+               int tblref = (*csi).tblvar_ref;
+               string field = (*csi).field;
+               data_type dt(schema->get_type_name(schref,field));
+               sprintf(tmpstr,"unpack_var_%s_%d", field.c_str(), tblref);
+               ret+="\t"+dt.make_host_cvar(tmpstr)+";\n";
+               sprintf(tmpstr,"\tgs_int32_t unpack_offset_%s_%d;\n", field.c_str(), tblref);
+               ret.append(tmpstr);
+       }
+       return(ret);
+}
+
+static string generate_partial_fcn_vars(vector<scalarexp_t *> &partial_fcns,
+       vector<int> &ref_cnt, vector<bool> &is_partial, bool gen_fcn_cache){
+       string ret;
+       int p;
+
+
+       for(p=0;p<partial_fcns.size();++p){
+               if(!gen_fcn_cache || is_partial[p] ||  ref_cnt[p]>1){
+                       sprintf(tmpstr,"partial_fcn_result_%d", p);
+                       ret+="\t"+partial_fcns[p]->get_data_type()->make_host_cvar(tmpstr)+";\n";
+                       if(gen_fcn_cache && ref_cnt[p]>1){
+                               ret+="\tint fcn_ref_cnt_"+int_to_string(p)+";\n";
+                       }
+               }
+       }
+       return(ret);
+}
+
+
+static string generate_complex_lit_vars(cplx_lit_table *complex_literals){
+       string ret;
+    int cl;
+    for(cl=0;cl<complex_literals->size();cl++){
+        literal_t *l = complex_literals->get_literal(cl);
+        data_type *dtl = new data_type( l->get_type() );
+        sprintf(tmpstr,"complex_literal_%d",cl);
+               ret += "\t"+dtl->make_host_cvar(tmpstr)+";\n";
+        if(complex_literals->is_handle_ref(cl)){
+            sprintf(tmpstr,"\tstruct search_handle *lit_handle_%d;\n",cl);
+            ret.append(tmpstr);
+        }
+    }
+       return(ret);
+}
+
+
+static string generate_pass_by_handle_vars(
+                               vector<handle_param_tbl_entry *> &param_handle_table){
+       string ret;
+       int p;
+
+       for(p=0;p<param_handle_table.size();++p){
+               sprintf(tmpstr,"\tgs_param_handle_t handle_param_%d;\n",p);
+               ret += tmpstr;
+       }
+
+       return(ret);
+}
+
+
+// ------------------------------------------------------------
+//             functions for generating initialization code.
+
+static string gen_access_var_init(col_id_set &cid_set){
+       string ret;
+       col_id_set::iterator csi;
+
+    for(csi=cid_set.begin(); csi!=cid_set.end();++csi){
+        int tblref = (*csi).tblvar_ref;
+        string field = (*csi).field;
+        sprintf(tmpstr,"\tunpack_offset_%s_%d = ftaschema_get_field_offset_by_name(schema_handle%d, \"%s\");\n", field.c_str(),tblref,tblref,field.c_str());
+        ret.append(tmpstr);
+    }
+       return ret;
+}
+
+
+static string gen_complex_lit_init(cplx_lit_table *complex_literals){
+       string ret;
+
+       int cl;
+    for(cl=0;cl<complex_literals->size();cl++){
+        literal_t *l = complex_literals->get_literal(cl);
+//        sprintf(tmpstr,"\tcomplex_literal_%d = ",cl);
+//        ret += tmpstr + l->to_hfta_C_code() + ";\n";
+        sprintf(tmpstr,"&(complex_literal_%d)",cl);
+        ret += "\t" + l->to_hfta_C_code(tmpstr) + ";\n";
+//                     I think that the code below is obsolete
+//                     TODO: it is obsolete.  add_cpx_lit is always
+//                     called with the handle indicator being false.
+//                     This entire structure should be cleansed.
+        if(complex_literals->is_handle_ref(cl)){
+            data_type *dt = new data_type( l->get_type() );
+            sprintf(tmpstr,"\tlit_handle_%d = %s(&(f->complex_literal_%d));\n",
+                cl, dt->hfta_handle_registration_name().c_str(), cl);
+            ret += tmpstr;
+            delete dt;
+       }
+    }
+       return(ret);
+}
+
+
+static string gen_partial_fcn_init(vector<scalarexp_t *> &partial_fcns){
+       string ret;
+
+       int p;
+       for(p=0;p<partial_fcns.size();++p){
+               data_type *pdt =partial_fcns[p]->get_data_type();
+               literal_t empty_lit(pdt->type_indicator());
+               if(pdt->is_buffer_type()){
+//                     sprintf(tmpstr,"\tpartial_fcn_result_%d = %s;\n",
+//                              p, empty_lit.to_hfta_C_code().c_str());
+                       sprintf(tmpstr,"&(partial_fcn_result_%d)",p);
+                       ret += "\t"+empty_lit.to_hfta_C_code(tmpstr)+";\n";
+               }
+       }
+       return(ret);
+}
+
+static string gen_pass_by_handle_init(
+                               vector<handle_param_tbl_entry *> &param_handle_table){
+       string ret;
+
+    int ph;
+    for(ph=0;ph<param_handle_table.size();++ph){
+               data_type pdt(param_handle_table[ph]->type_name);
+               sprintf(tmpstr,"\thandle_param_%d = %s(",ph,param_handle_table[ph]->lfta_registration_fcn().c_str());
+               switch(param_handle_table[ph]->val_type){
+               case cplx_lit_e:
+                       ret += tmpstr;
+                       if(pdt.is_buffer_type()) ret += "&(";
+                       sprintf(tmpstr,"complex_literal_%d",param_handle_table[ph]->complex_literal_idx);
+                       ret += tmpstr;
+                       if(pdt.is_buffer_type()) ret += ")";
+                       ret += ");\n";
+                       break;
+               case litval_e:
+                       ret += tmpstr;
+                       ret += param_handle_table[ph]->litval->to_hfta_C_code("") + ");\n";
+//                     ret += ");\n";
+                       break;
+               case param_e:
+//                             query parameter handles are regstered/deregistered in the
+//                             load_params function.
+//                     ret += "t->param_"+param_handle_table[ph]->param_name;
+                       break;
+               default:
+                       fprintf(stderr, "INTERNAL ERROR unknown case found when processing pass-by-handle parameter table.\n");
+                       exit(1);
+               }
+       }
+       return(ret);
+}
+
+//------------------------------------------------------------
+//                     functions for destructor and deregistration code
+
+static string gen_complex_lit_dtr(cplx_lit_table *complex_literals){
+       string ret;
+
+       int cl;
+    for(cl=0;cl<complex_literals->size();cl++){
+        literal_t *l = complex_literals->get_literal(cl);
+               data_type ldt(  l->get_type() );
+        if(ldt.is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&complex_literal_%d);\n",
+                         ldt.get_hfta_buffer_destroy().c_str(), cl );
+            ret += tmpstr;
+        }
+    }
+       return(ret);
+}
+
+
+static string gen_pass_by_handle_dtr(
+                               vector<handle_param_tbl_entry *> &param_handle_table){
+       string ret;
+
+       int ph;
+    for(ph=0;ph<param_handle_table.size();++ph){
+               sprintf(tmpstr, "\t\t%s(handle_param_%d);\n",
+                       param_handle_table[ph]->lfta_deregistration_fcn().c_str(),ph);
+               ret += tmpstr;
+       }
+       return(ret);
+}
+
+//                     Destroy all previous results
+static string gen_partial_fcn_dtr(vector<scalarexp_t *> &partial_fcns){
+       string ret;
+
+       int p;
+       for(p=0;p<partial_fcns.size();++p){
+               data_type *pdt =partial_fcns[p]->get_data_type();
+               if(pdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&partial_fcn_result_%d);\n",
+                         pdt->get_hfta_buffer_destroy().c_str(), p );
+                       ret += tmpstr;
+               }
+       }
+       return(ret);
+}
+
+//             Destroy previsou results of fcns in pfcn_set
+static string gen_partial_fcn_dtr(vector<scalarexp_t *> &partial_fcns, set<int> &pfcn_set){
+       string ret;
+       set<int>::iterator si;
+
+       for(si=pfcn_set.begin(); si!=pfcn_set.end(); ++si){
+               data_type *pdt =partial_fcns[(*si)]->get_data_type();
+               if(pdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&partial_fcn_result_%d);\n",
+                         pdt->get_hfta_buffer_destroy().c_str(), (*si) );
+                       ret += tmpstr;
+               }
+       }
+       return(ret);
+}
+
+
+//-------------------------------------------------------------------------
+//                     Functions related to se generation bookkeeping.
+
+static void get_new_pred_cids(predicate_t *pr, col_id_set &found_cids,
+                                                               col_id_set &new_cids, gb_table *gtbl){
+       col_id_set this_pred_cids;
+       col_id_set::iterator csi;
+
+//                             get colrefs in predicate not already found.
+       gather_pr_col_ids(pr,this_pred_cids,gtbl);
+       set_difference(this_pred_cids.begin(), this_pred_cids.end(),
+                                          found_cids.begin(), found_cids.end(),
+                                               inserter(new_cids,new_cids.begin()) );
+
+//                             We've found these cids, so update found_cids
+       for(csi=new_cids.begin(); csi!=new_cids.end(); ++csi)
+               found_cids.insert((*csi));
+
+}
+
+//             after the call, new_cids will have the colrefs in se but not found_cids.
+//             update found_cids with the new cids.
+static void get_new_se_cids(scalarexp_t *se, col_id_set &found_cids,
+                                                               col_id_set &new_cids, gb_table *gtbl){
+       col_id_set this_se_cids;
+       col_id_set::iterator csi;
+
+//                             get colrefs in se not already found.
+       gather_se_col_ids(se,this_se_cids,gtbl);
+       set_difference(this_se_cids.begin(), this_se_cids.end(),
+                                          found_cids.begin(), found_cids.end(),
+                                               inserter(new_cids,new_cids.begin()) );
+
+//                             We've found these cids, so update found_cids
+       for(csi=new_cids.begin(); csi!=new_cids.end(); ++csi)
+               found_cids.insert((*csi));
+
+}
+
+static string gen_unpack_cids(table_list *schema, col_id_set &new_cids, string on_problem, vector<bool> &needs_xform){
+       string ret;
+       col_id_set::iterator csi;
+
+       for(csi=new_cids.begin(); csi!=new_cids.end(); ++csi){
+       int schref = (*csi).schema_ref;
+           int tblref = (*csi).tblvar_ref;
+       string field = (*csi).field;
+               data_type dt(schema->get_type_name(schref,field));
+               string unpack_fcn;
+               if(needs_xform[tblref]){
+                       unpack_fcn = dt.get_hfta_unpack_fcn();
+               }else{
+                       unpack_fcn = dt.get_hfta_unpack_fcn_noxf();
+               }
+               if(dt.is_buffer_type()){
+                       sprintf(tmpstr,"\t unpack_var_%s_%d = %s(tup%d.data, tup%d.tuple_size, unpack_offset_%s_%d, &problem);\n",field.c_str(), tblref, unpack_fcn.c_str(), tblref, tblref, field.c_str(), tblref);
+               }else{
+                       sprintf(tmpstr,"\t unpack_var_%s_%d = %s_nocheck(tup%d.data,  unpack_offset_%s_%d);\n",field.c_str(), tblref, unpack_fcn.c_str(), tblref,  field.c_str(), tblref);
+               }
+               ret += tmpstr;
+               if(dt.is_buffer_type()){
+                       ret += "\tif(problem) return "+on_problem+" ;\n";
+               }
+       }
+       return(ret);
+}
+
+// generates the declaration of all the variables related to
+// temp tuples generation
+static string gen_decl_temp_vars(){
+       string ret;
+
+       ret += "\t// variables related to temp tuple generation\n";
+       ret += "\tbool temp_tuple_received;\n";
+
+       return(ret);
+}
+
+// generates initialization code for variables related to temp tuple processing
+static string gen_init_temp_vars(table_list *schema, vector<select_element *>& select_list, gb_table *gtbl){
+       string ret;
+       col_id_set::iterator csi;
+       int s;
+
+//             Initialize internal state
+       ret += "\ttemp_tuple_received = false;\n";
+
+       col_id_set temp_cids;   // colrefs unpacked thus far.
+
+       for(s=0;s<select_list.size();s++){
+               if (select_list[s]->se->get_data_type()->is_temporal()) {
+//                     Find the set of attributes accessed in this SE
+                       col_id_set new_cids;
+                       get_new_se_cids(select_list[s]->se,temp_cids, new_cids, gtbl);
+
+                       // init these vars
+                       for(csi=new_cids.begin(); csi!=new_cids.end(); ++csi){
+                               int schref = (*csi).schema_ref;
+                               int tblref = (*csi).tblvar_ref;
+                               string field = (*csi).field;
+                               data_type dt(schema->get_type_name(schref,field), schema->get_modifier_list(schref,field));
+
+                               sprintf(tmpstr,"\t unpack_var_%s_%d = %s;\n", field.c_str(), tblref,
+                                       dt.is_increasing() ? dt.get_min_literal().c_str() : dt.get_max_literal().c_str());
+                               ret += tmpstr;
+                       }
+               }
+       }
+       return(ret);
+}
+
+
+
+// generates a check if tuple is temporal
+static string gen_temp_tuple_check(string node_name, int channel) {
+       string ret;
+
+       char tmpstr[256];
+       sprintf(tmpstr, "tup%d", channel);
+       string tup_name = tmpstr;
+       sprintf(tmpstr, "schema_handle%d", channel);
+       string schema_handle_name = tmpstr;
+       string tuple_offset_name = "tuple_metadata_offset"+int_to_string(channel);
+
+//                     check if it is a temporary status tuple
+       ret += "\t// check if tuple is temp status tuple\n";
+//             ret += "\tif (ftaschema_is_temporal_tuple(" + schema_handle_name + ", " + tup_name + ".data)) {\n";
+       ret += "\tif (ftaschema_is_temporal_tuple_offset(" + tuple_offset_name + ", " + tup_name + ".data)) {\n";
+       ret += "\t\ttemp_tuple_received = true;\n";
+       ret += "\t}\n";
+       ret += "\telse\n\t\ttemp_tuple_received = false;\n\n";
+
+       return(ret);
+}
+
+// generates unpacking code for all temporal attributes referenced in select
+static string gen_unpack_temp_vars(table_list *schema, col_id_set& found_cids, vector<select_element *>& select_list, gb_table *gtbl, vector<bool> &needs_xform) {
+       string ret;
+       int s;
+
+//             Unpack all the temporal attributes references in select list
+//             we need it to be able to generate temp status tuples
+       for(s=0;s<select_list.size();s++){
+               if (select_list[s]->se->get_data_type()->is_temporal()) {
+//                     Find the set of attributes accessed in this SE
+                       col_id_set new_cids;
+                       get_new_se_cids(select_list[s]->se,found_cids, new_cids, gtbl);
+//                     Unpack these values.
+                       ret += gen_unpack_cids(schema, new_cids, "false", needs_xform);
+               }
+       }
+
+       return(ret);
+}
+
+
+//             Generates temporal tuple generation code (except attribute packing)
+static string gen_init_temp_status_tuple(string node_name) {
+       string ret;
+
+       ret += "\t// create temp status tuple\n";
+       ret += "\tresult.tuple_size = sizeof("+generate_tuple_name( node_name)+") + sizeof(gs_uint8_t);\n";
+       ret += "\tresult.data = (gs_sp_t )malloc(result.tuple_size);\n";
+       ret += "\tresult.heap_resident = true;\n";
+       ret += "\t//            Mark tuple as temporal\n";
+       ret += "\t*((gs_sp_t )result.data + sizeof("+generate_tuple_name( node_name)+")) = TEMPORAL_TUPLE;\n";
+
+       ret += "\t"+generate_tuple_name( node_name)+" *tuple = ("+
+               generate_tuple_name( node_name) +" *)(result.data);\n";
+
+       return(ret);
+}
+
+
+//             Assume that all colrefs unpacked already ...
+static string gen_unpack_partial_fcn(table_list *schema,
+                                       vector<scalarexp_t *> &partial_fcns,set<int> &pfcn_refs,
+                                       string on_problem){
+       string ret;
+       set<int>::iterator si;
+
+//                     Since set<..> is a "Sorted Associative Container",
+//                     we can walk through it in sorted order by walking from
+//                     begin() to end().  (and the partial fcns must be
+//                     evaluated in this order).
+       for(si=pfcn_refs.begin();si!=pfcn_refs.end();++si){
+               ret += unpack_partial_fcn(partial_fcns[(*si)], (*si), schema);
+               ret += "\tif(retval) return "+on_problem+" ;\n";
+       }
+       return(ret);
+}
+
+//             Assume that all colrefs unpacked already ...
+//             this time with cached functions.
+static string gen_unpack_partial_fcn(table_list *schema,
+                                       vector<scalarexp_t *> &partial_fcns,set<int> &pfcn_refs,
+                                       vector<int> &fcn_ref_cnt, vector<bool> &is_partial_fcn,
+                                       string on_problem){
+       string ret;
+       set<int>::iterator si;
+
+//                     Since set<..> is a "Sorted Associative Container",
+//                     we can walk through it in sorted order by walking from
+//                     begin() to end().  (and the partial fcns must be
+//                     evaluated in this order).
+       for(si=pfcn_refs.begin();si!=pfcn_refs.end();++si){
+               if(fcn_ref_cnt[(*si)] > 1){
+                       ret += "\tif(fcn_ref_cnt_"+int_to_string((*si))+"==0){\n";
+               }
+               if(is_partial_fcn[(*si)]){
+                       ret += unpack_partial_fcn(partial_fcns[(*si)], (*si), schema);
+                       ret += "\tif(retval) return "+on_problem+" ;\n";
+               }
+               if(fcn_ref_cnt[(*si)] > 1){
+                       if(!is_partial_fcn[(*si)]){
+                               ret += "\t\tpartial_fcn_result_"+int_to_string((*si))+"="+generate_cached_fcn(partial_fcns[(*si)],(*si),schema)+";\n";
+                       }
+                       ret += "\t\tfcn_ref_cnt_"+int_to_string((*si))+"=1;\n";
+                       ret += "\t}\n";
+               }
+       }
+
+       return(ret);
+}
+
+
+//             This version finds and unpacks new colrefs.
+//             found_cids gets updated with the newly unpacked cids.
+static string gen_full_unpack_partial_fcn(table_list *schema,
+                                       vector<scalarexp_t *> &partial_fcns,set<int> &pfcn_refs,
+                                       col_id_set &found_cids, gb_table *gtbl, string on_problem,
+                                       vector<bool> &needs_xform){
+       string ret;
+       set<int>::iterator slsi;
+
+       for(slsi=pfcn_refs.begin(); slsi!=pfcn_refs.end(); ++slsi){
+//                     find all new fields ref'd by this partial fcn.
+               col_id_set new_cids;
+               get_new_se_cids(partial_fcns[(*slsi)], found_cids, new_cids, gtbl);
+//                     Unpack these values.
+               ret += gen_unpack_cids(schema, new_cids, on_problem, needs_xform);
+
+//                     Now evaluate the partial fcn.
+               ret += unpack_partial_fcn(partial_fcns[(*slsi)], (*slsi), schema);
+               ret += "\tif(retval) return "+on_problem+" ;\n";
+       }
+       return(ret);
+}
+
+//             This version finds and unpacks new colrefs.
+//             found_cids gets updated with the newly unpacked cids.
+//                     BUT : only for the partial functions.
+static string gen_full_unpack_partial_fcn(table_list *schema,
+                                       vector<scalarexp_t *> &partial_fcns,set<int> &pfcn_refs,
+                                       vector<int> &fcn_ref_cnt, vector<bool> &is_partial_fcn,
+                                       col_id_set &found_cids, gb_table *gtbl, string on_problem,
+                                       vector<bool> &needs_xform){
+       string ret;
+       set<int>::iterator slsi;
+
+       for(slsi=pfcn_refs.begin(); slsi!=pfcn_refs.end(); ++slsi){
+         if(is_partial_fcn[(*slsi)]){
+//                     find all new fields ref'd by this partial fcn.
+               col_id_set new_cids;
+               get_new_se_cids(partial_fcns[(*slsi)], found_cids, new_cids, gtbl);
+//                     Unpack these values.
+               ret += gen_unpack_cids(schema, new_cids, on_problem, needs_xform);
+
+//                     Now evaluate the partial fcn.
+               if(fcn_ref_cnt[(*slsi)] > 1){
+                       ret += "\tif(fcn_ref_cnt_"+int_to_string((*slsi))+"==0){\n";
+               }
+               if(is_partial_fcn[(*slsi)]){
+                       ret += unpack_partial_fcn(partial_fcns[(*slsi)], (*slsi), schema);
+                       ret += "\tif(retval) return "+on_problem+" ;\n";
+               }
+               if(fcn_ref_cnt[(*slsi)] > 1){
+                       ret += "\t\tfcn_ref_cnt_"+int_to_string((*slsi))+"=1;\n";
+                       ret += "\t}\n";
+               }
+
+         }
+       }
+       return(ret);
+}
+
+static string gen_remaining_cached_fcns(table_list *schema,
+                                       vector<scalarexp_t *> &partial_fcns,set<int> &pfcn_refs,
+                                       vector<int> &fcn_ref_cnt, vector<bool> &is_partial_fcn){
+       string ret;
+       set<int>::iterator slsi;
+
+       for(slsi=pfcn_refs.begin(); slsi!=pfcn_refs.end(); ++slsi){
+         if(!is_partial_fcn[(*slsi)] && fcn_ref_cnt[(*slsi)] > 1){
+
+               if(fcn_ref_cnt[(*slsi)] > 1){
+                       ret += "\tif(fcn_ref_cnt_"+int_to_string((*slsi))+"==0){\n";
+                       ret += "\t\tpartial_fcn_result_"+int_to_string((*slsi))+"="+generate_cached_fcn(partial_fcns[(*slsi)],(*slsi),schema)+";\n";
+                       ret += "\t\tfcn_ref_cnt_"+int_to_string((*slsi))+"=1;\n";
+                       ret += "\t}\n";
+               }
+         }
+       }
+       return(ret);
+}
+
+
+//             unpack the colrefs in cid_set not in found_cids
+static string gen_remaining_colrefs(table_list *schema,
+                       col_id_set &cid_set, col_id_set &found_cids, string on_problem,
+                       vector<bool> &needs_xform){
+       string ret;
+       col_id_set::iterator csi;
+
+       for(csi=cid_set.begin(); csi!=cid_set.end();csi++){
+               if(found_cids.count( (*csi) ) == 0){
+               int schref = (*csi).schema_ref;
+                   int tblref = (*csi).tblvar_ref;
+               string field = (*csi).field;
+                       data_type dt(schema->get_type_name(schref,field));
+                       string unpack_fcn;
+                       if(needs_xform[tblref]){
+                               unpack_fcn = dt.get_hfta_unpack_fcn();
+                       }else{
+                               unpack_fcn = dt.get_hfta_unpack_fcn_noxf();
+                       }
+                       if(dt.is_buffer_type()){
+                               sprintf(tmpstr,"\t unpack_var_%s_%d = %s(tup%d.data, tup%d.tuple_size, unpack_offset_%s_%d, &problem);\n",field.c_str(), tblref, unpack_fcn.c_str(), tblref, tblref, field.c_str(), tblref);
+                       }else{
+                               sprintf(tmpstr,"\t unpack_var_%s_%d = %s_nocheck(tup%d.data, unpack_offset_%s_%d);\n",field.c_str(), tblref, unpack_fcn.c_str(), tblref, field.c_str(), tblref);
+                       }
+                       ret += tmpstr;
+                       if(dt.is_buffer_type()){
+                               ret.append("\tif(problem) return "+on_problem+" ;\n");
+                       }
+               }
+       }
+       return(ret);
+}
+
+static string gen_buffer_selvars(table_list *schema,
+                                                               vector<select_element *> &select_list){
+       string ret;
+       int s;
+
+    for(s=0;s<select_list.size();s++){
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = se->get_data_type();
+        if(sdt->is_buffer_type() &&
+                       !( (se->get_operator_type() == SE_COLREF) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+               ){
+            sprintf(tmpstr,"selvar_%d",s);
+                       ret+="\t"+sdt->make_host_cvar(tmpstr)+" = ";
+                       ret += generate_se_code(se,schema) +";\n";
+        }
+    }
+       return(ret);
+}
+
+static string gen_buffer_selvars_size(vector<select_element *> &select_list,table_list *schema){
+       string ret;
+       int s;
+
+    for(s=0;s<select_list.size();s++){
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = se->get_data_type();
+        if(sdt->is_buffer_type()){
+                 if( !( (se->get_operator_type() == SE_COLREF) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+                 ){
+            sprintf(tmpstr," + %s(&selvar_%d)", sdt->get_hfta_buffer_size().c_str(),s);
+            ret.append(tmpstr);
+                 }else{
+            sprintf(tmpstr," + %s(&%s)", sdt->get_hfta_buffer_size().c_str(),
+                               generate_se_code(se,schema).c_str());
+            ret.append(tmpstr);
+                 }
+        }
+    }
+       return(ret);
+}
+
+static string gen_buffer_selvars_dtr(vector<select_element *> &select_list){
+       string ret;
+       int s;
+
+    for(s=0;s<select_list.size();s++){
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = se->get_data_type();
+        if(sdt->is_buffer_type() &&
+                       !( (se->get_operator_type() == SE_COLREF) ||
+                               (se->get_operator_type() == SE_AGGR_STAR) ||
+                               (se->get_operator_type() == SE_AGGR_SE) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+                       ){
+                               sprintf(tmpstr,"\t\t%s(&selvar_%d);\n",
+                                 sdt->get_hfta_buffer_destroy().c_str(), s );
+               ret += tmpstr;
+        }
+    }
+       return(ret);
+}
+
+
+static string gen_pack_tuple(table_list *schema, vector<select_element *> &select_list, string node_name, bool temporal_only){
+       string ret;
+       int s;
+
+       ret += "\tint tuple_pos = sizeof("+generate_tuple_name(node_name)+") + sizeof(gs_uint8_t);\n";
+    for(s=0;s<select_list.size();s++){
+               scalarexp_t *se  = select_list[s]->se;
+        data_type *sdt = se->get_data_type();
+
+        if(!temporal_only && sdt->is_buffer_type()){
+                 if( !( (se->get_operator_type() == SE_COLREF) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()))
+                       ){
+               sprintf(tmpstr,"\t%s(&(tuple->tuple_var%d), &selvar_%d, ((gs_sp_t )tuple)+tuple_pos, tuple_pos);\n", sdt->get_hfta_buffer_tuple_copy().c_str(),s, s);
+               ret.append(tmpstr);
+               sprintf(tmpstr,"\ttuple_pos += %s(&selvar_%d);\n", sdt->get_hfta_buffer_size().c_str(), s);
+               ret.append(tmpstr);
+                       }else{
+               sprintf(tmpstr,"\t%s(&(tuple->tuple_var%d), &%s, ((gs_sp_t )tuple)+tuple_pos, tuple_pos);\n", sdt->get_hfta_buffer_tuple_copy().c_str(),s, generate_se_code(se,schema).c_str());
+               ret.append(tmpstr);
+               sprintf(tmpstr,"\ttuple_pos += %s(&%s);\n", sdt->get_hfta_buffer_size().c_str(), generate_se_code(se,schema).c_str());
+               ret.append(tmpstr);
+                       }
+        }else if (!temporal_only || sdt->is_temporal()) {
+            sprintf(tmpstr,"\ttuple->tuple_var%d = ",s);
+            ret.append(tmpstr);
+            ret.append(generate_se_code(se,schema) );
+            ret.append(";\n");
+        }
+    }
+       return(ret);
+}
+
+
+//-------------------------------------------------------------------------
+//                     functor generation methods
+//-------------------------------------------------------------------------
+
+/////////////////////////////////////////////////////////
+////                   File Output Operator
+string output_file_qpn::generate_functor_name(){
+       return("output_file_functor_" + normalize_name(get_node_name()));
+}
+
+
+string output_file_qpn::generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, vector<bool> &needs_xform){
+       string ret = "class " + this->generate_functor_name() + "{\n";
+
+//             Find the temporal field
+       int temporal_field_idx;
+       data_type *tdt = NULL;
+       for(temporal_field_idx=0;temporal_field_idx<fields.size();temporal_field_idx++){
+               tdt = new data_type(fields[temporal_field_idx]->get_type(), fields[temporal_field_idx]->get_modifier_list());
+               if(tdt->is_temporal()){
+                       break;
+               }else{
+                       delete tdt;
+               }
+       }
+
+       if(temporal_field_idx == fields.size()){
+               fprintf(stderr,"ERROR, no temporal field for file output operator %s\n",node_name.c_str());
+               exit(1);
+       }
+
+       ret += "private:\n";
+
+       // var to save the schema handle
+       ret += "\tint schema_handle0;\n";
+//                     tuple metadata offset
+       ret += "\tint tuple_metadata_offset0;\n";
+       sprintf(tmpstr,"\tgs_int32_t unpack_offset_%s_0;\n",  fields[temporal_field_idx]->get_name().c_str());
+       ret.append(tmpstr);
+
+//             For unpacking the hashing fields, if any
+       int h;
+       for(h=0;h<hash_flds.size();++h){
+               sprintf(tmpstr,"unpack_var_%s", fields[hash_flds[h]]->get_name().c_str());
+               data_type *hdt = new data_type(fields[hash_flds[h]]->get_type(), fields[hash_flds[h]]->get_modifier_list());
+               ret+="\t"+hdt->make_host_cvar(tmpstr)+";\n";
+               if(hash_flds[h]!=temporal_field_idx){
+                       sprintf(tmpstr,"\tgs_int32_t unpack_offset_%s_0;\n",  fields[hash_flds[h]]->get_name().c_str());
+                       ret.append(tmpstr);
+               }
+       }
+//             Specail case for output file hashing
+       if(n_streams>1 && hash_flds.size()==0){
+               ret+="\tgs_uint32_t outfl_cnt;\n";
+       }
+
+       ret += "//\t\tRemember the last posted timestamp.\n";
+       ret+="\t"+tdt->make_host_cvar("timestamp")+";\n";
+       ret+="\t"+tdt->make_host_cvar("last_bucket")+";\n";
+       ret+="\t"+tdt->make_host_cvar("slack")+";\n";
+       ret += "\tbool first_execution;\n";
+       ret += "\tbool temp_tuple_received;\n";
+       ret += "\tbool is_eof;\n";
+
+       ret += "\tgs_int32_t bucketwidth;\n";
+
+       ret += "public:\n";
+//-------------------
+//                     The functor constructor
+//                     pass in a schema handle (e.g. for the 1st input stream),
+//                     use it to determine how to unpack the merge variable.
+//                     ASSUME that both streams have the same layout,
+//                     just duplicate it.
+
+//             unpack vars
+       ret += "//\t\tFunctor constructor.\n";
+       ret +=  this->generate_functor_name()+"(int schema_hndl){\n";
+
+       ret += "\tschema_handle0 = schema_hndl;\n";
+//             tuple metadata offset
+       ret += "\ttuple_metadata_offset0 = ftaschema_get_tuple_metadata_offset(schema_handle0);\n";
+
+       if(output_spec->bucketwidth == 0)
+               ret += "\tbucketwidth = 60;\n";
+       else
+               ret += "\tbucketwidth = "+int_to_string(output_spec->bucketwidth)+";\n";
+       ret += "//\t\tGet offsets for unpacking fields from input tuple.\n";
+
+   sprintf(tmpstr,"\tunpack_offset_%s_0 = ftaschema_get_field_offset_by_name(schema_handle0, \"%s\");\n", fields[temporal_field_idx]->get_name().c_str(), fields[temporal_field_idx]->get_name().c_str());
+   ret.append(tmpstr);
+//             Hashing field unpacking, if any
+       for(h=0;h<hash_flds.size();++h){
+               if(hash_flds[h]!=temporal_field_idx){
+                       sprintf(tmpstr,"\tunpack_offset_%s_0 = ftaschema_get_field_offset_by_name(schema_handle0, \"%s\");\n",  fields[hash_flds[h]]->get_name().c_str(),fields[hash_flds[h]]->get_name().c_str());
+                       ret.append(tmpstr);
+               }
+       }
+
+       ret+="\tfirst_execution = true;\n";
+
+//             Initialize internal state
+       ret += "\ttemp_tuple_received = false;\n";
+
+       //              Init last timestamp values to minimum value for their type
+       if (tdt->is_increasing()){
+               ret+="\ttimestamp = " + tdt->get_min_literal() + ";\n";
+               ret+="\tlast_bucket = " + tdt->get_min_literal() + ";\n";
+       }else{
+               ret+="\ttimestamp = " + tdt->get_max_literal() + ";\n";
+               ret+="\tlast_bucket = " + tdt->get_max_literal() + ";\n";
+       }
+
+
+       ret += "};\n\n";
+
+       ret += "//\t\tFunctor destructor.\n";
+       ret +=  "~"+this->generate_functor_name()+"(){\n";
+       ret+="};\n\n";
+
+
+       ret += "int load_params_"+this->generate_functor_name()+"(gs_int32_t sz, void *value){return 0;}\n";
+       ret += "void destroy_params_"+this->generate_functor_name()+"(){}\n";
+
+//                     Register new parameter block
+       ret += "int set_param_block(gs_int32_t sz, void* value){\n";
+         ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+         ret += "\treturn this->load_params_"+this->generate_functor_name()+
+                               "(sz, value);\n";
+       ret += "};\n\n";
+
+       ret+="\nbool temp_status_received(const host_tuple& tup0)/* const*/   {\n";
+       ret+="\tgs_int32_t problem;\n";
+
+       ret += "\tvoid *tup_ptr = (void *)(&tup0);\n";
+       ret += "\tis_eof = ftaschema_is_eof_tuple(schema_handle0,tup_ptr);\n";
+
+       ret += gen_temp_tuple_check(this->node_name, 0);
+
+       sprintf(tmpstr,"\ttimestamp = %s_nocheck(tup0.data, unpack_offset_%s_%d);\n",  tdt->get_hfta_unpack_fcn_noxf().c_str(), fields[temporal_field_idx]->get_name().c_str(), 0);
+       ret += tmpstr;
+
+       for(h=0;h<hash_flds.size();++h){
+               data_type *hdt = new data_type(fields[hash_flds[h]]->get_type(), fields[hash_flds[h]]->get_modifier_list());
+               sprintf(tmpstr,"\tunpack_var_%s = %s_nocheck(tup0.data, unpack_offset_%s_%d);\n", fields[hash_flds[h]]->get_name().c_str(), hdt->get_hfta_unpack_fcn_noxf().c_str(), fields[hash_flds[h]]->get_name().c_str(), 0);
+       ret += tmpstr;
+       }
+       ret +=
+"      return temp_tuple_received;\n"
+"}\n"
+"\n"
+;
+
+       ret +=
+"bool new_epoch(){\n"
+"      if(first_execution || (last_bucket + 1) * bucketwidth <= timestamp){\n"
+"              last_bucket = timestamp / bucketwidth;\n"
+"              first_execution = false;\n"
+"              return true;\n"
+"      }\n"
+"      return false;\n"
+"}\n"
+"\n"
+;
+
+       if(n_streams <= 1){
+               ret+=
+"inline gs_uint32_t output_hash(){return 0;}\n\n";
+       }else{
+               if(hash_flds.size()==0){
+                       ret +=
+"gs_uint32_t output_hash(){\n"
+"      outfl_cnt++;\n"
+"      if(outfl_cnt >= "+int_to_string(n_streams)+")\n"
+"              outfl_cnt = 0;\n"
+"      return outfl_cnt;\n"
+"}\n"
+"\n"
+;
+               }else{
+                       ret +=
+"gs_uint32_t output_hash(){\n"
+"      gs_uint32_t ret = "
+;
+                       for(h=0;h<hash_flds.size();++h){
+                               if(h>0) ret += "^";
+                               data_type *hdt = new data_type(fields[hash_flds[h]]->get_type(), fields[hash_flds[h]]->get_modifier_list());
+                               if(hdt->use_hashfunc()){
+                                       sprintf(tmpstr,"%s(&(unpack_var_%s))",hdt->get_hfta_hashfunc().c_str(),fields[hash_flds[h]]->get_name().c_str());
+                               }else{
+                                       sprintf(tmpstr,"unpack_var_%s",fields[hash_flds[h]]->get_name().c_str());
+                               }
+                               ret += tmpstr;
+                       }
+                       ret +=
+";\n"
+"      return  ret % "+int_to_string(hash_flds.size())+";\n"
+"}\n\n"
+;
+               }
+       }
+
+ret +=
+"gs_uint32_t num_file_streams(){\n"
+"      return("+int_to_string(n_streams)+");\n"
+"}\n\n"
+;
+
+       ret +=
+"string get_filename_base(){\n"
+"      char tmp_fname[500];\n";
+
+       string output_filename_base = hfta_query_name+filestream_id;
+/*
+       if(n_hfta_clones > 1){
+               output_filename_base += "_"+int_to_string(parallel_idx);
+       }
+*/
+
+
+
+       if(output_spec->output_directory == "")
+               ret +=
+"      sprintf(tmp_fname,\""+output_filename_base+"_%lld\",(gs_int64_t)(last_bucket*bucketwidth));\n";
+               else ret +=
+"      sprintf(tmp_fname,\""+output_spec->output_directory+"/"+output_filename_base+"_%lld\",(gs_int64_t)(last_bucket*bucketwidth));\n";
+ret +=
+"      return (string)(tmp_fname);\n"
+"}\n"
+"\n";
+
+
+ret+=
+"bool do_compression(){\n";
+       if(do_gzip)
+               ret += "        return true;\n";
+       else
+               ret += "        return false;\n";
+ret+=
+"}\n"
+"\n"
+"bool is_eof_tuple(){\n"
+"      return is_eof;\n"
+"}\n"
+"\n"
+"bool propagate_tuple(){\n"
+;
+if(eat_input)
+       ret+="\treturn false;\n";
+else
+       ret+="\treturn true;\n";
+ret+="}\n\n";
+//             create a temp status tuple
+       ret += "int create_temp_status_tuple(host_tuple& result) {\n\n";
+
+       ret += gen_init_temp_status_tuple(this->hfta_query_name);
+
+       sprintf(tmpstr,"\ttuple->tuple_var%d = timestamp;\n",temporal_field_idx);
+
+
+       ret += tmpstr;
+
+       ret += "\treturn 0;\n";
+       ret += "}\n\n";
+       ret += "};\n\n";
+
+       return ret;
+}
+
+
+string output_file_qpn::generate_operator(int i, string params){
+       string optype = "file_output_operator";
+       switch(compression_type){
+       case regular:
+               optype = "file_output_operator";
+       break;
+       case gzip:
+               optype = "zfile_output_operator";
+       break;
+       case bzip:
+               optype = "bfile_output_operator";
+       break;
+       }
+
+               return("        "+optype+"<" +
+               generate_functor_name() +
+               "> *op"+int_to_string(i)+" = new "+optype+"<"+
+               generate_functor_name() +">("+params+", \"" + hfta_query_name + "\""
+               + "," + hfta_query_name + "_schema_definition);\n");
+}
+
+/////////////////////////////////////////////////////////
+//////                 SPX functor
+
+
+string spx_qpn::generate_functor_name(){
+       return("spx_functor_" + normalize_name(normalize_name(this->get_node_name())));
+}
+
+string spx_qpn::generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, vector<bool> &needs_xform){
+//                     Initialize generate utility globals
+       segen_gb_tbl = NULL;
+
+       string ret = "class " + this->generate_functor_name() + "{\n";
+
+//                     Find variables referenced in this query node.
+
+  col_id_set cid_set;
+  col_id_set::iterator csi;
+
+       int w, s, p;
+    for(w=0;w<where.size();++w)
+       gather_pr_col_ids(where[w]->pr,cid_set,NULL);
+    for(s=0;s<select_list.size();s++){
+       gather_se_col_ids(select_list[s]->se,cid_set,NULL);
+    }
+
+
+//                     Private variables : store the state of the functor.
+//                     1) variables for unpacked attributes
+//                     2) offsets of the upacked attributes
+//                     3) storage of partial functions
+//                     4) storage of complex literals (i.e., require a constructor)
+
+       ret += "private:\n";
+       ret += "\tbool first_execution;\t// internal processing state \n";
+       ret += "\tint schema_handle0;\n";
+
+       // generate the declaration of all the variables related to
+       // temp tuples generation
+       ret += gen_decl_temp_vars();
+
+
+//                     unpacked attribute storage, offsets
+       ret += "//\t\tstorage and offsets of accessed fields.\n";
+       ret += generate_access_vars(cid_set,schema);
+//                     tuple metadata management
+       ret += "\tint tuple_metadata_offset0;\n";
+
+//                     Variables to store results of partial functions.
+//                     WARNING find_partial_functions modifies the SE
+//                     (it marks the partial function id).
+       ret += "//\t\tParital function result storage\n";
+       vector<scalarexp_t *> partial_fcns;
+       vector<int> fcn_ref_cnt;
+       vector<bool> is_partial_fcn;
+       for(s=0;s<select_list.size();s++){
+               find_partial_fcns(select_list[s]->se, &partial_fcns,&fcn_ref_cnt,&is_partial_fcn, Ext_fcns);
+       }
+       for(w=0;w<where.size();w++){
+               find_partial_fcns_pr(where[w]->pr, &partial_fcns, &fcn_ref_cnt,&is_partial_fcn,Ext_fcns);
+       }
+//             Unmark non-partial expensive functions referenced only once.
+       for(p=0; p<partial_fcns.size();p++){
+               if(!is_partial_fcn[p] && fcn_ref_cnt[p] <= 1){
+                       partial_fcns[p]->set_partial_ref(-1);
+               }
+       }
+       if(partial_fcns.size()>0){
+         ret += generate_partial_fcn_vars(partial_fcns,fcn_ref_cnt,is_partial_fcn,true);
+       }
+
+//                     Complex literals (i.e., they need constructors)
+       ret += "//\t\tComplex literal storage.\n";
+       cplx_lit_table *complex_literals = this->get_cplx_lit_tbl(Ext_fcns);
+       ret += generate_complex_lit_vars(complex_literals);
+
+//                     Pass-by-handle parameters
+       ret += "//\t\tPass-by-handle storage.\n";
+       vector<handle_param_tbl_entry *> param_handle_table = this->get_handle_param_tbl(Ext_fcns);
+       ret += generate_pass_by_handle_vars(param_handle_table);
+
+//                     Variables to hold parameters
+       ret += "//\tfor query parameters\n";
+       ret += generate_param_vars(param_tbl);
+
+
+//                     The publicly exposed functions
+
+       ret += "\npublic:\n";
+
+
+//-------------------
+//                     The functor constructor
+//                     pass in the schema handle.
+//                     1) make assignments to the unpack offset variables
+//                     2) initialize the complex literals
+//                     3) Set the initial values of the temporal attributes
+//                             referenced in select clause (in case we need to emit
+//                             temporal tuple before receiving first tuple )
+
+       ret += "//\t\tFunctor constructor.\n";
+       ret +=  this->generate_functor_name()+"(int schema_handle0){\n";
+
+//             save schema handle
+       ret += "this->schema_handle0 = schema_handle0;\n";
+
+//             unpack vars
+       ret += "//\t\tGet offsets for unpacking fields from input tuple.\n";
+       ret += gen_access_var_init(cid_set);
+//             tuple metadata
+       ret += "\ttuple_metadata_offset0 = ftaschema_get_tuple_metadata_offset(schema_handle0);\n";
+
+//             complex literals
+       ret += "//\t\tInitialize complex literals.\n";
+       ret += gen_complex_lit_init(complex_literals);
+
+//             Initialize partial function results so they can be safely GC'd
+       ret += gen_partial_fcn_init(partial_fcns);
+
+//             Initialize non-query-parameter parameter handles
+       ret += gen_pass_by_handle_init(param_handle_table);
+
+//             Init temporal attributes referenced in select list
+       ret += gen_init_temp_vars(schema, select_list, NULL);
+
+       ret += "};\n\n";
+
+
+//-------------------
+//                     Functor destructor
+       ret += "//\t\tFunctor destructor.\n";
+       ret +=  "~"+this->generate_functor_name()+"(){\n";
+
+//             clean up buffer-type complex literals.
+       ret += gen_complex_lit_dtr(complex_literals);
+
+//                     Deregister the pass-by-handle parameters
+       ret += "/* register and de-register the pass-by-handle parameters */\n";
+       ret += gen_pass_by_handle_dtr(param_handle_table);
+
+//                     Reclaim buffer space for partial fucntion results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       ret += gen_partial_fcn_dtr(partial_fcns);
+
+
+//                     Destroy the parameters, if any need to be destroyed
+       ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+
+       ret += "};\n\n";
+
+
+//-------------------
+//                     Parameter manipulation routines
+       ret += generate_load_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table );
+       ret += generate_delete_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+
+
+//-------------------
+//                     Register new parameter block
+       ret += "int set_param_block(gs_int32_t sz, void* value){\n";
+         ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+         ret += "\treturn this->load_params_"+this->generate_functor_name()+
+                               "(sz, value);\n";
+       ret += "};\n\n";
+
+
+//-------------------
+//                     The selection predicate.
+//                     Unpack variables for 1 cnf element
+//                     at a time, return false immediately if the
+//                     predicate fails.
+//                     optimization : evaluate the cheap cnf elements
+//                     first, the expensive ones last.
+
+       ret += "bool predicate(host_tuple &tup0){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+//             Initialize cached function indicators.
+       for(p=0;p<partial_fcns.size();++p){
+               if(fcn_ref_cnt[p]>1){
+                       ret+="\tfcn_ref_cnt_"+int_to_string(p)+"=0;\n";
+               }
+       }
+
+
+       ret += gen_temp_tuple_check(this->node_name, 0);
+
+       if(partial_fcns.size()>0){              // partial fcn access failure
+         ret += "\tgs_retval_t retval = 0;\n";
+         ret += "\n";
+       }
+
+//                     Reclaim buffer space for partial fucntion results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       ret += gen_partial_fcn_dtr(partial_fcns);
+
+       col_id_set found_cids;  // colrefs unpacked thus far.
+       ret += gen_unpack_temp_vars(schema, found_cids, select_list, NULL, needs_xform);
+
+//             For temporal status tuple we don't need to do anything else
+       ret += "\tif (temp_tuple_received) return false;\n\n";
+
+
+       for(w=0;w<where.size();++w){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.\n",w);
+               ret += tmpstr;
+//                     Find the set of variables accessed in this CNF elem,
+//                     but in no previous element.
+               col_id_set new_cids;
+               get_new_pred_cids(where[w]->pr,found_cids, new_cids, NULL);
+//                     Unpack these values.
+               ret += gen_unpack_cids(schema, new_cids, "false", needs_xform);
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pfcn_refs;
+               collect_partial_fcns_pr(where[w]->pr, pfcn_refs);
+               ret += gen_unpack_partial_fcn(schema,partial_fcns,pfcn_refs,fcn_ref_cnt, is_partial_fcn, "false");
+
+               ret += "\tif( !("+generate_predicate_code(where[w]->pr,schema)+
+                               +") ) return(false);\n";
+       }
+
+//             The partial functions ref'd in the select list
+//             must also be evaluated.  If one returns false,
+//             then implicitly the predicate is false.
+       set<int> sl_pfcns;
+       for(s=0;s<select_list.size();s++){
+               collect_partial_fcns(select_list[s]->se, sl_pfcns);
+       }
+       if(sl_pfcns.size() > 0)
+               ret += "//\t\tUnpack remaining partial fcns.\n";
+       ret += gen_full_unpack_partial_fcn(schema, partial_fcns, sl_pfcns,
+                                       fcn_ref_cnt, is_partial_fcn,
+                                       found_cids, NULL, "false", needs_xform);
+
+//                     Unpack remaining fields
+       ret += "//\t\tunpack any remaining fields from the input tuple.\n";
+       ret += gen_remaining_colrefs(schema, cid_set, found_cids, "false", needs_xform);
+
+
+       ret += "\treturn(true);\n";
+       ret += "};\n\n";
+
+
+//-------------------
+//                     The output tuple function.
+//                     Unpack the remaining attributes into
+//                     the placeholder variables, unpack the
+//                     partial fcn refs, then pack up the tuple.
+
+       ret += "host_tuple create_output_tuple() {\n";
+       ret += "\thost_tuple tup;\n";
+       ret += "\tgs_retval_t retval = 0;\n";
+
+//                     Unpack any remaining cached functions.
+       ret += gen_remaining_cached_fcns(schema, partial_fcns, sl_pfcns,
+                                       fcn_ref_cnt, is_partial_fcn);
+
+
+//          Now, compute the size of the tuple.
+
+//          Unpack any BUFFER type selections into temporaries
+//          so that I can compute their size and not have
+//          to recompute their value during tuple packing.
+//          I can use regular assignment here because
+//          these temporaries are non-persistent.
+
+       ret += "//\t\tCompute the size of the tuple.\n";
+       ret += "//\t\t\tNote: buffer storage packed at the end of the tuple.\n";
+
+//                     Unpack all buffer type selections, to be able to compute their size
+       ret += gen_buffer_selvars(schema, select_list);
+
+//      The size of the tuple is the size of the tuple struct plus the
+//      size of the buffers to be copied in.
+
+
+      ret+="\ttup.tuple_size = sizeof(" + generate_tuple_name( this->get_node_name()) +") + sizeof(gs_uint8_t)";
+       ret += gen_buffer_selvars_size(select_list,schema);
+       ret.append(";\n");
+
+//             Allocate tuple data block.
+       ret += "//\t\tCreate the tuple block.\n";
+         ret += "\ttup.data = malloc(tup.tuple_size);\n";
+         ret += "\ttup.heap_resident = true;\n";
+//             Mark tuple as regular
+         ret += "\t*((gs_sp_t )tup.data + sizeof(" + generate_tuple_name( this->get_node_name()) +")) = REGULAR_TUPLE;\n";
+
+//       ret += "\ttup.channel = 0;\n";
+         ret += "\t"+generate_tuple_name( this->get_node_name())+" *tuple = ("+
+                               generate_tuple_name( this->get_node_name())+" *)(tup.data);\n";
+
+//             Start packing.
+//                     (Here, offsets are hard-wired.  is this a problem?)
+
+       ret += "//\t\tPack the fields into the tuple.\n";
+       ret += gen_pack_tuple(schema,select_list,this->get_node_name(), false );
+
+//                     Delete string temporaries
+       ret += gen_buffer_selvars_dtr(select_list);
+
+       ret += "\treturn tup;\n";
+       ret += "};\n";
+
+//-------------------------------------------------------------------
+//             Temporal update functions
+
+       ret += "bool temp_status_received(){return temp_tuple_received;};\n\n";
+
+
+//             create a temp status tuple
+       ret += "int create_temp_status_tuple(host_tuple& result) {\n\n";
+
+       ret += gen_init_temp_status_tuple(this->get_node_name());
+
+//             Start packing.
+//                     (Here, offsets are hard-wired.  is this a problem?)
+
+       ret += "//\t\tPack the fields into the tuple.\n";
+       ret += gen_pack_tuple(schema,select_list,this->get_node_name(), true );
+
+       ret += "\treturn 0;\n";
+       ret += "};};\n\n";
+
+       return(ret);
+}
+
+
+string spx_qpn::generate_operator(int i, string params){
+
+               return("        select_project_operator<" +
+               generate_functor_name() +
+               "> *op"+int_to_string(i)+" = new select_project_operator<"+
+               generate_functor_name() +">("+params+", \"" + get_node_name() + "\");\n");
+}
+
+
+////////////////////////////////////////////////////////////////
+////   SGAH functor
+
+
+
+string sgah_qpn::generate_functor_name(){
+       return("sgah_functor_" + normalize_name(this->get_node_name()));
+}
+
+
+string sgah_qpn::generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, vector<bool> &needs_xform){
+       int a,g,w,s;
+
+
+//                     Initialize generate utility globals
+       segen_gb_tbl = &(gb_tbl);
+
+//             Might need to generate empty values for cube processing.
+       map<int, string> structured_types;
+       for(g=0;g<gb_tbl.size();++g){
+               if(gb_tbl.get_data_type(g)->is_structured_type()){
+                       structured_types[gb_tbl.get_data_type(g)->type_indicator()] = gb_tbl.get_data_type(g)->get_type_str();
+               }
+       }
+
+//--------------------------------
+//                     group definition class
+       string ret = "class " + generate_functor_name() + "_groupdef{\n";
+       ret += "public:\n";
+       for(g=0;g<this->gb_tbl.size();g++){
+               sprintf(tmpstr,"gb_var%d",g);
+               ret+="\t"+this->gb_tbl.get_data_type(g)->make_host_cvar(tmpstr)+";\n";
+       }
+//             empty strucutred literals
+       map<int, string>::iterator sii;
+       for(sii=structured_types.begin();sii!=structured_types.end();++sii){
+               data_type dt(sii->second);
+               literal_t empty_lit(sii->first);
+               ret += "\t"+dt.make_host_cvar(empty_lit.hfta_empty_literal_name())+";\n";
+       }
+//             Constructors
+       if(structured_types.size()==0){
+               ret += "\t"+generate_functor_name() + "_groupdef(){};\n";
+       }else{
+               ret += "\t"+generate_functor_name() + "_groupdef(){}\n";
+       }
+
+
+       ret += "\t"+generate_functor_name() + "_groupdef("+
+               this->generate_functor_name() + "_groupdef *gd){\n";
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&gb_var%d, &(gd->gb_var%d));\n",
+                         gdt->get_hfta_buffer_assign_copy().c_str(),g,g );
+                       ret += tmpstr;
+               }else{
+                       sprintf(tmpstr,"\t\tgb_var%d = gd->gb_var%d;\n",g,g);
+                       ret += tmpstr;
+               }
+       }
+       ret += "\t}\n";
+       ret += "\t"+generate_functor_name() + "_groupdef("+
+               this->generate_functor_name() + "_groupdef *gd, bool *pattern){\n";
+       for(sii=structured_types.begin();sii!=structured_types.end();++sii){
+               literal_t empty_lit(sii->first);
+               ret += "\t\t"+empty_lit.to_hfta_C_code("&"+empty_lit.hfta_empty_literal_name())+";\n";
+       }
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               ret += "\t\tif(pattern["+int_to_string(g)+"]){\n";
+               if(gdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t\t%s(&gb_var%d, &(gd->gb_var%d));\n",
+                         gdt->get_hfta_buffer_assign_copy().c_str(),g,g );
+                       ret += tmpstr;
+               }else{
+                       sprintf(tmpstr,"\t\t\tgb_var%d = gd->gb_var%d;\n",g,g);
+                       ret += tmpstr;
+               }
+               ret += "\t\t}else{\n";
+               literal_t empty_lit(gdt->type_indicator());
+               if(empty_lit.is_cpx_lit()){
+                       ret +="\t\t\tgb_var"+int_to_string(g)+"= "+empty_lit.hfta_empty_literal_name()+";\n";
+               }else{
+                       ret +="\t\t\tgb_var"+int_to_string(g)+"="+empty_lit.to_hfta_C_code("")+";\n";
+               }
+               ret += "\t\t}\n";
+       }
+       ret += "\t};\n";
+//             destructor
+       ret += "\t~"+ generate_functor_name() + "_groupdef(){\n";
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&gb_var%d);\n",
+                         gdt->get_hfta_buffer_destroy().c_str(), g );
+                       ret += tmpstr;
+               }
+       }
+       ret += "\t};\n";
+
+       data_type *tgdt;
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_temporal()){
+                       tgdt = gdt;
+                       break;
+               }
+       }
+       ret += tgdt->get_host_cvar_type()+" get_curr_gb(){\n";
+       ret+="\treturn gb_var"+int_to_string(g)+";\n";
+       ret+="}\n";
+
+       ret +="};\n\n";
+
+//--------------------------------
+//                     aggr definition class
+       ret += "class " + this->generate_functor_name() + "_aggrdef{\n";
+       ret += "public:\n";
+       for(a=0;a<aggr_tbl.size();a++){
+               aggr_table_entry *ate = aggr_tbl.agr_tbl[a];
+               sprintf(tmpstr,"aggr_var%d",a);
+               if(aggr_tbl.is_builtin(a)){
+                 ret+="\t"+ aggr_tbl.get_data_type(a)->make_host_cvar(tmpstr)+";\n";
+                 if(aggr_tbl.get_op(a) == "AVG"){      // HACK!
+                       data_type cnt_type = data_type("ullong");
+                       ret+="\t"+cnt_type.make_host_cvar(string(tmpstr)+"_cnt")+";\n";
+                       ret+="\t"+ aggr_tbl.get_data_type(a)->make_host_cvar(string(tmpstr)+"_sum")+";\n";
+                 }
+               }else{
+                 ret+="\t"+ aggr_tbl.get_storage_type(a)->make_host_cvar(tmpstr)+";\n";
+               }
+       }
+//             Constructors
+       ret += "\t"+this->generate_functor_name() + "_aggrdef(){};\n";
+//             destructor
+       ret += "\t~"+this->generate_functor_name() + "_aggrdef(){\n";
+       for(a=0;a<aggr_tbl.size();a++){
+               if(aggr_tbl.is_builtin(a)){
+                       data_type *adt = aggr_tbl.get_data_type(a);
+                       if(adt->is_buffer_type()){
+                               sprintf(tmpstr,"\t\t%s(&aggr_var%d);\n",
+                               adt->get_hfta_buffer_destroy().c_str(), a );
+                               ret += tmpstr;
+                       }
+               }else{
+                       ret+="\t\t"+aggr_tbl.get_op(a)+"_HFTA_AGGR_DESTROY_(";
+                       if(aggr_tbl.get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="(aggr_var"+int_to_string(a)+"));\n";
+               }
+       }
+       ret += "\t};\n";
+       ret +="};\n\n";
+
+//-------------------------------------------
+//             group-by patterns for the functor,
+//             initialization within the class is cumbersome.
+       int n_patterns = gb_tbl.gb_patterns.size();
+       int i,j;
+       ret += "bool "+this->generate_functor_name()+"_gb_patterns["+int_to_string(n_patterns)+
+                       "]["+int_to_string(gb_tbl.size())+"] = {\n";
+       if(n_patterns == 0){
+               for(i=0;i<gb_tbl.size();++i){
+                       if(i>0) ret += ",";
+                       ret += "true";
+               }
+       }else{
+               for(i=0;i<n_patterns;++i){
+                       if(i>0) ret += ",\n";
+                       ret += "\t{";
+                       for(j=0;j<gb_tbl.size();j++){
+                               if(j>0) ret += ", ";
+                               if(gb_tbl.gb_patterns[i][j]){
+                                       ret += "true";
+                               }else{
+                                       ret += "false";
+                               }
+                       }
+                       ret += "}";
+               }
+               ret += "\n";
+       }
+       ret += "};\n";
+
+
+//--------------------------------
+//                     gb functor class
+       ret += "class " + this->generate_functor_name() + "{\n";
+
+//                     Find variables referenced in this query node.
+
+  col_id_set cid_set;
+  col_id_set::iterator csi;
+
+    for(w=0;w<where.size();++w)
+       gather_pr_col_ids(where[w]->pr,cid_set,segen_gb_tbl);
+    for(w=0;w<having.size();++w)
+       gather_pr_col_ids(having[w]->pr,cid_set,segen_gb_tbl);
+       for(g=0;g<gb_tbl.size();g++)
+               gather_se_col_ids(gb_tbl.get_def(g),cid_set,segen_gb_tbl);
+
+    for(s=0;s<select_list.size();s++){
+       gather_se_col_ids(select_list[s]->se,cid_set,segen_gb_tbl);     // descends into aggregates
+    }
+
+
+//                     Private variables : store the state of the functor.
+//                     1) variables for unpacked attributes
+//                     2) offsets of the upacked attributes
+//                     3) storage of partial functions
+//                     4) storage of complex literals (i.e., require a constructor)
+
+       ret += "private:\n";
+
+       // var to save the schema handle
+       ret += "\tint schema_handle0;\n";
+       // metadata from schema handle
+       ret += "\tint tuple_metadata_offset0;\n";
+
+       // generate the declaration of all the variables related to
+       // temp tuples generation
+       ret += gen_decl_temp_vars();
+
+//                     unpacked attribute storage, offsets
+       ret += "//\t\tstorage and offsets of accessed fields.\n";
+       ret += generate_access_vars(cid_set, schema);
+
+//                     Variables to store results of partial functions.
+//                     WARNING find_partial_functions modifies the SE
+//                     (it marks the partial function id).
+       ret += "//\t\tParital function result storage\n";
+       vector<scalarexp_t *> partial_fcns;
+       vector<int> fcn_ref_cnt;
+       vector<bool> is_partial_fcn;
+       for(s=0;s<select_list.size();s++){
+               find_partial_fcns(select_list[s]->se, &partial_fcns,NULL,NULL,  Ext_fcns);
+       }
+       for(w=0;w<where.size();w++){
+               find_partial_fcns_pr(where[w]->pr, &partial_fcns,NULL,NULL,  Ext_fcns);
+       }
+       for(w=0;w<having.size();w++){
+               find_partial_fcns_pr(having[w]->pr, &partial_fcns,NULL,NULL,  Ext_fcns);
+       }
+       for(g=0;g<gb_tbl.size();g++){
+               find_partial_fcns(gb_tbl.get_def(g), &partial_fcns,NULL,NULL,  Ext_fcns);
+       }
+       for(a=0;a<aggr_tbl.size();a++){
+               find_partial_fcns(aggr_tbl.get_aggr_se(a), &partial_fcns,NULL,NULL,  Ext_fcns);
+       }
+       if(partial_fcns.size()>0){
+         ret += "/*\t\tVariables for storing results of partial functions. \t*/\n";
+         ret += generate_partial_fcn_vars(partial_fcns,fcn_ref_cnt,is_partial_fcn,false);
+       }
+
+//                     Complex literals (i.e., they need constructors)
+       ret += "//\t\tComplex literal storage.\n";
+       cplx_lit_table *complex_literals = this->get_cplx_lit_tbl(Ext_fcns);
+       ret += generate_complex_lit_vars(complex_literals);
+
+//                     Pass-by-handle parameters
+       ret += "//\t\tPass-by-handle storage.\n";
+       vector<handle_param_tbl_entry *> param_handle_table = this->get_handle_param_tbl(Ext_fcns);
+       ret += generate_pass_by_handle_vars(param_handle_table);
+
+
+//                     variables to hold parameters.
+       ret += "//\tfor query parameters\n";
+       ret += generate_param_vars(param_tbl);
+
+//             Is there a temporal flush?  If so create flush temporaries,
+//             create flush indicator.
+       bool uses_temporal_flush = false;
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_temporal())
+                       uses_temporal_flush = true;
+       }
+
+       if(uses_temporal_flush){
+               ret += "//\t\tFor temporal flush\n";
+               for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+                       if(gdt->is_temporal()){
+                         sprintf(tmpstr,"last_gb%d",g);
+                         ret+="\t"+gb_tbl.get_data_type(g)->make_host_cvar(tmpstr)+";\n";
+                         sprintf(tmpstr,"last_flushed_gb%d",g);
+                         ret+="\t"+gb_tbl.get_data_type(g)->make_host_cvar(tmpstr)+";\n";
+                       }
+               }
+               ret += "\tbool needs_temporal_flush;\n";
+       }
+
+
+//                     The publicly exposed functions
+
+       ret += "\npublic:\n";
+
+
+//-------------------
+//                     The functor constructor
+//                     pass in the schema handle.
+//                     1) make assignments to the unpack offset variables
+//                     2) initialize the complex literals
+
+       ret += "//\t\tFunctor constructor.\n";
+       ret +=  this->generate_functor_name()+"(int schema_handle0){\n";
+
+       // save the schema handle
+       ret += "\t\tthis->schema_handle0 = schema_handle0;\n";
+
+//             unpack vars
+       ret += "//\t\tGet offsets for unpacking fields from input tuple.\n";
+       ret += gen_access_var_init(cid_set);
+//             tuple metadata
+       ret += "tuple_metadata_offset0 = ftaschema_get_tuple_metadata_offset(schema_handle0);\n";
+
+//             complex literals
+       ret += "//\t\tInitialize complex literals.\n";
+       ret += gen_complex_lit_init(complex_literals);
+
+//             Initialize partial function results so they can be safely GC'd
+       ret += gen_partial_fcn_init(partial_fcns);
+
+//             Initialize non-query-parameter parameter handles
+       ret += gen_pass_by_handle_init(param_handle_table);
+
+//             temporal flush variables
+//             ASSUME that structured values won't be temporal.
+       if(uses_temporal_flush){
+               ret += "//\t\tInitialize temporal flush variables.\n";
+               for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+                       if(gdt->is_temporal()){
+                               literal_t gl(gdt->type_indicator());
+                               sprintf(tmpstr,"\tlast_gb%d = %s;\n",g, gl.to_hfta_C_code("").c_str());
+                               ret.append(tmpstr);
+                               sprintf(tmpstr,"\tlast_flushed_gb%d = %s;\n",g, gl.to_hfta_C_code("").c_str());
+                               ret.append(tmpstr);
+                       }
+               }
+               ret += "\tneeds_temporal_flush = false;\n";
+       }
+
+       //              Init temporal attributes referenced in select list
+       ret += gen_init_temp_vars(schema, select_list, segen_gb_tbl);
+
+       ret += "}\n\n";
+
+//-------------------
+//                     Functor destructor
+       ret += "//\t\tFunctor destructor.\n";
+       ret +=  "~"+this->generate_functor_name()+"(){\n";
+
+//                     clean up buffer type complex literals
+       ret += gen_complex_lit_dtr(complex_literals);
+
+//                     Deregister the pass-by-handle parameters
+       ret += "/* register and de-register the pass-by-handle parameters */\n";
+       ret += gen_pass_by_handle_dtr(param_handle_table);
+
+//                     clean up partial function results.
+       ret += "/* clean up partial function storage    */\n";
+       ret += gen_partial_fcn_dtr(partial_fcns);
+
+//                     Destroy the parameters, if any need to be destroyed
+       ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+
+       ret += "};\n\n";
+
+
+//-------------------
+//                     Parameter manipulation routines
+       ret += generate_load_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+       ret += generate_delete_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+
+//-------------------
+//                     Register new parameter block
+
+       ret += "int set_param_block(gs_int32_t sz, void* value){\n";
+         ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+         ret += "\treturn this->load_params_"+this->generate_functor_name()+
+                               "(sz, value);\n";
+       ret += "};\n\n";
+
+// -----------------------------------
+//                     group-by pattern support
+
+       ret +=
+"int n_groupby_patterns(){\n"
+"      return "+int_to_string(gb_tbl.gb_patterns.size())+";\n"
+"}\n"
+"bool *get_pattern(int p){\n"
+"      return "+this->generate_functor_name()+"_gb_patterns[p];\n"
+"}\n\n"
+;
+
+
+
+
+//-------------------
+//             the create_group method.
+//             This method creates a group in a buffer passed in
+//             (to allow for creation on the stack).
+//             There are also a couple of side effects:
+//             1) evaluate the WHERE clause (and therefore, unpack all partial fcns)
+//             2) determine if a temporal flush is required.
+
+       ret += this->generate_functor_name()+"_groupdef *create_group(host_tuple &tup0, gs_sp_t buffer){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+       if(partial_fcns.size()>0){              // partial fcn access failure
+         ret += "\tgs_retval_t retval = 0;\n";
+         ret += "\n";
+       }
+//             return value
+       ret += "\t"+generate_functor_name()+"_groupdef *gbval = ("+generate_functor_name()+
+                       "_groupdef *) buffer;\n";
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       set<int> w_pfcns;       // partial fcns in where clause
+       for(w=0;w<where.size();++w)
+               collect_partial_fcns_pr(where[w]->pr, w_pfcns);
+
+       set<int> ag_gb_pfcns;   // partial fcns in gbdefs, aggr se's
+       for(g=0;g<gb_tbl.size();g++){
+               collect_partial_fcns(gb_tbl.get_def(g), ag_gb_pfcns);
+       }
+       for(a=0;a<aggr_tbl.size();a++){
+               collect_partial_fcns(aggr_tbl.get_aggr_se(a), ag_gb_pfcns);
+       }
+       ret += gen_partial_fcn_dtr(partial_fcns,w_pfcns);
+       ret += gen_partial_fcn_dtr(partial_fcns,ag_gb_pfcns);
+//     ret += gen_partial_fcn_dtr(partial_fcns);
+
+
+       ret += gen_temp_tuple_check(this->node_name, 0);
+       col_id_set found_cids;  // colrefs unpacked thus far.
+       ret += gen_unpack_temp_vars(schema, found_cids, select_list, segen_gb_tbl, needs_xform);
+
+
+//                     Save temporal group-by variables
+
+
+       ret.append("\n\t//\t\tCompute temporal groupby attributes\n\n");
+
+         for(g=0;g<gb_tbl.size();g++){
+
+                       data_type *gdt = gb_tbl.get_data_type(g);
+
+                       if(gdt->is_temporal()){
+                               sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                                       g, generate_se_code(gb_tbl.get_def(g),schema).c_str() );
+                               ret.append(tmpstr);
+                       }
+               }
+               ret.append("\n");
+
+
+
+//                     Compare the temporal GB vars with the stored ones,
+//                     set flush indicator and update stored GB vars if there is any change.
+
+ret += "// hfta_disorder = "+int_to_string(hfta_disorder)+"\n";
+       if(hfta_disorder < 2){
+               if(uses_temporal_flush){
+                       ret+= "\tif( !( (";
+                       bool first_one = true;
+                       for(g=0;g<gb_tbl.size();g++){
+                               data_type *gdt = gb_tbl.get_data_type(g);
+
+                               if(gdt->is_temporal()){
+                               sprintf(tmpstr,"last_gb%d",g);   string lhs_op = tmpstr;
+                               sprintf(tmpstr,"gbval->gb_var%d",g);   string rhs_op = tmpstr;
+                               if(first_one){first_one = false;} else {ret += ") && (";}
+                               ret += generate_equality_test(lhs_op, rhs_op, gdt);
+                               }
+                       }
+                       ret += ") ) ){\n";
+                       for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+                       if(gdt->is_temporal()){
+                               if(gdt->is_buffer_type()){
+                                       sprintf(tmpstr,"\t\t%s(&(gbval->gb_var%d),&last_gb%d);\n",gdt->get_hfta_buffer_replace().c_str(),g,g);
+                               }else{
+                                       sprintf(tmpstr,"\t\tlast_flushed_gb%d = last_gb%d;\n",g,g);
+                                       ret += tmpstr;
+                                       sprintf(tmpstr,"\t\tlast_gb%d = gbval->gb_var%d;\n",g,g);
+                               }
+                               ret += tmpstr;
+                               }
+                       }
+                       ret += "\t\tneeds_temporal_flush=true;\n";
+                       ret += "\t\t}else{\n"
+                               "\t\t\tneeds_temporal_flush=false;\n"
+                               "\t\t}\n";
+               }
+       }else{
+               ret+= "\tif(temp_tuple_received && !( (";
+               bool first_one = true;
+               for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+
+                       if(gdt->is_temporal()){
+                               sprintf(tmpstr,"last_gb%d",g);   string lhs_op = tmpstr;
+                               sprintf(tmpstr,"gbval->gb_var%d",g);   string rhs_op = tmpstr;
+                               if(first_one){first_one = false;} else {ret += ") && (";}
+                               ret += generate_equality_test(lhs_op, rhs_op, gdt);
+                               break;
+                       }
+               }
+               ret += ") ) ){\n";
+               int temporal_g = 0;
+               for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+                       if(gdt->is_temporal()){
+                               temporal_g = g;
+                               if(gdt->is_buffer_type()){
+                                       sprintf(tmpstr,"\t\t%s(&(gbval->gb_var%d),&last_gb%d);\n",gdt->get_hfta_buffer_replace().c_str(),g,g);
+                               }else{
+                                       sprintf(tmpstr,"\t\tlast_flushed_gb%d = last_gb%d;\n",g,g);
+                                       ret += tmpstr;
+                                       sprintf(tmpstr,"\t\tlast_gb%d = gbval->gb_var%d;\n",g,g);
+                               }
+                               ret += tmpstr;
+                               break;
+                       }
+               }
+               data_type *tgdt = gb_tbl.get_data_type(temporal_g);
+               literal_t gl(tgdt->type_indicator());
+               ret += "\t\tif(last_flushed_gb"+int_to_string(temporal_g)+">"+gl.to_hfta_C_code("")+")\n";
+               ret += "\t\t\tneeds_temporal_flush=true;\n";
+               ret += "\t\t}else{\n"
+                       "\t\t\tneeds_temporal_flush=false;\n"
+                       "\t\t}\n";
+       }
+
+
+//             For temporal status tuple we don't need to do anything else
+       ret += "\tif (temp_tuple_received) return NULL;\n\n";
+
+       for(w=0;w<where.size();++w){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.\n",w);
+               ret += tmpstr;
+//                     Find the set of variables accessed in this CNF elem,
+//                     but in no previous element.
+               col_id_set new_cids;
+               get_new_pred_cids(where[w]->pr, found_cids, new_cids, segen_gb_tbl);
+
+//                     Unpack these values.
+               ret += gen_unpack_cids(schema, new_cids, "NULL", needs_xform);
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pfcn_refs;
+               collect_partial_fcns_pr(where[w]->pr, pfcn_refs);
+               ret += gen_unpack_partial_fcn(schema, partial_fcns, pfcn_refs,"NULL");
+
+               ret += "\tif( !("+generate_predicate_code(where[w]->pr,schema)+
+                               +") ) return(NULL);\n";
+       }
+
+//             The partial functions ref'd in the group-by var and aggregate
+//             definitions must also be evaluated.  If one returns false,
+//             then implicitly the predicate is false.
+       set<int>::iterator pfsi;
+
+       if(ag_gb_pfcns.size() > 0)
+               ret += "//\t\tUnpack remaining partial fcns.\n";
+       ret += gen_full_unpack_partial_fcn(schema, partial_fcns, ag_gb_pfcns,
+                                                                               found_cids, segen_gb_tbl, "NULL", needs_xform);
+
+//                     Unpack the group-by variables
+
+         for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+
+               if(!gdt->is_temporal()){
+//                     Find the new fields ref'd by this GBvar def.
+                       col_id_set new_cids;
+                       get_new_se_cids(gb_tbl.get_def(g), found_cids, new_cids, segen_gb_tbl);
+//                     Unpack these values.
+                       ret += gen_unpack_cids(schema, new_cids, "NULL", needs_xform);
+
+                       sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                               g, generate_se_code(gb_tbl.get_def(g),schema).c_str() );
+/*
+//                             There seems to be no difference between the two
+//                             branches of the IF statement.
+               data_type *gdt = gb_tbl.get_data_type(g);
+                 if(gdt->is_buffer_type()){
+//                             Create temporary copy.
+                       sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                               g, generate_se_code(gb_tbl.get_def(g),schema).c_str() );
+                 }else{
+                       scalarexp_t *gse = gb_tbl.get_def(g);
+                       sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                                       g,generate_se_code(gse,schema).c_str());
+                 }
+*/
+
+                       ret.append(tmpstr);
+               }
+         }
+         ret.append("\n");
+
+       ret+= "\treturn gbval;\n";
+       ret += "};\n\n\n";
+
+//--------------------------------------------------------
+//                     Create and initialize an aggregate object
+
+       ret += this->generate_functor_name()+"_aggrdef *create_aggregate(host_tuple &tup0, gs_sp_t buffer){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//             return value
+       ret += "\t"+generate_functor_name()+"_aggrdef *aggval = ("+generate_functor_name()+
+                       "_aggrdef *)buffer;\n";
+
+       for(a=0;a<aggr_tbl.size();a++){
+               if(aggr_tbl.is_builtin(a)){
+//                     Create temporaries for buffer return values
+                 data_type *adt = aggr_tbl.get_data_type(a);
+                 if(adt->is_buffer_type()){
+                       sprintf(tmpstr,"aggr_tmp_%d", a);
+                       ret+=adt->make_host_cvar(tmpstr)+";\n";
+                 }
+               }
+       }
+
+//             Unpack all remaining attributes
+       ret += gen_remaining_colrefs(schema, cid_set, found_cids, "NULL", needs_xform);
+       for(a=0;a<aggr_tbl.size();a++){
+         sprintf(tmpstr,"aggval->aggr_var%d",a);
+         string assignto_var = tmpstr;
+         ret += "\t"+generate_aggr_init(assignto_var,&aggr_tbl,a, schema);
+       }
+
+       ret += "\treturn aggval;\n";
+       ret += "};\n\n";
+
+//--------------------------------------------------------
+//                     update an aggregate object
+
+       ret += "void update_aggregate(host_tuple &tup0, "
+               +generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//                     use of temporaries depends on the aggregate,
+//                     generate them in generate_aggr_update
+
+
+//             Unpack all remaining attributes
+       ret += gen_remaining_colrefs(schema, cid_set, found_cids, "", needs_xform);
+       for(a=0;a<aggr_tbl.size();a++){
+         sprintf(tmpstr,"aggval->aggr_var%d",a);
+         string varname = tmpstr;
+         ret.append(generate_aggr_update(varname,&aggr_tbl,a, schema));
+       }
+
+       ret += "\treturn;\n";
+       ret += "};\n";
+
+//---------------------------------------------------
+//                     Flush test
+
+       ret += "\tbool flush_needed(){\n";
+       if(uses_temporal_flush){
+               ret += "\t\treturn needs_temporal_flush;\n";
+       }else{
+               ret += "\t\treturn false;\n";
+       }
+       ret += "\t};\n";
+
+//---------------------------------------------------
+//                     create output tuple
+//                     Unpack the partial functions ref'd in the where clause,
+//                     select clause.  Evaluate the where clause.
+//                     Finally, pack the tuple.
+
+//                     I need to use special code generation here,
+//                     so I'll leave it in longhand.
+
+       ret += "host_tuple create_output_tuple("
+               +generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval, bool &failed){\n";
+
+       ret += "\thost_tuple tup;\n";
+       ret += "\tfailed = false;\n";
+       ret += "\tgs_retval_t retval = 0;\n";
+
+       string gbvar = "gbval->gb_var";
+       string aggvar = "aggval->";
+
+//                     Create cached temporaries for UDAF return values.
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn_id = aggr_tbl.get_fcn_id(a);
+                       data_type *adt = Ext_fcns->get_fcn_dt(afcn_id);
+                       sprintf(tmpstr,"udaf_ret_%d", a);
+                       ret+="\t"+adt->make_host_cvar(tmpstr)+";\n";
+               }
+       }
+
+
+//                     First, get the return values from the UDAFS
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a)){
+                       ret += "\t"+aggr_tbl.get_op(a)+"_HFTA_AGGR_OUTPUT_(&(udaf_ret_"+int_to_string(a)+"),";
+                       if(aggr_tbl.get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="("+aggvar+"aggr_var"+int_to_string(a)+"));\n";
+               }
+       }
+
+       set<int> hv_sl_pfcns;
+       for(w=0;w<having.size();w++){
+               collect_partial_fcns_pr(having[w]->pr, hv_sl_pfcns);
+       }
+       for(s=0;s<select_list.size();s++){
+               collect_partial_fcns(select_list[s]->se, hv_sl_pfcns);
+       }
+
+//             clean up the partial fcn results from any previous execution
+       ret += gen_partial_fcn_dtr(partial_fcns,hv_sl_pfcns);
+
+//             Unpack them now
+       for(pfsi=hv_sl_pfcns.begin();pfsi!=hv_sl_pfcns.end();++pfsi){
+               ret += unpack_partial_fcn_fm_aggr(partial_fcns[(*pfsi)], (*pfsi), gbvar, aggvar, schema);
+               ret += "\tif(retval){ failed = true; return(tup);}\n";
+       }
+
+//             Evalaute the HAVING clause
+//             TODO: this seems to have a ++ operator rather than a + operator.
+       for(w=0;w<having.size();++w){
+               ret += "\tif( !("+generate_predicate_code_fm_aggr(having[w]->pr,gbvar, aggvar, schema) +") ) { failed = true; return(tup);}\n";
+       }
+
+//          Now, compute the size of the tuple.
+
+//          Unpack any BUFFER type selections into temporaries
+//          so that I can compute their size and not have
+//          to recompute their value during tuple packing.
+//          I can use regular assignment here because
+//          these temporaries are non-persistent.
+//                     TODO: should I be using the selvar generation routine?
+
+       ret += "//\t\tCompute the size of the tuple.\n";
+       ret += "//\t\t\tNote: buffer storage packed at the end of the tuple.\n";
+      for(s=0;s<select_list.size();s++){
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = se->get_data_type();
+        if(sdt->is_buffer_type() &&
+                        !( (se->get_operator_type() == SE_COLREF) ||
+                               (se->get_operator_type() == SE_AGGR_STAR) ||
+                               (se->get_operator_type() == SE_AGGR_SE) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+               ){
+            sprintf(tmpstr,"selvar_%d",s);
+                       ret+="\t"+sdt->make_host_cvar(tmpstr)+" = ";
+                       ret += generate_se_code_fm_aggr(se,gbvar, aggvar, schema) +";\n";
+        }
+      }
+
+//      The size of the tuple is the size of the tuple struct plus the
+//      size of the buffers to be copied in.
+
+      ret+="\ttup.tuple_size = sizeof(" + generate_tuple_name( this->get_node_name()) +") + sizeof(gs_uint8_t)";
+      for(s=0;s<select_list.size();s++){
+//             if(s>0) ret += "+";
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = select_list[s]->se->get_data_type();
+        if(sdt->is_buffer_type()){
+                 if(!( (se->get_operator_type() == SE_COLREF) ||
+                               (se->get_operator_type() == SE_AGGR_STAR) ||
+                               (se->get_operator_type() == SE_AGGR_SE) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+                 ){
+            sprintf(tmpstr," + %s(&selvar_%d)", sdt->get_hfta_buffer_size().c_str(),s);
+            ret.append(tmpstr);
+                 }else{
+            sprintf(tmpstr," + %s(&%s)", sdt->get_hfta_buffer_size().c_str(),generate_se_code_fm_aggr(se,gbvar, aggvar, schema).c_str());
+            ret.append(tmpstr);
+                 }
+        }
+      }
+      ret.append(";\n");
+
+//             Allocate tuple data block.
+       ret += "//\t\tCreate the tuple block.\n";
+         ret += "\ttup.data = malloc(tup.tuple_size);\n";
+         ret += "\ttup.heap_resident = true;\n";
+
+//             Mark tuple as regular
+         ret += "\t*((gs_sp_t )tup.data + sizeof(" + generate_tuple_name( this->get_node_name()) +")) = REGULAR_TUPLE;\n";
+
+//       ret += "\ttup.channel = 0;\n";
+         ret += "\t"+generate_tuple_name( this->get_node_name())+" *tuple = ("+
+                               generate_tuple_name( this->get_node_name())+" *)(tup.data);\n";
+
+//             Start packing.
+//                     (Here, offsets are hard-wired.  is this a problem?)
+
+       ret += "//\t\tPack the fields into the tuple.\n";
+         ret += "\tint tuple_pos = sizeof("+generate_tuple_name( this->get_node_name()) +") + sizeof(gs_uint8_t);\n";
+      for(s=0;s<select_list.size();s++){
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = se->get_data_type();
+        if(sdt->is_buffer_type()){
+                 if(!( (se->get_operator_type() == SE_COLREF) ||
+                               (se->get_operator_type() == SE_AGGR_STAR) ||
+                               (se->get_operator_type() == SE_AGGR_SE) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+                 ){
+            sprintf(tmpstr,"\t%s(&(tuple->tuple_var%d), &selvar_%d,  ((gs_sp_t)tuple)+tuple_pos, tuple_pos);\n", sdt->get_hfta_buffer_tuple_copy().c_str(),s, s);
+            ret.append(tmpstr);
+            sprintf(tmpstr,"\ttuple_pos += %s(&selvar_%d);\n", sdt->get_hfta_buffer_size().c_str(), s);
+            ret.append(tmpstr);
+                 }else{
+            sprintf(tmpstr,"\t%s(&(tuple->tuple_var%d), &%s,  ((gs_sp_t)tuple)+tuple_pos, tuple_pos);\n", sdt->get_hfta_buffer_tuple_copy().c_str(),s, generate_se_code_fm_aggr(se,gbvar, aggvar, schema).c_str());
+            ret.append(tmpstr);
+            sprintf(tmpstr,"\ttuple_pos += %s(&%s);\n", sdt->get_hfta_buffer_size().c_str(), generate_se_code_fm_aggr(se,gbvar, aggvar, schema).c_str());
+            ret.append(tmpstr);
+                 }
+        }else{
+            sprintf(tmpstr,"\ttuple->tuple_var%d = ",s);
+            ret.append(tmpstr);
+            ret.append(generate_se_code_fm_aggr(se,gbvar, aggvar, schema) );
+            ret.append(";\n");
+        }
+      }
+
+//                     Destroy string temporaries
+         ret += gen_buffer_selvars_dtr(select_list);
+//                     Destroy string return vals of UDAFs
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn_id = aggr_tbl.get_fcn_id(a);
+                       data_type *adt = Ext_fcns->get_fcn_dt(afcn_id);
+                       if(adt->is_buffer_type()){
+                               sprintf(tmpstr,"\t%s(&udaf_ret_%d);\n",
+                               adt->get_hfta_buffer_destroy().c_str(), a );
+                               ret += tmpstr;
+                       }
+               }
+       }
+
+
+         ret += "\treturn tup;\n";
+         ret += "};\n";
+
+
+//-------------------------------------------------------------------
+//             Temporal update functions
+
+       ret+="bool temp_status_received(){return temp_tuple_received;};\n\n";
+
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_temporal()){
+                       tgdt = gdt;
+                       break;
+               }
+       }
+       ret += tgdt->get_host_cvar_type()+" get_last_flushed_gb(){\n";
+       ret+="\treturn last_flushed_gb"+int_to_string(g)+";\n";
+       ret+="}\n";
+       ret += tgdt->get_host_cvar_type()+" get_last_gb(){\n";
+       ret+="\treturn last_gb"+int_to_string(g)+";\n";
+       ret+="}\n";
+
+
+
+
+//             create a temp status tuple
+       ret += "int create_temp_status_tuple(host_tuple& result, bool flush_finished) {\n\n";
+
+       ret += gen_init_temp_status_tuple(this->get_node_name());
+
+//             Start packing.
+//                     (Here, offsets are hard-wired.  is this a problem?)
+
+       ret += "//\t\tPack the fields into the tuple.\n";
+       for(s=0;s<select_list.size();s++){
+               data_type *sdt = select_list[s]->se->get_data_type();
+               if(sdt->is_temporal()){
+                       sprintf(tmpstr,"\ttuple->tuple_var%d = ",s);
+                       ret += tmpstr;
+
+                       sprintf(tmpstr,"(flush_finished) ? %s : %s ", generate_se_code(select_list[s]->se,schema).c_str(), generate_se_code_fm_aggr(select_list[s]->se,"last_flushed_gb", "", schema).c_str());
+                       ret += tmpstr;
+                       ret += ";\n";
+               }
+       }
+
+
+       ret += "\treturn 0;\n";
+       ret += "};};\n\n\n";
+
+
+//----------------------------------------------------------
+//                     The hash function
+
+       ret += "struct "+generate_functor_name()+"_hash_func{\n";
+       ret += "\tgs_uint32_t operator()(const "+generate_functor_name()+
+                               "_groupdef *grp) const{\n";
+       ret += "\t\treturn( (";
+       for(g=0;g<gb_tbl.size();g++){
+               if(g>0) ret += "^";
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->use_hashfunc()){
+                       if(gdt->is_buffer_type())
+                               sprintf(tmpstr,"(%s*%s(&(grp->gb_var%d)))",hash_nums[g%NRANDS].c_str(),gdt->get_hfta_hashfunc().c_str(),g);
+                       else
+                               sprintf(tmpstr,"(%s*%s(grp->gb_var%d))",hash_nums[g%NRANDS].c_str(),gdt->get_hfta_hashfunc().c_str(),g);
+               }else{
+                       sprintf(tmpstr,"(%s*grp->gb_var%d)",hash_nums[g%NRANDS].c_str(),g);
+               }
+               ret += tmpstr;
+       }
+       ret += ") >> 32);\n";
+       ret += "\t}\n";
+       ret += "};\n\n";
+
+//----------------------------------------------------------
+//                     The comparison function
+
+       ret += "struct "+generate_functor_name()+"_equal_func{\n";
+       ret += "\tbool operator()(const "+generate_functor_name()+"_groupdef *grp1, "+
+                       generate_functor_name()+"_groupdef *grp2) const{\n";
+       ret += "\t\treturn( (";
+
+       for(g=0;g<gb_tbl.size();g++){
+               if(g>0) ret += ") && (";
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->complex_comparison(gdt)){
+               if(gdt->is_buffer_type())
+                       sprintf(tmpstr,"(%s(&(grp1->gb_var%d), &(grp2->gb_var%d))==0)",
+                               gdt->get_hfta_comparison_fcn(gdt).c_str(),g,g);
+               else
+                       sprintf(tmpstr,"(%s((grp1->gb_var%d), (grp2->gb_var%d))==0)",
+                               gdt->get_hfta_comparison_fcn(gdt).c_str(),g,g);
+               }else{
+                       sprintf(tmpstr,"grp1->gb_var%d == grp2->gb_var%d",g,g);
+               }
+               ret += tmpstr;
+       }
+       ret += ") );\n";
+       ret += "\t}\n";
+       ret += "};\n\n";
+
+
+       return(ret);
+}
+
+string sgah_qpn::generate_operator(int i, string params){
+
+       if(hfta_disorder < 2){
+               return(
+                       "       groupby_operator<" +
+                       generate_functor_name()+","+
+                       generate_functor_name() + "_groupdef, " +
+                       generate_functor_name() + "_aggrdef, " +
+                       generate_functor_name()+"_hash_func, "+
+                       generate_functor_name()+"_equal_func "
+                       "> *op"+int_to_string(i)+" = new groupby_operator<"+
+                       generate_functor_name()+","+
+                       generate_functor_name() + "_groupdef, " +
+                       generate_functor_name() + "_aggrdef, " +
+                       generate_functor_name()+"_hash_func, "+
+                       generate_functor_name()+"_equal_func "
+                       ">("+params+", \"" + get_node_name() +
+"\");\n"
+               );
+       }
+       data_type *tgdt;
+       for(int g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_temporal()){
+                       tgdt = gdt;
+                       break;
+               }
+       }
+
+       return(
+                       "       groupby_operator_oop<" +
+                       generate_functor_name()+","+
+                       generate_functor_name() + "_groupdef, " +
+                       generate_functor_name() + "_aggrdef, " +
+                       generate_functor_name()+"_hash_func, "+
+                       generate_functor_name()+"_equal_func, " +
+            tgdt->get_host_cvar_type() +
+                       "> *op"+int_to_string(i)+" = new groupby_operator_oop<"+
+                       generate_functor_name()+","+
+                       generate_functor_name() + "_groupdef, " +
+                       generate_functor_name() + "_aggrdef, " +
+                       generate_functor_name()+"_hash_func, "+
+                       generate_functor_name()+"_equal_func, " +
+            tgdt->get_host_cvar_type() +
+                       ">("+params+", \"" + get_node_name() +
+"\");\n"
+               );
+}
+
+
+////////////////////////////////////////////////
+///            MERGE operator
+///            MRG functor
+////////////////////////////////////////////
+
+string mrg_qpn::generate_functor_name(){
+       return("mrg_functor_" + normalize_name(this->get_node_name()));
+}
+
+string mrg_qpn::generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, vector<bool> &needs_xform){
+       int tblref;
+
+
+//             Sanity check
+       if(fm.size() != mvars.size()){
+               fprintf(stderr,"INTERNAL ERROR in mrg_qpn::generate_functor fm.size=%lu, mvars.size=%lu\n",fm.size(),mvars.size());
+               exit(1);
+       }
+       if(fm.size() != 2){
+               fprintf(stderr,"INTERNAL ERROR in mrg_qpn::generate_functor fm.size=mvars.size=%lu\n",fm.size());
+               exit(1);
+       }
+
+
+//                     Initialize generate utility globals
+       segen_gb_tbl = NULL;
+
+       string ret = "class " + this->generate_functor_name() + "{\n";
+
+//             Private variable:
+//             1) Vars for unpacked attrs.
+//             2) offsets ofthe unpakced attrs
+//             3) last_posted_timestamp
+
+       data_type dta(
+               schema->get_type_name(mvars[0]->get_schema_ref(), mvars[0]->get_field()),
+               schema->get_modifier_list(mvars[0]->get_schema_ref(), mvars[0]->get_field())
+       );
+       data_type dtb(
+               schema->get_type_name(mvars[1]->get_schema_ref(), mvars[1]->get_field()),
+               schema->get_modifier_list(mvars[1]->get_schema_ref(), mvars[1]->get_field())
+       );
+
+       ret += "private:\n";
+
+       // var to save the schema handle
+       ret += "\tint schema_handle0;\n";
+
+       // generate the declaration of all the variables related to
+       // temp tuples generation
+       ret += gen_decl_temp_vars();
+
+//                     unpacked attribute storage, offsets
+       ret += "//\t\tstorage and offsets of accessed fields.\n";
+       ret += "\tint tuple_metadata_offset0, tuple_metadata_offset1;\n";
+       tblref = 0;
+       sprintf(tmpstr,"unpack_var_%s_%d", mvars[0]->get_field().c_str(), tblref);
+       ret+="\t"+dta.make_host_cvar(tmpstr)+";\n";
+       sprintf(tmpstr,"\tgs_int32_t unpack_offset_%s_%d;\n", mvars[0]->get_field().c_str(), tblref);
+       ret.append(tmpstr);
+       tblref = 1;
+       sprintf(tmpstr,"unpack_var_%s_%d", mvars[1]->get_field().c_str(), tblref);
+       ret+="\t"+dtb.make_host_cvar(tmpstr)+";\n";
+       sprintf(tmpstr,"\tgs_int32_t unpack_offset_%s_%d;\n", mvars[1]->get_field().c_str(), tblref);
+       ret.append(tmpstr);
+
+       ret += "//\t\tRemember the last posted timestamp.\n";
+       ret+="\t"+dta.make_host_cvar("last_posted_timestamp_0")+";\n";
+       ret+="\t"+dta.make_host_cvar("last_posted_timestamp_1")+";\n";
+       ret+="\t"+dta.make_host_cvar("timestamp")+";\n";
+       ret+="\t"+dta.make_host_cvar("slack")+";\n";
+//     ret += "\t bool first_execution_0, first_execution_1;\n";
+
+//                     variables to hold parameters.
+       ret += "//\tfor query parameters\n";
+       ret += generate_param_vars(param_tbl);
+
+       ret += "public:\n";
+//-------------------
+//                     The functor constructor
+//                     pass in a schema handle (e.g. for the 1st input stream),
+//                     use it to determine how to unpack the merge variable.
+//                     ASSUME that both streams have the same layout,
+//                     just duplicate it.
+
+//             unpack vars
+       ret += "//\t\tFunctor constructor.\n";
+       ret +=  this->generate_functor_name()+"(int schema_handle0){\n";
+
+       // var to save the schema handle
+       ret += "\tthis->schema_handle0 = schema_handle0;\n";
+       ret += "\ttuple_metadata_offset0=ftaschema_get_tuple_metadata_offset(schema_handle0);\n";
+       ret += "\ttuple_metadata_offset1=ftaschema_get_tuple_metadata_offset(schema_handle0);\n";
+
+       ret += "//\t\tGet offsets for unpacking fields from input tuple.\n";
+
+   sprintf(tmpstr,"\tunpack_offset_%s_%d = ftaschema_get_field_offset_by_name(schema_handle0, \"%s\");\n", mvars[0]->get_field().c_str(), 0,mvars[0]->get_field().c_str());
+   ret.append(tmpstr);
+       sprintf(tmpstr,"\tunpack_offset_%s_%d = unpack_offset_%s_%d;\n",mvars[1]->get_field().c_str(), 1,mvars[0]->get_field().c_str(), 0);
+       ret.append(tmpstr);
+//     ret+="\tfirst_execution_0 = first_execution_1 = true;\n";
+       if(slack)
+               ret+="\tslack = "+generate_se_code(slack,schema)+";\n";
+       else
+               ret+="\tslack = 0;\n";
+
+//             Initialize internal state
+       ret += "\ttemp_tuple_received = false;\n";
+
+       //              Init last timestamp values to minimum value for their type
+       if (dta.is_increasing())
+               ret+="\tlast_posted_timestamp_0 = last_posted_timestamp_1 = " + dta.get_min_literal() + ";\n";
+       else
+               ret+="\tlast_posted_timestamp_0 = last_posted_timestamp_1 = " + dta.get_max_literal() + ";\n";
+
+
+       ret += "};\n\n";
+
+       ret += "//\t\tFunctor destructor.\n";
+       ret +=  "~"+this->generate_functor_name()+"(){\n";
+
+//                     Destroy the parameters, if any need to be destroyed
+       ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+
+       ret+="};\n\n";
+
+
+//                     no pass-by-handle params.
+       vector<handle_param_tbl_entry *> param_handle_table;
+
+//                     Parameter manipulation routines
+       ret += generate_load_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+       ret += generate_delete_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+
+//                     Register new parameter block
+
+       ret += "int set_param_block(gs_int32_t sz, void* value){\n";
+         ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+         ret += "\treturn this->load_params_"+this->generate_functor_name()+
+                               "(sz, value);\n";
+       ret += "};\n\n";
+
+
+//     -----------------------------------
+//                     Compare method
+
+       string unpack_fcna;
+       if(needs_xform[0]) unpack_fcna = dta.get_hfta_unpack_fcn();
+       else unpack_fcna = dta.get_hfta_unpack_fcn_noxf();
+       string unpack_fcnb;
+       if(needs_xform[1]) unpack_fcnb = dtb.get_hfta_unpack_fcn();
+       else unpack_fcnb = dtb.get_hfta_unpack_fcn_noxf();
+
+/*
+       ret+="\tint compare(const host_tuple& tup1, const host_tuple& tup2) const{ \n";
+       ret+="\t"+dta.make_host_cvar("timestamp1")+";\n";
+       ret+="\t"+dta.make_host_cvar("timestamp2")+";\n";
+       ret+="\tgs_int32_t problem;\n";
+       ret+="\tif (tup1.channel == 0)  {\n";
+       sprintf(tmpstr,"\t\ttimestamp1 = %s(tup1.data, tup1.tuple_size, unpack_offset_%s_%d, &problem);\n",  unpack_fcna.c_str(), mvars[0]->get_field().c_str(), 0);
+       ret += tmpstr;
+       sprintf(tmpstr,"\t\ttimestamp2 = %s(tup2.data, tup2.tuple_size, unpack_offset_%s_%d, &problem);\n",  unpack_fcnb.c_str(), mvars[1]->get_field().c_str(), 1);
+       ret += tmpstr;
+       ret+="\t}else{\n";
+       sprintf(tmpstr,"\t\ttimestamp1 = %s(tup1.data, tup1.tuple_size, unpack_offset_%s_%d, &problem);\n",  unpack_fcna.c_str(), mvars[0]->get_field().c_str(), 1);
+       ret += tmpstr;
+       sprintf(tmpstr,"\t\ttimestamp2 = %s(tup2.data, tup2.tuple_size, unpack_offset_%s_%d, &problem);\n",  unpack_fcnb.c_str(), mvars[1]->get_field().c_str(), 0);
+       ret += tmpstr;
+       ret+="\t}\n";
+       ret+=
+"        if (timestamp1 > timestamp2+slack)\n"
+"            return 1;\n"
+"        else if (timestamp1 < timestamp2)\n"
+"            return -1;\n"
+"        else\n"
+"            return 0;\n"
+"\n"
+"    }\n\n";
+*/
+
+ret +=
+"      void get_timestamp(const host_tuple& tup0){\n"
+"              gs_int32_t problem;\n"
+;
+       sprintf(tmpstr,"\t\ttimestamp = %s_nocheck(tup0.data, unpack_offset_%s_%d);\n",  unpack_fcna.c_str(), mvars[0]->get_field().c_str(), 0);
+       ret += tmpstr;
+ret +=
+"      }\n"
+"\n"
+;
+
+
+
+//                     Compare to temp status.
+       ret+=
+"      int compare_with_temp_status(int channel)   {\n"
+"      // check if tuple is temp status tuple\n"
+"\n"
+"      if (channel == 0)  {\n"
+//"    if(first_execution_0) return 1;\n"
+"        if (timestamp == last_posted_timestamp_0)\n"
+"            return 0;\n"
+"        else if (timestamp < last_posted_timestamp_0)\n"
+"            return -1;\n"
+"        else\n"
+"            return 1;\n"
+"      }\n"
+//"    if(first_execution_1) return 1;\n"
+"        if (timestamp == last_posted_timestamp_1)\n"
+"            return 0;\n"
+"        else if (timestamp < last_posted_timestamp_1)\n"
+"            return -1;\n"
+"        else\n"
+"            return 1;\n"
+"\n"
+"    }\n"
+;
+
+       ret +=
+"      int compare_stored_with_temp_status(const host_tuple& tup0, int channel)/* const*/   {\n"
+;
+       ret+="\t"+dta.make_host_cvar("l_timestamp")+";\n";
+       ret+="\tgs_int32_t problem;\n";
+
+       sprintf(tmpstr,"\t\tl_timestamp = %s_nocheck(tup0.data, unpack_offset_%s_%d);\n",  unpack_fcna.c_str(), mvars[0]->get_field().c_str(), 0);
+       ret += tmpstr;
+       ret+="\tif (channel == 0)  {\n";
+//             ret+="\tif(first_execution_0) return 1;\n";
+       ret+=
+"        if (l_timestamp == last_posted_timestamp_0)\n"
+"            return 0;\n"
+"        else if (l_timestamp < last_posted_timestamp_0)\n"
+"            return -1;\n"
+"        else\n"
+"            return 1;\n"
+"      }\n";
+//             ret+="\tif(first_execution_1) return 1;\n";
+       ret+=
+"        if (l_timestamp == last_posted_timestamp_1)\n"
+"            return 0;\n"
+"        else if (l_timestamp < last_posted_timestamp_1)\n"
+"            return -1;\n"
+"        else\n"
+"            return 1;\n"
+"\n"
+"    }\n\n";
+
+
+//                     update temp status.
+       ret+=
+"      int update_temp_status(const host_tuple& tup) {\n"
+"              if (tup.channel == 0)  {\n"
+"                      last_posted_timestamp_0=timestamp;\n"
+//"                    first_execution_0 = false;\n"
+"              }else{\n"
+"                      last_posted_timestamp_1=timestamp;\n"
+//"                    first_execution_1 = false;\n"
+"              }\n"
+"              return 0;\n"
+"   }\n"
+;
+       ret+=
+"      int update_stored_temp_status(const host_tuple& tup, int channel) {\n"
+;
+       ret+="\t"+dta.make_host_cvar("l_timestamp")+";\n";
+       ret+="\tgs_int32_t problem;\n";
+       sprintf(tmpstr,"\t\tl_timestamp = %s_nocheck(tup.data, unpack_offset_%s_%d);\n",  unpack_fcna.c_str(), mvars[0]->get_field().c_str(), 0);
+       ret += tmpstr;
+ret+=
+"              if (tup.channel == 0)  {\n"
+"                      last_posted_timestamp_0=l_timestamp;\n"
+//"                    first_execution_0 = false;\n"
+"              }else{\n"
+"                      last_posted_timestamp_1=l_timestamp;\n"
+//"                    first_execution_1 = false;\n"
+"              }\n"
+"              return 0;\n"
+"   }\n"
+;
+/*
+       ret+="\t"+dta.make_host_cvar("timestamp")+";\n";
+       ret+="\tgs_int32_t problem;\n";
+       ret+="\tif (tup.channel == 0)  {\n";
+       sprintf(tmpstr,"\t\ttimestamp = %s(tup.data, tup.tuple_size, unpack_offset_%s_%d, &problem);\n",  unpack_fcna.c_str(), mvars[0]->get_field().c_str(), 0);
+       ret += tmpstr;
+       ret+="\t}else{\n";
+       sprintf(tmpstr,"\t\ttimestamp = %s(tup.data, tup.tuple_size, unpack_offset_%s_%d, &problem);\n",  unpack_fcnb.c_str(), mvars[1]->get_field().c_str(), 1);
+       ret += tmpstr;
+       ret+="\t}\n";
+       ret+="\tif (tup.channel == 0)  {\n";
+       ret+="\tlast_posted_timestamp_0=timestamp;\n";
+       ret +="\tfirst_execution_0 = false;\n";
+       ret+="\t}else{\n";
+       ret+="\tlast_posted_timestamp_1=timestamp;\n";
+       ret +="\tfirst_execution_1 = false;\n";
+       ret+="\t}\n";
+       ret+=
+"    }\n\n";
+*/
+
+
+//                     update temp status modulo slack.
+       ret+="\tint update_temp_status_by_slack(const host_tuple& tup, int channel) {\n";
+    if(slack){
+       ret+="\t"+dta.make_host_cvar("timestamp")+";\n";
+       ret+="\tgs_int32_t problem;\n";
+       ret+="\tif (tup.channel == 0)  {\n";
+       sprintf(tmpstr,"\t\ttimestamp = %s_nocheck(tup.data, unpack_offset_%s_%d);\n",  unpack_fcna.c_str(), mvars[0]->get_field().c_str(), 0);
+       ret += tmpstr;
+       ret+="\t}else{\n";
+       sprintf(tmpstr,"\t\ttimestamp = %s_nocheck(tup.data, unpack_offset_%s_%d);\n",  unpack_fcnb.c_str(), mvars[1]->get_field().c_str(), 1);
+       ret += tmpstr;
+       ret+="\t}\n";
+ret +=
+"      if (channel == 0)  {\n"
+"              if(first_execution_0){\n"
+"                      last_posted_timestamp_0=timestamp - slack;\n"
+"                      first_execution_0 = false;\n"
+"              }else{\n"
+"                      if(last_posted_timestamp_0 < timestamp-slack)\n"
+"                              last_posted_timestamp_0 = timestamp-slack;\n"
+"              }\n"
+"      }else{\n"
+"              if(first_execution_1){\n"
+"                      last_posted_timestamp_1=timestamp - slack;\n"
+"                      first_execution_1 = false;\n"
+"              }else{\n"
+"                      if(last_posted_timestamp_1 < timestamp-slack)\n"
+"                              last_posted_timestamp_1 = timestamp-slack;\n"
+"              }\n"
+"      }\n"
+"      return 0;\n"
+"    }\n\n";
+       }else{
+       ret +=
+"      return 0;\n"
+"      }\n\n";
+       }
+
+
+//
+       ret+=
+"bool temp_status_received(const host_tuple& tup0){\n"
+"      return ftaschema_is_temporal_tuple_offset(tuple_metadata_offset0, tup0.data);\n"
+"};\n"
+;
+//"bool temp_status_received(){return temp_tuple_received;};\n\n";
+
+
+//             create a temp status tuple
+       ret += "int create_temp_status_tuple(host_tuple& result) {\n\n";
+
+       ret += gen_init_temp_status_tuple(this->get_node_name());
+
+//             Start packing.
+       ret += "//\t\tPack the fields into the tuple.\n";
+
+       string fld_name = mvars[0]->get_field();
+       int idx = table_layout->get_field_idx(fld_name);
+       field_entry* fld = table_layout->get_field(idx);
+       data_type dt(fld->get_type());
+
+//     if (needs_xform[0] && needs_xform[1] && dt.needs_hn_translation())
+//             sprintf(tmpstr,"\ttuple->tuple_var%d = %s((last_posted_timestamp_0 < last_posted_timestamp_1) ? last_posted_timestamp_0 : last_posted_timestamp_1);\n",idx, dt.hton_translation().c_str());
+//     else
+               sprintf(tmpstr,"\ttuple->tuple_var%d = (last_posted_timestamp_0 < last_posted_timestamp_1 ? last_posted_timestamp_0 : last_posted_timestamp_1);\n",idx);
+
+       ret += tmpstr;
+
+       ret += "\treturn 0;\n";
+       ret += "}\n\n";
+
+//                     Transform tuple (before output)
+
+
+ ret += "void xform_tuple(host_tuple &tup){\n";
+ if((needs_xform[0] && !needs_xform[1]) || (needs_xform[1] && !needs_xform[0])){
+  ret += "\tstruct "+generate_tuple_name(this->get_node_name())+" *tuple = ("+
+               generate_tuple_name(this->get_node_name())+" *)(tup.data);\n";
+
+  vector<field_entry *> flds = table_layout->get_fields();
+
+  ret+="\tif(tup.channel == 0){\n";
+  if(needs_xform[0] && !needs_xform[1]){
+       int f;
+       for(f=0;f<flds.size();f++){
+               ret.append("\t");
+               data_type dt(flds[f]->get_type());
+               if(dt.get_type() == v_str_t){
+//                     sprintf(tmpstr,"\ttuple->tuple_var%d.offset = htonl(tuple->tuple_var%d.offset);\n",f,f);
+//                     ret += tmpstr;
+//                     sprintf(tmpstr,"\ttuple->tuple_var%d.length = htonl(tuple->tuple_var%d.length);\n",f,f);
+//                     ret += tmpstr;
+//                     sprintf(tmpstr,"\ttuple->tuple_var%d.reserved = htonl(tuple->tuple_var%d.reserved);\n",f,f);
+//                     ret += tmpstr;
+               }else{
+                       if(dt.needs_hn_translation()){
+//                             sprintf(tmpstr,"\ttuple->tuple_var%d = %s(tuple->tuple_var%d);\n",
+//                                     f, dt.hton_translation().c_str(), f);
+//                             ret += tmpstr;
+                       }
+               }
+       }
+  }else{
+       ret += "\t\treturn;\n";
+  }
+  ret.append("\t}\n");
+
+
+  ret+="\tif(tup.channel == 1){\n";
+  if(needs_xform[1] && !needs_xform[0]){
+       int f;
+       for(f=0;f<flds.size();f++){
+               ret.append("\t");
+               data_type dt(flds[f]->get_type());
+               if(dt.get_type() == v_str_t){
+//                     sprintf(tmpstr,"\ttuple->tuple_var%d.offset = htonl(tuple->tuple_var%d.offset);\n",f,f);
+//                     ret += tmpstr;
+//                     sprintf(tmpstr,"\ttuple->tuple_var%d.length = htonl(tuple->tuple_var%d.length);\n",f,f);
+//                     ret += tmpstr;
+//                     sprintf(tmpstr,"\ttuple->tuple_var%d.reserved = htonl(tuple->tuple_var%d.reserved);\n",f,f);
+//                     ret += tmpstr;
+               }else{
+                       if(dt.needs_hn_translation()){
+//                             sprintf(tmpstr,"\ttuple->tuple_var%d = %s(tuple->tuple_var%d);\n",
+//                                     f, dt.hton_translation().c_str(), f);
+//                             ret += tmpstr;
+                       }
+               }
+       }
+  }else{
+       ret += "\t\treturn;\n";
+  }
+  ret.append("\t}\n");
+ }
+
+  ret.append("};\n\n");
+
+//             print_warnings() : tell the functor if the user wants to print warnings.
+  ret += "bool print_warnings(){\n";
+  if(definitions.count("print_warnings") && (
+               definitions["print_warnings"] == "yes" ||
+               definitions["print_warnings"] == "Yes" ||
+               definitions["print_warnings"] == "YES" )) {
+       ret += "return true;\n";
+  }else{
+       ret += "return false;\n";
+  }
+  ret.append("};\n\n");
+
+
+//             Done with methods.
+       ret+="\n};\n\n";
+
+
+       return(ret);
+}
+
+string mrg_qpn::generate_operator(int i, string params){
+
+       if(disorder < 2){
+               return(
+                       "       merge_operator<" +
+                       generate_functor_name()+
+                       "> *op"+int_to_string(i)+" = new merge_operator<"+
+                       generate_functor_name()+
+                       ">("+params+",10000,\"" + get_node_name() + "\");\n"
+               );
+       }
+       return(
+                       "       merge_operator_oop<" +
+                       generate_functor_name()+
+                       "> *op"+int_to_string(i)+" = new merge_operator_oop<"+
+                       generate_functor_name()+
+                       ">("+params+",10000,\"" + get_node_name() + "\");\n"
+       );
+}
+
+
+/////////////////////////////////////////////////////////
+//////                 JOIN_EQ_HASH functor
+
+
+string join_eq_hash_qpn::generate_functor_name(){
+       return("join_eq_hash_functor_" + normalize_name(this->get_node_name()));
+}
+
+string join_eq_hash_qpn::generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, vector<bool> &needs_xform){
+       int p,s;
+       vector<data_type *> hashkey_dt;         // data types in the hash key
+       vector<data_type *> temporal_dt;        // data types in the temporal key
+       map<string,scalarexp_t *> l_equiv, r_equiv;     // field equivalences
+       set<int> pfcn_refs;
+       col_id_set new_cids, local_cids;
+
+//--------------------------------
+//             Global init
+
+       string plus_op = "+";
+
+//--------------------------------
+//                     key definition class
+       string ret = "class " + generate_functor_name() + "_keydef{\n";
+       ret += "public:\n";
+//                     Collect attributes from hash join predicates.
+//                     ASSUME equality predicate.
+//                     Use the upwardly compatible data type
+//                     (infer from '+' operator if possible, else use left type)
+       for(p=0;p<this->hash_eq.size();++p){
+               scalarexp_t *lse =      hash_eq[p]->pr->get_left_se();
+               scalarexp_t *rse =      hash_eq[p]->pr->get_right_se();
+               data_type *hdt = new data_type(
+                       lse->get_data_type(), rse->get_data_type(), plus_op );
+               if(hdt->get_type() == undefined_t){
+                       hashkey_dt.push_back(lse->get_data_type()->duplicate());
+                       delete hdt;
+               }else{
+                       hashkey_dt.push_back(hdt);
+               }
+               sprintf(tmpstr,"hashkey_var%d",p);
+               ret+="\t"+hashkey_dt[p]->make_host_cvar(tmpstr)+";\n";
+
+//                     find equivalences
+//                     NOTE: this code needs to be synched with the temporality
+//                     checking done at join_eq_hash_qpn::get_fields
+               if(lse->get_operator_type()==SE_COLREF){
+                       l_equiv[lse->get_colref()->get_field()] = rse;
+               }
+               if(rse->get_operator_type()==SE_COLREF){
+                       r_equiv[rse->get_colref()->get_field()] = lse;
+               }
+       }
+       ret += "\tbool touched;\n";
+
+//             Constructors
+       ret += "\t"+generate_functor_name() + "_keydef(){touched=false;};\n";
+//             destructor
+       ret += "\t~"+ generate_functor_name() + "_keydef(){\n";
+       for(p=0;p<hashkey_dt.size();p++){
+               if(hashkey_dt[p]->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&hashkey_var%d);\n",
+                         hashkey_dt[p]->get_hfta_buffer_destroy().c_str(), p );
+                       ret += tmpstr;
+               }
+       }
+       ret += "\t};\n";
+       ret+="\tvoid touch(){touched = true;};\n";
+       ret+="\tbool is_touched(){return touched;};\n";
+       ret +="};\n\n";
+
+
+//--------------------------------
+//             temporal equality definition class
+       ret += "class " + generate_functor_name() + "_tempeqdef{\n";
+       ret += "public:\n";
+//                     Collect attributes from hash join predicates.
+//                     ASSUME equality predicate.
+//                     Use the upwardly compatible date type
+//                     (infer from '+' operator if possible, else use left type)
+       for(p=0;p<this->temporal_eq.size();++p){
+               scalarexp_t *lse =      temporal_eq[p]->pr->get_left_se();
+               scalarexp_t *rse =      temporal_eq[p]->pr->get_right_se();
+               data_type *hdt = new data_type(
+                       lse->get_data_type(), rse->get_data_type(), plus_op );
+               if(hdt->get_type() == undefined_t){
+                       temporal_dt.push_back(hash_eq[p]->pr->get_left_se()->get_data_type()->duplicate());
+                       delete hdt;
+               }else{
+                       temporal_dt.push_back(hdt);
+               }
+               sprintf(tmpstr,"tempeq_var%d",p);
+               ret+="\t"+temporal_dt[p]->make_host_cvar(tmpstr)+";\n";
+//                     find equivalences
+               if(lse->get_operator_type()==SE_COLREF){
+                       l_equiv[lse->get_colref()->get_field()] = rse;
+               }
+               if(rse->get_operator_type()==SE_COLREF){
+                       r_equiv[rse->get_colref()->get_field()] = lse;
+               }
+       }
+
+//             Constructors
+       ret += "\t"+generate_functor_name() + "_tempeqdef(){};\n";
+//             destructor
+       ret += "\t~"+ generate_functor_name() + "_tempeqdef(){\n";
+       for(p=0;p<temporal_dt.size();p++){
+               if(temporal_dt[p]->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&tempeq_var%d);\n",
+                         temporal_dt[p]->get_hfta_buffer_destroy().c_str(), p );
+                       ret += tmpstr;
+               }
+       }
+       ret += "\t};\n";
+       ret +="};\n\n";
+
+
+//--------------------------------
+//                     temporal eq, hash join functor class
+       ret += "class " + this->generate_functor_name() + "{\n";
+
+//                     Find variables referenced in this query node.
+
+       col_id_set cid_set;
+       col_id_set::iterator csi;
+
+    for(p=0;p<where.size();++p)
+       gather_pr_col_ids(where[p]->pr,cid_set,NULL);
+    for(s=0;s<select_list.size();s++)
+       gather_se_col_ids(select_list[s]->se,cid_set,NULL);
+
+//                     Private variables : store the state of the functor.
+//                     1) variables for unpacked attributes
+//                     2) offsets of the upacked attributes
+//                     3) storage of partial functions
+//                     4) storage of complex literals (i.e., require a constructor)
+
+       ret += "private:\n";
+
+       // var to save the schema handles
+       ret += "\tint schema_handle0;\n";
+       ret += "\tint schema_handle1;\n";
+
+       // generate the declaration of all the variables related to
+       // temp tuples generation
+       ret += gen_decl_temp_vars();
+       // tuple metadata offsets
+       ret += "\tint tuple_metadata_offset0, tuple_metadata_offset1;\n";
+
+//                     unpacked attribute storage, offsets
+       ret += "//\t\tstorage and offsets of accessed fields.\n";
+       ret += generate_access_vars(cid_set, schema);
+
+
+//                     Variables to store results of partial functions.
+//                     WARNING find_partial_functions modifies the SE
+//                     (it marks the partial function id).
+       ret += "//\t\tParital function result storage\n";
+       vector<scalarexp_t *> partial_fcns;
+       vector<int> fcn_ref_cnt;
+       vector<bool> is_partial_fcn;
+       for(s=0;s<select_list.size();s++){
+               find_partial_fcns(select_list[s]->se, &partial_fcns,NULL,NULL,  Ext_fcns);
+       }
+       for(p=0;p<where.size();p++){
+               find_partial_fcns_pr(where[p]->pr, &partial_fcns,NULL,NULL,  Ext_fcns);
+       }
+       if(partial_fcns.size()>0){
+         ret += "/*\t\tVariables for storing results of partial functions. \t*/\n";
+         ret += generate_partial_fcn_vars(partial_fcns,fcn_ref_cnt,is_partial_fcn,false);
+       }
+
+//                     Complex literals (i.e., they need constructors)
+       ret += "//\t\tComplex literal storage.\n";
+       cplx_lit_table *complex_literals = this->get_cplx_lit_tbl(Ext_fcns);
+       ret += generate_complex_lit_vars(complex_literals);
+//                     We need the following to handle strings in outer joins.
+//                             NEED AN EMPTY LITERAL FOR EAcH STRUCTURED LITERAL
+       ret += "\tstruct vstring EmptyString;\n";
+       ret += "\tstruct hfta_ipv6_str EmptyIp6;\n";
+
+//                     Pass-by-handle parameters
+       ret += "//\t\tPass-by-handle storage.\n";
+       vector<handle_param_tbl_entry *> param_handle_table = this->get_handle_param_tbl(Ext_fcns);
+       ret += generate_pass_by_handle_vars(param_handle_table);
+
+
+//                     variables to hold parameters.
+       ret += "//\tfor query parameters\n";
+       ret += generate_param_vars(param_tbl);
+
+
+       ret += "\npublic:\n";
+//-------------------
+//                     The functor constructor
+//                     pass in the schema handle.
+//                     1) make assignments to the unpack offset variables
+//                     2) initialize the complex literals
+
+       ret += "//\t\tFunctor constructor.\n";
+       ret +=  this->generate_functor_name()+"(int schema_handle0, int schema_handle1){\n";
+
+       ret += "\t\tthis->schema_handle0 = schema_handle0;\n";
+       ret += "\t\tthis->schema_handle1 = schema_handle1;\n";
+//             metadata offsets
+       ret += "\ttuple_metadata_offset0 = ftaschema_get_tuple_metadata_offset(schema_handle0);\n";
+       ret += "\ttuple_metadata_offset1 = ftaschema_get_tuple_metadata_offset(schema_handle1);\n";
+
+//             unpack vars
+       ret += "//\t\tGet offsets for unpacking fields from input tuple.\n";
+       ret += gen_access_var_init(cid_set);
+
+//             complex literals
+       ret += "//\t\tInitialize complex literals.\n";
+       ret += gen_complex_lit_init(complex_literals);
+//             Initialize EmptyString to the ... empty string
+//                             NEED AN EMPTY LITERAL FOR EAcH STRUCTURED LITERAL
+       literal_t mtstr_lit("");
+       ret += "\t" + mtstr_lit.to_hfta_C_code("&EmptyString")+";\n";
+       literal_t mip6_lit("0:0:0:0:0:0:0:0",LITERAL_IPV6);
+       ret += "\t" + mip6_lit.to_hfta_C_code("&EmptyIp6")+";\n";
+
+//             Initialize partial function results so they can be safely GC'd
+       ret += gen_partial_fcn_init(partial_fcns);
+
+//             Initialize non-query-parameter parameter handles
+       ret += gen_pass_by_handle_init(param_handle_table);
+
+//             Init temporal attributes referenced in select list
+       ret += gen_init_temp_vars(schema, select_list, NULL);
+
+
+       ret += "};\n";
+
+
+
+//-------------------
+//                     Functor destructor
+       ret += "//\t\tFunctor destructor.\n";
+       ret +=  "~"+this->generate_functor_name()+"(){\n";
+
+//                     clean up buffer type complex literals
+       ret += gen_complex_lit_dtr(complex_literals);
+
+//                     Deregister the pass-by-handle parameters
+       ret += "/* register and de-register the pass-by-handle parameters */\n";
+       ret += gen_pass_by_handle_dtr(param_handle_table);
+
+//                     clean up partial function results.
+       ret += "/* clean up partial function storage    */\n";
+       ret += gen_partial_fcn_dtr(partial_fcns);
+
+//                     Destroy the parameters, if any need to be destroyed
+       ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+
+       ret += "};\n\n";
+
+
+//-------------------
+//                     Parameter manipulation routines
+       ret += generate_load_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+       ret += generate_delete_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+
+//-------------------
+//                     Register new parameter block
+
+       ret += "int set_param_block(gs_int32_t sz, void* value){\n";
+         ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+         ret += "\treturn this->load_params_"+this->generate_functor_name()+
+                               "(sz, value);\n";
+       ret += "};\n\n";
+
+
+//-------------------
+//                     The create_key method.
+//                     Perform heap allocation.
+//                     ASSUME : the LHS of the preds reference channel 0 attributes
+//                     NOTE : it may fail if a partial function fails.
+
+       ret += this->generate_functor_name()+"_keydef *create_key(host_tuple &tup, bool &failed){\n";
+//             Variables for execution of the function.
+       ret+="\t"+this->generate_functor_name()+"_keydef *retval = NULL;\n";
+       ret+="\tgs_int32_t problem = 0;\n";
+
+//             Assume unsuccessful completion
+       ret+= "\tfailed = true;\n";
+
+//             Switch the processing based on the channel
+       ret+="\tif(tup.channel == 0){\n";
+       ret+="// ------------ processing for channel 0\n";
+       ret+="\t\thost_tuple &tup0 = tup;\n";
+//             Gather partial fcns and colids ref'd by this branch
+       pfcn_refs.clear();
+       new_cids.clear(); local_cids.clear();
+       for(p=0;p<hash_eq.size();p++){
+               collect_partial_fcns(hash_eq[p]->pr->get_left_se(), pfcn_refs);
+               gather_se_col_ids(hash_eq[p]->pr->get_left_se(),local_cids,NULL);
+       }
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       ret += gen_partial_fcn_dtr(partial_fcns,pfcn_refs);
+
+//                     Evaluate the partial functions
+       ret += gen_full_unpack_partial_fcn(schema, partial_fcns, pfcn_refs,
+                               new_cids, NULL, "NULL", needs_xform);
+//                     test passed -- unpack remaining cids.
+       ret += gen_remaining_colrefs(schema, local_cids, new_cids, "NULL", needs_xform);
+
+//                     Alloc and load a key object
+       ret += "\t\tretval = new "+this->generate_functor_name()+"_keydef();\n";
+       for(p=0;p<hash_eq.size();p++){
+               data_type *hdt = hash_eq[p]->pr->get_left_se()->get_data_type();
+               if(hdt->is_buffer_type()){
+                       string vname = "tmp_keyvar"+int_to_string(p);
+                       ret += "\t\t"+hdt->make_host_cvar(vname)+" = "+generate_se_code(hash_eq[p]->pr->get_left_se(),schema)+";\n";
+                       ret += "\t\t"+hdt->get_hfta_buffer_assign_copy()+"(&(retval->hashkey_var"+int_to_string(p)+"),&"+vname+");\n";
+               }else{
+                 sprintf(tmpstr,"\t\tretval->hashkey_var%d = %s;\n",
+                       p,generate_se_code(hash_eq[p]->pr->get_left_se(),schema).c_str() );
+                 ret += tmpstr;
+               }
+       }
+       ret += "\t}else{\n";
+
+       ret+="// ------------ processing for channel 1\n";
+       ret+="\t\thost_tuple &tup1 = tup;\n";
+//             Gather partial fcns and colids ref'd by this branch
+       pfcn_refs.clear();
+       new_cids.clear(); local_cids.clear();
+       for(p=0;p<hash_eq.size();p++){
+               collect_partial_fcns(hash_eq[p]->pr->get_right_se(), pfcn_refs);
+               gather_se_col_ids(hash_eq[p]->pr->get_right_se(),local_cids,NULL);
+       }
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       ret += gen_partial_fcn_dtr(partial_fcns,pfcn_refs);
+
+//                     Evaluate the partial functions
+       ret += gen_full_unpack_partial_fcn(schema, partial_fcns, pfcn_refs,
+                               new_cids, NULL, "NULL", needs_xform);
+
+//                     test passed -- unpack remaining cids.
+       ret += gen_remaining_colrefs(schema, local_cids, new_cids, "NULL", needs_xform);
+
+//                     Alloc and load a key object
+       ret += "\t\tretval = new "+this->generate_functor_name()+"_keydef();\n";
+       for(p=0;p<hash_eq.size();p++){
+               data_type *hdt = hash_eq[p]->pr->get_right_se()->get_data_type();
+               if(hdt->is_buffer_type()){
+                       string vname = "tmp_keyvar"+int_to_string(p);
+                       ret += "\t\t"+hdt->make_host_cvar(vname)+" = "+generate_se_code(hash_eq[p]->pr->get_right_se(),schema)+";\n";
+                       ret += "\t\t"+hdt->get_hfta_buffer_assign_copy()+"(&(retval->hashkey_var"+int_to_string(p)+"),&"+vname+");\n";
+               }else{
+                 sprintf(tmpstr,"\t\tretval->hashkey_var%d = %s;\n",
+                       p,generate_se_code(hash_eq[p]->pr->get_right_se(),schema).c_str() );
+                 ret += tmpstr;
+               }
+       }
+       ret += "\t}\n";
+
+       ret += "\tfailed = false;\n";
+       ret += "\t return retval;\n";
+       ret += "}\n";
+
+
+//-------------------
+//                     The load_ts method.
+//                     load into an allocated buffer.
+//                     ASSUME : the LHS of the preds reference channel 0 attributes
+//                     NOTE : it may fail if a partial function fails.
+//                     NOTE : cann't handle buffer attributes
+
+       ret += "bool load_ts_from_tup("+this->generate_functor_name()+"_tempeqdef *ts, host_tuple &tup){\n";
+//             Variables for execution of the function.
+       ret+="\tgs_int32_t problem = 0;\n";
+
+//             Switch the processing based on the channel
+       ret+="\tif(tup.channel == 0){\n";
+       ret+="// ------------ processing for channel 0\n";
+       ret+="\t\thost_tuple &tup0 = tup;\n";
+
+//             Gather partial fcns and colids ref'd by this branch
+       pfcn_refs.clear();
+       new_cids.clear(); local_cids.clear();
+       for(p=0;p<temporal_eq.size();p++){
+               collect_partial_fcns(temporal_eq[p]->pr->get_left_se(), pfcn_refs);
+               gather_se_col_ids(temporal_eq[p]->pr->get_left_se(),local_cids,NULL);
+       }
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       ret += gen_partial_fcn_dtr(partial_fcns,pfcn_refs);
+
+//                     Evaluate the partial functions
+       ret += gen_full_unpack_partial_fcn(schema, partial_fcns, pfcn_refs,
+                               new_cids, NULL, "false", needs_xform);
+
+//                     test passed -- unpack remaining cids.
+       ret += gen_remaining_colrefs(schema, local_cids, new_cids, "false", needs_xform);
+
+//                     load the temporal key object
+       for(p=0;p<temporal_eq.size();p++){
+               sprintf(tmpstr,"\t\tts->tempeq_var%d = %s;\n",
+                       p,generate_se_code(temporal_eq[p]->pr->get_left_se(),schema).c_str() );
+               ret += tmpstr;
+       }
+
+       ret += "\t}else{\n";
+
+       ret+="// ------------ processing for channel 1\n";
+       ret+="\t\thost_tuple &tup1 = tup;\n";
+
+//             Gather partial fcns and colids ref'd by this branch
+       pfcn_refs.clear();
+       new_cids.clear(); local_cids.clear();
+       for(p=0;p<temporal_eq.size();p++){
+               collect_partial_fcns(temporal_eq[p]->pr->get_right_se(), pfcn_refs);
+               gather_se_col_ids(temporal_eq[p]->pr->get_right_se(),local_cids,NULL);
+       }
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       ret += gen_partial_fcn_dtr(partial_fcns,pfcn_refs);
+
+//                     Evaluate the partial functions
+       ret += gen_full_unpack_partial_fcn(schema, partial_fcns, pfcn_refs,
+                               new_cids, NULL, "false", needs_xform);
+
+//                     test passed -- unpack remaining cids.
+       ret += gen_remaining_colrefs(schema, local_cids, new_cids, "false", needs_xform);
+
+//                     load the key object
+       for(p=0;p<temporal_eq.size();p++){
+               sprintf(tmpstr,"\t\tts->tempeq_var%d = %s;\n",
+                       p,generate_se_code(temporal_eq[p]->pr->get_right_se(),schema).c_str() );
+               ret += tmpstr;
+       }
+
+       ret += "\t}\n";
+
+       ret += "\t return true;\n";
+       ret += "}\n";
+
+
+//     ------------------------------
+//             Load ts from ts
+//             (i.e make a copy)
+
+       ret += "bool load_ts_from_ts("+this->generate_functor_name()+"_tempeqdef *lts,"+this->generate_functor_name()+"_tempeqdef *rts){\n";
+       for(p=0;p<temporal_eq.size();p++){
+               sprintf(tmpstr,"\tlts->tempeq_var%d = rts->tempeq_var%d;\n",p,p);
+               ret += tmpstr;
+       }
+       ret += "}\n";
+
+//     -------------------------------------
+//             compare_ts_to_ts
+//             There should be only one variable to compare.
+//             If there is more, assume an arbitrary lexicographic order.
+
+       ret += "int compare_ts_with_ts("+this->generate_functor_name()+"_tempeqdef *lts,"+this->generate_functor_name()+"_tempeqdef *rts){\n";
+       for(p=0;p<temporal_eq.size();p++){
+               sprintf(tmpstr,"\tif(lts->tempeq_var%d < rts->tempeq_var%d) return(-1);\n",p,p);
+               ret += tmpstr;
+               sprintf(tmpstr,"\tif(lts->tempeq_var%d > rts->tempeq_var%d) return(1);\n",p,p);
+               ret += tmpstr;
+       }
+       ret += "\treturn(0);\n";
+       ret += "}\n";
+
+//     ------------------------------------------
+//             apply_prefilter
+//             apply the prefilter
+
+       ret += "bool apply_prefilter(host_tuple &tup){\n";
+
+//             Variables for this procedure
+       ret+="\tgs_int32_t problem = 0;\n";
+       ret+="\tgs_retval_t retval;\n";
+
+//             Switch the processing based on the channel
+       ret+="\tif(tup.channel == 0){\n";
+       ret+="// ------------ processing for channel 0\n";
+       ret+="\t\thost_tuple &tup0 = tup;\n";
+//             Gather partial fcns and colids ref'd by this branch
+       pfcn_refs.clear();
+       new_cids.clear(); local_cids.clear();
+       for(p=0;p<prefilter[0].size();p++){
+               collect_partial_fcns_pr((prefilter[0])[p]->pr, pfcn_refs);
+       }
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       ret += gen_partial_fcn_dtr(partial_fcns,pfcn_refs);
+
+       for(p=0;p<(prefilter[0]).size();++p){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.\n",p);
+               ret += tmpstr;
+//                     Find the set of variables accessed in this CNF elem,
+//                     but in no previous element.
+               col_id_set new_pr_cids;
+               get_new_pred_cids((prefilter[0])[p]->pr,local_cids,new_pr_cids, NULL);
+//                     Unpack these values.
+               ret += gen_unpack_cids(schema, new_pr_cids, "false", needs_xform);
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pr_pfcn_refs;
+               collect_partial_fcns_pr((prefilter[0])[p]->pr, pr_pfcn_refs);
+               ret += gen_unpack_partial_fcn(schema,partial_fcns,pr_pfcn_refs,"false");
+
+               ret += "\t\tif( !("+generate_predicate_code((prefilter[0])[p]->pr,schema)+") ) return(false);\n";
+       }
+       ret += "\t}else{\n";
+       ret+="// ------------ processing for channel 1\n";
+       ret+="\t\thost_tuple &tup1 = tup;\n";
+//             Gather partial fcns and colids ref'd by this branch
+       pfcn_refs.clear();
+       new_cids.clear(); local_cids.clear();
+       for(p=0;p<prefilter[1].size();p++){
+               collect_partial_fcns_pr((prefilter[1])[p]->pr, pfcn_refs);
+       }
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       ret += gen_partial_fcn_dtr(partial_fcns,pfcn_refs);
+
+       for(p=0;p<(prefilter[1]).size();++p){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.\n",p);
+               ret += tmpstr;
+//                     Find the set of variables accessed in this CNF elem,
+//                     but in no previous element.
+               col_id_set pr_new_cids;
+               get_new_pred_cids((prefilter[1])[p]->pr,local_cids, pr_new_cids, NULL);
+//                     Unpack these values.
+               ret += gen_unpack_cids(schema, pr_new_cids, "false", needs_xform);
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pr_pfcn_refs;
+               collect_partial_fcns_pr((prefilter[1])[p]->pr, pr_pfcn_refs);
+               ret += gen_unpack_partial_fcn(schema,partial_fcns,pr_pfcn_refs,"false");
+
+               ret += "\t\tif( !("+generate_predicate_code((prefilter[1])[p]->pr,schema)+ ") ) return(false);\n";
+       }
+
+       ret += "\t}\n";
+       ret+="\treturn true;\n";
+       ret += "}\n";
+
+
+//     -------------------------------------
+//                     create_output_tuple
+//                     If the postfilter on the pair of tuples passes,
+//                     create an output tuple from the combined information.
+//                     (Plus, outer join processing)
+
+       ret += "host_tuple create_output_tuple(const host_tuple &tup0, const host_tuple &tup1, bool &failed){\n";
+
+       ret += "\thost_tuple tup;\n";
+       ret += "\tfailed = true;\n";
+       ret += "\tgs_retval_t retval = 0;\n";
+       ret += "\tgs_int32_t problem = 0;\n";
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       pfcn_refs.clear();
+       new_cids.clear(); local_cids.clear();
+       for(p=0;p<postfilter.size();p++){
+               collect_partial_fcns_pr(postfilter[p]->pr, pfcn_refs);
+       }
+       for(s=0;s<select_list.size();s++){
+               collect_partial_fcns(select_list[s]->se, pfcn_refs);
+       }
+       ret += gen_partial_fcn_dtr(partial_fcns,pfcn_refs);
+
+
+       ret+="\tif(tup0.data && tup1.data){\n";
+//                     Evaluate the postfilter
+       new_cids.clear(); local_cids.clear();
+       for(p=0;p<postfilter.size();p++){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.\n",p);
+               ret += tmpstr;
+//                     Find the set of variables accessed in this CNF elem,
+//                     but in no previous element.
+               col_id_set pr_new_cids;
+               get_new_pred_cids(postfilter[p]->pr,local_cids, pr_new_cids, NULL);
+//                     Unpack these values.
+               ret += gen_unpack_cids(schema, pr_new_cids, "tup", needs_xform);
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pr_pfcn_refs;
+               collect_partial_fcns_pr(postfilter[p]->pr, pr_pfcn_refs);
+               ret += gen_unpack_partial_fcn(schema,partial_fcns,pr_pfcn_refs,"tup");
+
+               ret += "\t\tif( !("+generate_predicate_code(postfilter[p]->pr,schema)+ ") ) return(tup);\n";
+       }
+
+
+//             postfilter passed, evaluate partial functions for select list
+
+       set<int> sl_pfcns;
+       col_id_set se_cids;
+       for(s=0;s<select_list.size();s++){
+               collect_partial_fcns(select_list[s]->se, sl_pfcns);
+       }
+
+       if(sl_pfcns.size() > 0)
+               ret += "//\t\tUnpack remaining partial fcns.\n";
+       ret += gen_full_unpack_partial_fcn(schema, partial_fcns, sl_pfcns,
+                                       local_cids, NULL, "tup", needs_xform);
+
+//                     Unpack remaining fields
+       ret += "//\t\tunpack any remaining fields from the input tuples.\n";
+       for(s=0;s<select_list.size();s++)
+               get_new_se_cids(select_list[s]->se, local_cids,se_cids,NULL);
+       ret += gen_unpack_cids(schema,  se_cids,"tup", needs_xform);
+
+
+//                     Deal with outer join stuff
+       col_id_set l_cids, r_cids;
+       col_id_set::iterator ocsi;
+       for(ocsi=local_cids.begin();ocsi!=local_cids.end();++ocsi){
+               if((*ocsi).tblvar_ref == 0) l_cids.insert((*ocsi));
+               else                                            r_cids.insert((*ocsi));
+       }
+       for(ocsi=se_cids.begin();ocsi!=se_cids.end();++ocsi){
+               if((*ocsi).tblvar_ref == 0) l_cids.insert((*ocsi));
+               else                                            r_cids.insert((*ocsi));
+       }
+
+       ret += "\t}else if(tup0.data){\n";
+       string unpack_null = ""; col_id_set extra_cids;
+       for(ocsi=r_cids.begin();ocsi!=r_cids.end();++ocsi){
+               string field = (*ocsi).field;
+               if(r_equiv.count(field)){
+                       unpack_null+="\t\tunpack_var_"+field+"_1="+generate_se_code(r_equiv[field],schema)+";\n";
+                       get_new_se_cids(r_equiv[field],l_cids,new_cids,NULL);
+               }else{
+               int schref = (*ocsi).schema_ref;
+                       data_type dt(schema->get_type_name(schref,field));
+                       literal_t empty_lit(dt.type_indicator());
+                       if(empty_lit.is_cpx_lit()){
+//                             sprintf(tmpstr,"&(unpack_var_%s_1)",field.c_str());
+//                             unpack_null += "\t"+empty_lit.to_hfta_C_code(tmpstr)+";\n";
+//                                     NB : works for string type only
+//                                     NNB: installed fix for ipv6, more of this should be pushed
+//                                             into the literal_t code.
+                               unpack_null+="\tunpack_var_"+field+"_1= "+empty_lit.hfta_empty_literal_name()+";\n";
+                       }else{
+                               unpack_null+="\tunpack_var_"+field+"_1="+empty_lit.to_hfta_C_code("")+";\n";
+                       }
+               }
+       }
+       ret += gen_unpack_cids(schema,  l_cids, "tup", needs_xform);
+       ret += gen_unpack_cids(schema,  extra_cids, "tup", needs_xform);
+       ret += unpack_null;
+       ret += gen_unpack_partial_fcn(schema, partial_fcns, sl_pfcns, "tup");
+
+       ret+="\t}else{\n";
+       unpack_null = ""; extra_cids.clear();
+       for(ocsi=l_cids.begin();ocsi!=l_cids.end();++ocsi){
+               string field = (*ocsi).field;
+               if(l_equiv.count(field)){
+                       unpack_null+="\t\tunpack_var_"+field+"_0="+generate_se_code(l_equiv[field],schema)+";\n";
+                       get_new_se_cids(l_equiv[field],r_cids,new_cids,NULL);
+               }else{
+               int schref = (*ocsi).schema_ref;
+                       data_type dt(schema->get_type_name(schref,field));
+                       literal_t empty_lit(dt.type_indicator());
+                       if(empty_lit.is_cpx_lit()){
+//                             sprintf(tmpstr,"&(unpack_var_%s_0)",field.c_str());
+//                             unpack_null += "\t"+empty_lit.to_hfta_C_code(tmpstr)+";\n";
+//                                     NB : works for string type only
+//                                     NNB: installed fix for ipv6, more of this should be pushed
+//                                             into the literal_t code.
+                               unpack_null+="\tunpack_var_"+field+"_0= "+empty_lit.hfta_empty_literal_name()+";\n";
+                       }else{
+                               unpack_null+="\tunpack_var_"+field+"_0="+empty_lit.to_hfta_C_code("")+";\n";
+                       }
+               }
+       }
+       ret += gen_unpack_cids(schema,  r_cids, "tup", needs_xform);
+       ret += gen_unpack_cids(schema,  extra_cids, "tup", needs_xform);
+       ret += unpack_null;
+       ret += gen_unpack_partial_fcn(schema, partial_fcns, sl_pfcns, "tup");
+       ret+="\t}\n";
+
+
+
+//          Unpack any BUFFER type selections into temporaries
+//          so that I can compute their size and not have
+//          to recompute their value during tuple packing.
+//          I can use regular assignment here because
+//          these temporaries are non-persistent.
+
+       ret += "//\t\tCompute the size of the tuple.\n";
+       ret += "//\t\t\tNote: buffer storage packed at the end of the tuple.\n";
+
+//                     Unpack all buffer type selections, to be able to compute their size
+       ret += gen_buffer_selvars(schema, select_list);
+
+//      The size of the tuple is the size of the tuple struct plus the
+//      size of the buffers to be copied in.
+
+    ret+="\ttup.tuple_size = sizeof(" + generate_tuple_name( this->get_node_name()) +") + sizeof(gs_uint8_t)";
+       ret += gen_buffer_selvars_size(select_list,schema);
+      ret.append(";\n");
+
+//             Allocate tuple data block.
+       ret += "//\t\tCreate the tuple block.\n";
+         ret += "\ttup.data = malloc(tup.tuple_size);\n";
+         ret += "\ttup.heap_resident = true;\n";
+//       ret += "\ttup.channel = 0;\n";
+
+//             Mark tuple as regular
+         ret += "\t*((gs_sp_t )tup.data + sizeof(" + generate_tuple_name( this->get_node_name()) +")) = REGULAR_TUPLE;\n";
+
+
+         ret += "\t"+generate_tuple_name( this->get_node_name())+" *tuple = ("+
+                               generate_tuple_name( this->get_node_name())+" *)(tup.data);\n";
+
+//             Start packing.
+//                     (Here, offsets are hard-wired.  is this a problem?)
+
+       ret += "//\t\tPack the fields into the tuple.\n";
+       ret += gen_pack_tuple(schema,select_list,this->get_node_name(), false );
+
+//                     Delete string temporaries
+       ret += gen_buffer_selvars_dtr(select_list);
+
+       ret += "\tfailed = false;\n";
+       ret += "\treturn tup;\n";
+       ret += "};\n";
+
+
+
+//-----------------------------
+//                     Method for checking whether tuple is temporal
+
+       ret += "bool temp_status_received(host_tuple &tup){\n";
+
+//             Switch the processing based on the channel
+       ret+="\tif(tup.channel == 0){\n";
+       ret+="\t\thost_tuple &tup0 = tup;\n";
+       ret += gen_temp_tuple_check(this->node_name, 0);
+       ret += "\t}else{\n";
+       ret+="\t\thost_tuple &tup1 = tup;\n";
+       ret += gen_temp_tuple_check(this->node_name, 1);
+       ret += "\t}\n";
+       ret += "\treturn temp_tuple_received;\n};\n\n";
+
+
+//-------------------------------------------------------------------
+//             Temporal update functions
+
+
+//             create a temp status tuple
+       ret += "int create_temp_status_tuple(const host_tuple &tup0, const host_tuple &tup1, host_tuple& result) {\n\n";
+
+       ret += "\tgs_retval_t retval = 0;\n";
+       ret += "\tgs_int32_t problem = 0;\n";
+
+       ret += "\tif(tup0.data){\n";
+
+//             Unpack all the temporal attributes references in select list
+       col_id_set found_cids;
+
+       for(s=0;s<select_list.size();s++){
+               if (select_list[s]->se->get_data_type()->is_temporal()) {
+//                     Find the set of attributes accessed in this SE
+                       col_id_set new_cids;
+                       get_new_se_cids(select_list[s]->se,found_cids, new_cids, NULL);
+               }
+       }
+
+       //                      Deal with outer join stuff
+       l_cids.clear(), r_cids.clear();
+       for(ocsi=found_cids.begin();ocsi!=found_cids.end();++ocsi){
+               if((*ocsi).tblvar_ref == 0) l_cids.insert((*ocsi));
+               else                                            r_cids.insert((*ocsi));
+       }
+       unpack_null = "";
+       extra_cids.clear();
+       for(ocsi=r_cids.begin();ocsi!=r_cids.end();++ocsi){
+               string field = (*ocsi).field;
+               if(r_equiv.count(field)){
+                       unpack_null+="\t\tunpack_var_"+field+"_1="+generate_se_code(r_equiv[field],schema)+";\n";
+                       col_id_set addnl_cids;
+                       get_new_se_cids(r_equiv[field],l_cids,addnl_cids,NULL);
+               }else{
+               int schref = (*ocsi).schema_ref;
+                       data_type dt(schema->get_type_name(schref,field));
+                       literal_t empty_lit(dt.type_indicator());
+                       if(empty_lit.is_cpx_lit()){
+                               sprintf(tmpstr,"&(unpack_var_%s_1)",field.c_str());
+                               unpack_null += "\t"+empty_lit.to_hfta_C_code(tmpstr)+";\n";
+                       }else{
+                               unpack_null+="\tunpack_var_"+field+"_1="+empty_lit.to_hfta_C_code("")+";\n";
+                       }
+               }
+       }
+       ret += gen_unpack_cids(schema,  l_cids, "1", needs_xform);
+       ret += gen_unpack_cids(schema,  extra_cids, "1", needs_xform);
+       ret += unpack_null;
+
+       ret+="\t}else if (tup1.data) {\n";
+       unpack_null = ""; extra_cids.clear();
+       for(ocsi=l_cids.begin();ocsi!=l_cids.end();++ocsi){
+               string field = (*ocsi).field;
+               if(l_equiv.count(field)){
+                       unpack_null+="\t\tunpack_var_"+field+"_0="+generate_se_code(l_equiv[field],schema)+";\n";
+                       col_id_set addnl_cids;
+                       get_new_se_cids(l_equiv[field],r_cids,addnl_cids,NULL);
+               }else{
+               int schref = (*ocsi).schema_ref;
+                       data_type dt(schema->get_type_name(schref,field));
+                       literal_t empty_lit(dt.type_indicator());
+                       if(empty_lit.is_cpx_lit()){
+                               sprintf(tmpstr,"&(unpack_var_%s_0)",field.c_str());
+                               unpack_null += "\t"+empty_lit.to_hfta_C_code(tmpstr)+";\n";
+                       }else{
+                               unpack_null+="\tunpack_var_"+field+"_0="+empty_lit.to_hfta_C_code("")+";\n";
+                       }
+               }
+       }
+       ret += gen_unpack_cids(schema,  r_cids, "1", needs_xform);
+       ret += gen_unpack_cids(schema,  extra_cids, "1", needs_xform);
+       ret += unpack_null;
+       ret+="\t}\n";
+
+       ret += gen_init_temp_status_tuple(this->get_node_name());
+
+//             Start packing.
+       ret += "//\t\tPack the fields into the tuple.\n";
+       ret += gen_pack_tuple(schema,select_list,this->get_node_name(), true );
+
+
+       ret += "\treturn 0;\n";
+       ret += "};\n\n";
+
+
+       ret += "};\n\n\n";
+
+//----------------------------------------------------------
+//                     The hash function
+
+       ret += "struct "+generate_functor_name()+"_hash_func{\n";
+       ret += "\tgs_uint32_t operator()(const "+generate_functor_name()+
+                               "_keydef *key) const{\n";
+       ret += "\t\treturn( (";
+       if(hashkey_dt.size() > 0){
+         for(p=0;p<hashkey_dt.size();p++){
+               if(p>0) ret += "^";
+               if(hashkey_dt[p]->use_hashfunc()){
+//                     sprintf(tmpstr,"%s(&(key->hashkey_var%d))",hashkey_dt[p]->get_hfta_hashfunc().c_str(),p);
+                       if(hashkey_dt[p]->is_buffer_type())
+                               sprintf(tmpstr,"(%s*%s(&(key->hashkey_var%d)))",hash_nums[p%NRANDS].c_str(),hashkey_dt[p]->get_hfta_hashfunc().c_str(),p);
+                       else
+                               sprintf(tmpstr,"(%s*%s(key->hashkey_var%d))",hash_nums[p%NRANDS].c_str(),hashkey_dt[p]->get_hfta_hashfunc().c_str(),p);
+               }else{
+                       sprintf(tmpstr,"(%s*key->hashkey_var%d)",hash_nums[p%NRANDS].c_str(),p);
+               }
+               ret += tmpstr;
+         }
+       }else{
+               ret += "0";
+       }
+       ret += ") >> 32);\n";
+       ret += "\t}\n";
+       ret += "};\n\n";
+
+//----------------------------------------------------------
+//                     The comparison function
+
+       ret += "struct "+generate_functor_name()+"_equal_func{\n";
+       ret += "\tbool operator()(const "+generate_functor_name()+"_keydef *key1, "+
+                       generate_functor_name()+"_keydef *key2) const{\n";
+       ret += "\t\treturn( (";
+       if(hashkey_dt.size() > 0){
+         for(p=0;p<hashkey_dt.size();p++){
+               if(p>0) ret += ") && (";
+               if(hashkey_dt[p]->complex_comparison(hashkey_dt[p])){
+                 if(hashkey_dt[p]->is_buffer_type())
+                       sprintf(tmpstr,"(%s(&(key1->hashkey_var%d), &(key2->hashkey_var%d))==0)",
+                               hashkey_dt[p]->get_hfta_comparison_fcn(hashkey_dt[p]).c_str(),p,p);
+                 else
+                       sprintf(tmpstr,"(%s((key1->hashkey_var%d), (key2->hashkey_var%d))==0)",
+                               hashkey_dt[p]->get_hfta_comparison_fcn(hashkey_dt[p]).c_str(),p,p);
+               }else{
+                       sprintf(tmpstr,"key1->hashkey_var%d == key2->hashkey_var%d",p,p);
+               }
+               ret += tmpstr;
+         }
+       }else{
+               ret += "1";
+       }
+       ret += ") );\n";
+       ret += "\t}\n";
+       ret += "};\n\n";
+
+
+       return(ret);
+}
+
+
+
+string join_eq_hash_qpn::generate_operator(int i, string params){
+
+               return(
+                       "       join_eq_hash_operator<" +
+                       generate_functor_name()+ ","+
+                       generate_functor_name() + "_tempeqdef,"+
+                       generate_functor_name() + "_keydef,"+
+                       generate_functor_name()+"_hash_func,"+
+                       generate_functor_name()+"_equal_func"
+                       "> *op"+int_to_string(i)+" = new join_eq_hash_operator<"+
+                       generate_functor_name()+","+
+                       generate_functor_name() + "_tempeqdef,"+
+                       generate_functor_name() + "_keydef,"+
+                       generate_functor_name()+"_hash_func,"+
+                       generate_functor_name()+"_equal_func"
+                       ">("+params+", "+
+                       int_to_string(from[0]->get_property()+2*from[1]->get_property())+", \"" + get_node_name() +
+"\");\n"
+               );
+}
+
+
+
+////////////////////////////////////////////////////////////////
+////   SGAHCWCB functor
+
+
+
+string sgahcwcb_qpn::generate_functor_name(){
+       return("sgahcwcb_functor_" + normalize_name(this->get_node_name()));
+}
+
+
+string sgahcwcb_qpn::generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, vector<bool> &needs_xform){
+       int a,g,w,s;
+
+
+//                     Initialize generate utility globals
+       segen_gb_tbl = &(gb_tbl);
+
+
+//--------------------------------
+//                     group definition class
+       string ret = "class " + generate_functor_name() + "_groupdef{\n";
+       ret += "public:\n";
+       ret += "\tbool valid;\n";
+       for(g=0;g<this->gb_tbl.size();g++){
+               sprintf(tmpstr,"gb_var%d",g);
+               ret+="\t"+this->gb_tbl.get_data_type(g)->make_host_cvar(tmpstr)+";\n";
+       }
+//             Constructors
+       ret += "\t"+generate_functor_name() + "_groupdef(){valid=true;};\n";
+       ret += "\t"+generate_functor_name() + "_groupdef("+
+               this->generate_functor_name() + "_groupdef *gd){\n";
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&gb_var%d, &(gd->gb_var%d));\n",
+                         gdt->get_hfta_buffer_assign_copy().c_str(),g,g );
+                       ret += tmpstr;
+               }else{
+                       sprintf(tmpstr,"\t\tgb_var%d = gd->gb_var%d;\n",g,g);
+                       ret += tmpstr;
+               }
+       }
+       ret += "\tvalid=true;\n";
+       ret += "\t};\n";
+//             destructor
+       ret += "\t~"+ generate_functor_name() + "_groupdef(){\n";
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&gb_var%d);\n",
+                         gdt->get_hfta_buffer_destroy().c_str(), g );
+                       ret += tmpstr;
+               }
+       }
+       ret += "\t};\n";
+       ret +="};\n\n";
+
+//--------------------------------
+//                     aggr definition class
+       ret += "class " + this->generate_functor_name() + "_aggrdef{\n";
+       ret += "public:\n";
+       for(a=0;a<aggr_tbl.size();a++){
+aggr_table_entry *ate = aggr_tbl.agr_tbl[a];
+               sprintf(tmpstr,"aggr_var%d",a);
+               if(aggr_tbl.is_builtin(a))
+               ret+="\t"+ aggr_tbl.get_data_type(a)->make_host_cvar(tmpstr)+";\n";
+               else
+               ret+="\t"+ aggr_tbl.get_storage_type(a)->make_host_cvar(tmpstr)+";\n";
+       }
+//             Constructors
+       ret += "\t"+this->generate_functor_name() + "_aggrdef(){};\n";
+//             destructor
+       ret += "\t~"+this->generate_functor_name() + "_aggrdef(){\n";
+       for(a=0;a<aggr_tbl.size();a++){
+aggr_table_entry *ate = aggr_tbl.agr_tbl[a];
+               if(aggr_tbl.is_builtin(a)){
+                       data_type *adt = aggr_tbl.get_data_type(a);
+                       if(adt->is_buffer_type()){
+                               sprintf(tmpstr,"\t\t%s(&aggr_var%d);\n",
+                               adt->get_hfta_buffer_destroy().c_str(), a );
+                               ret += tmpstr;
+                       }
+               }else{
+                       ret+="\t\t"+aggr_tbl.get_op(a)+"_HFTA_AGGR_DESTROY_(";
+                       if(aggr_tbl.get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="(aggr_var"+int_to_string(a)+"));\n";
+               }
+       }
+       ret += "\t};\n";
+       ret +="};\n\n";
+
+//--------------------------------
+//                     superaggr definition class
+       ret += "class " + this->generate_functor_name() + "_statedef{\n";
+       ret += "public:\n";
+       for(a=0;a<aggr_tbl.size();a++){
+aggr_table_entry *ate = aggr_tbl.agr_tbl[a];
+               if(ate->is_superaggr()){
+                       sprintf(tmpstr,"aggr_var%d",a);
+                       if(aggr_tbl.is_builtin(a))
+                       ret+="\t"+ aggr_tbl.get_data_type(a)->make_host_cvar(tmpstr)+";\n";
+                       else
+                       ret+="\t"+ aggr_tbl.get_storage_type(a)->make_host_cvar(tmpstr)+";\n";
+               }
+       }
+       set<string>::iterator ssi;
+       for(ssi=states_refd.begin(); ssi!=states_refd.end(); ++ssi){
+               string state_nm = (*ssi);
+               int state_id = Ext_fcns->lookup_state(state_nm);
+               data_type *dt = Ext_fcns->get_storage_dt(state_id);
+               string state_var = "state_var_"+state_nm;
+               ret += "\t"+dt->make_host_cvar(state_var)+";\n";
+       }
+//             Constructors
+       ret += "\t"+this->generate_functor_name() + "_statedef(){};\n";
+//             destructor
+       ret += "\t~"+this->generate_functor_name() + "_statedef(){\n";
+       for(a=0;a<aggr_tbl.size();a++){
+aggr_table_entry *ate = aggr_tbl.agr_tbl[a];
+               if(ate->is_superaggr()){
+                       if(aggr_tbl.is_builtin(a)){
+                               data_type *adt = aggr_tbl.get_data_type(a);
+                               if(adt->is_buffer_type()){
+                                       sprintf(tmpstr,"\t\t%s(&aggr_var%d);\n",
+                                       adt->get_hfta_buffer_destroy().c_str(), a );
+                                       ret += tmpstr;
+                               }
+                       }else{
+                               ret+="\t\t"+aggr_tbl.get_op(a)+"_HFTA_AGGR_DESTROY_(";
+                               if(aggr_tbl.get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                               ret+="(aggr_var"+int_to_string(a)+"));\n";
+                       }
+               }
+       }
+       for(ssi=states_refd.begin(); ssi!=states_refd.end(); ++ssi){
+               string state_nm = (*ssi);
+               int state_id = Ext_fcns->lookup_state(state_nm);
+               string state_var = "state_var_"+state_nm;
+               ret += "\t_sfun_state_destroy_"+state_nm+"(&"+state_var+");\n";
+       }
+
+       ret += "\t};\n";
+       ret +="};\n\n";
+
+
+//--------------------------------
+//                     gb functor class
+       ret += "class " + this->generate_functor_name() + "{\n";
+
+//                     Find variables referenced in this query node.
+
+  col_id_set cid_set;
+  col_id_set::iterator csi;
+
+    for(w=0;w<where.size();++w)
+       gather_pr_col_ids(where[w]->pr,cid_set,segen_gb_tbl);
+    for(w=0;w<having.size();++w)
+       gather_pr_col_ids(having[w]->pr,cid_set,segen_gb_tbl);
+    for(w=0;w<cleanby.size();++w)
+       gather_pr_col_ids(cleanby[w]->pr,cid_set,segen_gb_tbl);
+    for(w=0;w<cleanwhen.size();++w)
+       gather_pr_col_ids(cleanwhen[w]->pr,cid_set,segen_gb_tbl);
+       for(g=0;g<gb_tbl.size();g++)
+               gather_se_col_ids(gb_tbl.get_def(g),cid_set,segen_gb_tbl);
+
+    for(s=0;s<select_list.size();s++){
+       gather_se_col_ids(select_list[s]->se,cid_set,segen_gb_tbl);     // descends into aggregates
+    }
+
+
+//                     Private variables : store the state of the functor.
+//                     1) variables for unpacked attributes
+//                     2) offsets of the upacked attributes
+//                     3) storage of partial functions
+//                     4) storage of complex literals (i.e., require a constructor)
+
+       ret += "private:\n";
+
+       // var to save the schema handle
+       ret += "\tint schema_handle0;\n";
+
+       // generate the declaration of all the variables related to
+       // temp tuples generation
+       ret += gen_decl_temp_vars();
+
+//                     unpacked attribute storage, offsets
+       ret += "//\t\tstorage and offsets of accessed fields.\n";
+       ret += generate_access_vars(cid_set, schema);
+//             tuple metadata offset
+       ret += "\ttuple_metadata_offset0;\n";
+
+//                     Variables to store results of partial functions.
+//                     WARNING find_partial_functions modifies the SE
+//                     (it marks the partial function id).
+       ret += "//\t\tParital function result storage\n";
+       vector<scalarexp_t *> partial_fcns;
+       vector<int> fcn_ref_cnt;
+       vector<bool> is_partial_fcn;
+       for(s=0;s<select_list.size();s++){
+               find_partial_fcns(select_list[s]->se, &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(w=0;w<where.size();w++){
+               find_partial_fcns_pr(where[w]->pr, &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(w=0;w<having.size();w++){
+               find_partial_fcns_pr(having[w]->pr, &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(w=0;w<cleanby.size();w++){
+               find_partial_fcns_pr(cleanby[w]->pr, &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(w=0;w<cleanwhen.size();w++){
+               find_partial_fcns_pr(cleanwhen[w]->pr, &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(g=0;g<gb_tbl.size();g++){
+               find_partial_fcns(gb_tbl.get_def(g), &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(a=0;a<aggr_tbl.size();a++){
+               find_partial_fcns(aggr_tbl.get_aggr_se(a), &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       if(partial_fcns.size()>0){
+         ret += "/*\t\tVariables for storing results of partial functions. \t*/\n";
+         ret += generate_partial_fcn_vars(partial_fcns,fcn_ref_cnt,is_partial_fcn,false);
+       }
+
+//                     Complex literals (i.e., they need constructors)
+       ret += "//\t\tComplex literal storage.\n";
+       cplx_lit_table *complex_literals = this->get_cplx_lit_tbl(Ext_fcns);
+       ret += generate_complex_lit_vars(complex_literals);
+
+//                     Pass-by-handle parameters
+       ret += "//\t\tPass-by-handle storage.\n";
+       vector<handle_param_tbl_entry *> param_handle_table = this->get_handle_param_tbl(Ext_fcns);
+       ret += generate_pass_by_handle_vars(param_handle_table);
+
+//                     Create cached temporaries for UDAF return values.
+       ret += "//\t\tTemporaries for UDAF return values.\n";
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn_id = aggr_tbl.get_fcn_id(a);
+                       data_type *adt = Ext_fcns->get_fcn_dt(afcn_id);
+                       sprintf(tmpstr,"udaf_ret_%d", a);
+                       ret+="\t"+adt->make_host_cvar(tmpstr)+";\n";
+               }
+       }
+
+
+
+//                     variables to hold parameters.
+       ret += "//\tfor query parameters\n";
+       ret += generate_param_vars(param_tbl);
+
+//             Is there a temporal flush?  If so create flush temporaries,
+//             create flush indicator.
+       bool uses_temporal_flush = false;
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_temporal())
+                       uses_temporal_flush = true;
+       }
+
+       if(uses_temporal_flush){
+               ret += "//\t\tFor temporal flush\n";
+               for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+                       if(gdt->is_temporal()){
+                         sprintf(tmpstr,"last_gb%d",g);
+                         ret+="\t"+gb_tbl.get_data_type(g)->make_host_cvar(tmpstr)+";\n";
+                         sprintf(tmpstr,"last_flushed_gb%d",g);
+                         ret+="\t"+gb_tbl.get_data_type(g)->make_host_cvar(tmpstr)+";\n";
+                       }
+               }
+               ret += "\tbool needs_temporal_flush;\n";
+       }
+
+//                     The publicly exposed functions
+
+       ret += "\npublic:\n";
+
+
+//-------------------
+//                     The functor constructor
+//                     pass in the schema handle.
+//                     1) make assignments to the unpack offset variables
+//                     2) initialize the complex literals
+
+       ret += "//\t\tFunctor constructor.\n";
+       ret +=  this->generate_functor_name()+"(int schema_handle0){\n";
+
+       // save the schema handle
+       ret += "\t\tthis->schema_handle0 = schema_handle0;\n";
+//             tuple metadata offset
+       ret += "\ttuple_metadata_offset0 = ftaschema_get_tuple_metadata_offset(schema_handle0);\n";
+
+//             unpack vars
+       ret += "//\t\tGet offsets for unpacking fields from input tuple.\n";
+       ret += gen_access_var_init(cid_set);
+
+//             aggregate return vals : refd in both final_sample
+//             and create_output_tuple
+//                     Create cached temporaries for UDAF return values.
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn_id = aggr_tbl.get_fcn_id(a);
+                       data_type *adt = Ext_fcns->get_fcn_dt(afcn_id);
+                       sprintf(tmpstr,"udaf_ret_%d", a);
+                       ret+="\t"+adt->make_host_cvar(tmpstr)+";\n";
+               }
+       }
+
+//             complex literals
+       ret += "//\t\tInitialize complex literals.\n";
+       ret += gen_complex_lit_init(complex_literals);
+
+//             Initialize partial function results so they can be safely GC'd
+       ret += gen_partial_fcn_init(partial_fcns);
+
+//             Initialize non-query-parameter parameter handles
+       ret += gen_pass_by_handle_init(param_handle_table);
+
+//             temporal flush variables
+//             ASSUME that structured values won't be temporal.
+       if(uses_temporal_flush){
+               ret += "//\t\tInitialize temporal flush variables.\n";
+               for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+                       if(gdt->is_temporal()){
+                               literal_t gl(gdt->type_indicator());
+                               sprintf(tmpstr,"\tlast_gb%d = %s;\n",g, gl.to_hfta_C_code("").c_str());
+                               ret.append(tmpstr);
+                       }
+               }
+               ret += "\tneeds_temporal_flush = false;\n";
+       }
+
+       //              Init temporal attributes referenced in select list
+       ret += gen_init_temp_vars(schema, select_list, segen_gb_tbl);
+
+       ret += "};\n";
+
+
+//-------------------
+//                     Functor destructor
+       ret += "//\t\tFunctor destructor.\n";
+       ret +=  "~"+this->generate_functor_name()+"(){\n";
+
+//                     clean up buffer type complex literals
+       ret += gen_complex_lit_dtr(complex_literals);
+
+//                     Deregister the pass-by-handle parameters
+       ret += "/* register and de-register the pass-by-handle parameters */\n";
+       ret += gen_pass_by_handle_dtr(param_handle_table);
+
+//                     clean up partial function results.
+       ret += "/* clean up partial function storage    */\n";
+       ret += gen_partial_fcn_dtr(partial_fcns);
+
+//                     Destroy the parameters, if any need to be destroyed
+       ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+
+       ret += "};\n\n";
+
+
+//-------------------
+//                     Parameter manipulation routines
+       ret += generate_load_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+       ret += generate_delete_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+
+//-------------------
+//                     Register new parameter block
+
+       ret += "int set_param_block(gs_int32_t sz, void* value){\n";
+         ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+         ret += "\treturn this->load_params_"+this->generate_functor_name()+
+                               "(sz, value);\n";
+       ret += "};\n\n";
+
+//-------------------
+//             the create_group method.
+//             This method creates a group in a buffer passed in
+//             (to allow for creation on the stack).
+//             There are also a couple of side effects:
+//             1) evaluate the WHERE clause (and therefore, unpack all partial fcns)
+//             2) determine if a temporal flush is required.
+
+       ret += this->generate_functor_name()+"_groupdef *create_group(host_tuple &tup0, gs_sp_t buffer){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+       if(partial_fcns.size()>0){              // partial fcn access failure
+         ret += "\tgs_retval_t retval = 0;\n";
+         ret += "\n";
+       }
+//             return value
+       ret += "\t"+generate_functor_name()+"_groupdef *gbval = ("+generate_functor_name()+
+                       "_groupdef *) buffer;\n";
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+
+       set<int> gb_pfcns;      // partial fcns in gbdefs, aggr se's
+       for(g=0;g<gb_tbl.size();g++){
+               collect_partial_fcns(gb_tbl.get_def(g), gb_pfcns);
+       }
+       ret += gen_partial_fcn_dtr(partial_fcns,gb_pfcns);
+//     ret += gen_partial_fcn_dtr(partial_fcns);
+
+
+       ret += gen_temp_tuple_check(this->node_name, 0);
+       col_id_set found_cids;  // colrefs unpacked thus far.
+       ret += gen_unpack_temp_vars(schema, found_cids, select_list, segen_gb_tbl, needs_xform);
+
+
+
+//                     Save temporal group-by variables
+
+
+       ret.append("\n\t//\t\tCompute temporal groupby attributes\n\n");
+
+         for(g=0;g<gb_tbl.size();g++){
+
+                       data_type *gdt = gb_tbl.get_data_type(g);
+
+                       if(gdt->is_temporal()){
+                               sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                                       g, generate_se_code(gb_tbl.get_def(g),schema).c_str() );
+                               ret.append(tmpstr);
+                       }
+               }
+               ret.append("\n");
+
+
+
+//                     Compare the temporal GB vars with the stored ones,
+//                     set flush indicator and update stored GB vars if there is any change.
+
+       if(uses_temporal_flush){
+               ret+= "\tif( !( (";
+               bool first_one = true;
+               for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+
+                       if(gdt->is_temporal()){
+                         sprintf(tmpstr,"last_gb%d",g);   string lhs_op = tmpstr;
+                         sprintf(tmpstr,"gbval->gb_var%d",g);   string rhs_op = tmpstr;
+                         if(first_one){first_one = false;} else {ret += ") && (";}
+                         ret += generate_equality_test(lhs_op, rhs_op, gdt);
+                       }
+               }
+               ret += ") ) ){\n";
+               for(g=0;g<gb_tbl.size();g++){
+                 data_type *gdt = gb_tbl.get_data_type(g);
+                 if(gdt->is_temporal()){
+                         if(gdt->is_buffer_type()){
+                               sprintf(tmpstr,"\t\t%s(&(gbval->gb_var%d),&last_gb%d);\n",gdt->get_hfta_buffer_replace().c_str(),g,g);
+                         }else{
+                               sprintf(tmpstr,"\t\tlast_flushed_gb%d = last_gb%d;\n",g,g);
+                               ret += tmpstr;
+                               sprintf(tmpstr,"\t\tlast_gb%d = gbval->gb_var%d;\n",g,g);
+                         }
+                         ret += tmpstr;
+                       }
+               }
+/*
+               if(uses_temporal_flush){
+                       for(g=0;g<gb_tbl.size();g++){
+                               data_type *gdt = gb_tbl.get_data_type(g);
+                               if(gdt->is_temporal()){
+                                       ret+="if(last_flushed_gb"+int_to_string(g)+">0)\n";
+                                       break;
+                               }
+                       }
+               }
+*/
+               ret += "\t\tneeds_temporal_flush=true;\n";
+               ret += "\t\t}else{\n"
+                       "\t\t\tneeds_temporal_flush=false;\n"
+                       "\t\t}\n";
+       }
+
+
+//             For temporal status tuple we don't need to do anything else
+       ret += "\tif (temp_tuple_received) return NULL;\n\n";
+
+
+//             The partial functions ref'd in the group-by var
+//             definitions must be evaluated.  If one returns false,
+//             then implicitly the predicate is false.
+       set<int>::iterator pfsi;
+
+       if(gb_pfcns.size() > 0)
+               ret += "//\t\tUnpack partial fcns.\n";
+       ret += gen_full_unpack_partial_fcn(schema, partial_fcns, gb_pfcns,
+                                                                               found_cids, segen_gb_tbl, "NULL", needs_xform);
+
+//                     Unpack the group-by variables
+
+         for(g=0;g<gb_tbl.size();g++){
+//                     Find the new fields ref'd by this GBvar def.
+               col_id_set new_cids;
+               get_new_se_cids(gb_tbl.get_def(g), found_cids, new_cids, segen_gb_tbl);
+//                     Unpack these values.
+               ret += gen_unpack_cids(schema, new_cids, "NULL", needs_xform);
+
+               sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                               g, generate_se_code(gb_tbl.get_def(g),schema).c_str() );
+/*
+//                             There seems to be no difference between the two
+//                             branches of the IF statement.
+               data_type *gdt = gb_tbl.get_data_type(g);
+                 if(gdt->is_buffer_type()){
+//                             Create temporary copy.
+                       sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                               g, generate_se_code(gb_tbl.get_def(g),schema).c_str() );
+                 }else{
+                       scalarexp_t *gse = gb_tbl.get_def(g);
+                       sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                                       g,generate_se_code(gse,schema).c_str());
+                 }
+*/
+                 ret.append(tmpstr);
+         }
+         ret.append("\n");
+
+
+       ret+= "\treturn gbval;\n";
+       ret += "};\n\n\n";
+
+
+
+//-------------------
+//             the create_group method.
+//             This method creates a group in a buffer passed in
+//             (to allow for creation on the stack).
+//             There are also a couple of side effects:
+//             1) evaluate the WHERE clause (and therefore, unpack all partial fcns)
+//             2) determine if a temporal flush is required.
+
+       ret += "bool evaluate_predicate(host_tuple &tup0, "+generate_functor_name()+"_groupdef *gbval, "+generate_functor_name()+"_statedef *stval, int cd){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+       if(partial_fcns.size()>0){              // partial fcn access failure
+         ret += "\tgs_retval_t retval = 0;\n";
+         ret += "\n";
+       }
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       set<int> w_pfcns;       // partial fcns in where clause
+       for(w=0;w<where.size();++w)
+               collect_partial_fcns_pr(where[w]->pr, w_pfcns);
+
+       set<int> ag_pfcns;      // partial fcns in gbdefs, aggr se's
+       for(a=0;a<aggr_tbl.size();a++){
+               collect_partial_fcns(aggr_tbl.get_aggr_se(a), ag_pfcns);
+       }
+       ret += gen_partial_fcn_dtr(partial_fcns,w_pfcns);
+       ret += gen_partial_fcn_dtr(partial_fcns,ag_pfcns);
+
+       ret+="//\t\tEvaluate clauses which don't reference stateful fcns first \n";
+       for(w=0;w<where.size();++w){
+               if(! pred_refs_sfun(where[w]->pr)){
+                       sprintf(tmpstr,"//\t\tPredicate clause %d.\n",w);
+                       ret += tmpstr;
+//                     Find the set of variables accessed in this CNF elem,
+//                     but in no previous element.
+                       col_id_set new_cids;
+                       get_new_pred_cids(where[w]->pr, found_cids, new_cids, segen_gb_tbl);
+
+//                     Unpack these values.
+                       ret += gen_unpack_cids(schema, new_cids, "false", needs_xform);
+//                     Find partial fcns ref'd in this cnf element
+                       set<int> pfcn_refs;
+                       collect_partial_fcns_pr(where[w]->pr, pfcn_refs);
+                       ret += gen_unpack_partial_fcn(schema, partial_fcns, pfcn_refs,"false");
+
+                       ret += "\tif( !("+generate_predicate_code(where[w]->pr,schema)+
+                               +") ) return(false);\n";
+               }
+       }
+
+
+//             The partial functions ref'd in the and aggregate
+//             definitions must also be evaluated.  If one returns false,
+//             then implicitly the predicate is false.
+//             ASSUME that aggregates cannot reference stateful fcns.
+
+       if(ag_pfcns.size() > 0)
+               ret += "//\t\tUnpack remaining partial fcns.\n";
+       ret += gen_full_unpack_partial_fcn(schema, partial_fcns, ag_pfcns,
+                                                                               found_cids, segen_gb_tbl, "false", needs_xform);
+
+       ret+="//\t\tEvaluate all remaining where clauses.\n";
+       ret+="\tbool retval = true;\n";
+       for(w=0;w<where.size();++w){
+               if( pred_refs_sfun(where[w]->pr)){
+                       sprintf(tmpstr,"//\t\tPredicate clause %d.\n",w);
+                       ret += tmpstr;
+//                     Find the set of variables accessed in this CNF elem,
+//                     but in no previous element.
+                       col_id_set new_cids;
+                       get_new_pred_cids(where[w]->pr, found_cids, new_cids, segen_gb_tbl);
+
+//                     Unpack these values.
+                       ret += gen_unpack_cids(schema, new_cids, "false", needs_xform);
+//                     Find partial fcns ref'd in this cnf element
+                       set<int> pfcn_refs;
+                       collect_partial_fcns_pr(where[w]->pr, pfcn_refs);
+                       ret += gen_unpack_partial_fcn(schema, partial_fcns, pfcn_refs,"false");
+
+                       ret += "\tif( !("+generate_predicate_code(where[w]->pr,schema)+
+                               +") ) retval = false;\n";
+               }
+       }
+
+       ret+="//                Unpack all remaining attributes\n";
+       ret += gen_remaining_colrefs(schema, cid_set, found_cids, "false", needs_xform);
+
+    ret += "\n\treturn retval;\n";
+       ret += "};\n\n\n";
+
+//--------------------------------------------------------
+//                     Create and initialize an aggregate object
+
+       ret += this->generate_functor_name()+"_aggrdef *create_aggregate(host_tuple &tup0, "+generate_functor_name()+"_groupdef *gbval, gs_sp_t a,"+generate_functor_name()+"_statedef *stval, int cd){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//             return value
+       ret += "\t"+generate_functor_name()+"_aggrdef *aggval = ("+generate_functor_name()+ "_aggrdef *)a;\n";
+
+       for(a=0;a<aggr_tbl.size();a++){
+               if(aggr_tbl.is_builtin(a)){
+//                     Create temporaries for buffer return values
+                 data_type *adt = aggr_tbl.get_data_type(a);
+                 if(adt->is_buffer_type()){
+                       sprintf(tmpstr,"aggr_tmp_%d", a);
+                       ret+=adt->make_host_cvar(tmpstr)+";\n";
+                 }
+               }
+       }
+
+       for(a=0;a<aggr_tbl.size();a++){
+               sprintf(tmpstr,"aggval->aggr_var%d",a);
+               string assignto_var = tmpstr;
+               ret += "\t"+generate_aggr_init(assignto_var,&aggr_tbl,a, schema);
+       }
+
+       ret += "\treturn aggval;\n";
+       ret += "};\n\n";
+
+
+//--------------------------------------------------------
+//                     initialize an aggregate object inplace
+
+       ret += "void create_aggregate(host_tuple &tup0, "+this->generate_functor_name()+"_aggrdef *aggval,"+generate_functor_name()+"_statedef *stval, int cd){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//             return value
+
+       for(a=0;a<aggr_tbl.size();a++){
+               if(aggr_tbl.is_builtin(a)){
+//                     Create temporaries for buffer return values
+                 data_type *adt = aggr_tbl.get_data_type(a);
+                 if(adt->is_buffer_type()){
+                       sprintf(tmpstr,"aggr_tmp_%d", a);
+                       ret+=adt->make_host_cvar(tmpstr)+";\n";
+                 }
+               }
+       }
+
+       for(a=0;a<aggr_tbl.size();a++){
+               sprintf(tmpstr,"aggval->aggr_var%d",a);
+               string assignto_var = tmpstr;
+               ret += "\t"+generate_aggr_init(assignto_var,&aggr_tbl,a, schema);
+       }
+
+       ret += "};\n\n";
+
+
+//--------------------------------------------------------
+//                     Create and clean-initialize an state object
+
+       ret += "void initialize_state(host_tuple &tup0, "+generate_functor_name()+"_groupdef *gbval, "+generate_functor_name()+"_statedef *stval){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//             return value
+//     ret += "\t"+generate_functor_name()+"_statedef *stval = ("+generate_functor_name()+ "_statedef *)s;\n";
+
+       for(a=0;a<aggr_tbl.size();a++){
+               if( aggr_tbl.is_superaggr(a)){
+                       if(aggr_tbl.is_builtin(a)){
+//                     Create temporaries for buffer return values
+                         data_type *adt = aggr_tbl.get_data_type(a);
+                         if(adt->is_buffer_type()){
+                               sprintf(tmpstr,"aggr_tmp_%d", a);
+                               ret+=adt->make_host_cvar(tmpstr)+";\n";
+                         }
+                       }
+               }
+       }
+
+       for(a=0;a<aggr_tbl.size();a++){
+               if( aggr_tbl.is_superaggr(a)){
+                       sprintf(tmpstr,"stval->aggr_var%d",a);
+                       string assignto_var = tmpstr;
+                       ret += "\t"+generate_aggr_init(assignto_var,&aggr_tbl,a, schema);
+               }
+       }
+
+       for(ssi=states_refd.begin(); ssi!=states_refd.end();++ssi){
+               string state_nm = (*ssi);
+               ret += "_sfun_state_clean_init_"+state_nm+"(&(stval->state_var_"+state_nm+"));\n";
+       }
+
+       ret += "};\n\n";
+
+
+//--------------------------------------------------------
+//                     Create and dirty-initialize an state object
+
+       ret += "void reinitialize_state(host_tuple &tup0, "+generate_functor_name()+"_groupdef *gbval, "+generate_functor_name()+"_statedef *stval, "+generate_functor_name()+"_statedef *old_stval, int cd){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//             return value
+//     ret += "\t"+generate_functor_name()+"_statedef *stval = ("+generate_functor_name()+ "_statedef *)s;\n";
+
+       for(a=0;a<aggr_tbl.size();a++){
+               if( aggr_tbl.is_superaggr(a)){
+                       if(aggr_tbl.is_builtin(a)){
+//                     Create temporaries for buffer return values
+                         data_type *adt = aggr_tbl.get_data_type(a);
+                         if(adt->is_buffer_type()){
+                               sprintf(tmpstr,"aggr_tmp_%d", a);
+                               ret+=adt->make_host_cvar(tmpstr)+";\n";
+                         }
+                       }
+               }
+       }
+
+//             initialize superaggregates
+       for(a=0;a<aggr_tbl.size();a++){
+               if( aggr_tbl.is_superaggr(a)){
+                       sprintf(tmpstr,"stval->aggr_var%d",a);
+                       string assignto_var = tmpstr;
+                       ret += "\t"+generate_aggr_init(assignto_var,&aggr_tbl,a, schema);
+               }
+       }
+
+       for(ssi=states_refd.begin(); ssi!=states_refd.end();++ssi){
+               string state_nm = (*ssi);
+               ret += "_sfun_state_dirty_init_"+state_nm+"(&(stval->state_var_"+state_nm+"),&(old_stval->state_var_"+state_nm+"), cd );\n";
+       }
+
+       ret += "};\n\n";
+
+//--------------------------------------------------------
+//             Finalize_state : call the finalize fcn on all states
+
+
+       ret += "void finalize_state( "+generate_functor_name()+"_statedef *stval, int cd){\n";
+
+       for(ssi=states_refd.begin(); ssi!=states_refd.end();++ssi){
+               string state_nm = (*ssi);
+               ret += "_sfun_state_final_init_"+state_nm+"(&(stval->state_var_"+state_nm+"), cd);\n";
+       }
+
+       ret += "};\n\n";
+
+
+
+
+//--------------------------------------------------------
+//                     update (plus) a superaggregate object
+
+       ret += "void update_plus_superaggr(host_tuple &tup0, " +
+               generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_statedef *stval){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//                     use of temporaries depends on the aggregate,
+//                     generate them in generate_aggr_update
+
+
+       for(a=0;a<aggr_tbl.size();a++){
+         if(aggr_tbl.is_superaggr(a)){
+               sprintf(tmpstr,"stval->aggr_var%d",a);
+               string varname = tmpstr;
+               ret.append(generate_aggr_update(varname,&aggr_tbl,a, schema));
+         }
+       }
+
+       ret += "\treturn;\n";
+       ret += "};\n";
+
+
+
+//--------------------------------------------------------
+//                     update (minus) a superaggregate object
+
+       ret += "void update_minus_superaggr( "+
+               generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval,"+
+               generate_functor_name()+"_statedef *stval"+
+               "){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//                     use of temporaries depends on the aggregate,
+//                     generate them in generate_aggr_update
+
+
+       for(a=0;a<aggr_tbl.size();a++){
+         if(aggr_tbl.is_superaggr(a)){
+               sprintf(tmpstr,"stval->aggr_var%d",a);
+               string super_varname = tmpstr;
+               sprintf(tmpstr,"aggval->aggr_var%d",a);
+               string sub_varname = tmpstr;
+               ret.append(generate_superaggr_minus(sub_varname, super_varname,&aggr_tbl,a, schema));
+         }
+       }
+
+       ret += "\treturn;\n";
+       ret += "};\n";
+
+
+//--------------------------------------------------------
+//                     update an aggregate object
+
+       ret += "void update_aggregate(host_tuple &tup0, "
+               +generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval,"+generate_functor_name()+"_statedef *stval, int cd){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//                     use of temporaries depends on the aggregate,
+//                     generate them in generate_aggr_update
+
+
+       for(a=0;a<aggr_tbl.size();a++){
+         sprintf(tmpstr,"aggval->aggr_var%d",a);
+         string varname = tmpstr;
+         ret.append(generate_aggr_update(varname,&aggr_tbl,a, schema));
+       }
+
+       ret += "\treturn;\n";
+       ret += "};\n";
+
+//---------------------------------------------------
+//                     Flush test
+
+       ret += "\tbool flush_needed(){\n";
+       if(uses_temporal_flush){
+               ret += "\t\treturn needs_temporal_flush;\n";
+       }else{
+               ret += "\t\treturn false;\n";
+       }
+       ret += "\t};\n";
+
+
+//------------------------------------------------------
+//                     THe cleaning_when predicate
+
+       string gbvar = "gbval->gb_var";
+       string aggvar = "aggval->";
+
+       ret += "bool need_to_clean( "
+               +generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_statedef *stval, int cd"+
+               "){\n";
+
+       if(cleanwhen.size()>0)
+               ret += "\tbool predval = true;\n";
+       else
+               ret += "\tbool predval = false;\n";
+
+//                     Find the udafs ref'd in the having clause
+       set<int> cw_aggs;
+       for(w=0;w<cleanwhen.size();++w)
+               collect_aggr_refs_pr(cleanwhen[w]->pr, cw_aggs);
+
+
+//                     get the return values from the UDAFS
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a) && cw_aggs.count(a)){
+                       ret += "\t"+aggr_tbl.get_op(a)+"_HFTA_AGGR_OUTPUT_(&(udaf_ret_"+int_to_string(a)+"),";
+                       if(aggr_tbl.get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="("+aggvar+"aggr_var"+int_to_string(a)+"));\n";
+               }
+       }
+
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       set<int> cw_pfcns;      // partial fcns in where clause
+       for(w=0;w<cleanwhen.size();++w)
+               collect_partial_fcns_pr(cleanwhen[w]->pr, cw_pfcns);
+
+       ret += gen_partial_fcn_dtr(partial_fcns,cw_pfcns);
+
+
+       for(w=0;w<cleanwhen.size();++w){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.\n",w);
+               ret += tmpstr;
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pfcn_refs;
+               collect_partial_fcns_pr(cleanwhen[w]->pr, pfcn_refs);
+               for(pfsi=pfcn_refs.begin();pfsi!=pfcn_refs.end();++pfsi){
+                       ret += unpack_partial_fcn_fm_aggr(partial_fcns[(*pfsi)], (*pfsi), gbvar, aggvar, schema);
+                       ret += "\tif(retval){ return false;}\n";
+               }
+//             ret += unpack_partial_fcn_fm_aggr(schema, partial_fcns, pfcn_refs,"false");
+
+               ret += "\tif( !("+generate_predicate_code_fm_aggr(cleanwhen[w]->pr,gbvar, aggvar, schema)+
+                               ") ) predval = false;\n";
+       }
+
+       ret += "\treturn predval;\n";
+       ret += "\t};\n";
+
+//------------------------------------------------------
+//                     THe cleaning_by predicate
+
+       ret += "bool sample_group("
+               +generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval,"+
+               generate_functor_name()+"_statedef *stval, int cd"+
+               "){\n";
+
+       if(cleanby.size()>0)
+               ret += "\tbool retval = true;\n";
+       else
+               ret += "\tbool retval = false;\n";
+
+//                     Find the udafs ref'd in the having clause
+       set<int> cb_aggs;
+       for(w=0;w<cleanby.size();++w)
+               collect_aggr_refs_pr(cleanby[w]->pr, cb_aggs);
+
+
+//                     get the return values from the UDAFS
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a) && cb_aggs.count(a)){
+                       ret += "\t"+aggr_tbl.get_op(a)+"_HFTA_AGGR_OUTPUT_(&(udaf_ret_"+int_to_string(a)+"),";
+                       if(aggr_tbl.get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="("+aggvar+"aggr_var"+int_to_string(a)+"));\n";
+               }
+       }
+
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       set<int> cb_pfcns;      // partial fcns in where clause
+       for(w=0;w<cleanby.size();++w)
+               collect_partial_fcns_pr(cleanby[w]->pr, cb_pfcns);
+
+       ret += gen_partial_fcn_dtr(partial_fcns,cb_pfcns);
+
+
+       for(w=0;w<cleanwhen.size();++w){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.\n",w);
+               ret += tmpstr;
+
+/*
+//                     Find the set of variables accessed in this CNF elem,
+//                     but in no previous element.
+               col_id_set new_cids;
+               get_new_pred_cids(cleanby[w]->pr, found_cids, new_cids, segen_gb_tbl);
+
+//                     Unpack these values.
+               ret += gen_unpack_cids(schema, new_cids, "false", needs_xform);
+*/
+
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pfcn_refs;
+               collect_partial_fcns_pr(cleanby[w]->pr, pfcn_refs);
+               for(pfsi=pfcn_refs.begin();pfsi!=pfcn_refs.end();++pfsi){
+                       ret += unpack_partial_fcn_fm_aggr(partial_fcns[(*pfsi)], (*pfsi), gbvar, aggvar, schema);
+                       ret += "\tif(retval){ return false;}\n";
+               }
+//             ret += gen_unpack_partial_fcn(schema, partial_fcns, pfcn_refs,"false");
+
+               ret += "\tif( !("+generate_predicate_code_fm_aggr(cleanby[w]->pr,gbvar, aggvar, schema)+
+                       +") ) retval = false;\n";
+       }
+
+       ret += "\treturn retval;\n";
+       ret += "\t};\n";
+
+
+//-----------------------------------------------------
+//
+       ret += "bool final_sample_group("
+               +generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval,"+
+               generate_functor_name()+"_statedef *stval,"+
+               "int cd){\n";
+
+       ret += "\tgs_retval_t retval = 0;\n";
+
+//                     Find the udafs ref'd in the having clause
+       set<int> hv_aggs;
+       for(w=0;w<having.size();++w)
+               collect_aggr_refs_pr(having[w]->pr, hv_aggs);
+
+
+//                     get the return values from the UDAFS
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a) && hv_aggs.count(a)){
+                       ret += "\t"+aggr_tbl.get_op(a)+"_HFTA_AGGR_OUTPUT_(&(udaf_ret_"+int_to_string(a)+"),";
+                       if(aggr_tbl.get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="("+aggvar+"aggr_var"+int_to_string(a)+"));\n";
+               }
+       }
+
+
+       set<int> hv_sl_pfcns;
+       for(w=0;w<having.size();w++){
+               collect_partial_fcns_pr(having[w]->pr, hv_sl_pfcns);
+       }
+
+//             clean up the partial fcn results from any previous execution
+       ret += gen_partial_fcn_dtr(partial_fcns,hv_sl_pfcns);
+
+//             Unpack them now
+       for(pfsi=hv_sl_pfcns.begin();pfsi!=hv_sl_pfcns.end();++pfsi){
+               ret += unpack_partial_fcn_fm_aggr(partial_fcns[(*pfsi)], (*pfsi), gbvar, aggvar, schema);
+               ret += "\tif(retval){ return false;}\n";
+       }
+
+//             Evalaute the HAVING clause
+//             TODO: this seems to have a ++ operator rather than a + operator.
+       for(w=0;w<having.size();++w){
+               ret += "\tif( !("+generate_predicate_code_fm_aggr(having[w]->pr,gbvar, aggvar, schema) +") ) { return false;}\n";
+       }
+
+       ret += "\treturn true;\n";
+       ret+="}\n\n";
+
+//---------------------------------------------------
+//                     create output tuple
+//                     Unpack the partial functions ref'd in the where clause,
+//                     select clause.  Evaluate the where clause.
+//                     Finally, pack the tuple.
+
+//                     I need to use special code generation here,
+//                     so I'll leave it in longhand.
+
+       ret += "host_tuple create_output_tuple("
+               +generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval,"+
+               generate_functor_name()+"_statedef *stval,"+
+               "int cd, bool &failed){\n";
+
+       ret += "\thost_tuple tup;\n";
+       ret += "\tfailed = false;\n";
+       ret += "\tgs_retval_t retval = 0;\n";
+
+
+//                     Find the udafs ref'd in the select clause
+       set<int> sl_aggs;
+       for(s=0;s<select_list.size();s++)
+               collect_agg_refs(select_list[s]->se, sl_aggs);
+
+
+//                     get the return values from the UDAFS
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a) && sl_aggs.count(a)){
+                       ret += "\t"+aggr_tbl.get_op(a)+"_HFTA_AGGR_OUTPUT_(&(udaf_ret_"+int_to_string(a)+"),";
+                       if(aggr_tbl.get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="("+aggvar+"aggr_var"+int_to_string(a)+"));\n";
+               }
+       }
+
+
+//                     I can't cache partial fcn results from the having
+//                     clause because evaluation is separated.
+       set<int> sl_pfcns;
+       for(s=0;s<select_list.size();s++){
+               collect_partial_fcns(select_list[s]->se, sl_pfcns);
+       }
+//             Unpack them now
+       for(pfsi=sl_pfcns.begin();pfsi!=sl_pfcns.end();++pfsi){
+               ret += unpack_partial_fcn_fm_aggr(partial_fcns[(*pfsi)], (*pfsi), gbvar, aggvar, schema);
+               ret += "\tif(retval){ failed=true; return tup;}\n";
+       }
+
+
+//          Now, compute the size of the tuple.
+
+//          Unpack any BUFFER type selections into temporaries
+//          so that I can compute their size and not have
+//          to recompute their value during tuple packing.
+//          I can use regular assignment here because
+//          these temporaries are non-persistent.
+//                     TODO: should I be using the selvar generation routine?
+
+       ret += "//\t\tCompute the size of the tuple.\n";
+       ret += "//\t\t\tNote: buffer storage packed at the end of the tuple.\n";
+      for(s=0;s<select_list.size();s++){
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = se->get_data_type();
+        if(sdt->is_buffer_type() &&
+                        !( (se->get_operator_type() == SE_COLREF) ||
+                               (se->get_operator_type() == SE_AGGR_STAR) ||
+                               (se->get_operator_type() == SE_AGGR_SE) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+               ){
+            sprintf(tmpstr,"selvar_%d",s);
+                       ret+="\t"+sdt->make_host_cvar(tmpstr)+" = ";
+                       ret += generate_se_code_fm_aggr(se,gbvar, aggvar, schema) +";\n";
+        }
+      }
+
+//      The size of the tuple is the size of the tuple struct plus the
+//      size of the buffers to be copied in.
+
+      ret+="\ttup.tuple_size = sizeof(" + generate_tuple_name( this->get_node_name()) +") + sizeof(gs_uint8_t)";
+      for(s=0;s<select_list.size();s++){
+//             if(s>0) ret += "+";
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = select_list[s]->se->get_data_type();
+        if(sdt->is_buffer_type()){
+                 if(!( (se->get_operator_type() == SE_COLREF) ||
+                               (se->get_operator_type() == SE_AGGR_STAR) ||
+                               (se->get_operator_type() == SE_AGGR_SE) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+                 ){
+            sprintf(tmpstr," + %s(&selvar_%d)", sdt->get_hfta_buffer_size().c_str(),s);
+            ret.append(tmpstr);
+                 }else{
+            sprintf(tmpstr," + %s(&%s)", sdt->get_hfta_buffer_size().c_str(),generate_se_code_fm_aggr(se,gbvar, aggvar, schema).c_str());
+            ret.append(tmpstr);
+                 }
+        }
+      }
+      ret.append(";\n");
+
+//             Allocate tuple data block.
+       ret += "//\t\tCreate the tuple block.\n";
+         ret += "\ttup.data = malloc(tup.tuple_size);\n";
+         ret += "\ttup.heap_resident = true;\n";
+
+//             Mark tuple as regular
+         ret += "\t*((gs_sp_t )tup.data + sizeof(" + generate_tuple_name( this->get_node_name()) +")) = REGULAR_TUPLE;\n";
+
+//       ret += "\ttup.channel = 0;\n";
+         ret += "\t"+generate_tuple_name( this->get_node_name())+" *tuple = ("+
+                               generate_tuple_name( this->get_node_name())+" *)(tup.data);\n";
+
+//             Start packing.
+//                     (Here, offsets are hard-wired.  is this a problem?)
+
+       ret += "//\t\tPack the fields into the tuple.\n";
+         ret += "\tint tuple_pos = sizeof("+generate_tuple_name( this->get_node_name()) +") + sizeof(gs_uint8_t);\n";
+      for(s=0;s<select_list.size();s++){
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = se->get_data_type();
+        if(sdt->is_buffer_type()){
+                 if(!( (se->get_operator_type() == SE_COLREF) ||
+                               (se->get_operator_type() == SE_AGGR_STAR) ||
+                               (se->get_operator_type() == SE_AGGR_SE) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+                 ){
+            sprintf(tmpstr,"\t%s(&(tuple->tuple_var%d), &selvar_%d,  ((gs_sp_t )tuple)+tuple_pos, tuple_pos);\n", sdt->get_hfta_buffer_tuple_copy().c_str(),s, s);
+            ret.append(tmpstr);
+            sprintf(tmpstr,"\ttuple_pos += %s(&selvar_%d);\n", sdt->get_hfta_buffer_size().c_str(), s);
+            ret.append(tmpstr);
+                 }else{
+            sprintf(tmpstr,"\t%s(&(tuple->tuple_var%d), &%s,  ((gs_sp_t )tuple)+tuple_pos, tuple_pos);\n", sdt->get_hfta_buffer_tuple_copy().c_str(),s, generate_se_code_fm_aggr(se,gbvar, aggvar, schema).c_str());
+            ret.append(tmpstr);
+            sprintf(tmpstr,"\ttuple_pos += %s(&%s);\n", sdt->get_hfta_buffer_size().c_str(), generate_se_code_fm_aggr(se,gbvar, aggvar, schema).c_str());
+            ret.append(tmpstr);
+                 }
+        }else{
+            sprintf(tmpstr,"\ttuple->tuple_var%d = ",s);
+            ret.append(tmpstr);
+            ret.append(generate_se_code_fm_aggr(se,gbvar, aggvar, schema) );
+            ret.append(";\n");
+        }
+      }
+
+//                     Destroy string temporaries
+         ret += gen_buffer_selvars_dtr(select_list);
+//                     Destroy string return vals of UDAFs
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn_id = aggr_tbl.get_fcn_id(a);
+                       data_type *adt = Ext_fcns->get_fcn_dt(afcn_id);
+                       if(adt->is_buffer_type()){
+                               sprintf(tmpstr,"\t%s(&udaf_ret_%d);\n",
+                               adt->get_hfta_buffer_destroy().c_str(), a );
+                               ret += tmpstr;
+                       }
+               }
+       }
+
+
+         ret += "\treturn tup;\n";
+         ret += "};\n";
+
+
+//-------------------------------------------------------------------
+//             Temporal update functions
+
+       ret+="bool temp_status_received(){return temp_tuple_received;};\n\n";
+
+//             create a temp status tuple
+       ret += "int create_temp_status_tuple(host_tuple& result, bool flush_finished) {\n\n";
+
+       ret += gen_init_temp_status_tuple(this->get_node_name());
+
+//             Start packing.
+//                     (Here, offsets are hard-wired.  is this a problem?)
+
+       ret += "//\t\tPack the fields into the tuple.\n";
+       for(s=0;s<select_list.size();s++){
+               data_type *sdt = select_list[s]->se->get_data_type();
+               if(sdt->is_temporal()){
+                       sprintf(tmpstr,"\ttuple->tuple_var%d = ",s);
+                       ret += tmpstr;
+                       sprintf(tmpstr,"(flush_finished) ? %s : %s ", generate_se_code(select_list[s]->se,schema).c_str(), generate_se_code_fm_aggr(select_list[s]->se,"last_flushed_gb", "", schema).c_str());
+                       ret += tmpstr;
+                       ret += ";\n";
+               }
+       }
+
+       ret += "\treturn 0;\n";
+       ret += "};};\n\n\n";
+
+
+//----------------------------------------------------------
+//                     The hash function
+
+       ret += "struct "+generate_functor_name()+"_hash_func{\n";
+       ret += "\tgs_uint32_t operator()(const "+generate_functor_name()+
+                               "_groupdef *grp) const{\n";
+       ret += "\t\treturn(";
+       for(g=0;g<gb_tbl.size();g++){
+               if(g>0) ret += "^";
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->use_hashfunc()){
+                       if(gdt->is_buffer_type())
+                               sprintf(tmpstr,"(%s*%s(&)grp->gb_var%d)))",hash_nums[g%NRANDS].c_str(),gdt->get_hfta_hashfunc().c_str(),g);
+                       else
+                               sprintf(tmpstr,"(%s*%s(grp->gb_var%d))",hash_nums[g%NRANDS].c_str(),gdt->get_hfta_hashfunc().c_str(),g);
+               }else{
+                       sprintf(tmpstr,"(%s*grp->gb_var%d)",hash_nums[g%NRANDS].c_str(),g);
+               }
+               ret += tmpstr;
+       }
+       ret += ") >> 32);\n";
+       ret += "\t}\n";
+       ret += "};\n\n";
+
+//----------------------------------------------------------
+//                     The superhash function
+
+       ret += "struct "+generate_functor_name()+"_superhash_func{\n";
+       ret += "\tgs_uint32_t operator()(const "+generate_functor_name()+
+                               "_groupdef *grp) const{\n";
+       ret += "\t\treturn(0";
+
+       for(g=0;g<gb_tbl.size();g++){
+               if(sg_tbl.count(g)>0){
+                       ret += "^";
+                       data_type *gdt = gb_tbl.get_data_type(g);
+                       if(gdt->use_hashfunc()){
+                               sprintf(tmpstr,"(%s*%s(&(grp->gb_var%d)))",hash_nums[g%NRANDS].c_str(),gdt->get_hfta_hashfunc().c_str(),g);
+                       }else{
+                               sprintf(tmpstr,"(%s*grp->gb_var%d)",hash_nums[g%NRANDS].c_str(),g);
+                       }
+                       ret += tmpstr;
+               }
+       }
+       ret += ") >> 32);\n";
+
+       ret += "\t}\n";
+       ret += "};\n\n";
+
+//----------------------------------------------------------
+//                     The comparison function
+
+       ret += "struct "+generate_functor_name()+"_equal_func{\n";
+       ret += "\tbool operator()(const "+generate_functor_name()+"_groupdef *grp1, "+
+                       generate_functor_name()+"_groupdef *grp2) const{\n";
+       ret += "\t\treturn( (";
+       for(g=0;g<gb_tbl.size();g++){
+               if(g>0) ret += ") && (";
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->complex_comparison(gdt)){
+                 if(gdt->is_buffer_type())
+                       sprintf(tmpstr,"(%s(&(grp1->gb_var%d), &(grp2->gb_var%d))==0)",
+                               gdt->get_hfta_comparison_fcn(gdt).c_str(),g,g);
+                 else
+                       sprintf(tmpstr,"(%s((grp1->gb_var%d), (grp2->gb_var%d))==0)",
+                               gdt->get_hfta_comparison_fcn(gdt).c_str(),g,g);
+               }else{
+                       sprintf(tmpstr,"grp1->gb_var%d == grp2->gb_var%d",g,g);
+               }
+               ret += tmpstr;
+       }
+       ret += ") );\n";
+       ret += "\t}\n";
+       ret += "};\n\n";
+
+
+//----------------------------------------------------------
+//                     The superhashcomparison function
+
+       ret += "struct "+generate_functor_name()+"_superequal_func{\n";
+       ret += "\tbool operator()(const "+generate_functor_name()+"_groupdef *grp1, "+
+                       generate_functor_name()+"_groupdef *grp2) const{\n";
+       ret += "\t\treturn( (";
+    if(sg_tbl.size()){
+               bool first_elem = true;
+               for(g=0;g<gb_tbl.size();g++){
+                       if(sg_tbl.count(g)){
+                               if(first_elem) first_elem=false; else ret += ") && (";
+                               data_type *gdt = gb_tbl.get_data_type(g);
+                               if(gdt->complex_comparison(gdt)){
+                                 if(gdt->is_buffer_type())
+                                       sprintf(tmpstr,"(%s(&(grp1->gb_var%d), &(grp2->gb_var%d))==0)",
+                                               gdt->get_hfta_comparison_fcn(gdt).c_str(),g,g);
+                                 else
+                                       sprintf(tmpstr,"(%s((grp1->gb_var%d), (grp2->gb_var%d))==0)",
+                                               gdt->get_hfta_comparison_fcn(gdt).c_str(),g,g);
+                               }else{
+                                       sprintf(tmpstr,"grp1->gb_var%d == grp2->gb_var%d",g,g);
+                               }
+                       ret += tmpstr;
+                       }
+               }
+       }else{
+               ret += "true";
+       }
+
+       ret += ") );\n";
+       ret += "\t}\n";
+
+
+       ret += "};\n\n";
+       return(ret);
+}
+
+string sgahcwcb_qpn::generate_operator(int i, string params){
+
+               return(
+                       "       clean_operator<" +
+                       generate_functor_name()+",\n\t"+
+                       generate_functor_name() + "_groupdef, \n\t" +
+                       generate_functor_name() + "_aggrdef, \n\t" +
+                       generate_functor_name() + "_statedef, \n\t" +
+                       generate_functor_name()+"_hash_func, \n\t"+
+                       generate_functor_name()+"_equal_func ,\n\t"+
+                       generate_functor_name()+"_superhash_func,\n\t "+
+                       generate_functor_name()+"_superequal_func \n\t"+
+                       "> *op"+int_to_string(i)+" = new clean_operator<"+
+                       generate_functor_name()+",\n\t"+
+                       generate_functor_name() + "_groupdef,\n\t " +
+                       generate_functor_name() + "_aggrdef, \n\t" +
+                       generate_functor_name() + "_statedef, \n\t" +
+                       generate_functor_name()+"_hash_func, \n\t"+
+                       generate_functor_name()+"_equal_func, \n\t"+
+                       generate_functor_name()+"_superhash_func, \n\t"+
+                       generate_functor_name()+"_superequal_func\n\t "
+                       ">("+params+", \"" + get_node_name() + "\");\n"
+               );
+}
+
+////////////////////////////////////////////////////////////////
+////   RSGAH functor
+
+
+
+string rsgah_qpn::generate_functor_name(){
+       return("rsgah_functor_" + normalize_name(this->get_node_name()));
+}
+
+
+string rsgah_qpn::generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, vector<bool> &needs_xform){
+       int a,g,w,s;
+
+
+//                     Initialize generate utility globals
+       segen_gb_tbl = &(gb_tbl);
+
+
+//--------------------------------
+//                     group definition class
+       string ret = "class " + generate_functor_name() + "_groupdef{\n";
+       ret += "public:\n";
+       for(g=0;g<this->gb_tbl.size();g++){
+               sprintf(tmpstr,"gb_var%d",g);
+               ret+="\t"+this->gb_tbl.get_data_type(g)->make_host_cvar(tmpstr)+";\n";
+       }
+//             Constructors
+       ret += "\t"+generate_functor_name() + "_groupdef(){};\n";
+       ret += "\t"+generate_functor_name() + "_groupdef("+
+               this->generate_functor_name() + "_groupdef *gd){\n";
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&gb_var%d, &(gd->gb_var%d));\n",
+                         gdt->get_hfta_buffer_assign_copy().c_str(),g,g );
+                       ret += tmpstr;
+               }else{
+                       sprintf(tmpstr,"\t\tgb_var%d = gd->gb_var%d;\n",g,g);
+                       ret += tmpstr;
+               }
+       }
+       ret += "\t};\n";
+//             destructor
+       ret += "\t~"+ generate_functor_name() + "_groupdef(){\n";
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&gb_var%d);\n",
+                         gdt->get_hfta_buffer_destroy().c_str(), g );
+                       ret += tmpstr;
+               }
+       }
+       ret += "\t};\n";
+       ret +="};\n\n";
+
+//--------------------------------
+//                     aggr definition class
+       ret += "class " + this->generate_functor_name() + "_aggrdef{\n";
+       ret += "public:\n";
+       for(a=0;a<aggr_tbl.size();a++){
+aggr_table_entry *ate = aggr_tbl.agr_tbl[a];
+               sprintf(tmpstr,"aggr_var%d",a);
+               if(aggr_tbl.is_builtin(a))
+                 ret+="\t"+ aggr_tbl.get_data_type(a)->make_host_cvar(tmpstr)+";\n";
+               else
+                 ret+="\t"+ aggr_tbl.get_storage_type(a)->make_host_cvar(tmpstr)+";\n";
+       }
+//             Constructors
+       ret += "\t"+this->generate_functor_name() + "_aggrdef(){};\n";
+//             destructor
+       ret += "\t~"+this->generate_functor_name() + "_aggrdef(){\n";
+       for(a=0;a<aggr_tbl.size();a++){
+               if(aggr_tbl.is_builtin(a)){
+                       data_type *adt = aggr_tbl.get_data_type(a);
+                       if(adt->is_buffer_type()){
+                               sprintf(tmpstr,"\t\t%s(&aggr_var%d);\n",
+                               adt->get_hfta_buffer_destroy().c_str(), a );
+                               ret += tmpstr;
+                       }
+               }else{
+                       ret+="\t\t"+aggr_tbl.get_op(a)+"_HFTA_AGGR_DESTROY_(";
+                       if(aggr_tbl.get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="(aggr_var"+int_to_string(a)+"));\n";
+               }
+       }
+       ret += "\t};\n";
+       ret +="};\n\n";
+
+//--------------------------------
+//                     gb functor class
+       ret += "class " + this->generate_functor_name() + "{\n";
+
+//                     Find variables referenced in this query node.
+
+  col_id_set cid_set;
+  col_id_set::iterator csi;
+
+    for(w=0;w<where.size();++w)
+       gather_pr_col_ids(where[w]->pr,cid_set,segen_gb_tbl);
+    for(w=0;w<having.size();++w)
+       gather_pr_col_ids(having[w]->pr,cid_set,segen_gb_tbl);
+    for(w=0;w<closing_when.size();++w)
+       gather_pr_col_ids(closing_when[w]->pr,cid_set,segen_gb_tbl);
+       for(g=0;g<gb_tbl.size();g++)
+               gather_se_col_ids(gb_tbl.get_def(g),cid_set,segen_gb_tbl);
+
+    for(s=0;s<select_list.size();s++){
+       gather_se_col_ids(select_list[s]->se,cid_set,segen_gb_tbl);     // descends into aggregates
+    }
+
+
+//                     Private variables : store the state of the functor.
+//                     1) variables for unpacked attributes
+//                     2) offsets of the upacked attributes
+//                     3) storage of partial functions
+//                     4) storage of complex literals (i.e., require a constructor)
+
+       ret += "private:\n";
+
+       // var to save the schema handle
+       ret += "\tint schema_handle0;\n";
+
+       // generate the declaration of all the variables related to
+       // temp tuples generation
+       ret += gen_decl_temp_vars();
+
+//                     unpacked attribute storage, offsets
+       ret += "//\t\tstorage and offsets of accessed fields.\n";
+       ret += generate_access_vars(cid_set, schema);
+//                     tuple metadata offset
+       ret += "\tint tuple_metadata_offset0;\n";
+
+//                     Variables to store results of partial functions.
+//                     WARNING find_partial_functions modifies the SE
+//                     (it marks the partial function id).
+       ret += "//\t\tParital function result storage\n";
+       vector<scalarexp_t *> partial_fcns;
+       vector<int> fcn_ref_cnt;
+       vector<bool> is_partial_fcn;
+       for(s=0;s<select_list.size();s++){
+               find_partial_fcns(select_list[s]->se, &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(w=0;w<where.size();w++){
+               find_partial_fcns_pr(where[w]->pr, &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(w=0;w<having.size();w++){
+               find_partial_fcns_pr(having[w]->pr, &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(w=0;w<closing_when.size();w++){
+               find_partial_fcns_pr(closing_when[w]->pr, &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(g=0;g<gb_tbl.size();g++){
+               find_partial_fcns(gb_tbl.get_def(g), &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       for(a=0;a<aggr_tbl.size();a++){
+               find_partial_fcns(aggr_tbl.get_aggr_se(a), &partial_fcns, NULL,NULL, Ext_fcns);
+       }
+       if(partial_fcns.size()>0){
+         ret += "/*\t\tVariables for storing results of partial functions. \t*/\n";
+         ret += generate_partial_fcn_vars(partial_fcns,fcn_ref_cnt,is_partial_fcn,false);
+       }
+
+//                     Create cached temporaries for UDAF return values.
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn_id = aggr_tbl.get_fcn_id(a);
+                       data_type *adt = Ext_fcns->get_fcn_dt(afcn_id);
+                       sprintf(tmpstr,"udaf_ret_%d", a);
+                       ret+="\t"+adt->make_host_cvar(tmpstr)+";\n";
+               }
+       }
+
+
+//                     Complex literals (i.e., they need constructors)
+       ret += "//\t\tComplex literal storage.\n";
+       cplx_lit_table *complex_literals = this->get_cplx_lit_tbl(Ext_fcns);
+       ret += generate_complex_lit_vars(complex_literals);
+
+//                     Pass-by-handle parameters
+       ret += "//\t\tPass-by-handle storage.\n";
+       vector<handle_param_tbl_entry *> param_handle_table = this->get_handle_param_tbl(Ext_fcns);
+       ret += generate_pass_by_handle_vars(param_handle_table);
+
+
+//                     variables to hold parameters.
+       ret += "//\tfor query parameters\n";
+       ret += generate_param_vars(param_tbl);
+
+//             Is there a temporal flush?  If so create flush temporaries,
+//             create flush indicator.
+       bool uses_temporal_flush = false;
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(gdt->is_temporal())
+                       uses_temporal_flush = true;
+       }
+
+       if(uses_temporal_flush){
+               ret += "//\t\tFor temporal flush\n";
+               for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+                       if(gdt->is_temporal()){
+                         sprintf(tmpstr,"last_gb%d",g);
+                         ret+="\t"+gb_tbl.get_data_type(g)->make_host_cvar(tmpstr)+";\n";
+                         sprintf(tmpstr,"last_flushed_gb%d",g);
+                         ret+="\t"+gb_tbl.get_data_type(g)->make_host_cvar(tmpstr)+";\n";
+                       }
+               }
+               ret += "\tbool needs_temporal_flush;\n";
+       }
+
+//                     The publicly exposed functions
+
+       ret += "\npublic:\n";
+
+
+//-------------------
+//                     The functor constructor
+//                     pass in the schema handle.
+//                     1) make assignments to the unpack offset variables
+//                     2) initialize the complex literals
+
+       ret += "//\t\tFunctor constructor.\n";
+       ret +=  this->generate_functor_name()+"(int schema_handle0){\n";
+
+       // save the schema handle
+       ret += "\t\tthis->schema_handle0 = schema_handle0;\n";
+//             metadata offset
+       ret += "\ttuple_metadata_offset0 = ftaschema_get_tuple_metadata_offset(schema_handle0);\n";
+
+//             unpack vars
+       ret += "//\t\tGet offsets for unpacking fields from input tuple.\n";
+       ret += gen_access_var_init(cid_set);
+
+//             complex literals
+       ret += "//\t\tInitialize complex literals.\n";
+       ret += gen_complex_lit_init(complex_literals);
+
+//             Initialize partial function results so they can be safely GC'd
+       ret += gen_partial_fcn_init(partial_fcns);
+
+//             Initialize non-query-parameter parameter handles
+       ret += gen_pass_by_handle_init(param_handle_table);
+
+//             temporal flush variables
+//             ASSUME that structured values won't be temporal.
+       if(uses_temporal_flush){
+               ret += "//\t\tInitialize temporal flush variables.\n";
+               for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+                       if(gdt->is_temporal()){
+                               literal_t gl(gdt->type_indicator());
+                               sprintf(tmpstr,"\tlast_gb%d = %s;\n",g, gl.to_hfta_C_code("").c_str());
+                               ret.append(tmpstr);
+                       }
+               }
+               ret += "\tneeds_temporal_flush = false;\n";
+       }
+
+       //              Init temporal attributes referenced in select list
+       ret += gen_init_temp_vars(schema, select_list, segen_gb_tbl);
+
+       ret += "};\n";
+
+
+//-------------------
+//                     Functor destructor
+       ret += "//\t\tFunctor destructor.\n";
+       ret +=  "~"+this->generate_functor_name()+"(){\n";
+
+//                     clean up buffer type complex literals
+       ret += gen_complex_lit_dtr(complex_literals);
+
+//                     Deregister the pass-by-handle parameters
+       ret += "/* register and de-register the pass-by-handle parameters */\n";
+       ret += gen_pass_by_handle_dtr(param_handle_table);
+
+//                     clean up partial function results.
+       ret += "/* clean up partial function storage    */\n";
+       ret += gen_partial_fcn_dtr(partial_fcns);
+
+//                     Destroy the parameters, if any need to be destroyed
+       ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+
+       ret += "};\n\n";
+
+
+//-------------------
+//                     Parameter manipulation routines
+       ret += generate_load_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+       ret += generate_delete_param_block(this->generate_functor_name(),
+                                                                       this->param_tbl,param_handle_table);
+
+//-------------------
+//                     Register new parameter block
+
+       ret += "int set_param_block(gs_int32_t sz, void* value){\n";
+         ret += "\tthis->destroy_params_"+this->generate_functor_name()+"();\n";
+         ret += "\treturn this->load_params_"+this->generate_functor_name()+
+                               "(sz, value);\n";
+       ret += "};\n\n";
+
+
+//-------------------
+//             the create_group method.
+//             This method creates a group in a buffer passed in
+//             (to allow for creation on the stack).
+//             There are also a couple of side effects:
+//             1) evaluate the WHERE clause (and therefore, unpack all partial fcns)
+//             2) determine if a temporal flush is required.
+
+       ret += this->generate_functor_name()+"_groupdef *create_group(host_tuple &tup0, gs_sp_t buffer){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+       if(partial_fcns.size()>0){              // partial fcn access failure
+         ret += "\tgs_retval_t retval = 0;\n";
+         ret += "\n";
+       }
+//             return value
+       ret += "\t"+generate_functor_name()+"_groupdef *gbval = ("+generate_functor_name()+
+                       "_groupdef *) buffer;\n";
+
+//             Start by cleaning up partial function results
+       ret += "//\t\tcall destructors for partial fcn storage vars of buffer type\n";
+       set<int> w_pfcns;       // partial fcns in where clause
+       for(w=0;w<where.size();++w)
+               collect_partial_fcns_pr(where[w]->pr, w_pfcns);
+
+       set<int> ag_gb_pfcns;   // partial fcns in gbdefs, aggr se's
+       for(g=0;g<gb_tbl.size();g++){
+               collect_partial_fcns(gb_tbl.get_def(g), ag_gb_pfcns);
+       }
+       for(a=0;a<aggr_tbl.size();a++){
+               collect_partial_fcns(aggr_tbl.get_aggr_se(a), ag_gb_pfcns);
+       }
+       ret += gen_partial_fcn_dtr(partial_fcns,w_pfcns);
+       ret += gen_partial_fcn_dtr(partial_fcns,ag_gb_pfcns);
+//     ret += gen_partial_fcn_dtr(partial_fcns);
+
+
+       ret += gen_temp_tuple_check(this->node_name, 0);
+       col_id_set found_cids;  // colrefs unpacked thus far.
+       ret += gen_unpack_temp_vars(schema, found_cids, select_list, segen_gb_tbl, needs_xform);
+
+
+//                     Save temporal group-by variables
+
+
+       ret.append("\n\t//\t\tCompute temporal groupby attributes\n\n");
+
+         for(g=0;g<gb_tbl.size();g++){
+
+                       data_type *gdt = gb_tbl.get_data_type(g);
+
+                       if(gdt->is_temporal()){
+                               sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                                       g, generate_se_code(gb_tbl.get_def(g),schema).c_str() );
+                               ret.append(tmpstr);
+                       }
+               }
+               ret.append("\n");
+
+
+
+//                     Compare the temporal GB vars with the stored ones,
+//                     set flush indicator and update stored GB vars if there is any change.
+
+       if(uses_temporal_flush){
+               ret+= "\tif( !( (";
+               bool first_one = true;
+               for(g=0;g<gb_tbl.size();g++){
+                       data_type *gdt = gb_tbl.get_data_type(g);
+
+                       if(gdt->is_temporal()){
+                         sprintf(tmpstr,"last_gb%d",g);   string lhs_op = tmpstr;
+                         sprintf(tmpstr,"gbval->gb_var%d",g);   string rhs_op = tmpstr;
+                         if(first_one){first_one = false;} else {ret += ") && (";}
+                         ret += generate_equality_test(lhs_op, rhs_op, gdt);
+                       }
+               }
+               ret += ") ) ){\n";
+               for(g=0;g<gb_tbl.size();g++){
+                 data_type *gdt = gb_tbl.get_data_type(g);
+                 if(gdt->is_temporal()){
+                         if(gdt->is_buffer_type()){
+                               sprintf(tmpstr,"\t\t%s(&(gbval->gb_var%d),&last_gb%d);\n",gdt->get_hfta_buffer_replace().c_str(),g,g);
+                         }else{
+                               sprintf(tmpstr,"\t\tlast_flushed_gb%d = last_gb%d;\n",g,g);
+                               ret += tmpstr;
+                               sprintf(tmpstr,"\t\tlast_gb%d = gbval->gb_var%d;\n",g,g);
+                         }
+                         ret += tmpstr;
+                       }
+               }
+               ret += "\t\tneeds_temporal_flush=true;\n";
+               ret += "\t\t}else{\n"
+                       "\t\t\tneeds_temporal_flush=false;\n"
+                       "\t\t}\n";
+       }
+
+
+//             For temporal status tuple we don't need to do anything else
+       ret += "\tif (temp_tuple_received) return NULL;\n\n";
+
+       for(w=0;w<where.size();++w){
+               sprintf(tmpstr,"//\t\tPredicate clause %d.\n",w);
+               ret += tmpstr;
+//                     Find the set of variables accessed in this CNF elem,
+//                     but in no previous element.
+               col_id_set new_cids;
+               get_new_pred_cids(where[w]->pr, found_cids, new_cids, segen_gb_tbl);
+
+//                     Unpack these values.
+               ret += gen_unpack_cids(schema, new_cids, "NULL", needs_xform);
+//                     Find partial fcns ref'd in this cnf element
+               set<int> pfcn_refs;
+               collect_partial_fcns_pr(where[w]->pr, pfcn_refs);
+               ret += gen_unpack_partial_fcn(schema, partial_fcns, pfcn_refs,"NULL");
+
+               ret += "\tif( !("+generate_predicate_code(where[w]->pr,schema)+
+                               +") ) return(NULL);\n";
+       }
+
+//             The partial functions ref'd in the group-by var and aggregate
+//             definitions must also be evaluated.  If one returns false,
+//             then implicitly the predicate is false.
+       set<int>::iterator pfsi;
+
+       if(ag_gb_pfcns.size() > 0)
+               ret += "//\t\tUnpack remaining partial fcns.\n";
+       ret += gen_full_unpack_partial_fcn(schema, partial_fcns, ag_gb_pfcns,
+                                                                               found_cids, segen_gb_tbl, "NULL", needs_xform);
+
+//                     Unpack the group-by variables
+
+         for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(!gdt->is_temporal()){        // temproal gbs already computed
+//                     Find the new fields ref'd by this GBvar def.
+                       col_id_set new_cids;
+                       get_new_se_cids(gb_tbl.get_def(g), found_cids, new_cids, segen_gb_tbl);
+//                     Unpack these values.
+                       ret += gen_unpack_cids(schema, new_cids, "NULL", needs_xform);
+
+                       sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                               g, generate_se_code(gb_tbl.get_def(g),schema).c_str() );
+/*
+//                             There seems to be no difference between the two
+//                             branches of the IF statement.
+               data_type *gdt = gb_tbl.get_data_type(g);
+                 if(gdt->is_buffer_type()){
+//                             Create temporary copy.
+                       sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                               g, generate_se_code(gb_tbl.get_def(g),schema).c_str() );
+                 }else{
+                       scalarexp_t *gse = gb_tbl.get_def(g);
+                       sprintf(tmpstr,"\tgbval->gb_var%d = %s;\n",
+                                       g,generate_se_code(gse,schema).c_str());
+                 }
+*/
+                       ret.append(tmpstr);
+               }
+         }
+         ret.append("\n");
+
+
+       ret+= "\treturn gbval;\n";
+       ret += "};\n\n\n";
+
+//--------------------------------------------------------
+//                     Create and initialize an aggregate object
+
+       ret += this->generate_functor_name()+"_aggrdef *create_aggregate(host_tuple &tup0, gs_sp_t buffer){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//             return value
+       ret += "\t"+generate_functor_name()+"_aggrdef *aggval = ("+generate_functor_name()+
+                       "_aggrdef *)buffer;\n";
+
+       for(a=0;a<aggr_tbl.size();a++){
+               if(aggr_tbl.is_builtin(a)){
+//                     Create temporaries for buffer return values
+                 data_type *adt = aggr_tbl.get_data_type(a);
+                 if(adt->is_buffer_type()){
+                       sprintf(tmpstr,"aggr_tmp_%d", a);
+                       ret+=adt->make_host_cvar(tmpstr)+";\n";
+                 }
+               }
+       }
+
+//             Unpack all remaining attributes
+       ret += gen_remaining_colrefs(schema, cid_set, found_cids, "NULL", needs_xform);
+       for(a=0;a<aggr_tbl.size();a++){
+         sprintf(tmpstr,"aggval->aggr_var%d",a);
+         string assignto_var = tmpstr;
+         ret += "\t"+generate_aggr_init(assignto_var,&aggr_tbl,a, schema);
+       }
+
+       ret += "\treturn aggval;\n";
+       ret += "};\n\n";
+
+//--------------------------------------------------------
+//                     update an aggregate object
+
+       ret += "void update_aggregate(host_tuple &tup0, "
+               +generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//                     use of temporaries depends on the aggregate,
+//                     generate them in generate_aggr_update
+
+
+//             Unpack all remaining attributes
+       ret += gen_remaining_colrefs(schema, cid_set, found_cids, "", needs_xform);
+       for(a=0;a<aggr_tbl.size();a++){
+         sprintf(tmpstr,"aggval->aggr_var%d",a);
+         string varname = tmpstr;
+         ret.append(generate_aggr_update(varname,&aggr_tbl,a, schema));
+       }
+
+       ret += "\treturn;\n";
+       ret += "};\n";
+
+//--------------------------------------------------------
+//                     reinitialize an aggregate object
+
+       ret += "void reinit_aggregates( "+
+               generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval){\n";
+       //              Variables for execution of the function.
+       ret += "\tgs_int32_t problem = 0;\n";   // return unpack failure
+
+//                     use of temporaries depends on the aggregate,
+//                     generate them in generate_aggr_update
+
+       for(g=0;g<gb_tbl.size();g++){
+         data_type *gdt = gb_tbl.get_data_type(g);
+         if(gdt->is_temporal()){
+                 if(gdt->is_buffer_type()){
+                       sprintf(tmpstr,"\t\t%s(&(gbval->gb_var%d),&last_gb%d);\n",gdt->get_hfta_buffer_replace().c_str(),g,g);
+                 }else{
+                       sprintf(tmpstr,"\t\t gbval->gb_var%d =last_gb%d;\n",g,g);
+                 }
+                 ret += tmpstr;
+               }
+       }
+
+//             Unpack all remaining attributes
+       for(a=0;a<aggr_tbl.size();a++){
+         sprintf(tmpstr,"aggval->aggr_var%d",a);
+         string varname = tmpstr;
+         ret.append(generate_aggr_reinitialize(varname,&aggr_tbl,a, schema));
+       }
+
+       ret += "\treturn;\n";
+       ret += "};\n";
+
+
+
+
+
+//---------------------------------------------------
+//                     Flush test
+
+       ret += "\tbool flush_needed(){\n";
+       if(uses_temporal_flush){
+               ret += "\t\treturn needs_temporal_flush;\n";
+       }else{
+               ret += "\t\treturn false;\n";
+       }
+       ret += "\t};\n";
+
+//---------------------------------------------------
+//                     create output tuple
+//                     Unpack the partial functions ref'd in the where clause,
+//                     select clause.  Evaluate the where clause.
+//                     Finally, pack the tuple.
+
+//                     I need to use special code generation here,
+//                     so I'll leave it in longhand.
+
+       ret += "host_tuple create_output_tuple("
+               +generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval, bool &failed){\n";
+
+       ret += "\thost_tuple tup;\n";
+       ret += "\tfailed = false;\n";
+       ret += "\tgs_retval_t retval = 0;\n";
+
+       string gbvar = "gbval->gb_var";
+       string aggvar = "aggval->";
+
+
+//                     First, get the return values from the UDAFS
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a)){
+                       ret += "\t"+aggr_tbl.get_op(a)+"_HFTA_AGGR_OUTPUT_(&(udaf_ret_"+int_to_string(a)+"),";
+                       if(aggr_tbl.get_storage_type(a)->get_type() != fstring_t) ret+="&";
+                       ret+="("+aggvar+"aggr_var"+int_to_string(a)+"));\n";
+               }
+       }
+
+       set<int> hv_sl_pfcns;
+       for(w=0;w<having.size();w++){
+               collect_partial_fcns_pr(having[w]->pr, hv_sl_pfcns);
+       }
+       for(s=0;s<select_list.size();s++){
+               collect_partial_fcns(select_list[s]->se, hv_sl_pfcns);
+       }
+
+//             clean up the partial fcn results from any previous execution
+       ret += gen_partial_fcn_dtr(partial_fcns,hv_sl_pfcns);
+
+//             Unpack them now
+       for(pfsi=hv_sl_pfcns.begin();pfsi!=hv_sl_pfcns.end();++pfsi){
+               ret += unpack_partial_fcn_fm_aggr(partial_fcns[(*pfsi)], (*pfsi), gbvar, aggvar, schema);
+               ret += "\tif(retval){ failed = true; return(tup);}\n";
+       }
+
+//             Evalaute the HAVING clause
+//             TODO: this seems to have a ++ operator rather than a + operator.
+       for(w=0;w<having.size();++w){
+               ret += "\tif( !("+generate_predicate_code_fm_aggr(having[w]->pr,gbvar, aggvar, schema) +") ) { failed = true; return(tup);}\n";
+       }
+
+//          Now, compute the size of the tuple.
+
+//          Unpack any BUFFER type selections into temporaries
+//          so that I can compute their size and not have
+//          to recompute their value during tuple packing.
+//          I can use regular assignment here because
+//          these temporaries are non-persistent.
+//                     TODO: should I be using the selvar generation routine?
+
+       ret += "//\t\tCompute the size of the tuple.\n";
+       ret += "//\t\t\tNote: buffer storage packed at the end of the tuple.\n";
+      for(s=0;s<select_list.size();s++){
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = se->get_data_type();
+        if(sdt->is_buffer_type() &&
+                        !( (se->get_operator_type() == SE_COLREF) ||
+                               (se->get_operator_type() == SE_AGGR_STAR) ||
+                               (se->get_operator_type() == SE_AGGR_SE) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+               ){
+            sprintf(tmpstr,"selvar_%d",s);
+                       ret+="\t"+sdt->make_host_cvar(tmpstr)+" = ";
+                       ret += generate_se_code_fm_aggr(se,gbvar, aggvar, schema) +";\n";
+        }
+      }
+
+//      The size of the tuple is the size of the tuple struct plus the
+//      size of the buffers to be copied in.
+
+      ret+="\ttup.tuple_size = sizeof(" + generate_tuple_name( this->get_node_name()) +") + sizeof(gs_uint8_t)";
+      for(s=0;s<select_list.size();s++){
+//             if(s>0) ret += "+";
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = select_list[s]->se->get_data_type();
+        if(sdt->is_buffer_type()){
+                 if(!( (se->get_operator_type() == SE_COLREF) ||
+                               (se->get_operator_type() == SE_AGGR_STAR) ||
+                               (se->get_operator_type() == SE_AGGR_SE) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+                 ){
+            sprintf(tmpstr," + %s(&selvar_%d)", sdt->get_hfta_buffer_size().c_str(),s);
+            ret.append(tmpstr);
+                 }else{
+            sprintf(tmpstr," + %s(&%s)", sdt->get_hfta_buffer_size().c_str(),generate_se_code_fm_aggr(se,gbvar, aggvar, schema).c_str());
+            ret.append(tmpstr);
+                 }
+        }
+      }
+      ret.append(";\n");
+
+//             Allocate tuple data block.
+       ret += "//\t\tCreate the tuple block.\n";
+         ret += "\ttup.data = malloc(tup.tuple_size);\n";
+         ret += "\ttup.heap_resident = true;\n";
+
+//             Mark tuple as regular
+         ret += "\t*((gs_sp_t )tup.data + sizeof(" + generate_tuple_name( this->get_node_name()) +")) = REGULAR_TUPLE;\n";
+
+//       ret += "\ttup.channel = 0;\n";
+         ret += "\t"+generate_tuple_name( this->get_node_name())+" *tuple = ("+
+                               generate_tuple_name( this->get_node_name())+" *)(tup.data);\n";
+
+//             Start packing.
+//                     (Here, offsets are hard-wired.  is this a problem?)
+
+       ret += "//\t\tPack the fields into the tuple.\n";
+         ret += "\tint tuple_pos = sizeof("+generate_tuple_name( this->get_node_name()) +") + sizeof(gs_uint8_t);\n";
+      for(s=0;s<select_list.size();s++){
+               scalarexp_t *se = select_list[s]->se;
+        data_type *sdt = se->get_data_type();
+        if(sdt->is_buffer_type()){
+                 if(!( (se->get_operator_type() == SE_COLREF) ||
+                               (se->get_operator_type() == SE_AGGR_STAR) ||
+                               (se->get_operator_type() == SE_AGGR_SE) ||
+                          (se->get_operator_type() == SE_FUNC && se->is_partial()) ||
+                          (se->get_operator_type() == SE_FUNC && se->get_aggr_ref() >= 0))
+                 ){
+            sprintf(tmpstr,"\t%s(&(tuple->tuple_var%d), &selvar_%d,  ((gs_sp_t )tuple)+tuple_pos, tuple_pos);\n", sdt->get_hfta_buffer_tuple_copy().c_str(),s, s);
+            ret.append(tmpstr);
+            sprintf(tmpstr,"\ttuple_pos += %s(&selvar_%d);\n", sdt->get_hfta_buffer_size().c_str(), s);
+            ret.append(tmpstr);
+                 }else{
+            sprintf(tmpstr,"\t%s(&(tuple->tuple_var%d), &%s,  ((gs_sp_t )tuple)+tuple_pos, tuple_pos);\n", sdt->get_hfta_buffer_tuple_copy().c_str(),s, generate_se_code_fm_aggr(se,gbvar, aggvar, schema).c_str());
+            ret.append(tmpstr);
+            sprintf(tmpstr,"\ttuple_pos += %s(&%s);\n", sdt->get_hfta_buffer_size().c_str(), generate_se_code_fm_aggr(se,gbvar, aggvar, schema).c_str());
+            ret.append(tmpstr);
+                 }
+        }else{
+            sprintf(tmpstr,"\ttuple->tuple_var%d = ",s);
+            ret.append(tmpstr);
+            ret.append(generate_se_code_fm_aggr(se,gbvar, aggvar, schema) );
+            ret.append(";\n");
+        }
+      }
+
+//                     Destroy string temporaries
+         ret += gen_buffer_selvars_dtr(select_list);
+
+         ret += "\treturn tup;\n";
+         ret += "};\n";
+
+//------------------------------------------------------------------
+//             Cleaning_when : evaluate the cleaning_when clause.
+//             ASSUME that the udaf return values have already
+//             been unpacked.  delete the string udaf return values at the end.
+
+       ret += "bool cleaning_when("
+               +generate_functor_name()+"_groupdef *gbval, "+
+               generate_functor_name()+"_aggrdef *aggval){\n";
+
+       ret += "\tbool retval = true;\n";
+
+
+       gbvar = "gbval->gb_var";
+       aggvar = "aggval->";
+
+
+       set<int> clw_pfcns;
+       for(w=0;w<closing_when.size();w++){
+               collect_partial_fcns_pr(closing_when[w]->pr, clw_pfcns);
+       }
+
+//             clean up the partial fcn results from any previous execution
+       ret += gen_partial_fcn_dtr(partial_fcns,clw_pfcns);
+
+//             Unpack them now
+       for(pfsi=clw_pfcns.begin();pfsi!=clw_pfcns.end();++pfsi){
+               ret += unpack_partial_fcn_fm_aggr(partial_fcns[(*pfsi)], (*pfsi), gbvar, aggvar, schema);
+               ret += "\tif(retval){ return false;}\n";
+       }
+
+//             Evalaute the Closing When clause
+//             TODO: this seems to have a ++ operator rather than a + operator.
+       for(w=0;w<closing_when.size();++w){
+               ret += "\tif( !("+generate_predicate_code_fm_aggr(closing_when[w]->pr,gbvar, aggvar, schema) +") ) { return false;}\n";
+       }
+
+
+//                     Destroy string return vals of UDAFs
+       for(a=0;a<aggr_tbl.size();a++){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn_id = aggr_tbl.get_fcn_id(a);
+                       data_type *adt = Ext_fcns->get_fcn_dt(afcn_id);
+                       if(adt->is_buffer_type()){
+                               sprintf(tmpstr,"\t%s(&udaf_ret_%d);\n",
+                               adt->get_hfta_buffer_destroy().c_str(), a );
+                               ret += tmpstr;
+                       }
+               }
+       }
+
+       ret += "\treturn retval;\n";
+       ret += "};\n";
+
+
+
+
+//-------------------------------------------------------------------
+//             Temporal update functions
+
+       ret+="bool temp_status_received(){return temp_tuple_received;};\n\n";
+
+//             create a temp status tuple
+       ret += "int create_temp_status_tuple(host_tuple& result, bool flush_finished) {\n\n";
+
+       ret += gen_init_temp_status_tuple(this->get_node_name());
+
+//             Start packing.
+//                     (Here, offsets are hard-wired.  is this a problem?)
+
+       ret += "//\t\tPack the fields into the tuple.\n";
+       for(s=0;s<select_list.size();s++){
+               data_type *sdt = select_list[s]->se->get_data_type();
+               if(sdt->is_temporal()){
+                       sprintf(tmpstr,"\ttuple->tuple_var%d = ",s);
+                       ret += tmpstr;
+                       sprintf(tmpstr,"(flush_finished) ? %s : %s ", generate_se_code(select_list[s]->se,schema).c_str(), generate_se_code_fm_aggr(select_list[s]->se,"last_flushed_gb", "", schema).c_str());
+                       ret += tmpstr;
+                       ret += ";\n";
+               }
+       }
+
+       ret += "\treturn 0;\n";
+       ret += "};};\n\n\n";
+
+
+//----------------------------------------------------------
+//                     The hash function
+
+       ret += "struct "+generate_functor_name()+"_hash_func{\n";
+       ret += "\tgs_uint32_t operator()(const "+generate_functor_name()+
+                               "_groupdef *grp) const{\n";
+       ret += "\t\treturn(0";
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(! gdt->is_temporal()){
+                       ret += "^";
+                       if(gdt->use_hashfunc()){
+                               if(gdt->is_buffer_type())
+                                       sprintf(tmpstr,"(%s*%s(&(grp->gb_var%d)))",hash_nums[g%NRANDS].c_str(),gdt->get_hfta_hashfunc().c_str(),g);
+                                       else
+                               sprintf(tmpstr,"(%s*%s(grp->gb_var%d))",hash_nums[g%NRANDS].c_str(),gdt->get_hfta_hashfunc().c_str(),g);
+                       }else{
+                               sprintf(tmpstr,"(%s*grp->gb_var%d)",hash_nums[g%NRANDS].c_str(),g);
+                       }
+                       ret += tmpstr;
+               }
+       }
+       ret += " >> 32);\n";
+       ret += "\t}\n";
+       ret += "};\n\n";
+
+//----------------------------------------------------------
+//                     The comparison function
+
+       ret += "struct "+generate_functor_name()+"_equal_func{\n";
+       ret += "\tbool operator()(const "+generate_functor_name()+"_groupdef *grp1, "+
+                       generate_functor_name()+"_groupdef *grp2) const{\n";
+       ret += "\t\treturn( (";
+
+       string hcmpr = "";
+       bool first_exec = true;
+       for(g=0;g<gb_tbl.size();g++){
+               data_type *gdt = gb_tbl.get_data_type(g);
+               if(! gdt->is_temporal()){
+                       if(first_exec){first_exec=false;}else{ hcmpr += ") && (";}
+                       if(gdt->complex_comparison(gdt)){
+                         if(gdt->is_buffer_type())
+                               sprintf(tmpstr,"(%s(&(grp1->gb_var%d), &(grp2->gb_var%d))==0)",
+                               gdt->get_hfta_comparison_fcn(gdt).c_str(),g,g);
+                         else
+                               sprintf(tmpstr,"(%s((grp1->gb_var%d), (grp2->gb_var%d))==0)",
+                               gdt->get_hfta_comparison_fcn(gdt).c_str(),g,g);
+                       }else{
+                               sprintf(tmpstr,"grp1->gb_var%d == grp2->gb_var%d",g,g);
+                       }
+                       hcmpr += tmpstr;
+               }
+       }
+       if(hcmpr == "")
+               hcmpr = "true";
+       ret += hcmpr;
+
+       ret += ") );\n";
+       ret += "\t}\n";
+       ret += "};\n\n";
+
+
+       return(ret);
+}
+
+string rsgah_qpn::generate_operator(int i, string params){
+
+               return(
+                       "       running_agg_operator<" +
+                       generate_functor_name()+","+
+                       generate_functor_name() + "_groupdef, " +
+                       generate_functor_name() + "_aggrdef, " +
+                       generate_functor_name()+"_hash_func, "+
+                       generate_functor_name()+"_equal_func "
+                       "> *op"+int_to_string(i)+" = new running_agg_operator<"+
+                       generate_functor_name()+","+
+                       generate_functor_name() + "_groupdef, " +
+                       generate_functor_name() + "_aggrdef, " +
+                       generate_functor_name()+"_hash_func, "+
+                       generate_functor_name()+"_equal_func "
+                       ">("+params+", \"" + get_node_name() + "\");\n"
+               );
+}
+
+
+
+//             Split aggregation into two HFTA components - sub and superaggregation
+//             If unable to split the aggreagates, empty vector will be returned
+vector<qp_node *> sgah_qpn::split_node_for_hfta(ext_fcn_list *Ext_fcns, table_list *Schema){
+
+       vector<qp_node *> ret_vec;
+       int s, p, g, a, o, i;
+       int si;
+
+       vector<string> fta_flds, stream_flds;
+       int t = table_name->get_schema_ref();
+
+//                     Get the set of interfaces it accesses.
+       int ierr;
+       vector<string> sel_names;
+
+//                     Verify that all of the ref'd UDAFs can be split.
+
+       for(a=0;a<aggr_tbl.size();++a){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn = aggr_tbl.get_fcn_id(a);
+                       int hfta_super_id = Ext_fcns->get_hfta_superaggr_id(afcn);
+                       int hfta_sub_id = Ext_fcns->get_hfta_subaggr_id(afcn);
+                       if(hfta_super_id < 0 || hfta_sub_id < 0){
+                               return(ret_vec);
+                       }
+               }
+    }
+
+/////////////////////////////////////////////////////
+//                     Split into  aggr/aggr.
+
+
+       sgah_qpn *low_hfta_node = new sgah_qpn();
+       low_hfta_node->table_name = table_name;
+       low_hfta_node->set_node_name( "_"+node_name );
+       low_hfta_node->table_name->set_range_var(table_name->get_var_name());
+
+
+       sgah_qpn *hi_hfta_node = new sgah_qpn();
+       hi_hfta_node->table_name = new tablevar_t(  ("_"+node_name).c_str());
+       hi_hfta_node->set_node_name( node_name );
+       hi_hfta_node->table_name->set_range_var(table_name->get_var_name());
+
+//                     First, process the group-by variables.
+//                     both low and hi level queries duplicate group-by variables of original query
+
+
+       for(g=0;g<gb_tbl.size();g++){
+//                     Insert the gbvar into both low- and hi level hfta.
+               scalarexp_t *gbvar_def = dup_se(gb_tbl.get_def(g), &aggr_tbl);
+               low_hfta_node->gb_tbl.add_gb_var(
+                       gb_tbl.get_name(g), gb_tbl.get_tblvar_ref(g), gbvar_def, gb_tbl.get_reftype(g)
+               );
+
+//                     Insert a ref to the value of the gbvar into the low-level hfta select list.
+               colref_t *new_cr = new colref_t(gb_tbl.get_name(g).c_str() );
+               scalarexp_t *gbvar_fta = new scalarexp_t(new_cr);
+               gbvar_fta->set_gb_ref(g);
+               gbvar_fta->set_data_type( gb_tbl.get_def(g)->get_data_type() );
+               scalarexp_t *gbvar_stream = make_fta_se_ref(low_hfta_node->select_list, gbvar_fta,0);
+
+//                     Insert the corresponding gbvar ref (gbvar_stream) into the stream.
+               gbvar_stream->set_gb_ref(-1);   // used as GBvar def
+               hi_hfta_node->gb_tbl.add_gb_var(
+                       gbvar_stream->get_colref()->get_field(), -1, gbvar_stream,  gb_tbl.get_reftype(g)
+               );
+
+       }
+//     hi_hfta_node->gb_tbl.gb_patterns = gb_tbl.gb_patterns; // pattern processing at higtest level
+       hi_hfta_node->gb_tbl.set_pattern_info( &gb_tbl); // pattern processing at higtest level
+
+//                     SEs in the aggregate definitions.
+//                     They are all safe, so split them up for later processing.
+       map<int, scalarexp_t *> hfta_aggr_se;
+       for(a=0;a<aggr_tbl.size();++a){
+               split_hfta_aggr( &(aggr_tbl), a,
+                                               &(hi_hfta_node->aggr_tbl), &(low_hfta_node->aggr_tbl)  ,
+                                               low_hfta_node->select_list,
+                                               hfta_aggr_se,
+                                               Ext_fcns
+                                       );
+       }
+
+
+//                     Next, the select list.
+
+       for(s=0;s<select_list.size();s++){
+               bool fta_forbidden = false;
+               scalarexp_t *root_se = rehome_fta_se(select_list[s]->se, &hfta_aggr_se);
+               hi_hfta_node->select_list.push_back(
+                       new select_element(root_se, select_list[s]->name));
+       }
+
+
+
+//                     All the predicates in the where clause must execute
+//                     in the low-level hfta.
+
+       for(p=0;p<where.size();p++){
+               predicate_t *new_pr = dup_pr(where[p]->pr, &aggr_tbl);
+               cnf_elem *new_cnf = new cnf_elem(new_pr);
+               analyze_cnf(new_cnf);
+
+               low_hfta_node->where.push_back(new_cnf);
+       }
+
+//                     All of the predicates in the having clause must
+//                     execute in the high-level hfta node.
+
+       for(p=0;p<having.size();p++){
+               predicate_t *pr_root = rehome_fta_pr( having[p]->pr,  &hfta_aggr_se);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               hi_hfta_node->having.push_back(cnf_root);
+       }
+
+
+//                     Copy parameters to both nodes
+       vector<string> param_names = param_tbl->get_param_names();
+       int pi;
+       for(pi=0;pi<param_names.size();pi++){
+               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+               low_hfta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+               hi_hfta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+       }
+       low_hfta_node->definitions = definitions;
+       hi_hfta_node->definitions = definitions;
+
+
+       low_hfta_node->table_name->set_machine(table_name->get_machine());
+       low_hfta_node->table_name->set_interface(table_name->get_interface());
+       low_hfta_node->table_name->set_ifq(false);
+
+       hi_hfta_node->table_name->set_machine(table_name->get_machine());
+       hi_hfta_node->table_name->set_interface(table_name->get_interface());
+       hi_hfta_node->table_name->set_ifq(false);
+
+       ret_vec.push_back(low_hfta_node);
+       ret_vec.push_back(hi_hfta_node);
+
+
+       return(ret_vec);
+
+
+       // TODO: add splitting into selection/aggregation
+}
+
+
+//             Split aggregation into two HFTA components - sub and superaggregation
+//             If unable to split the aggreagates, empty vector will be returned
+//                     Similar to sgah, but super aggregate is rsgah, subaggr is sgah
+vector<qp_node *> rsgah_qpn::split_node_for_hfta(ext_fcn_list *Ext_fcns, table_list *Schema){
+
+       vector<qp_node *> ret_vec;
+       int s, p, g, a, o, i;
+       int si;
+
+       vector<string> fta_flds, stream_flds;
+       int t = table_name->get_schema_ref();
+
+//                     Get the set of interfaces it accesses.
+       int ierr;
+       vector<string> sel_names;
+
+//                     Verify that all of the ref'd UDAFs can be split.
+
+       for(a=0;a<aggr_tbl.size();++a){
+               if(! aggr_tbl.is_builtin(a)){
+                       int afcn = aggr_tbl.get_fcn_id(a);
+                       int hfta_super_id = Ext_fcns->get_hfta_superaggr_id(afcn);
+                       int hfta_sub_id = Ext_fcns->get_hfta_subaggr_id(afcn);
+                       if(hfta_super_id < 0 || hfta_sub_id < 0){
+                               return(ret_vec);
+                       }
+               }
+    }
+
+/////////////////////////////////////////////////////
+//                     Split into  aggr/aggr.
+
+
+       sgah_qpn *low_hfta_node = new sgah_qpn();
+       low_hfta_node->table_name = table_name;
+       low_hfta_node->set_node_name( "_"+node_name );
+       low_hfta_node->table_name->set_range_var(table_name->get_var_name());
+
+
+       rsgah_qpn *hi_hfta_node = new rsgah_qpn();
+       hi_hfta_node->table_name = new tablevar_t(  ("_"+node_name).c_str());
+       hi_hfta_node->set_node_name( node_name );
+       hi_hfta_node->table_name->set_range_var(table_name->get_var_name());
+
+//                     First, process the group-by variables.
+//                     both low and hi level queries duplicate group-by variables of original query
+
+
+       for(g=0;g<gb_tbl.size();g++){
+//                     Insert the gbvar into both low- and hi level hfta.
+               scalarexp_t *gbvar_def = dup_se(gb_tbl.get_def(g), &aggr_tbl);
+               low_hfta_node->gb_tbl.add_gb_var(
+                       gb_tbl.get_name(g), gb_tbl.get_tblvar_ref(g), gbvar_def, gb_tbl.get_reftype(g)
+               );
+
+//                     Insert a ref to the value of the gbvar into the low-level hfta select list.
+               colref_t *new_cr = new colref_t(gb_tbl.get_name(g).c_str() );
+               scalarexp_t *gbvar_fta = new scalarexp_t(new_cr);
+               gbvar_fta->set_gb_ref(g);
+               gbvar_fta->set_data_type( gb_tbl.get_def(g)->get_data_type() );
+               scalarexp_t *gbvar_stream = make_fta_se_ref(low_hfta_node->select_list, gbvar_fta,0);
+
+//                     Insert the corresponding gbvar ref (gbvar_stream) into the stream.
+               gbvar_stream->set_gb_ref(-1);   // used as GBvar def
+               hi_hfta_node->gb_tbl.add_gb_var(
+                       gbvar_stream->get_colref()->get_field(), -1, gbvar_stream,  gb_tbl.get_reftype(g)
+               );
+
+       }
+
+//                     SEs in the aggregate definitions.
+//                     They are all safe, so split them up for later processing.
+       map<int, scalarexp_t *> hfta_aggr_se;
+       for(a=0;a<aggr_tbl.size();++a){
+               split_hfta_aggr( &(aggr_tbl), a,
+                                               &(hi_hfta_node->aggr_tbl), &(low_hfta_node->aggr_tbl)  ,
+                                               low_hfta_node->select_list,
+                                               hfta_aggr_se,
+                                               Ext_fcns
+                                       );
+       }
+
+
+//                     Next, the select list.
+
+       for(s=0;s<select_list.size();s++){
+               bool fta_forbidden = false;
+               scalarexp_t *root_se = rehome_fta_se(select_list[s]->se, &hfta_aggr_se);
+               hi_hfta_node->select_list.push_back(
+                       new select_element(root_se, select_list[s]->name));
+       }
+
+
+
+//                     All the predicates in the where clause must execute
+//                     in the low-level hfta.
+
+       for(p=0;p<where.size();p++){
+               predicate_t *new_pr = dup_pr(where[p]->pr, &aggr_tbl);
+               cnf_elem *new_cnf = new cnf_elem(new_pr);
+               analyze_cnf(new_cnf);
+
+               low_hfta_node->where.push_back(new_cnf);
+       }
+
+//                     All of the predicates in the having clause must
+//                     execute in the high-level hfta node.
+
+       for(p=0;p<having.size();p++){
+               predicate_t *pr_root = rehome_fta_pr( having[p]->pr,  &hfta_aggr_se);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               hi_hfta_node->having.push_back(cnf_root);
+       }
+
+//             Similar for closing when
+       for(p=0;p<closing_when.size();p++){
+               predicate_t *pr_root = rehome_fta_pr( closing_when[p]->pr,  &hfta_aggr_se);
+               cnf_elem *cnf_root = new cnf_elem(pr_root);
+               analyze_cnf(cnf_root);
+
+               hi_hfta_node->closing_when.push_back(cnf_root);
+       }
+
+
+//                     Copy parameters to both nodes
+       vector<string> param_names = param_tbl->get_param_names();
+       int pi;
+       for(pi=0;pi<param_names.size();pi++){
+               data_type *dt = param_tbl->get_data_type(param_names[pi]);
+               low_hfta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+               hi_hfta_node->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                                       param_tbl->handle_access(param_names[pi]));
+       }
+       low_hfta_node->definitions = definitions;
+       hi_hfta_node->definitions = definitions;
+
+
+       low_hfta_node->table_name->set_machine(table_name->get_machine());
+       low_hfta_node->table_name->set_interface(table_name->get_interface());
+       low_hfta_node->table_name->set_ifq(false);
+
+       hi_hfta_node->table_name->set_machine(table_name->get_machine());
+       hi_hfta_node->table_name->set_interface(table_name->get_interface());
+       hi_hfta_node->table_name->set_ifq(false);
+
+       ret_vec.push_back(low_hfta_node);
+       ret_vec.push_back(hi_hfta_node);
+
+
+       return(ret_vec);
+
+
+       // TODO: add splitting into selection/aggregation
+}
+
+//---------------------------------------------------------------
+//             Code for propagating Protocol field source information
+
+
+scalarexp_t *resolve_protocol_se(scalarexp_t *se, vector<map<string, scalarexp_t *> *> &src_vec, gb_table *gb_tbl, table_list *Schema){
+       scalarexp_t *rse, *lse,*p_se, *gb_se;
+       int tno, schema_type;
+       map<string, scalarexp_t *> *pse_map;
+
+  switch(se->get_operator_type()){
+    case SE_LITERAL:
+               return new scalarexp_t(se->get_literal());
+    case SE_PARAM:
+               return scalarexp_t::make_param_reference(se->get_op().c_str());
+    case SE_COLREF:
+       if(se->is_gb()){
+                       if(gb_tbl == NULL)
+                                       fprintf(stderr,"INTERNAL ERROR, in resolve_protocol_se, se->gb_ref=%d, but gb_tbl is NULL\n",se->get_gb_ref());
+                       gb_se = gb_tbl->get_def(se->get_gb_ref());
+                       return resolve_protocol_se(gb_se,src_vec,gb_tbl,Schema);
+               }
+
+               schema_type = Schema->get_schema_type(se->get_colref()->get_schema_ref());
+               if(schema_type == PROTOCOL_SCHEMA)
+                       return dup_se(se,NULL);
+
+       tno = se->get_colref()->get_tablevar_ref();
+       if(tno >= src_vec.size()){
+                       fprintf(stderr,"INTERNAL ERROR, in resolve_protocol_se, tno=%d, src_vec.size()=%lu\n",tno,src_vec.size());
+               }
+               if(src_vec[tno] == NULL)
+                       return NULL;
+
+               pse_map =src_vec[tno];
+               p_se = (*pse_map)[se->get_colref()->get_field()];
+               if(p_se == NULL)
+                       return NULL;
+               return dup_se(p_se,NULL);
+    case SE_UNARY_OP:
+       lse = resolve_protocol_se(se->get_left_se(),src_vec,gb_tbl,Schema);
+       if(lse == NULL)
+               return NULL;
+       else
+               return new scalarexp_t(se->get_op().c_str(),lse);
+    case SE_BINARY_OP:
+       lse = resolve_protocol_se(se->get_left_se(),src_vec,gb_tbl,Schema);
+       if(lse == NULL)
+               return NULL;
+       rse = resolve_protocol_se(se->get_right_se(),src_vec,gb_tbl,Schema);
+       if(rse == NULL)
+               return NULL;
+               return new scalarexp_t(se->get_op().c_str(),lse,rse);
+    case SE_AGGR_STAR:
+               return( NULL );
+    case SE_AGGR_SE:
+               return( NULL );
+       case SE_FUNC:
+               return(NULL);
+       default:
+               return(NULL);
+       break;
+  }
+
+}
+
+void spx_qpn::create_protocol_se(vector<qp_node *> q_sources, table_list *Schema){
+       int i;
+       vector<map<string, scalarexp_t *> *> src_vec;
+
+       for(i=0;i<q_sources.size();i++){
+               if(q_sources[i] != NULL)
+                       src_vec.push_back(q_sources[i]->get_protocol_se());
+               else
+                       src_vec.push_back(NULL);
+       }
+
+       for(i=0;i<select_list.size();i++){
+               protocol_map[select_list[i]->name] = resolve_protocol_se(select_list[i]->se,src_vec,NULL,Schema);
+       }
+}
+
+void join_eq_hash_qpn::create_protocol_se(vector<qp_node *> q_sources, table_list *Schema){
+       int i;
+       vector<map<string, scalarexp_t *> *> src_vec;
+
+       for(i=0;i<q_sources.size();i++){
+               if(q_sources[i] != NULL)
+                       src_vec.push_back(q_sources[i]->get_protocol_se());
+               else
+                       src_vec.push_back(NULL);
+       }
+
+       for(i=0;i<select_list.size();i++){
+               protocol_map[select_list[i]->name] = resolve_protocol_se(select_list[i]->se,src_vec,NULL,Schema);
+       }
+
+       for(i=0;i<hash_eq.size();i++){
+               hash_src_l.push_back(resolve_protocol_se(hash_eq[i]->pr->get_left_se(),src_vec,NULL,Schema));
+               hash_src_r.push_back(resolve_protocol_se(hash_eq[i]->pr->get_right_se(),src_vec,NULL,Schema));
+       }
+}
+
+void filter_join_qpn::create_protocol_se(vector<qp_node *> q_sources, table_list *Schema){
+       int i;
+       vector<map<string, scalarexp_t *> *> src_vec;
+
+       for(i=0;i<q_sources.size();i++){
+               if(q_sources[i] != NULL)
+                       src_vec.push_back(q_sources[i]->get_protocol_se());
+               else
+                       src_vec.push_back(NULL);
+       }
+
+       for(i=0;i<select_list.size();i++){
+               protocol_map[select_list[i]->name] = resolve_protocol_se(select_list[i]->se,src_vec,NULL,Schema);
+       }
+
+       for(i=0;i<hash_eq.size();i++){
+               hash_src_l.push_back(resolve_protocol_se(hash_eq[i]->pr->get_left_se(),src_vec,NULL,Schema));
+               hash_src_r.push_back(resolve_protocol_se(hash_eq[i]->pr->get_right_se(),src_vec,NULL,Schema));
+       }
+}
+
+void sgah_qpn::create_protocol_se(vector<qp_node *> q_sources, table_list *Schema){
+       int i;
+       vector<map<string, scalarexp_t *> *> src_vec;
+
+       for(i=0;i<q_sources.size();i++){
+               if(q_sources[i] != NULL)
+                       src_vec.push_back(q_sources[i]->get_protocol_se());
+               else
+                       src_vec.push_back(NULL);
+       }
+
+       for(i=0;i<select_list.size();i++){
+               protocol_map[select_list[i]->name] = resolve_protocol_se(select_list[i]->se,src_vec,&gb_tbl,Schema);
+       }
+
+       for(i=0;i<gb_tbl.size();i++)
+               gb_sources.push_back(resolve_protocol_se(gb_tbl.get_def(i),src_vec,&gb_tbl,Schema));
+
+}
+
+void rsgah_qpn::create_protocol_se(vector<qp_node *> q_sources, table_list *Schema){
+       int i;
+       vector<map<string, scalarexp_t *> *> src_vec;
+
+       for(i=0;i<q_sources.size();i++){
+               if(q_sources[i] != NULL)
+                       src_vec.push_back(q_sources[i]->get_protocol_se());
+               else
+                       src_vec.push_back(NULL);
+       }
+
+       for(i=0;i<select_list.size();i++){
+               protocol_map[select_list[i]->name] = resolve_protocol_se(select_list[i]->se,src_vec,&gb_tbl,Schema);
+       }
+
+       for(i=0;i<gb_tbl.size();i++)
+               gb_sources.push_back(resolve_protocol_se(gb_tbl.get_def(i),src_vec,&gb_tbl,Schema));
+}
+
+void sgahcwcb_qpn::create_protocol_se(vector<qp_node *> q_sources, table_list *Schema){
+       int i;
+       vector<map<string, scalarexp_t *> *> src_vec;
+
+       for(i=0;i<q_sources.size();i++){
+               if(q_sources[i] != NULL)
+                       src_vec.push_back(q_sources[i]->get_protocol_se());
+               else
+                       src_vec.push_back(NULL);
+       }
+
+       for(i=0;i<select_list.size();i++){
+               protocol_map[select_list[i]->name] = resolve_protocol_se(select_list[i]->se,src_vec,&gb_tbl,Schema);
+       }
+
+       for(i=0;i<gb_tbl.size();i++)
+               gb_sources.push_back(resolve_protocol_se(gb_tbl.get_def(i),src_vec,&gb_tbl,Schema));
+}
+
+void mrg_qpn::create_protocol_se(vector<qp_node *> q_sources, table_list *Schema){
+       int f,s,i;
+       scalarexp_t *first_se;
+
+       vector<map<string, scalarexp_t *> *> src_vec;
+       map<string, scalarexp_t *> *pse_map;
+
+       for(i=0;i<q_sources.size();i++){
+               if(q_sources[i] != NULL)
+                       src_vec.push_back(q_sources[i]->get_protocol_se());
+               else
+                       src_vec.push_back(NULL);
+       }
+
+       if(q_sources.size() == 0){
+               fprintf(stderr,"INTERNAL ERROR in mrg_qpn::create_protocol_se, q_sources.size() == 0\n");
+               exit(1);
+       }
+
+       vector<field_entry *> tbl_flds = table_layout->get_fields();
+       for(f=0;f<tbl_flds.size();f++){
+               bool match = true;
+               string fld_nm = tbl_flds[f]->get_name();
+               pse_map = src_vec[0];
+               first_se = (*pse_map)[fld_nm];
+               if(first_se == NULL)
+                       match = false;
+               for(s=1;s<src_vec.size() && match;s++){
+                       pse_map = src_vec[s];
+                       scalarexp_t *match_se = (*pse_map)[fld_nm];
+                       if(match_se == false)
+                               match = false;
+                       else
+                               match = is_equivalent_se_base(first_se, match_se, Schema);
+               }
+               if(match)
+                       protocol_map[fld_nm] = first_se;
+               else
+                       protocol_map[fld_nm] = NULL;
+       }
+}
diff --git a/src/ftacmp/query_plan.h b/src/ftacmp/query_plan.h
new file mode 100644 (file)
index 0000000..8c7d32a
--- /dev/null
@@ -0,0 +1,2068 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __QUERY_PLAN_H__
+#define __QUERY_PLAN_H__
+
+#include<vector>
+#include<string>
+#include<map>
+using namespace std;
+
+#include"analyze_fta.h"
+#include"iface_q.h"
+#include"parse_partn.h"
+#include"generate_utils.h"
+
+//             Identify the format of the input, output streams.
+#define UNKNOWNFORMAT 0
+#define NETFORMAT 1
+#define HOSTFORMAT 2
+
+///////////////////////////////////////////////////
+//     representation of an output operator specification
+
+struct ospec_str{
+       string query;
+       string operator_type;
+       string operator_param;
+       string output_directory;
+       int bucketwidth;
+       string partitioning_flds;
+       int n_partitions;
+};
+
+
+////////////////////////////////////////////////////
+//     Input representation of a query
+
+struct query_node{
+       int idx;
+       std::set<int> reads_from;
+       std::set<int> sources_to;
+       std::vector<std::string> refd_tbls;
+       std::vector<var_pair_t *> params;
+       std::string name;
+       std::string file;
+       std::string mangler;            // for UDOPs
+       bool touched;
+       table_exp_t *parse_tree;
+       int n_consumers;
+       bool is_udop;
+       bool is_externally_visible;
+       bool inferred_visible_node;
+
+       set<int> subtree_roots;
+
+       query_node(){
+               idx = -1;
+               touched = false;
+               parse_tree = NULL;
+               n_consumers = 0;
+               is_externally_visible = false;
+               inferred_visible_node = false;
+               mangler="";
+       };
+       query_node(int i, std::string qnm, std::string flnm, table_exp_t *pt){
+               idx = i;
+               touched = false;
+               name = qnm;
+               file = flnm;
+               parse_tree = pt;
+               n_consumers = 0;
+               is_udop = false;
+               is_externally_visible = pt->get_visible();
+               inferred_visible_node = false;
+               mangler="";
+
+               tablevar_list_t *fm = parse_tree->get_from();
+               refd_tbls =  fm->get_table_names();
+
+               params  = pt->query_params;
+       };
+       query_node(int ix, std::string udop_name,table_list *Schema){
+               idx = ix;
+               touched = false;
+               name = udop_name;
+               file = udop_name;
+               parse_tree = NULL;
+               n_consumers = 0;
+               is_udop = true;
+               is_externally_visible = true;
+               inferred_visible_node = false;
+               mangler="";
+
+               int sid = Schema->find_tbl(udop_name);
+               std::vector<subquery_spec *> subq = Schema->get_subqueryspecs(sid);
+               int i;
+               for(i=0;i<subq.size();++i){
+                       refd_tbls.push_back(subq[i]->name);
+               }
+       };
+};
+
+struct hfta_node{
+       std::string name;
+       std::string source_name;
+       std::vector<int> query_node_indices;
+       std::set<int> reads_from;
+       std::set<int> sources_to;
+       bool is_udop;
+       bool inferred_visible_node;
+       int n_parallel;
+       int parallel_idx;
+       bool do_generation;     // false means, ignore it.
+
+       hfta_node(){
+               is_udop = false;
+               inferred_visible_node = false;
+               n_parallel = 1;
+               parallel_idx = 0;
+               do_generation = true;
+       }
+};
+
+
+
+
+
+
+#define SPX_QUERY 1
+#define SGAH_QUERY 2
+
+// the following selectivity estimates are used by our primitive rate estimators
+#define SPX_SELECTIVITY 1.0
+#define SGAH_SELECTIVITY 0.1
+#define RSGAH_SELECTIVITY 0.1
+#define SGAHCWCB_SELECTIVITY 0.1
+#define MRG_SELECTIVITY 1.0
+#define JOIN_EQ_HASH_SELECTIVITY 1.0
+
+// the the output rate of the interface is not given we are going to use
+// this default value
+#define DEFAULT_INTERFACE_RATE 100
+
+
+//                     Define query plan nodes
+//                     These nodes are intended for query modeling
+//                     and transformation rather than for code generation.
+
+
+//                     Query plan node base class.
+//                     It has an ID, can return its type,
+//                     and can be linked into lists with the predecessors
+//                     and successors.
+//                     To add : serialize, unserialize?
+
+class qp_node{
+public:
+  int id;
+  std::vector<int> predecessors;
+  std::vector<int> successors;
+  std::string node_name;
+
+//             For error reporting without exiting the program.
+  int error_code;
+  std::string err_str;
+
+//                     These should be moved to the containing stream_query object.
+  std::map<std::string, std::string> definitions;
+  param_table *param_tbl;
+
+//             The value of a field in terms of protocol fields (if any).
+  std::map<std::string, scalarexp_t *> protocol_map;
+
+  qp_node(){
+       error_code = 0;
+       id = -1;
+       param_tbl = new param_table();
+  };
+  qp_node(int i){
+       error_code = 0;
+       id = i;
+       param_tbl = new param_table();
+  };
+
+  int get_id(){return(id);};
+  void set_id(int i){id = i;   };
+
+  int get_error_code(){return error_code;};
+  std::string get_error_str(){return err_str;};
+
+  virtual std::string node_type() = 0;
+
+//             For code generation, does the operator xform its input.
+  virtual bool makes_transform() = 0;
+
+//             For linking, what external libraries does the operator depend on?
+  virtual std::vector<std::string> external_libs() = 0;
+
+  void set_node_name(std::string n){node_name = n;};
+  std::string get_node_name(){return node_name;};
+
+  void set_definitions(std::map<std::string, std::string> &def){
+         definitions = def;
+  };
+  std::map<std::string, std::string> get_definitions(){return definitions;};
+
+
+//             call to create the mapping from field name to se in protocol fields.
+//             Pass in qp_node of data sources, in order.
+  virtual void create_protocol_se(std::vector<qp_node *> q_sources,table_list *Schema)=0;
+//             get the protocol map.  the parameter is the return value.
+  std::map<std::string, scalarexp_t *> *get_protocol_se(){return &protocol_map;}
+
+//             Each qp node must be able to return a description
+//             of the tuples it creates.
+//             TODO: the get_output_tls method should subsume the get_fields
+//                     method, but in fact it really just returns the
+//                     operator name.
+  virtual table_def *get_fields() = 0; // Should be vector?
+//             Get the from clause
+  virtual std::vector<tablevar_t *> get_input_tbls() = 0;
+//             this is a confused function, it acutally return the output
+//             table name.
+  virtual std::vector<tablevar_t *> get_output_tbls() = 0;
+
+  std::string get_val_of_def(std::string def){
+       if(definitions.count(def) > 0) return definitions[def];
+       return("");
+  };
+  void set_definition(std::string def, std::string val){
+       definitions[def]=val;
+  }
+
+//             Associate colrefs in SEs with tables
+//             at code generation time.
+  virtual void bind_to_schema(table_list *Schema) = 0;
+
+//             Get colrefs of the operator, currently only meaningful for lfta
+//             operators, and only interested in colrefs with extraction fcns
+  virtual col_id_set get_colrefs(bool ext_fcns_only,table_list *Schema)=0;
+
+  virtual std::string to_query_string() = 0;
+  virtual std::string generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, std::vector<bool> &needs_xform) = 0;
+  virtual std::string generate_functor_name() = 0;
+
+  virtual std::string generate_operator(int i, std::string params) = 0;
+  virtual std::string get_include_file() = 0;
+
+  virtual cplx_lit_table *get_cplx_lit_tbl(ext_fcn_list *Ext_fcns) = 0;
+  virtual std::vector<handle_param_tbl_entry *> get_handle_param_tbl(ext_fcn_list *Ext_fcns) = 0;
+
+//             Split this node into LFTA and HFTA nodes.
+//             Four possible outcomes:
+//             1) the qp_node reads from a protocol, but does not need to
+//                     split (can be evaluated as an LFTA).
+//                     The lfta node is the only element in the return vector,
+//                     and hfta_returned is false.
+//             2) the qp_node reads from no protocol, and therefore cannot be split.
+//                     THe hfta node is the only element in the return vector,
+//                     and hfta_returned is true.
+//             3) reads from at least one protocol, but cannot be split : failure.
+//                     return vector is empty, the error conditions are written
+//                     in the qp_node.
+//             4) The qp_node splits into an hfta node and one or more LFTA nodes.
+//                     the return vector has two or more elements, and hfta_returned
+//                     is true.  The last element is the HFTA.
+       virtual std::vector<qp_node *> split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx) = 0;
+
+
+//             Ensure that any refs to interface params have been split away.
+       virtual int count_ifp_refs(std::set<std::string> &ifpnames)=0;
+
+
+
+//             Tag the data sources which are views,
+//             return the (optimized) source queries and
+//             record the view access in opview_set
+       virtual std::vector<table_exp_t *> extract_opview(table_list *Schema, std::vector<query_node *> &qnodes, opview_set &opviews, std::string rootnm, std::string silo_nm) = 0;
+
+  param_table *get_param_tbl(){return param_tbl;};
+
+//                     The "where" clause is a pre-filter
+  virtual  std::vector<cnf_elem *> get_where_clause() = 0;
+//                     To be more explicit, use get_filter_preds
+  virtual  std::vector<cnf_elem *> get_filter_clause() = 0;
+
+  void add_predecessor(int i){predecessors.push_back(i);};
+  void remove_predecessor(int i){
+       std::vector<int>::iterator vi;
+       for(vi=predecessors.begin(); vi!=predecessors.end();++vi){
+               if((*vi) == i){
+                       predecessors.erase(vi);
+                       return;
+               }
+       }
+  };
+  void add_successor(int i){successors.push_back(i);};
+  std::vector<int> get_predecessors(){return predecessors;};
+  int n_predecessors(){return predecessors.size();};
+  std::vector<int> get_successors(){return successors;};
+  int n_successors(){return successors.size();};
+  void clear_predecessors(){predecessors.clear();};
+  void clear_successors(){successors.clear();};
+
+  // the following method is used for distributed query optimization
+  double get_rate_estimate();
+
+
+  // used for cloning query nodes
+  virtual qp_node* make_copy(std::string suffix) = 0;
+};
+
+
+
+//             Select, project, transform (xform) query plan node.
+//             represent the following query fragment
+//                     select scalar_expression_1, ..., scalar_expression_k
+//                     from S
+//                     where predicate
+//
+//             the predicates and the scalar expressions can reference
+//             attributes of S and also functions.
+class spx_qpn: public qp_node{
+public:
+       tablevar_t *table_name;                                 //      Source table
+       std::vector<cnf_elem *> where;                  // selection predicate
+       std::vector<select_element *> select_list;      //      Select list
+
+
+
+       std::string node_type(){return("spx_qpn");      };
+    bool makes_transform(){return true;};
+       std::vector<std::string> external_libs(){
+               std::vector<std::string> ret;
+               return ret;
+       }
+
+       void bind_to_schema(table_list *Schema);
+       col_id_set get_colrefs(bool ext_fcns_only,table_list *Schema);
+
+       std::string to_query_string();
+       std::string generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, std::vector<bool> &needs_xform);
+       std::string generate_functor_name();
+       std::string generate_operator(int i, std::string params);
+       std::string get_include_file(){return("#include <selection_operator.h>\n");};
+
+    std::vector<select_element *> get_select_list(){return select_list;};
+    std::vector<scalarexp_t *> get_select_se_list(){
+               std::vector<scalarexp_t *> ret;
+               int i;
+               for(i=0;i<select_list.size();++i) ret.push_back(select_list[i]->se);
+               return ret;
+       };
+    std::vector<cnf_elem *> get_where_clause(){return where;};
+    std::vector<cnf_elem *> get_filter_clause(){return where;};
+       cplx_lit_table *get_cplx_lit_tbl(ext_fcn_list *Ext_fcns);
+    std::vector<handle_param_tbl_entry *> get_handle_param_tbl(ext_fcn_list *Ext_fcns);
+
+       table_def *get_fields();
+       std::vector<tablevar_t *> get_input_tbls();
+       std::vector<tablevar_t *> get_output_tbls();
+
+       std::vector<qp_node *> split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx);
+       virtual std::vector<table_exp_t *> extract_opview(table_list *Schema, std::vector<query_node *> &qnodes, opview_set &opviews, std::string rootnm, std::string silo_nm);
+//             Ensure that any refs to interface params have been split away.
+       int count_ifp_refs(std::set<std::string> &ifpnames);
+       int resolve_if_params(ifq_t *ifdb, std::string &err);
+
+       spx_qpn(){
+       };
+       spx_qpn(query_summary_class *qs,table_list *Schema){
+//                             Get the table name.
+//                             NOTE the colrefs have the table ref (an int)
+//                             embedded in them.  Would it make sense
+//                             to grab the whole table list?
+               tablevar_list_t *fm = qs->fta_tree->get_from();
+               std::vector<tablevar_t *> tbl_vec = fm->get_table_list();
+               if(tbl_vec.size() != 1){
+                       char tmpstr[200];
+                       sprintf(tmpstr,"INTERNAL ERROR building SPX node: query defined over %lu tables.\n",tbl_vec.size() );
+                       err_str = tmpstr;
+                       error_code = 1;
+               }
+               table_name = (tbl_vec[0]);
+
+//                             Get the select list.
+               select_list = qs->fta_tree->get_sl_vec();
+
+//                             Get the selection predicate.
+               where = qs->wh_cnf;
+
+
+//                             Get the parameters
+               param_tbl = qs->param_tbl;
+
+
+
+       };
+
+       // the following method is used for distributed query optimization
+       double get_rate_estimate();
+
+
+       qp_node* make_copy(std::string suffix){
+               spx_qpn *ret = new spx_qpn();
+
+               ret->param_tbl = new param_table();
+               std::vector<std::string> param_names = param_tbl->get_param_names();
+               int pi;
+               for(pi=0;pi<param_names.size();pi++){
+                       data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                       ret->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                       param_tbl->handle_access(param_names[pi]));
+               }
+               ret->definitions = definitions;
+               ret->node_name = node_name + suffix;
+
+               // make shallow copy of all fields
+               ret->where = where;
+               ret->select_list = select_list;
+
+               return ret;
+       };
+       void create_protocol_se(vector<qp_node *> q_sources, table_list *Schema);
+
+};
+
+
+
+//             Select, group-by, aggregate.
+//             Representing
+//                     Select SE_1, ..., SE_k
+//                     From T
+//                     Where predicate
+//                     Group By gb1, ..., gb_n
+//                     Having predicate
+//
+//             NOTE : the samlping operator is sgahcwcb_qpn.
+//
+//             For now, must have group-by variables and aggregates.
+//             The scalar expressions which are output must be a function
+//             of the groub-by variables and the aggregates.
+//             The group-by variables can be references to columsn of T,
+//             or they can be scalar expressions.
+class sgah_qpn: public qp_node{
+public:
+       tablevar_t *table_name;                         // source table
+       std::vector<cnf_elem *> where;          // selection predicate
+       std::vector<cnf_elem *> having;         // post-aggregation predicate
+       std::vector<select_element *> select_list;      // se's of output
+       gb_table gb_tbl;                        // Table of all group-by attributes.
+       aggregate_table aggr_tbl;       // Table of all referenced aggregates.
+
+       std::vector<scalarexp_t *> gb_sources;  // pre-compute for partitioning.
+
+       int lfta_disorder;              // maximum disorder in the steam between lfta, hfta
+       int hfta_disorder;              // maximum disorder in the  hfta
+
+//             rollup, cube, and grouping_sets cannot be readily reconstructed by
+//             analyzing the patterns, so explicitly record them here.
+//             used only so that to_query_string produces something meaningful.
+       std::vector<std::string> gb_entry_type;
+       std::vector<int> gb_entry_count;
+
+       std::vector<scalarexp_t *> get_gb_sources(){return gb_sources;}
+
+       std::string node_type(){return("sgah_qpn");     };
+    bool makes_transform(){return true;};
+       std::vector<std::string> external_libs(){
+               std::vector<std::string> ret;
+               return ret;
+       }
+
+       void bind_to_schema(table_list *Schema);
+       col_id_set get_colrefs(bool ext_fcns_only,table_list *Schema);
+
+       std::string to_query_string();
+       std::string generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, std::vector<bool> &needs_xform);
+       std::string generate_functor_name();
+
+       std::string generate_operator(int i, std::string params);
+       std::string get_include_file(){
+                       if(hfta_disorder <= 1){
+                               return("#include <groupby_operator.h>\n");
+                       }else{
+                               return("#include <groupby_operator_oop.h>\n");
+                       }
+       };
+
+    std::vector<select_element *> get_select_list(){return select_list;};
+    std::vector<scalarexp_t *> get_select_se_list(){
+               std::vector<scalarexp_t *> ret;
+               int i;
+               for(i=0;i<select_list.size();++i) ret.push_back(select_list[i]->se);
+               return ret;
+       };
+    std::vector<cnf_elem *> get_where_clause(){return where;};
+    std::vector<cnf_elem *> get_filter_clause(){return where;};
+    std::vector<cnf_elem *> get_having_clause(){return having;};
+    gb_table *get_gb_tbl(){return &gb_tbl;};
+    aggregate_table *get_aggr_tbl(){return &aggr_tbl;};
+       cplx_lit_table *get_cplx_lit_tbl(ext_fcn_list *Ext_fcns);
+    std::vector<handle_param_tbl_entry *> get_handle_param_tbl(ext_fcn_list *Ext_fcns);
+
+//                             table which represents output tuple.
+       table_def *get_fields();
+       std::vector<tablevar_t *> get_input_tbls();
+       std::vector<tablevar_t *> get_output_tbls();
+
+
+       sgah_qpn(){
+               lfta_disorder = 1;
+               hfta_disorder = 1;
+       };
+       sgah_qpn(query_summary_class *qs,table_list *Schema){
+               lfta_disorder = 1;
+               hfta_disorder = 1;
+
+//                             Get the table name.
+//                             NOTE the colrefs have the tablevar ref (an int)
+//                             embedded in them.  Would it make sense
+//                             to grab the whole table list?
+               tablevar_list_t *fm = qs->fta_tree->get_from();
+               std::vector<tablevar_t *> tbl_vec = fm->get_table_list();
+               if(tbl_vec.size() != 1){
+                       char tmpstr[200];
+                       sprintf(tmpstr,"INTERNAL ERROR building SGAH node: query defined over %lu tables.\n",tbl_vec.size() );
+                       err_str=tmpstr;
+                       error_code = 1;
+               }
+               table_name = (tbl_vec[0]);
+
+//                             Get the select list.
+               select_list = qs->fta_tree->get_sl_vec();
+
+//                             Get the selection and having predicates.
+               where = qs->wh_cnf;
+               having = qs->hav_cnf;
+
+//                             Build a new GB var table (don't share, might need to modify)
+               int g;
+               for(g=0;g<qs->gb_tbl->size();g++){
+                       gb_tbl.add_gb_var(qs->gb_tbl->get_name(g),
+                               qs->gb_tbl->get_tblvar_ref(g), qs->gb_tbl->get_def(g),
+                               qs->gb_tbl->get_reftype(g)
+                       );
+               }
+               gb_tbl.set_pattern_info(qs->gb_tbl);
+//             gb_tbl.gb_entry_type = qs->gb_tbl->gb_entry_type;
+//             gb_tbl.gb_entry_count = qs->gb_tbl->gb_entry_count;
+//             gb_tbl.pattern_components = qs->gb_tbl->pattern_components;
+
+//                             Build a new aggregate table. (don't share, might need
+//                             to modify).
+               int a;
+               for(a=0;a<qs->aggr_tbl->size();a++){
+                       aggr_tbl.add_aggr(
+//                             qs->aggr_tbl->get_op(a), qs->aggr_tbl->get_aggr_se(a)
+                               qs->aggr_tbl->duplicate(a)
+                       );
+               }
+
+
+//                             Get the parameters
+               param_tbl = qs->param_tbl;
+
+       };
+
+
+
+       std::vector<qp_node *> split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx);
+       virtual std::vector<table_exp_t *> extract_opview(table_list *Schema, std::vector<query_node *> &qnodes, opview_set &opviews, std::string rootnm, std::string silo_nm);
+//             Ensure that any refs to interface params have been split away.
+       int count_ifp_refs(std::set<std::string> &ifpnames);
+       int resolve_if_params(ifq_t *ifdb, std::string &err);
+
+       // the following method is used for distributed query optimization
+       double get_rate_estimate();
+
+
+       qp_node* make_copy(std::string suffix){
+               sgah_qpn *ret = new sgah_qpn();
+
+               ret->param_tbl = new param_table();
+               std::vector<std::string> param_names = param_tbl->get_param_names();
+               int pi;
+               for(pi=0;pi<param_names.size();pi++){
+                       data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                       ret->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                       param_tbl->handle_access(param_names[pi]));
+               }
+               ret->definitions = definitions;
+
+               ret->node_name = node_name + suffix;
+
+               // make shallow copy of all fields
+               ret->where = where;
+               ret->having = having;
+               ret->select_list = select_list;
+               ret->gb_tbl = gb_tbl;
+               ret->aggr_tbl = aggr_tbl;
+
+               return ret;
+       };
+
+//             Split aggregation into two HFTA components - sub and superaggregation
+//             If unable to split the aggreagates, split into selection and aggregation
+//             If resulting low-level query is empty (e.g. when aggregates cannot be split and
+//             where clause is empty) empty vector willb e returned
+       virtual std::vector<qp_node *> split_node_for_hfta(ext_fcn_list *Ext_fcns, table_list *Schema);
+
+       void create_protocol_se(vector<qp_node *> q_sources, table_list *Schema);
+
+};
+
+
+
+
+//             Select, group-by, aggregate. with running aggregates
+//             Representing
+//                     Select SE_1, ..., SE_k
+//                     From T
+//                     Where predicate
+//                     Group By gb1, ..., gb_n
+//                     Closing When predicate
+//                     Having predicate
+//
+//             NOTE : the sampling operator is sgahcwcb_qpn.
+//
+//             For now, must have group-by variables and aggregates.
+//             The scalar expressions which are output must be a function
+//             of the groub-by variables and the aggregates.
+//             The group-by variables can be references to columsn of T,
+//             or they can be scalar expressions.
+class rsgah_qpn: public qp_node{
+public:
+       tablevar_t *table_name;                         // source table
+       std::vector<cnf_elem *> where;          // selection predicate
+       std::vector<cnf_elem *> having;         // post-aggregation predicate
+       std::vector<cnf_elem *> closing_when;           // group closing predicate
+       std::vector<select_element *> select_list;      // se's of output
+       gb_table gb_tbl;                        // Table of all group-by attributes.
+       aggregate_table aggr_tbl;       // Table of all referenced aggregates.
+
+       std::vector<scalarexp_t *> gb_sources;  // pre-compute for partitioning.
+
+       int lfta_disorder;              // maximum disorder allowed in stream between lfta, hfta
+       int hfta_disorder;              // maximum disorder allowed in hfta
+
+       std::vector<scalarexp_t *> get_gb_sources(){return gb_sources;}
+
+
+       std::string node_type(){return("rsgah_qpn");    };
+    bool makes_transform(){return true;};
+       std::vector<std::string> external_libs(){
+               std::vector<std::string> ret;
+               return ret;
+       }
+
+       void bind_to_schema(table_list *Schema);
+       col_id_set get_colrefs(bool ext_fcns_only,table_list *Schema){
+               fprintf(stderr,"INTERNAL ERROR, calling rsgah_qpn::get_colrefs\n");
+               exit(1);
+       }
+
+       std::string to_query_string();
+       std::string generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, std::vector<bool> &needs_xform);
+       std::string generate_functor_name();
+
+       std::string generate_operator(int i, std::string params);
+       std::string get_include_file(){return("#include <running_gb_operator.h>\n");};
+
+    std::vector<select_element *> get_select_list(){return select_list;};
+    std::vector<scalarexp_t *> get_select_se_list(){
+               std::vector<scalarexp_t *> ret;
+               int i;
+               for(i=0;i<select_list.size();++i) ret.push_back(select_list[i]->se);
+               return ret;
+       };
+    std::vector<cnf_elem *> get_where_clause(){return where;};
+    std::vector<cnf_elem *> get_filter_clause(){return where;};
+    std::vector<cnf_elem *> get_having_clause(){return having;};
+    std::vector<cnf_elem *> get_closing_when_clause(){return closing_when;};
+    gb_table *get_gb_tbl(){return &gb_tbl;};
+    aggregate_table *get_aggr_tbl(){return &aggr_tbl;};
+       cplx_lit_table *get_cplx_lit_tbl(ext_fcn_list *Ext_fcns);
+    std::vector<handle_param_tbl_entry *> get_handle_param_tbl(ext_fcn_list *Ext_fcns);
+
+//                             table which represents output tuple.
+       table_def *get_fields();
+       std::vector<tablevar_t *> get_input_tbls();
+       std::vector<tablevar_t *> get_output_tbls();
+
+
+       rsgah_qpn(){
+               lfta_disorder = 1;
+               hfta_disorder = 1;
+       };
+       rsgah_qpn(query_summary_class *qs,table_list *Schema){
+               lfta_disorder = 1;
+               hfta_disorder = 1;
+
+//                             Get the table name.
+//                             NOTE the colrefs have the tablevar ref (an int)
+//                             embedded in them.  Would it make sense
+//                             to grab the whole table list?
+               tablevar_list_t *fm = qs->fta_tree->get_from();
+               std::vector<tablevar_t *> tbl_vec = fm->get_table_list();
+               if(tbl_vec.size() != 1){
+                       char tmpstr[200];
+                       sprintf(tmpstr,"INTERNAL ERROR buildingR SGAH node: query defined over %lu tables.\n",tbl_vec.size() );
+                       err_str=tmpstr;
+                       error_code = 1;
+               }
+               table_name = (tbl_vec[0]);
+
+//                             Get the select list.
+               select_list = qs->fta_tree->get_sl_vec();
+
+//                             Get the selection and having predicates.
+               where = qs->wh_cnf;
+               having = qs->hav_cnf;
+               closing_when = qs->closew_cnf;
+
+//                             Build a new GB var table (don't share, might need to modify)
+               int g;
+               for(g=0;g<qs->gb_tbl->size();g++){
+                       gb_tbl.add_gb_var(qs->gb_tbl->get_name(g),
+                               qs->gb_tbl->get_tblvar_ref(g), qs->gb_tbl->get_def(g),
+                               qs->gb_tbl->get_reftype(g)
+                       );
+               }
+
+//                             Build a new aggregate table. (don't share, might need
+//                             to modify).
+               int a;
+               for(a=0;a<qs->aggr_tbl->size();a++){
+                       aggr_tbl.add_aggr(
+//                             qs->aggr_tbl->get_op(a), qs->aggr_tbl->get_aggr_se(a)
+                               qs->aggr_tbl->duplicate(a)
+                       );
+               }
+
+
+//                             Get the parameters
+               param_tbl = qs->param_tbl;
+
+       };
+
+
+
+       std::vector<qp_node *> split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx);
+       std::vector<qp_node *> split_node_for_hfta(ext_fcn_list *Ext_fcns, table_list *Schema);
+       virtual std::vector<table_exp_t *> extract_opview(table_list *Schema, std::vector<query_node *> &qnodes, opview_set &opviews, std::string rootnm, std::string silo_nm);
+//             Ensure that any refs to interface params have been split away.
+       int count_ifp_refs(std::set<std::string> &ifpnames);
+       int resolve_if_params(ifq_t *ifdb, std::string &err){ return 0;}
+
+       // the following method is used for distributed query optimization
+       double get_rate_estimate();
+
+       qp_node* make_copy(std::string suffix){
+               rsgah_qpn *ret = new rsgah_qpn();
+
+               ret->param_tbl = new param_table();
+               std::vector<std::string> param_names = param_tbl->get_param_names();
+               int pi;
+               for(pi=0;pi<param_names.size();pi++){
+                       data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                       ret->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                       param_tbl->handle_access(param_names[pi]));
+               }
+               ret->definitions = definitions;
+
+               ret->node_name = node_name + suffix;
+
+               // make shallow copy of all fields
+               ret->where = where;
+               ret->having = having;
+               ret->closing_when = closing_when;
+               ret->select_list = select_list;
+               ret->gb_tbl = gb_tbl;
+               ret->aggr_tbl = aggr_tbl;
+
+               return ret;
+       };
+       void create_protocol_se(vector<qp_node *> q_sources, table_list *Schema);
+};
+
+
+//             forward reference
+class filter_join_qpn;
+
+
+//             (temporal) Merge query plan node.
+//             represent the following query fragment
+//                     Merge c1:c2
+//                     from T1 _t1, T2 _t2
+//
+//             T1 and T2 must have compatible schemas,
+//             that is the same types in the same slots.
+//             c1 and c2 must be colrefs from T1 and T2,
+//             both ref'ing the same slot.  Their types
+//             must be temporal and the same kind of temporal.
+//             in the output, no other field is temporal.
+//             the field names ofthe output are drawn from T1.
+class mrg_qpn: public qp_node{
+public:
+       std::vector<tablevar_t *> fm;                                   //      Source table
+       std::vector<colref_t *> mvars;                                  // the merge-by columns.
+       scalarexp_t *slack;
+
+       table_def *table_layout;                                // the output schema
+       int merge_fieldpos;                                             // position of merge field,
+                                                                                       // convenience for manipulation.
+
+       int disorder;           // max disorder seen in the input / allowed in the output
+
+
+       // partition definition for merges that combine streams partitioned over multiple interfaces
+       partn_def_t* partn_def;
+
+
+
+       std::string node_type(){return("mrg_qpn");      };
+    bool makes_transform(){return false;};
+       std::vector<std::string> external_libs(){
+               std::vector<std::string> ret;
+               return ret;
+       }
+
+       void bind_to_schema(table_list *Schema);
+       col_id_set get_colrefs(bool ext_fcns_only,table_list *Schema){
+               fprintf(stderr,"INTERNAL ERROR, calling mrg_qpn::get_colrefs\n");
+               exit(1);
+       }
+
+       std::string to_query_string();
+       std::string generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, std::vector<bool> &needs_xform);
+       std::string generate_functor_name();
+       std::string generate_operator(int i, std::string params);
+       std::string get_include_file(){
+               if(disorder>1)
+                       return("#include <merge_operator_oop.h>\n");
+               return("#include <merge_operator.h>\n");
+       };
+
+       cplx_lit_table *get_cplx_lit_tbl(ext_fcn_list *Ext_fcns);
+    std::vector<handle_param_tbl_entry *> get_handle_param_tbl(ext_fcn_list *Ext_fcns);
+
+       table_def *get_fields();
+       std::vector<tablevar_t *> get_input_tbls();
+       std::vector<tablevar_t *> get_output_tbls();
+
+       std::vector<qp_node *> split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx);
+       virtual std::vector<table_exp_t *> extract_opview(table_list *Schema, std::vector<query_node *> &qnodes,  opview_set &opviews, std::string rootnm, std::string silo_nm);
+//             Ensure that any refs to interface params have been split away.
+       int count_ifp_refs(std::set<std::string> &ifpnames);
+
+//                     No predicates, return an empty clause
+    std::vector<cnf_elem *> get_where_clause(){
+                std::vector<cnf_elem *> t;
+               return(t);
+       };
+    std::vector<cnf_elem *> get_filter_clause(){
+               return get_where_clause();
+       }
+
+       mrg_qpn(){
+               partn_def = NULL;
+       };
+
+       void set_disorder(int d){
+               disorder = d;
+       }
+
+       mrg_qpn(query_summary_class *qs,table_list *Schema){
+               disorder = 1;
+
+//                             Grab the elements of the query node.
+               fm = qs->fta_tree->get_from()->get_table_list();
+               mvars = qs->mvars;
+               slack = qs->slack;
+
+//                     sanity check
+               if(fm.size() != mvars.size()){
+                       fprintf(stderr,"INTERNAL ERROR in mrg_qpn::mrg_qpn.  fm.size() = %lu, mvars.size() = %lu\n",fm.size(),mvars.size());
+                       exit(1);
+               }
+
+//                             Get the parameters
+               param_tbl = qs->param_tbl;
+
+//                             Need to set the node name now, so that the
+//                             schema (table_layout) can be properly named.
+//                             TODO: Setting the name of the table might best be done
+//                             via the set_node_name method, because presumably
+//                             thats when the node name is really known.
+//                             This should propogate to the table_def table_layout
+               node_name=qs->query_name;
+
+/*
+int ff;
+printf("instantiating merge node, name = %s, %d sources.\n\t",node_name.c_str(), fm.size());
+for(ff=0;ff<fm.size();++ff){
+printf("%s ",fm[ff]->to_string().c_str());
+}
+printf("\n");
+*/
+
+
+//             Create the output schema.
+//             strip temporal properites form all fields except the merge field.
+               std::vector<field_entry *> flva = Schema->get_fields(fm[0]->get_schema_name());
+               field_entry_list *fel = new field_entry_list();
+               int f;
+               for(f=0;f<flva.size();++f){
+                       field_entry *fe;
+                       data_type dt(flva[f]->get_type().c_str(), flva[f]->get_modifier_list());
+                       if(flva[f]->get_name() == mvars[0]->get_field()){
+                               merge_fieldpos = f;
+//                             if(slack != NULL) dt.reset_temporal();
+                       }else{
+                               dt.reset_temporal();
+                       }
+
+                       param_list *plist = new param_list();
+                       std::vector<std::string> param_strings = dt.get_param_keys();
+                       int p;
+                       for(p=0;p<param_strings.size();++p){
+                               std::string v = dt.get_param_val(param_strings[p]);
+                               if(v != "")
+                                       plist->append(param_strings[p].c_str(),v.c_str());
+                               else
+                                       plist->append(param_strings[p].c_str());
+                       }
+
+
+                       fe=new field_entry(
+                               dt.get_type_str().c_str(), flva[f]->get_name().c_str(),"",plist, flva[f]->get_unpack_fcns());
+                       fel->append_field(fe);
+               }
+
+
+
+
+               table_layout = new table_def(
+                       node_name.c_str(), NULL, NULL, fel, STREAM_SCHEMA
+               );
+
+               partn_def = NULL;
+       };
+
+
+/////////////////////////////////////////////
+///            Created for de-siloing.  to be removed?  or is it otherwise useful?
+//             Merge existing set of sources (de-siloing)
+       mrg_qpn(std::string n_name, std::vector<std::string> &src_names,table_list *Schema){
+               int i,f;
+
+               disorder = 1;
+
+//                             Construct the fm list
+               for(f=0;f<src_names.size();++f){
+                       int tbl_ref = Schema->get_table_ref(src_names[f]);
+                       if(tbl_ref < 0){
+                               fprintf(stderr,"INTERNAL ERROR, can't find %s in the schema when constructing no-silo merge node %s\n",src_names[f].c_str(), n_name.c_str());
+                               exit(1);
+                       }
+                       table_def *src_tbl = Schema->get_table(tbl_ref);
+                       tablevar_t *fm_t = new tablevar_t(src_names[f].c_str());
+                       string range_name = "_t" + int_to_string(f);
+                       fm_t->set_range_var(range_name);
+                       fm_t->set_schema_ref(tbl_ref);
+                       fm.push_back(fm_t);
+               }
+
+//             Create the output schema.
+//             strip temporal properites form all fields except the merge field.
+               std::vector<field_entry *> flva = Schema->get_fields(fm[0]->get_schema_name());
+               field_entry_list *fel = new field_entry_list();
+               bool temporal_found = false;
+               for(f=0;f<flva.size();++f){
+                       field_entry *fe;
+                       data_type dt(flva[f]->get_type().c_str(), flva[f]->get_modifier_list());
+                       if(dt.is_temporal() && !temporal_found){
+                               merge_fieldpos = f;
+                               temporal_found = true;
+                       }else{
+                               dt.reset_temporal();
+                       }
+
+                       param_list *plist = new param_list();
+                       std::vector<std::string> param_strings = dt.get_param_keys();
+                       int p;
+                       for(p=0;p<param_strings.size();++p){
+                               std::string v = dt.get_param_val(param_strings[p]);
+                               if(v != "")
+                                       plist->append(param_strings[p].c_str(),v.c_str());
+                               else
+                                       plist->append(param_strings[p].c_str());
+                       }
+
+                       fe=new field_entry(
+                               dt.get_type_str().c_str(), flva[f]->get_name().c_str(),"",plist,
+                               flva[f]->get_unpack_fcns()
+                       );
+                       fel->append_field(fe);
+               }
+
+               if(! temporal_found){
+                       fprintf(stderr,"ERROR, can't find temporal field of the sources when constructing no-silo merge node %s\n",n_name.c_str());
+                       exit(1);
+               }
+
+               node_name=n_name;
+               table_layout = new table_def(
+                       node_name.c_str(), NULL, NULL, fel, STREAM_SCHEMA
+               );
+
+               partn_def = NULL;
+               param_tbl = new param_table();
+
+//                     Construct mvars
+               for(f=0;f<fm.size();++f){
+                       std::vector<field_entry *> flv_f = Schema->get_fields(fm[f]->get_schema_name());
+                       data_type dt_f(flv_f[merge_fieldpos]->get_type().c_str(),
+                            flva[merge_fieldpos]->get_modifier_list());
+
+                       colref_t *mcr = new colref_t(fm[f]->get_var_name().c_str(),
+                               flv_f[merge_fieldpos]->get_name().c_str());
+                       mvars.push_back(mcr);
+               }
+
+//             literal_t *s_lit = new literal_t("5",LITERAL_INT);
+//             slack = new scalarexp_t(s_lit);
+               slack = NULL;
+
+       };
+//                     end de-siloing
+////////////////////////////////////////
+
+       void resolve_slack(scalarexp_t *t_se, std::string fname, std::vector<std::pair<std::string, std::string> > &sources,ifq_t *ifdb, gb_table *gbt);
+
+
+//                     Merge filter_join LFTAs.
+
+       mrg_qpn(filter_join_qpn *spx, std::string n_name, std::vector<std::string> &sources, std::vector<std::pair<std::string, std::string> > &ifaces, ifq_t *ifdb);
+
+//                     Merge selection LFTAs.
+
+       mrg_qpn(spx_qpn *spx, std::string n_name, std::vector<std::string> &sources, std::vector<std::pair<std::string, std::string> > &ifaces, ifq_t *ifdb){
+
+               disorder = 1;
+
+               param_tbl = spx->param_tbl;
+               int i;
+               node_name = n_name;
+               field_entry_list *fel = new field_entry_list();
+               merge_fieldpos = -1;
+
+
+
+
+               for(i=0;i<spx->select_list.size();++i){
+                       data_type *dt = spx->select_list[i]->se->get_data_type()->duplicate();
+                       if(dt->is_temporal()){
+                               if(merge_fieldpos < 0){
+                                       merge_fieldpos = i;
+                               }else{
+                                       fprintf(stderr,"Warning: Merge subquery %s found two temporal fields (%s, %s), using %s\n", n_name.c_str(), spx->select_list[merge_fieldpos]->name.c_str(), spx->select_list[i]->name.c_str(), spx->select_list[merge_fieldpos]->name.c_str() );
+                                       dt->reset_temporal();
+                               }
+                       }
+
+                       field_entry *fe = dt->make_field_entry(spx->select_list[i]->name);
+                       fel->append_field(fe);
+                       delete dt;
+               }
+               if(merge_fieldpos<0){
+                       fprintf(stderr,"ERROR, no temporal attribute for merge subquery %s\n",n_name.c_str());
+                               exit(1);
+               }
+               table_layout = new table_def( n_name.c_str(), NULL, NULL, fel, STREAM_SCHEMA);
+
+//                             NEED TO HANDLE USER_SPECIFIED SLACK
+               this->resolve_slack(spx->select_list[merge_fieldpos]->se,
+                               spx->select_list[merge_fieldpos]->name, ifaces, ifdb,NULL);
+//     if(this->slack == NULL)
+//             fprintf(stderr,"Zero slack.\n");
+//     else
+//             fprintf(stderr,"slack is %s\n",slack->to_string().c_str());
+
+               for(i=0;i<sources.size();i++){
+                       std::string rvar = "_m"+int_to_string(i);
+                       mvars.push_back(new colref_t(rvar.c_str(), spx->select_list[merge_fieldpos]->name.c_str()));
+                       mvars[i]->set_tablevar_ref(i);
+                       fm.push_back(new tablevar_t(sources[i].c_str()));
+                       fm[i]->set_range_var(rvar);
+               }
+
+               param_tbl = new param_table();
+               std::vector<std::string> param_names = spx->param_tbl->get_param_names();
+               int pi;
+               for(pi=0;pi<param_names.size();pi++){
+                       data_type *dt = spx->param_tbl->get_data_type(param_names[pi]);
+                       param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                       spx->param_tbl->handle_access(param_names[pi]));
+               }
+               definitions = spx->definitions;
+
+       }
+
+//             Merge aggregation LFTAs
+
+       mrg_qpn(sgah_qpn *sgah, std::string n_name, std::vector<std::string> &sources, std::vector<std::pair< std::string, std::string> > &ifaces, ifq_t *ifdb){
+
+               disorder = 1;
+
+               param_tbl = sgah->param_tbl;
+               int i;
+               node_name = n_name;
+               field_entry_list *fel = new field_entry_list();
+               merge_fieldpos = -1;
+               for(i=0;i<sgah->select_list.size();++i){
+                       data_type *dt = sgah->select_list[i]->se->get_data_type()->duplicate();
+                       if(dt->is_temporal()){
+                               if(merge_fieldpos < 0){
+                                       merge_fieldpos = i;
+                               }else{
+                                       fprintf(stderr,"Warning: Merge subquery %s found two temporal fields (%s, %s), using %s\n", n_name.c_str(), sgah->select_list[merge_fieldpos]->name.c_str(), sgah->select_list[i]->name.c_str(), sgah->select_list[merge_fieldpos]->name.c_str() );
+                                       dt->reset_temporal();
+                               }
+                       }
+
+                       field_entry *fe = dt->make_field_entry(sgah->select_list[i]->name);
+                       fel->append_field(fe);
+                       delete dt;
+               }
+               if(merge_fieldpos<0){
+                       fprintf(stderr,"ERROR, no temporal attribute for merge subquery %s\n",n_name.c_str());
+                       exit(1);
+               }
+               table_layout = new table_def( n_name.c_str(), NULL, NULL, fel, STREAM_SCHEMA);
+
+//                             NEED TO HANDLE USER_SPECIFIED SLACK
+               this->resolve_slack(sgah->select_list[merge_fieldpos]->se,
+                               sgah->select_list[merge_fieldpos]->name, ifaces, ifdb,
+                               &(sgah->gb_tbl));
+               if(this->slack == NULL)
+                       fprintf(stderr,"Zero slack.\n");
+               else
+                       fprintf(stderr,"slack is %s\n",slack->to_string().c_str());
+
+
+               for(i=0;i<sources.size();i++){
+                       std::string rvar = "_m"+int_to_string(i);
+                       mvars.push_back(new colref_t(rvar.c_str(), sgah->select_list[merge_fieldpos]->name.c_str()));
+                       mvars[i]->set_tablevar_ref(i);
+                       fm.push_back(new tablevar_t(sources[i].c_str()));
+                       fm[i]->set_range_var(rvar);
+               }
+
+               param_tbl = new param_table();
+               std::vector<std::string> param_names = sgah->param_tbl->get_param_names();
+               int pi;
+               for(pi=0;pi<param_names.size();pi++){
+                       data_type *dt = sgah->param_tbl->get_data_type(param_names[pi]);
+                       param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                       sgah->param_tbl->handle_access(param_names[pi]));
+               }
+               definitions = sgah->definitions;
+
+       }
+
+       qp_node *make_copy(std::string suffix){
+               mrg_qpn *ret = new mrg_qpn();
+               ret->slack = slack;
+               ret->disorder = disorder;
+
+               ret->param_tbl = new param_table();
+               std::vector<std::string> param_names = param_tbl->get_param_names();
+               int pi;
+               for(pi=0;pi<param_names.size();pi++){
+                       data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                       ret->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                       param_tbl->handle_access(param_names[pi]));
+               }
+               ret->definitions = definitions;
+
+               ret->node_name = node_name + suffix;
+               ret->table_layout = table_layout->make_shallow_copy(ret->node_name);
+               ret->merge_fieldpos = merge_fieldpos;
+
+               return ret;
+       };
+
+       std::vector<mrg_qpn *> split_sources();
+
+       // the following method is used for distributed query optimization
+       double get_rate_estimate();
+
+
+       // get partition definition for merges that combine streams partitioned over multiple interfaces
+       // return NULL for regular merges
+       partn_def_t* get_partn_definition(map<string, int> lfta_names, vector<string> interface_names, vector<string> machine_names, ifq_t *ifaces_db, partn_def_list_t *partn_parse_result) {
+               if (partn_def)
+                       return partn_def;
+
+               int err;
+               string err_str;
+               string partn_name;
+
+               vector<tablevar_t *> input_tables = get_input_tbls();
+               for (int i = 0; i <  input_tables.size(); ++i) {
+                       tablevar_t * table = input_tables[i];
+
+                       vector<string> partn_names = ifaces_db->get_iface_vals(table->get_machine(), table->get_interface(),"iface_partition",err,err_str);
+                       if (partn_names.size() != 1)    // can't have more than one value of partition attribute
+                               return NULL;
+                       string new_partn_name = partn_names[0];
+
+                       // need to make sure that all ifaces belong to the same partition
+                       if (!i)
+                               partn_name = new_partn_name;
+                       else if (new_partn_name != partn_name)
+                               return NULL;
+               }
+
+               // now find partition definition corresponding to partn_name
+               partn_def = partn_parse_result->get_partn_def(partn_name);
+               return partn_def;
+       };
+
+       void set_partn_definition(partn_def_t* def) {
+               partn_def = def;
+       }
+
+       bool is_multihost_merge() {
+
+               bool is_multihost = false;
+
+               // each input table must be have machine attribute be non-empty
+               // and there should be at least 2 different values of machine attributes
+               vector<tablevar_t *> input_tables = get_input_tbls();
+               string host = input_tables[0]->get_machine();
+               for  (int i = 1; i < input_tables.size(); ++i) {
+                       string new_host = input_tables[i]->get_machine();
+                       if (new_host == "")
+                               return false;
+                       if (new_host != host)
+                               is_multihost = true;
+               }
+               return is_multihost;
+       }
+
+       void create_protocol_se(vector<qp_node *> q_sources, table_list *Schema);
+};
+
+
+//             eq_temporal, hash join query plan node.
+//             represent the following query fragment
+//                     select scalar_expression_1, ..., scalar_expression_k
+//                     from T0 t0, T1 t1
+//                     where predicate
+//
+//             the predicates and the scalar expressions can reference
+//             attributes of t0 and t1 and also functions.
+//             The predicate must contain CNF elements to enable the
+//             efficient evaluation of the query.
+//             1) at least one predicate of the form
+//                     (temporal se in t0) = (temporal se in t1)
+//             2) at least one predicate of the form
+//                     (non-temporal se in t0) = (non-temporal se in t1)
+//
+class join_eq_hash_qpn: public qp_node{
+public:
+       std::vector<tablevar_t *> from;                                 //      Source tables
+       std::vector<select_element *> select_list;      //      Select list
+       std::vector<cnf_elem *> prefilter[2];           // source prefilters
+       std::vector<cnf_elem *> temporal_eq;            // define temporal window
+       std::vector<cnf_elem *> hash_eq;                        // define hash key
+       std::vector<cnf_elem *> postfilter;                     // final filter on hash matches.
+
+       std::vector<cnf_elem *> where;                          // all the filters
+                                                                                               // useful for summary analysis
+
+       std::vector<scalarexp_t *> hash_src_r, hash_src_l;
+
+       std::vector<scalarexp_t *> get_hash_r(){return hash_src_r;}
+       std::vector<scalarexp_t *> get_hash_l(){return hash_src_l;}
+
+       std::string node_type(){return("join_eq_hash_qpn");     };
+    bool makes_transform(){return true;};
+       std::vector<std::string> external_libs(){
+               std::vector<std::string> ret;
+               return ret;
+       }
+
+       void bind_to_schema(table_list *Schema);
+       col_id_set get_colrefs(bool ext_fcns_only,table_list *Schema){
+               fprintf(stderr,"INTERNAL ERROR, calling join_eq_hash_qpn::get_colrefs\n");
+               exit(1);
+       }
+
+       std::string to_query_string();
+       std::string generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, std::vector<bool> &needs_xform);
+       std::string generate_functor_name();
+       std::string generate_operator(int i, std::string params);
+       std::string get_include_file(){return("#include <join_eq_hash_operator.h>\n");};
+
+    std::vector<select_element *> get_select_list(){return select_list;};
+    std::vector<scalarexp_t *> get_select_se_list(){
+               std::vector<scalarexp_t *> ret;
+               int i;
+               for(i=0;i<select_list.size();++i) ret.push_back(select_list[i]->se);
+               return ret;
+       };
+//                     Used for LFTA only
+    std::vector<cnf_elem *> get_where_clause(){
+                std::vector<cnf_elem *> t;
+               return(t);
+       };
+    std::vector<cnf_elem *> get_filter_clause(){
+               return get_where_clause();
+       }
+
+       cplx_lit_table *get_cplx_lit_tbl(ext_fcn_list *Ext_fcns);
+    std::vector<handle_param_tbl_entry *> get_handle_param_tbl(ext_fcn_list *Ext_fcns);
+
+       table_def *get_fields();
+       std::vector<tablevar_t *> get_input_tbls();
+       std::vector<tablevar_t *> get_output_tbls();
+
+       std::vector<qp_node *> split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx);
+       virtual std::vector<table_exp_t *> extract_opview(table_list *Schema, std::vector<query_node *> &qnodes,  opview_set &opviews, std::string rootnm, std::string silo_nm);
+//             Ensure that any refs to interface params have been split away.
+       int count_ifp_refs(std::set<std::string> &ifpnames);
+
+       join_eq_hash_qpn(){
+       };
+       join_eq_hash_qpn(query_summary_class *qs,table_list *Schema){
+               int w;
+//                             Get the table name.
+//                             NOTE the colrefs have the table ref (an int)
+//                             embedded in them.  Would it make sense
+//                             to grab the whole table list?
+               from = qs->fta_tree->get_from()->get_table_list();
+               if(from.size() != 2){
+                       char tmpstr[200];
+                       sprintf(tmpstr,"ERROR building join_eq_hash node: query defined over %lu tables, but joins must be between two sources.\n",from.size() );
+                       err_str = tmpstr;
+                       error_code = 1;
+               }
+
+//                             Get the select list.
+               select_list = qs->fta_tree->get_sl_vec();
+
+//                             Get the selection predicate.
+               where = qs->wh_cnf;
+               for(w=0;w<where.size();++w){
+                       analyze_cnf(where[w]);
+                       std::vector<int> pred_tbls;
+                       get_tablevar_ref_pr(where[w]->pr,pred_tbls);
+//                             Prefilter if refs only one tablevar
+                       if(pred_tbls.size()==1){
+                               prefilter[pred_tbls[0]].push_back(where[w]);
+                               continue;
+                       }
+//                             refs nothing -- might be sampling, do it as postfilter.
+                       if(pred_tbls.size()==0){
+                               postfilter.push_back(where[w]);
+                               continue;
+                       }
+//                             See if it can be a hash or temporal predicate.
+//                             NOTE: synchronize with the temporality checking
+//                             done at join_eq_hash_qpn::get_fields
+                       if(where[w]->is_atom && where[w]->eq_pred){
+                               std::vector<int> sel_tbls, ser_tbls;
+                               get_tablevar_ref_se(where[w]->pr->get_left_se(),sel_tbls);
+                               get_tablevar_ref_se(where[w]->pr->get_right_se(),ser_tbls);
+                               if(sel_tbls.size()==1 && ser_tbls.size()==1 && sel_tbls[0] != ser_tbls[0]){
+//                                             make channel 0 SE on LHS.
+                                       if(sel_tbls[0] != 0)
+                                               where[w]->pr->swap_scalar_operands();
+
+                                       data_type *dtl=where[w]->pr->get_left_se()->get_data_type();
+                                       data_type *dtr=where[w]->pr->get_right_se()->get_data_type();
+                                       if( (dtl->is_increasing() && dtr->is_increasing()) ||
+                                           (dtl->is_decreasing() && dtr->is_decreasing()) )
+                                                       temporal_eq.push_back(where[w]);
+                                       else
+                                                       hash_eq.push_back(where[w]);
+                                       continue;
+
+                               }
+                       }
+//                             All tests failed, fallback is postfilter.
+                       postfilter.push_back(where[w]);
+               }
+
+               if(temporal_eq.size()==0){
+                       err_str = "ERROR in join query: can't find temporal equality predicate to define a join window.\n";
+                       error_code = 1;
+               }
+
+//                             Get the parameters
+               param_tbl = qs->param_tbl;
+
+       };
+
+       // the following method is used for distributed query optimization
+       double get_rate_estimate();
+
+
+       qp_node* make_copy(std::string suffix){
+               join_eq_hash_qpn *ret = new join_eq_hash_qpn();
+
+               ret->param_tbl = new param_table();
+               std::vector<std::string> param_names = param_tbl->get_param_names();
+               int pi;
+               for(pi=0;pi<param_names.size();pi++){
+                       data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                       ret->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                       param_tbl->handle_access(param_names[pi]));
+               }
+               ret->definitions = definitions;
+
+               ret->node_name = node_name + suffix;
+
+               // make shallow copy of all fields
+               ret->where = where;
+               ret->from = from;
+               ret->select_list = select_list;
+               ret->prefilter[0] = prefilter[0];
+               ret->prefilter[1] = prefilter[1];
+               ret->postfilter = postfilter;
+               ret->temporal_eq = temporal_eq;
+               ret->hash_eq = hash_eq;
+
+               return ret;
+       };
+       void create_protocol_se(vector<qp_node *> q_sources, table_list *Schema);
+
+};
+
+
+// ---------------------------------------------
+//             eq_temporal, hash join query plan node.
+//             represent the following query fragment
+//                     select scalar_expression_1, ..., scalar_expression_k
+//                     FILTER_JOIN(col, range) from T0 t0, T1 t1
+//                     where predicate
+//
+//             t0 is the output range variable, t1 is the filtering range
+//             variable.  Both must alias a PROTOCOL.
+//             The scalar expressions in the select clause may
+//             reference t0 only.
+//             The predicates are classified as follows
+//             prefilter predicates:
+//               a cheap predicate in t0 such that there is an equivalent
+//               predicate in t1.  Cost decisions about pushing to
+//               lfta prefilter made later.
+//             t0 predicates (other than prefilter predicates)
+//                     -- cheap vs. expensive sorted out at genereate time,
+//                             the constructor isn't called with the function list.
+//             t1 predicates (other than prefiler predicates).
+//             equi-join predicates of the form:
+//                     (se in t0) = (se in t1)
+//
+//             There must be at least one equi-join predicate.
+//             No join predicates other than equi-join predicates
+//               are allowed.
+//             Warn on temporal equi-join predicates.
+//             t1 predicates should not be expensive ... warn?
+//
+class filter_join_qpn: public qp_node{
+public:
+       std::vector<tablevar_t *> from;                                 //      Source tables
+               colref_t *temporal_var;                 // join window in FROM
+               unsigned int temporal_range;    // metadata.
+       std::vector<select_element *> select_list;      //      Select list
+       std::vector<cnf_elem *> shared_pred;            // prefilter preds
+       std::vector<cnf_elem *> pred_t0;                        // main (R) preds
+       std::vector<cnf_elem *> pred_t1;                        // filtering (S) preds
+       std::vector<cnf_elem *> hash_eq;                        // define hash key
+       std::vector<cnf_elem *> postfilter;                     // ref's no table.
+
+       std::vector<cnf_elem *> where;                          // all the filters
+                                                                                               // useful for summary analysis
+
+       std::vector<scalarexp_t *> hash_src_r, hash_src_l;
+       std::vector<scalarexp_t *> get_hash_r(){return hash_src_r;}
+       std::vector<scalarexp_t *> get_hash_l(){return hash_src_l;}
+
+
+       bool use_bloom;                 // true => bloom filter, false => limited hash
+
+       std::string node_type(){return("filter_join");  };
+    bool makes_transform(){return true;};
+       std::vector<std::string> external_libs(){
+               std::vector<std::string> ret;
+               return ret;
+       }
+
+       void bind_to_schema(table_list *Schema);
+       col_id_set get_colrefs(bool ext_fcns_only,table_list *Schema);
+
+       std::string to_query_string();
+       std::string generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, std::vector<bool> &needs_xform){
+               fprintf(stderr,"INTERNAL ERROR, filter_join_qpn::generate_functor called\n");
+               exit(1);
+       }
+       std::string generate_functor_name(){
+               fprintf(stderr,"INTERNAL ERROR, filter_join_qpn::generate_functor_name called\n");
+               exit(1);
+       }
+       std::string generate_operator(int i, std::string params){
+               fprintf(stderr,"INTERNAL ERROR, filter_join_qpn::generate_operator called\n");
+               exit(1);
+       }
+       std::string get_include_file(){return("#include <join_eq_hash_operator.h>\n");};
+
+    std::vector<select_element *> get_select_list(){return select_list;};
+    std::vector<scalarexp_t *> get_select_se_list(){
+               std::vector<scalarexp_t *> ret;
+               int i;
+               for(i=0;i<select_list.size();++i) ret.push_back(select_list[i]->se);
+               return ret;
+       };
+//                     Used for LFTA only
+    std::vector<cnf_elem *> get_where_clause(){return where;}
+    std::vector<cnf_elem *> get_filter_clause(){return shared_pred;}
+
+       cplx_lit_table *get_cplx_lit_tbl(ext_fcn_list *Ext_fcns);
+    std::vector<handle_param_tbl_entry *> get_handle_param_tbl(ext_fcn_list *Ext_fcns);
+
+       table_def *get_fields();
+       std::vector<tablevar_t *> get_input_tbls();
+       std::vector<tablevar_t *> get_output_tbls();
+
+       std::vector<qp_node *> split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx);
+       int resolve_if_params(ifq_t *ifdb, std::string &err);
+
+       virtual std::vector<table_exp_t *> extract_opview(table_list *Schema, std::vector<query_node *> &qnodes,  opview_set &opviews, std::string rootnm, std::string silo_nm);
+//             Ensure that any refs to interface params have been split away.
+       int count_ifp_refs(std::set<std::string> &ifpnames);
+
+
+       filter_join_qpn(){
+       };
+       filter_join_qpn(query_summary_class *qs,table_list *Schema){
+               int i,w;
+//                             Get the table name.
+//                             NOTE the colrefs have the table ref (an int)
+//                             embedded in them.  Would it make sense
+//                             to grab the whole table list?
+               from = qs->fta_tree->get_from()->get_table_list();
+               temporal_var = qs->fta_tree->get_from()->get_colref();
+               temporal_range = qs->fta_tree->get_from()->get_temporal_range();
+               if(from.size() != 2){
+                       char tmpstr[200];
+                       sprintf(tmpstr,"ERROR building filter_join_qpn node: query defined over %lu tables, but joins must be between two sources.\n",from.size() );
+                       err_str += tmpstr;
+                       error_code = 1;
+               }
+
+//                             Get the select list.
+               select_list = qs->fta_tree->get_sl_vec();
+//                             Verify that only t0 is referenced.
+               bool bad_ref = false;
+               for(i=0;i<select_list.size();i++){
+                       vector<int> sel_tbls;
+                       get_tablevar_ref_se(select_list[i]->se,sel_tbls);
+                       if((sel_tbls.size() == 2) || (sel_tbls.size()==1 && sel_tbls[0]==1))
+                               bad_ref = true;
+               }
+               if(bad_ref){
+                       err_str += "ERROR building filter_join_qpn node: query references range variable "+from[1]->variable_name+", but only the first range variable ("+from[0]->variable_name+" can be referenced.\n";
+                       error_code = 1;
+               }
+
+
+//                             Get the selection predicate.
+               where = qs->wh_cnf;
+               std::vector<cnf_elem *> t0_only, t1_only;
+               for(w=0;w<where.size();++w){
+                       analyze_cnf(where[w]);
+                       std::vector<int> pred_tbls;
+                       get_tablevar_ref_pr(where[w]->pr,pred_tbls);
+//                             Collect the list of preds by src var,
+//                             extract the shared preds later.
+                       if(pred_tbls.size()==1){
+                               if(pred_tbls[0] == 0){
+                                       t0_only.push_back(where[w]);
+                               }else{
+                                       t1_only.push_back(where[w]);
+                               }
+                               continue;
+                       }
+//                             refs nothing -- might be sampling, do it as postfilter.
+                       if(pred_tbls.size()==0){
+                               postfilter.push_back(where[w]);
+                               continue;
+                       }
+//                             See if it can be a hash or temporal predicate.
+//                             NOTE: synchronize with the temporality checking
+//                             done at join_eq_hash_qpn::get_fields
+                       if(where[w]->is_atom && where[w]->eq_pred){
+                               std::vector<int> sel_tbls, ser_tbls;
+                               get_tablevar_ref_se(where[w]->pr->get_left_se(),sel_tbls);
+                               get_tablevar_ref_se(where[w]->pr->get_right_se(),ser_tbls);
+                               if(sel_tbls.size()==1 && ser_tbls.size()==1 && sel_tbls[0] != ser_tbls[0]){
+//                                             make channel 0 SE on LHS.
+                                       if(sel_tbls[0] != 0)
+                                               where[w]->pr->swap_scalar_operands();
+
+                                       hash_eq.push_back(where[w]);
+
+                                       data_type *dtl=where[w]->pr->get_left_se()->get_data_type();
+                                       data_type *dtr=where[w]->pr->get_right_se()->get_data_type();
+                                       if( (dtl->is_increasing() && dtr->is_increasing()) ||
+                                           (dtl->is_decreasing() && dtr->is_decreasing()) )
+                                               err_str += "Warning, a filter join should not have join predicates on temporal fields.\n";
+                                       continue;
+
+                               }
+                       }
+//                             All tests failed, fallback is postfilter.
+                       err_str += "ERROR, join predicates in a filter join should have the form (scalar expression in "+from[0]->variable_name+") = (scalar expression in "+from[1]->variable_name+").\n";
+                       error_code = 3;
+               }
+//             Classify the t0_only and t1_only preds.
+               set<int> matched_pred;
+               int v;
+               for(w=0;w<t0_only.size();w++){
+                       for(v=0;v<t1_only.size();++v)
+                               if(is_equivalent_pred_base(t0_only[w]->pr,t1_only[v]->pr,Schema))
+                                       break;
+                       if(v<t1_only.size()){
+                               shared_pred.push_back(t0_only[w]);
+                               matched_pred.insert(v);
+                       }else{
+                               pred_t0.push_back(t0_only[w]);
+                       }
+               }
+               for(v=0;v<t1_only.size();++v){
+                       if(matched_pred.count(v) == 0)
+                               pred_t1.push_back(t1_only[v]);
+               }
+
+
+//                             Get the parameters
+               param_tbl = qs->param_tbl;
+               definitions = qs->definitions;
+
+//                             Determine the algorithm
+               if(this->get_val_of_def("algorithm") == "hash"){
+                       use_bloom = false;
+               }else{
+                       use_bloom = true;
+               }
+       };
+
+       // the following method is used for distributed query optimization
+       double get_rate_estimate();
+
+
+       qp_node* make_copy(std::string suffix){
+               filter_join_qpn *ret = new filter_join_qpn();
+
+               ret->param_tbl = new param_table();
+               std::vector<std::string> param_names = param_tbl->get_param_names();
+               int pi;
+               for(pi=0;pi<param_names.size();pi++){
+                       data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                       ret->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                       param_tbl->handle_access(param_names[pi]));
+               }
+               ret->definitions = definitions;
+
+               ret->node_name = node_name + suffix;
+
+               // make shallow copy of all fields
+               ret->where = where;
+               ret->from = from;
+               ret->temporal_range = temporal_range;
+               ret->temporal_var = temporal_var;
+               ret->select_list = select_list;
+               ret->shared_pred = shared_pred;
+               ret->pred_t0 = pred_t0;
+               ret->pred_t1 = pred_t1;
+               ret->postfilter = postfilter;
+               ret->hash_eq = hash_eq;
+
+               return ret;
+       };
+       void create_protocol_se(vector<qp_node *> q_sources, table_list *Schema);
+
+};
+
+
+enum output_file_type_enum {regular, gzip, bzip};
+
+class output_file_qpn: public qp_node{
+public:
+       std::string source_op_name;                                     //      Source table
+       std::vector<field_entry *> fields;
+       ospec_str *output_spec;
+       vector<tablevar_t *> fm;
+       std::string hfta_query_name;
+       std::string filestream_id;
+       bool eat_input;
+       std::vector<std::string> params;
+       bool do_gzip;
+       output_file_type_enum compression_type;
+
+       int n_streams;          // Number of output streams
+       int n_hfta_clones;      // number of hfta clones
+       int parallel_idx;       // which close this produces output for.
+       std::vector<int> hash_flds;     // fields used to hash the output.
+
+       std::string node_type(){return("output_file_qpn");      };
+    bool makes_transform(){return false;};
+       std::vector<std::string> external_libs(){
+               std::vector<std::string> ret;
+               switch(compression_type){
+               case gzip:
+                       ret.push_back("-lz");
+               break;
+               case bzip:
+                       ret.push_back("-lbz2");
+               break;
+               default:
+               break;
+               }
+               return ret;
+       }
+
+       void bind_to_schema(table_list *Schema){}
+       col_id_set get_colrefs(bool ext_fcns_only,table_list *Schema){
+               col_id_set ret;
+               return ret;
+       }
+
+       std::string to_query_string(){return "// output_file_operator \n";}
+       std::string generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, std::vector<bool> &needs_xform);
+       std::string generate_functor_name();
+       std::string generate_operator(int i, std::string params);
+       std::string get_include_file(){
+               switch(compression_type){
+               case gzip:
+                       return("#include <zfile_output_operator.h>\n");
+               default:
+                       return("#include <file_output_operator.h>\n");
+               }
+               return("#include <file_output_operator.h>\n");
+       };
+
+    std::vector<cnf_elem *> get_where_clause(){std::vector<cnf_elem *> ret; return ret;};
+    std::vector<cnf_elem *> get_filter_clause(){std::vector<cnf_elem *> ret; return ret;};
+       cplx_lit_table *get_cplx_lit_tbl(ext_fcn_list *Ext_fcns){cplx_lit_table *ret = new cplx_lit_table(); return ret;}
+    std::vector<handle_param_tbl_entry *> get_handle_param_tbl(ext_fcn_list *Ext_fcns){std::vector<handle_param_tbl_entry *> ret; return ret;}
+
+       table_def *get_fields(){
+               field_entry_list *fel = new field_entry_list();
+               int i;
+               for(i=0;i<fields.size();++i)
+                       fel->append_field(fields[i]);
+               return new table_def(node_name.c_str(), NULL, NULL, fel, STREAM_SCHEMA);
+       }
+       std::vector<tablevar_t *> get_input_tbls();
+       std::vector<tablevar_t *> get_output_tbls();
+
+       std::vector<qp_node *> split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx){
+               std::vector<qp_node *> ret; ret.push_back(this); hfta_returned = true; return ret;
+       }
+       std::vector<table_exp_t *> extract_opview(table_list *Schema, std::vector<query_node *> &qnodes, opview_set &opviews, std::string rootnm, std::string silo_nm){
+               std::vector<table_exp_t *> ret; return ret;
+       }
+//             Ensure that any refs to interface params have been split away.
+       int count_ifp_refs(std::set<std::string> &ifpnames){return 0;}
+       int resolve_if_params(ifq_t *ifdb, std::string &err){return 0;};
+
+
+       output_file_qpn(std::string src_op, std::string qn, std::string fs_id, table_def *src_tbl_def, ospec_str *ospec, bool ei){
+               source_op_name = src_op;
+               node_name = source_op_name + "_output";
+               filestream_id = fs_id;
+               fields = src_tbl_def->get_fields();
+               output_spec = ospec;
+               fm.push_back(new tablevar_t(source_op_name.c_str()));
+               hfta_query_name = qn;
+               eat_input = ei;
+
+               do_gzip = false;
+               compression_type = regular;
+               if(ospec->operator_type == "zfile")
+                       compression_type = gzip;
+
+               n_streams = 1;
+               parallel_idx = 0;
+               n_hfta_clones = 1;
+
+               char buf[1000];
+               strncpy(buf, output_spec->operator_param.c_str(),1000);
+               buf[999] = '\0';
+               char *words[100];
+               int nwords = split_string(buf, ':', words,100);
+               int i;
+               for(i=0;i<nwords;i++){
+                       params.push_back(words[i]);
+               }
+               for(i=0;i<params.size();i++){
+                       if(params[i] == "gzip")
+                               do_gzip = true;
+               }
+       }
+
+//             Set output splitting parameters
+       bool set_splitting_params(int np, int ix, int ns, std::string split_flds, std::string &err_report){
+               n_streams = ns;
+               n_hfta_clones = np;
+               parallel_idx = ix;
+
+               if(split_flds != ""){
+                       string err_flds = "";
+                       char *tmpstr = strdup(split_flds.c_str());
+                       char *words[100];
+                       int nwords = split_string(tmpstr,':',words,100);
+                       int i,j;
+                       for(i=0;i<nwords;++i){
+                               string target = words[i];
+                               for(j=0;j<fields.size();++j){
+                                       if(fields[j]->get_name() == target){
+                                               hash_flds.push_back(j);
+                                               break;
+                                       }
+                               }
+                               if(j==fields.size()){
+                                       err_flds += " "+target;
+                               }
+                       }
+                       if(err_flds != ""){
+                               err_report += "ERROR in "+hfta_query_name+", a file output operator needs to split the output but these splitting fileds are not part of the output:"+err_flds;
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       // the following method is used for distributed query optimization
+       double get_rate_estimate(){return 1.0;}
+
+
+       qp_node* make_copy(std::string suffix){
+//             output_file_qpn *ret = new output_file_qpn();
+               output_file_qpn *ret = new output_file_qpn(source_op_name, hfta_query_name, filestream_id, this->get_fields(), output_spec, eat_input);
+               return ret;
+       }
+
+       void create_protocol_se(vector<qp_node *> q_sources, table_list *Schema){}
+
+};
+
+
+
+//
+
+// ---------------------------------------------
+
+
+//             Select, group-by, aggregate, sampling.
+//             Representing
+//                     Select SE_1, ..., SE_k
+//                     From T
+//                     Where predicate
+//                     Group By gb1, ..., gb_n
+//                     [Subgroup gb_i1, .., gb_ik]
+//                     Cleaning_when  predicate
+//                     Cleaning_by predicate
+//                     Having predicate
+//
+//             For now, must have group-by variables and aggregates.
+//             The scalar expressions which are output must be a function
+//             of the groub-by variables and the aggregates.
+//             The group-by variables can be references to columsn of T,
+//             or they can be scalar expressions.
+class sgahcwcb_qpn: public qp_node{
+public:
+       tablevar_t *table_name;                         // source table
+       std::vector<cnf_elem *> where;          // selection predicate
+       std::vector<cnf_elem *> having;         // post-aggregation predicate
+       std::vector<select_element *> select_list;      // se's of output
+       gb_table gb_tbl;                        // Table of all group-by attributes.
+       std::set<int> sg_tbl;           // Names of the superGB attributes
+       aggregate_table aggr_tbl;       // Table of all referenced aggregates.
+       std::set<std::string> states_refd;      // states ref'd by stateful fcns.
+       std::vector<cnf_elem *> cleanby;
+       std::vector<cnf_elem *> cleanwhen;
+
+       std::vector<scalarexp_t *> gb_sources;  // pre-compute for partitioning.
+
+       std::vector<scalarexp_t *> get_gb_sources(){return gb_sources;}
+
+       std::string node_type(){return("sgahcwcb_qpn"); };
+    bool makes_transform(){return true;};
+       std::vector<std::string> external_libs(){
+               std::vector<std::string> ret;
+               return ret;
+       }
+
+       void bind_to_schema(table_list *Schema);
+       col_id_set get_colrefs(bool ext_fcns_only,table_list *Schema){
+               fprintf(stderr,"INTERNAL ERROR, calling sgahcwcb_qpn::get_colrefs\n");
+               exit(1);
+       }
+
+       std::string to_query_string();
+       std::string generate_functor(table_list *schema, ext_fcn_list *Ext_fcns, std::vector<bool> &needs_xform);
+       std::string generate_functor_name();
+
+       std::string generate_operator(int i, std::string params);
+       std::string get_include_file(){return("#include <clean_operator.h>\n");};
+
+    std::vector<select_element *> get_select_list(){return select_list;};
+    std::vector<scalarexp_t *> get_select_se_list(){
+               std::vector<scalarexp_t *> ret;
+               int i;
+               for(i=0;i<select_list.size();++i) ret.push_back(select_list[i]->se);
+               return ret;
+       };
+    std::vector<cnf_elem *> get_where_clause(){return where;};
+    std::vector<cnf_elem *> get_filter_clause(){return where;};
+    std::vector<cnf_elem *> get_having_clause(){return having;};
+    gb_table *get_gb_tbl(){return &gb_tbl;};
+    aggregate_table *get_aggr_tbl(){return &aggr_tbl;};
+       cplx_lit_table *get_cplx_lit_tbl(ext_fcn_list *Ext_fcns);
+    std::vector<handle_param_tbl_entry *> get_handle_param_tbl(ext_fcn_list *Ext_fcns);
+
+//                             table which represents output tuple.
+       table_def *get_fields();
+       std::vector<tablevar_t *> get_input_tbls();
+       std::vector<tablevar_t *> get_output_tbls();
+
+
+       sgahcwcb_qpn(){
+       };
+       sgahcwcb_qpn(query_summary_class *qs,table_list *Schema){
+//                             Get the table name.
+//                             NOTE the colrefs have the tablevar ref (an int)
+//                             embedded in them.  Would it make sense
+//                             to grab the whole table list?
+               tablevar_list_t *fm = qs->fta_tree->get_from();
+               std::vector<tablevar_t *> tbl_vec = fm->get_table_list();
+               if(tbl_vec.size() != 1){
+                       char tmpstr[200];
+                       sprintf(tmpstr,"INTERNAL ERROR building SGAHCWCB node: query defined over %lu tables.\n",tbl_vec.size() );
+                       err_str=tmpstr;
+                       error_code = 1;
+               }
+               table_name = (tbl_vec[0]);
+
+//                             Get the select list.
+               select_list = qs->fta_tree->get_sl_vec();
+
+//                             Get the selection and having predicates.
+               where = qs->wh_cnf;
+               having = qs->hav_cnf;
+               cleanby = qs->cb_cnf;
+               cleanwhen = qs->cw_cnf;
+
+//                             Build a new GB var table (don't share, might need to modify)
+               int g;
+               for(g=0;g<qs->gb_tbl->size();g++){
+                       gb_tbl.add_gb_var(qs->gb_tbl->get_name(g),
+                               qs->gb_tbl->get_tblvar_ref(g), qs->gb_tbl->get_def(g),
+                               qs->gb_tbl->get_reftype(g)
+                       );
+               }
+
+//                             Build a new aggregate table. (don't share, might need
+//                             to modify).
+               int a;
+               for(a=0;a<qs->aggr_tbl->size();a++){
+                       aggr_tbl.add_aggr(
+//                             qs->aggr_tbl->get_op(a), qs->aggr_tbl->get_aggr_se(a)
+                               qs->aggr_tbl->duplicate(a)
+                       );
+               }
+
+               sg_tbl = qs->sg_tbl;
+               states_refd = qs->states_refd;
+
+
+//                             Get the parameters
+               param_tbl = qs->param_tbl;
+
+       };
+
+
+
+       std::vector<qp_node *> split_node_for_fta(ext_fcn_list *Ext_fcns, table_list *Schema, int &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx);
+       virtual std::vector<table_exp_t *> extract_opview(table_list *Schema, std::vector<query_node *> &qnodes, opview_set &opviews, std::string rootnm, std::string silo_nm);
+//             Ensure that any refs to interface params have been split away.
+//                     CURRENTLY not allowed by split_node_for_fta
+       int count_ifp_refs(std::set<std::string> &ifpnames){return 0;}
+       int resolve_if_params(ifq_t *ifdb, std::string &err){return 0;}
+
+       // the following method is used for distributed query optimization
+       double get_rate_estimate();
+
+       qp_node* make_copy(std::string suffix){
+               sgahcwcb_qpn *ret = new sgahcwcb_qpn();
+
+               ret->param_tbl = new param_table();
+               std::vector<std::string> param_names = param_tbl->get_param_names();
+               int pi;
+               for(pi=0;pi<param_names.size();pi++){
+                       data_type *dt = param_tbl->get_data_type(param_names[pi]);
+                       ret->param_tbl->add_param(param_names[pi],dt->duplicate(),
+                                                       param_tbl->handle_access(param_names[pi]));
+               }
+               ret->definitions = definitions;
+
+               ret->node_name = node_name + suffix;
+
+               // make shallow copy of all fields
+               ret->where = where;
+               ret->having = having;
+               ret->select_list = select_list;
+               ret->gb_tbl = gb_tbl;
+               ret->aggr_tbl = aggr_tbl;
+               ret->sg_tbl = sg_tbl;
+               ret->states_refd = states_refd;
+               ret->cleanby = cleanby;
+               ret->cleanwhen = cleanwhen;
+
+               return ret;
+       };
+
+       void create_protocol_se(vector<qp_node *> q_sources, table_list *Schema);
+};
+
+
+std::vector<qp_node *> create_query_nodes(query_summary_class *qs,table_list *Schema);
+
+
+
+void untaboo(string &s);
+
+table_def *create_attributes(string tname, vector<select_element *> &select_list);
+
+
+
+#endif
diff --git a/src/ftacmp/res.l b/src/ftacmp/res.l
new file mode 100644 (file)
index 0000000..a9036c2
--- /dev/null
@@ -0,0 +1,223 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+/*
+       MUST COMPILE WITH
+               flex -PResParser -oreslexer.cc res.l
+       (or equivalent).
+*/     
+
+%{
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_fta.h"
+ #include <string.h>
+
+
+
+#include "res.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int ResParserwrap(){return(1);}
+
+extern int ResParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_res_lineno : the line currently being parsed when the error occurs.
+               flex_res_ch : the character on the line where the error occurs
+               flex_res_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_res_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_res_lineno = 1;
+int flex_res_ch = 0;
+char flex_res_linebuf[20000];
+
+char *flex_res_stringinput = NULL;
+int flex_res_stringinput_ptr = 0;
+FILE *flex_res_fileinput = NULL;
+int my_ResParser_yyinput(char *buf, int max_size);
+
+
+
+void ResParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_res_lineno, flex_res_ch, s, ResParsertext, flex_res_linebuf );
+    for(i=0;i<flex_res_ch;i++){
+               if(flex_res_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_res_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_ResParser_yyinput(b,ms))
+
+%}
+       /* MKS needs the next line to increase the NFA table */
+%e 1200
+%option noyywrap
+
+%%
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+
+
+
+[<>=/] { flex_res_ch+=ResParserleng; return yytext[0]; }
+
+       /* names */
+
+[A-Za-z_][A-Za-z0-9_]* { flex_res_ch+=ResParserleng; ResParserlval.strval = strdup(yytext); return NAME; }
+
+
+       /* strings */
+
+'[^'\n]*'      {
+               
+               int c;
+               
+               ResParserlval.strval = strdup(ResParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_res_ch+=ResParserleng; 
+                       ResParserlval.strval[ResParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+               
+'[^'\n]*$      { flex_res_ch+=ResParserleng; ResParsererror("Unterminated string"); }
+
+ /*                                                                                                                    */
+ /*            Newline : advance the error reporting line number       */
+ /*            and grab the next line into flex_res_linebuf                    */
+ /*                                                                                                                    */
+
+\n.*           {flex_res_ch=0; flex_res_lineno++;
+                          strcpy(flex_res_linebuf,ResParsertext+1);
+                          yyless(1);
+                          }
+
+[ \t\r]+       {flex_res_ch+=ResParserleng; }  /* white space */
+
+"--".*$                {flex_res_ch+=ResParserleng; }; /* comment */
+"//".*$                {flex_res_ch+=ResParserleng; }; /* comment */
+"<?xml".*$      {flex_res_ch+=ResParserleng; }; /* comment */
+
+.|\n            {flex_res_ch+=ResParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  ResParsererror(yytext);}
+
+%%
+
+int my_ResParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_res_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_res_stringinput[flex_res_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_res_stringinput[flex_res_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_res_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_res_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void ResParser_setfileinput(FILE *f){
+       ResParserrestart(NULL);
+
+       flex_res_fileinput = f;
+       flex_res_stringinput = NULL;
+       flex_res_lineno = 1;
+       flex_res_ch = 0;
+}
+
+void ResParser_setstringinput(char *s){
+       ResParserrestart(NULL);
+
+       flex_res_fileinput = NULL;
+       flex_res_stringinput = s;
+       flex_res_stringinput_ptr = 0;
+       flex_res_lineno = 1;
+       flex_res_ch = 0;
+}
+       
+               
+
+
diff --git a/src/ftacmp/res.tab.cc b/src/ftacmp/res.tab.cc
new file mode 100644 (file)
index 0000000..4a6a85e
--- /dev/null
@@ -0,0 +1,1228 @@
+/* A Bison parser, made from res.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON        1
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* If NAME_PREFIX is specified substitute the variables and functions
+   names.  */
+#define yyparse ResParserparse
+#define yylex   ResParserlex
+#define yyerror ResParsererror
+#define yylval  ResParserlval
+#define yychar  ResParserchar
+#define yydebug ResParserdebug
+#define yynerrs ResParsernerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259
+   };
+#endif
+#define NAME 258
+#define STRING_TOKEN 259
+
+
+
+
+/* Copy the first part of user declarations.  */
+#line 8 "res.y"
+
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "iface_q.h"
+
+
+extern resparse_data *rpd_ptr;
+extern std::vector<std::string> res_attr_vec;
+extern std::vector<std::string> res_val_vec;
+extern std::string res_a, res_v;
+
+
+
+#define YYDEBUG 1
+
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#ifndef YYSTYPE
+#line 39 "res.y"
+typedef union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       /*                      for FTA definition.     */
+
+} yystype;
+/* Line 193 of /usr/local/share/bison/yacc.c.  */
+#line 128 "res.tab.cc"
+# define YYSTYPE yystype
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+#ifndef YYLTYPE
+typedef struct yyltype
+{
+  int first_line;
+  int first_column;
+  int last_line;
+  int last_column;
+} yyltype;
+# define YYLTYPE yyltype
+# define YYLTYPE_IS_TRIVIAL 1
+#endif
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 213 of /usr/local/share/bison/yacc.c.  */
+#line 149 "res.tab.cc"
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
+#    define YYSTACK_ALLOC alloca
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
+      + YYSTACK_GAP_MAX)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         register YYSIZE_T yyi;                \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];    \
+       }                                       \
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;   \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  6
+#define YYLAST   25
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  9
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  9
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  14
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  26
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   259
+
+#define YYTRANSLATE(X) \
+  ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     6,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       5,     8,     7,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned char yyprhs[] =
+{
+       0,     0,     3,     5,     9,    12,    18,    23,    28,    30,
+      33,    35,    36,    38,    41
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      10,     0,    -1,    11,    -1,    12,    14,    13,    -1,    12,
+      13,    -1,     5,     3,    15,     6,     7,    -1,     5,     3,
+      15,     7,    -1,     5,     6,     3,     7,    -1,    11,    -1,
+      14,    11,    -1,    16,    -1,    -1,    17,    -1,    16,    17,
+      -1,     3,     8,     4,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned char yyrline[] =
+{
+       0,    57,    57,    60,    62,    63,    69,    73,    78,    80,
+      83,    85,    88,    91,    95
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "NAME", "STRING_TOKEN", "'<'", "'/'", 
+  "'>'", "'='", "$accept", "parse_result", "resource", "start_tag", 
+  "end_tag", "res_list", "opt_val_list", "val_list", "val", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short yytoknum[] =
+{
+       0,   256,   257,   258,   259,    60,    47,    62,    61
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,     9,    10,    11,    11,    11,    12,    13,    14,    14,
+      15,    15,    16,    16,    17
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     1,     3,     2,     5,     4,     4,     1,     2,
+       1,     0,     1,     2,     3
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       0,     0,     0,     2,     0,    11,     1,     0,     8,     4,
+       0,     0,     0,    10,    12,     0,     9,     3,     0,     0,
+       6,    13,     0,    14,     5,     7
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+      -1,     2,     3,     4,     9,    10,    12,    13,    14
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -5
+static const yysigned_char yypact[] =
+{
+      -3,     0,     5,    -5,     4,     7,    -5,    -2,    -5,    -5,
+       4,     3,     1,     7,    -5,     9,    -5,    -5,    10,     6,
+      -5,    -5,     8,    -5,    -5,    -5
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yysigned_char yypgoto[] =
+{
+      -5,    -5,    -4,    -5,    11,    -5,    -5,    -5,    12
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, parse error.  */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+       8,     5,     1,     5,    15,     6,    16,    19,    20,     7,
+      11,    18,    22,    24,    23,    25,     0,     0,     0,     0,
+       0,    17,     0,     0,     0,    21
+};
+
+static const yysigned_char yycheck[] =
+{
+       4,     3,     5,     3,     6,     0,    10,     6,     7,     5,
+       3,     8,     3,     7,     4,     7,    -1,    -1,    -1,    -1,
+      -1,    10,    -1,    -1,    -1,    13
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,     5,    10,    11,    12,     3,     0,     5,    11,    13,
+      14,     3,    15,    16,    17,     6,    11,    13,     8,     6,
+       7,    17,     3,     4,     7,     7
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT                goto yyabortlab
+#define YYERROR                goto yyerrlab1
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL         goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");                        \
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)           \
+  Current.first_line   = Rhs[1].first_line;      \
+  Current.first_column = Rhs[1].first_column;    \
+  Current.last_line    = Rhs[N].last_line;       \
+  Current.last_column  = Rhs[N].last_column;
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#define YYLEX  yylex ()
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+# define YYDSYMPRINT(Args)                     \
+do {                                           \
+  if (yydebug)                                 \
+    yysymprint Args;                           \
+} while (0)
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+\f
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+\f
+
+#if YYDEBUG
+/*-----------------------------.
+| Print this symbol on YYOUT.  |
+`-----------------------------*/
+
+static void
+#if defined (__STDC__) || defined (__cplusplus)
+yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue)
+#else
+yysymprint (yyout, yytype, yyvalue)
+    FILE* yyout;
+    int yytype;
+    YYSTYPE yyvalue;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvalue;
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyout, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+      YYPRINT (yyout, yytoknum[yytype], yyvalue);
+# endif
+    }
+  else
+    YYFPRINTF (yyout, "nterm %s (", yytname[yytype]);
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyout, ")");
+}
+#endif /* YYDEBUG. */
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+static void
+#if defined (__STDC__) || defined (__cplusplus)
+yydestruct (int yytype, YYSTYPE yyvalue)
+#else
+yydestruct (yytype, yyvalue)
+    int yytype;
+    YYSTYPE yyvalue;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvalue;
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+}
+
+\f
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
+# else
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of parse errors so far.  */
+int yynerrs;
+
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule.  */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+
+                   &yystacksize);
+
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with.  */
+
+  if (yychar <= 0)             /* This means end of input.  */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more.  */
+
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE (yychar);
+
+      /* We have to keep this `#if YYDEBUG', since we use variables
+        which are defined only if `YYDEBUG' is set.  */
+      YYDPRINTF ((stderr, "Next token is "));
+      YYDSYMPRINT ((stderr, yychar1, yylval));
+      YYDPRINTF ((stderr, "\n"));
+    }
+
+  /* If the proper action on seeing token YYCHAR1 is to reduce or to
+     detect an error, take that action.  */
+  yyn += yychar1;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+             yychar, yytname[yychar1]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+
+#if YYDEBUG
+  /* We have to keep this `#if YYDEBUG', since we use variables which
+     are defined only if `YYDEBUG' is set.  */
+  if (yydebug)
+    {
+      int yyi;
+
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+                yyn - 1, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++)
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+  switch (yyn)
+    {
+        case 5:
+#line 64 "res.y"
+    {startElement(rpd_ptr, yyvsp[-3].strval, res_attr_vec, res_val_vec);
+               endElement(rpd_ptr, yyvsp[-3].strval);
+               }
+    break;
+
+  case 6:
+#line 70 "res.y"
+    {startElement(rpd_ptr, yyvsp[-2].strval, res_attr_vec, res_val_vec);}
+    break;
+
+  case 7:
+#line 74 "res.y"
+    {endElement(rpd_ptr, yyvsp[-1].strval);}
+    break;
+
+  case 11:
+#line 85 "res.y"
+    {res_attr_vec.clear(); res_val_vec.clear();}
+    break;
+
+  case 12:
+#line 89 "res.y"
+    {res_attr_vec.clear();  res_attr_vec.push_back(res_a);
+                        res_val_vec.clear(); res_val_vec.push_back(res_v); }
+    break;
+
+  case 13:
+#line 91 "res.y"
+    {res_attr_vec.push_back(res_a);
+                                       res_val_vec.push_back(res_v); }
+    break;
+
+  case 14:
+#line 96 "res.y"
+    {res_a = yyvsp[-2].strval; res_v = yyvsp[0].strval;}
+    break;
+
+
+    }
+
+/* Line 1016 of /usr/local/share/bison/yacc.c.  */
+#line 1007 "res.tab.cc"
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         int yytype = YYTRANSLATE (yychar);
+         char *yymsg;
+         int yyx, yycount;
+
+         yycount = 0;
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         for (yyx = yyn < 0 ? -yyn : 0;
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+           if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen (yytname[yytype]);
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[yytype]);
+
+             if (yycount < 5)
+               {
+                 yycount = 0;
+                 for (yyx = yyn < 0 ? -yyn : 0;
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));
+                      yyx++)
+                   if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+                     {
+                       const char *yyq = ! yycount ? ", expecting " : " or ";
+                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yycount++;
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exhausted");
+       }
+      else
+#endif /* YYERROR_VERBOSE */
+       yyerror ("parse error");
+    }
+  goto yyerrlab1;
+
+
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action.  |
+`----------------------------------------------------*/
+yyerrlab1:
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      /* Return failure if at end of input.  */
+      if (yychar == YYEOF)
+        {
+         /* Pop the error token.  */
+          YYPOPSTACK;
+         /* Pop the rest of the stack.  */
+         while (yyssp > yyss)
+           {
+             YYDPRINTF ((stderr, "Error: popping "));
+             YYDSYMPRINT ((stderr,
+                           yystos[*yyssp],
+                           *yyvsp));
+             YYDPRINTF ((stderr, "\n"));
+             yydestruct (yystos[*yyssp], *yyvsp);
+             YYPOPSTACK;
+           }
+         YYABORT;
+        }
+
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+                 yychar, yytname[yychar1]));
+      yydestruct (yychar1, yylval);
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+
+  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+       {
+         yyn += YYTERROR;
+         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+           {
+             yyn = yytable[yyn];
+             if (0 < yyn)
+               break;
+           }
+       }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+       YYABORT;
+
+      YYDPRINTF ((stderr, "Error: popping "));
+      YYDSYMPRINT ((stderr,
+                   yystos[*yyssp], *yyvsp));
+      YYDPRINTF ((stderr, "\n"));
+
+      yydestruct (yystos[yystate], *yyvsp);
+      yyvsp--;
+      yystate = *--yyssp;
+
+
+#if YYDEBUG
+      if (yydebug)
+       {
+         short *yyssp1 = yyss - 1;
+         YYFPRINTF (stderr, "Error: state stack now");
+         while (yyssp1 != yyssp)
+           YYFPRINTF (stderr, " %d", *++yyssp1);
+         YYFPRINTF (stderr, "\n");
+       }
+#endif
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+
+
+#line 103 "res.y"
+
+
+
diff --git a/src/ftacmp/res.tab.cc.h b/src/ftacmp/res.tab.cc.h
new file mode 100644 (file)
index 0000000..2bc5371
--- /dev/null
@@ -0,0 +1,65 @@
+/* A Bison parser, made from res.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef BISON_RES_TAB_CC_H
+# define BISON_RES_TAB_CC_H
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259
+   };
+#endif
+#define NAME 258
+#define STRING_TOKEN 259
+
+
+
+
+#ifndef YYSTYPE
+#line 39 "res.y"
+typedef union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       /*                      for FTA definition.     */
+
+} yystype;
+/* Line 1281 of /usr/local/share/bison/yacc.c.  */
+#line 58 "res.tab.cc.h"
+# define YYSTYPE yystype
+#endif
+
+extern YYSTYPE ResParserlval;
+
+
+#endif /* not BISON_RES_TAB_CC_H */
+
diff --git a/src/ftacmp/res.y b/src/ftacmp/res.y
new file mode 100644 (file)
index 0000000..eca5341
--- /dev/null
@@ -0,0 +1,119 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+       MUST COMPILE WITH
+               bison --verbose --defines=res.tab.cc.h -p ResParser  -o res.tab.cc res.y
+
+        (or equivalent).
+*/
+
+%{
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "iface_q.h"
+
+
+extern resparse_data *rpd_ptr;
+extern std::vector<std::string> res_attr_vec;
+extern std::vector<std::string> res_val_vec;
+extern std::string res_a, res_v;
+
+
+
+#define YYDEBUG 1
+
+%}
+
+
+       /* symbolic tokens */
+
+%union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       /*                      for FTA definition.     */
+
+}
+
+%token <strval> NAME
+%token <strval> STRING_TOKEN
+
+
+
+
+%%
+
+parse_result:  resource
+       ;
+
+resource:
+       start_tag res_list end_tag
+       | start_tag end_tag
+       | '<' NAME opt_val_list '/' '>'
+               {startElement(rpd_ptr, $2, res_attr_vec, res_val_vec);
+               endElement(rpd_ptr, $2);
+               }
+       ;
+
+start_tag:
+       '<' NAME opt_val_list '>'       {startElement(rpd_ptr, $2, res_attr_vec, res_val_vec);}
+       ;
+
+end_tag:
+       '<' '/' NAME '>'        {endElement(rpd_ptr, $3);}
+       ;
+
+
+res_list:
+       resource
+       | res_list resource
+       ;
+
+opt_val_list:
+       val_list
+       |               {res_attr_vec.clear(); res_val_vec.clear();}
+       ;
+
+val_list:
+       val             {res_attr_vec.clear();  res_attr_vec.push_back(res_a);
+                        res_val_vec.clear(); res_val_vec.push_back(res_v); }
+       | val_list val {res_attr_vec.push_back(res_a);
+                                       res_val_vec.push_back(res_v); }
+       ;
+
+val:
+       NAME '=' STRING_TOKEN   {res_a = $1; res_v = $3;}
+       ;
+       
+
+
+
+
+%%
+
diff --git a/src/ftacmp/reslexer.cc b/src/ftacmp/reslexer.cc
new file mode 100644 (file)
index 0000000..890c8eb
--- /dev/null
@@ -0,0 +1,1778 @@
+#define yy_create_buffer ResParser_create_buffer
+#define yy_delete_buffer ResParser_delete_buffer
+#define yy_scan_buffer ResParser_scan_buffer
+#define yy_scan_string ResParser_scan_string
+#define yy_scan_bytes ResParser_scan_bytes
+#define yy_flex_debug ResParser_flex_debug
+#define yy_init_buffer ResParser_init_buffer
+#define yy_flush_buffer ResParser_flush_buffer
+#define yy_load_buffer_state ResParser_load_buffer_state
+#define yy_switch_to_buffer ResParser_switch_to_buffer
+#define yyin ResParserin
+#define yyleng ResParserleng
+#define yylex ResParserlex
+#define yyout ResParserout
+#define yyrestart ResParserrestart
+#define yytext ResParsertext
+
+#line 19 "reslexer.cc"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /cvsroot/gscpv4/src/ftacmp/reslexer.cc,v 1.1.1.1 2013/12/02 17:44:57 spatsch Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <unistd.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yytext_ptr -= yy_more_len; \
+       yyleng = (int) (yy_cp - yytext_ptr); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 11
+#define YY_END_OF_BUFFER 12
+static yyconst short int yy_accept[32] =
+    {   0,
+        0,    0,   12,   10,    6,    5,   10,   10,    1,    1,
+        1,    2,    6,    5,    0,    4,    3,    0,    0,    0,
+        2,    0,    7,    0,    8,    0,    0,    0,    0,    9,
+        0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    1,    1,    1,    1,    1,    4,    1,
+        1,    1,    1,    1,    5,    1,    6,    7,    7,    7,
+        7,    7,    7,    7,    7,    7,    7,    1,    1,    8,
+        9,    9,   10,    1,   11,   11,   11,   11,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
+        1,    1,    1,    1,   11,    1,   11,   11,   11,   11,
+
+       11,   11,   11,   11,   11,   11,   11,   12,   13,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   14,
+       11,   11,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[15] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    3,    1,    1,    1,
+        3,    3,    3,    3
+    } ;
+
+static yyconst short int yy_base[38] =
+    {   0,
+        0,    0,   48,   49,   45,    0,   12,   41,   39,   34,
+       49,    0,   41,    0,   14,   49,   49,   39,   38,   26,
+        0,   36,   49,   35,   49,   24,   24,   32,   31,   49,
+       49,   18,   21,   17,   24,   27,   30
+    } ;
+
+static yyconst short int yy_def[38] =
+    {   0,
+       31,    1,   31,   31,   31,   32,   33,   31,   31,   31,
+       31,   34,   31,   32,   33,   31,   31,   35,   36,   31,
+       34,   35,   31,   36,   31,   31,   31,   37,   37,   31,
+        0,   31,   31,   31,   31,   31,   31
+    } ;
+
+static yyconst short int yy_nxt[64] =
+    {   0,
+        4,    5,    6,    7,    8,    9,    4,   10,   11,    4,
+       12,   12,   12,   12,   16,   17,   16,   17,   14,   21,
+       14,   15,   15,   15,   22,   22,   22,   24,   24,   24,
+       29,   29,   29,   30,   30,   28,   27,   25,   23,   26,
+       25,   23,   13,   20,   19,   18,   13,   31,    3,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31
+    } ;
+
+static yyconst short int yy_chk[64] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    7,    7,   15,   15,   32,   34,
+       32,   33,   33,   33,   35,   35,   35,   36,   36,   36,
+       37,   37,   37,   29,   28,   27,   26,   24,   22,   20,
+       19,   18,   13,   10,    9,    8,    5,    3,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+static int yy_more_flag = 0;
+static int yy_more_len = 0;
+#define yymore() (yy_more_flag = 1)
+#define YY_MORE_ADJ yy_more_len
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "res.l"
+#define INITIAL 0
+/*
+       MUST COMPILE WITH
+               flex -PResParser -oreslexer.cc res.l
+       (or equivalent).
+*/     
+#line 9 "res.l"
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_fta.h"
+ #include <string.h>
+
+
+
+#include "res.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int ResParserwrap(){return(1);}
+
+extern int ResParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_res_lineno : the line currently being parsed when the error occurs.
+               flex_res_ch : the character on the line where the error occurs
+               flex_res_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_res_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_res_lineno = 1;
+int flex_res_ch = 0;
+char flex_res_linebuf[20000];
+
+char *flex_res_stringinput = NULL;
+int flex_res_stringinput_ptr = 0;
+FILE *flex_res_fileinput = NULL;
+int my_ResParser_yyinput(char *buf, int max_size);
+
+
+
+void ResParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_res_lineno, flex_res_ch, s, ResParsertext, flex_res_linebuf );
+    for(i=0;i<flex_res_ch;i++){
+               if(flex_res_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_res_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_ResParser_yyinput(b,ms))
+
+/* MKS needs the next line to increase the NFA table */
+#line 490 "reslexer.cc"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( yy_current_buffer->yy_is_interactive ) \
+               { \
+               int c = '*', n; \
+               for ( n = 0; n < max_size && \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+                       buf[n] = (char) c; \
+               if ( c == '\n' ) \
+                       buf[n++] = (char) c; \
+               if ( c == EOF && ferror( yyin ) ) \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+               result = n; \
+               } \
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+                 && ferror( yyin ) ) \
+               YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+       YY_USER_ACTION
+
+YY_DECL
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp = NULL, *yy_bp = NULL;
+       register int yy_act;
+
+#line 88 "res.l"
+
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+
+
+
+#line 663 "reslexer.cc"
+
+       if ( yy_init )
+               {
+               yy_init = 0;
+
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! yy_start )
+                       yy_start = 1;   /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( ! yy_current_buffer )
+                       yy_current_buffer =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+
+               yy_load_buffer_state();
+               }
+
+       while ( 1 )             /* loops until end-of-file is reached */
+               {
+               yy_more_len = 0;
+               if ( yy_more_flag )
+                       {
+                       yy_more_len = yy_c_buf_p - yytext_ptr;
+                       yy_more_flag = 0;
+                       }
+               yy_cp = yy_c_buf_p;
+
+               /* Support of yytext. */
+               *yy_cp = yy_hold_char;
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = yy_start;
+yy_match:
+               do
+                       {
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               yy_last_accepting_state = yy_current_state;
+                               yy_last_accepting_cpos = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 32 )
+                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 49 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+               if ( yy_act == 0 )
+                       { /* have to back up */
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       yy_act = yy_accept[yy_current_state];
+                       }
+
+               YY_DO_BEFORE_ACTION;
+
+
+do_action:     /* This label is used only to access EOF actions. */
+
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = yy_hold_char;
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 109 "res.l"
+{ flex_res_ch+=ResParserleng; return yytext[0]; }
+       YY_BREAK
+/* names */
+case 2:
+YY_RULE_SETUP
+#line 113 "res.l"
+{ flex_res_ch+=ResParserleng; ResParserlval.strval = strdup(yytext); return NAME; }
+       YY_BREAK
+/* strings */
+case 3:
+YY_RULE_SETUP
+#line 118 "res.l"
+{
+               
+               int c;
+               
+               ResParserlval.strval = strdup(ResParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_res_ch+=ResParserleng; 
+                       ResParserlval.strval[ResParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+       YY_BREAK
+case 4:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 135 "res.l"
+{ flex_res_ch+=ResParserleng; ResParsererror("Unterminated string"); }
+       YY_BREAK
+/*                                                                                                                     */
+/*             Newline : advance the error reporting line number       */
+/*             and grab the next line into flex_res_linebuf                    */
+/*                                                                                                                     */
+case 5:
+YY_RULE_SETUP
+#line 142 "res.l"
+{flex_res_ch=0; flex_res_lineno++;
+                          strcpy(flex_res_linebuf,ResParsertext+1);
+                          yyless(1);
+                          }
+       YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 147 "res.l"
+{flex_res_ch+=ResParserleng; } /* white space */
+       YY_BREAK
+case 7:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 149 "res.l"
+{flex_res_ch+=ResParserleng; };        /* comment */
+       YY_BREAK
+case 8:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 150 "res.l"
+{flex_res_ch+=ResParserleng; };        /* comment */
+       YY_BREAK
+case 9:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 151 "res.l"
+{flex_res_ch+=ResParserleng; }; /* comment */
+       YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 153 "res.l"
+{flex_res_ch+=ResParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  ResParsererror(yytext);}
+       YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 155 "res.l"
+ECHO;
+       YY_BREAK
+#line 843 "reslexer.cc"
+case YY_STATE_EOF(INITIAL):
+       yyterminate();
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = yy_hold_char;
+               YY_RESTORE_YY_MORE_OFFSET
+
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between yy_current_buffer and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       yy_n_chars = yy_current_buffer->yy_n_chars;
+                       yy_current_buffer->yy_input_file = yyin;
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state();
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++yy_c_buf_p;
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                               yy_cp = yy_c_buf_p;
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer() )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               yy_did_buffer_switch_on_eof = 0;
+
+                               if ( yywrap() )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               yy_c_buf_p =
+                                       yytext_ptr + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               yy_c_buf_p =
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+       {
+       register char *dest = yy_current_buffer->yy_ch_buf;
+       register char *source = yytext_ptr;
+       register int number_to_move, i;
+       int ret_val;
+
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( yy_current_buffer->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a single character, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+       else
+               {
+               int num_to_read =
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+                       YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = yy_current_buffer;
+
+                       int yy_c_buf_p_offset =
+                               (int) (yy_c_buf_p - b->yy_ch_buf);
+
+                       if ( b->yy_is_our_buffer )
+                               {
+                               int new_size = b->yy_buf_size * 2;
+
+                               if ( new_size <= 0 )
+                                       b->yy_buf_size += b->yy_buf_size / 8;
+                               else
+                                       b->yy_buf_size *= 2;
+
+                               b->yy_ch_buf = (char *)
+                                       /* Include room in for 2 EOB chars. */
+                                       yy_flex_realloc( (void *) b->yy_ch_buf,
+                                                        b->yy_buf_size + 2 );
+                               }
+                       else
+                               /* Can't grow it, we don't own it. */
+                               b->yy_ch_buf = 0;
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = yy_current_buffer->yy_buf_size -
+                                               number_to_move - 1;
+#endif
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+                       yy_n_chars, num_to_read );
+
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       if ( yy_n_chars == 0 )
+               {
+               if ( number_to_move == YY_MORE_ADJ )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       yy_current_buffer->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       yy_n_chars += number_to_move;
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+       return ret_val;
+       }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp;
+
+       yy_current_state = yy_start;
+
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+               {
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       yy_last_accepting_state = yy_current_state;
+                       yy_last_accepting_cpos = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 32 )
+                               yy_c = yy_meta[(unsigned int) yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+               }
+
+       return yy_current_state;
+       }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+       {
+       register int yy_is_jam;
+       register char *yy_cp = yy_c_buf_p;
+
+       register YY_CHAR yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               yy_last_accepting_state = yy_current_state;
+               yy_last_accepting_cpos = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 32 )
+                       yy_c = yy_meta[(unsigned int) yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+       yy_is_jam = (yy_current_state == 31);
+
+       return yy_is_jam ? 0 : yy_current_state;
+       }
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+       {
+       register char *yy_cp = yy_c_buf_p;
+
+       /* undo effects of setting up yytext */
+       *yy_cp = yy_hold_char;
+
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               register int number_to_move = yy_n_chars + 2;
+               register char *dest = &yy_current_buffer->yy_ch_buf[
+                                       yy_current_buffer->yy_buf_size + 2];
+               register char *source =
+                               &yy_current_buffer->yy_ch_buf[number_to_move];
+
+               while ( source > yy_current_buffer->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += (int) (dest - source);
+               yy_bp += (int) (dest - source);
+               yy_current_buffer->yy_n_chars =
+                       yy_n_chars = yy_current_buffer->yy_buf_size;
+
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       *--yy_cp = (char) c;
+
+
+       yytext_ptr = yy_bp;
+       yy_hold_char = *yy_cp;
+       yy_c_buf_p = yy_cp;
+       }
+#endif /* ifndef YY_NO_UNPUT */
+
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+       {
+       int c;
+
+       *yy_c_buf_p = yy_hold_char;
+
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       /* This was really a NUL. */
+                       *yy_c_buf_p = '\0';
+
+               else
+                       { /* need more input */
+                       int offset = yy_c_buf_p - yytext_ptr;
+                       ++yy_c_buf_p;
+
+                       switch ( yy_get_next_buffer() )
+                               {
+                               case EOB_ACT_LAST_MATCH:
+                                       /* This happens because yy_g_n_b()
+                                        * sees that we've accumulated a
+                                        * token and flags that we need to
+                                        * try matching the token before
+                                        * proceeding.  But for input(),
+                                        * there's no matching to consider.
+                                        * So convert the EOB_ACT_LAST_MATCH
+                                        * to EOB_ACT_END_OF_FILE.
+                                        */
+
+                                       /* Reset buffer status. */
+                                       yyrestart( yyin );
+
+                                       /* fall through */
+
+                               case EOB_ACT_END_OF_FILE:
+                                       {
+                                       if ( yywrap() )
+                                               return EOF;
+
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+#ifdef __cplusplus
+                                       return yyinput();
+#else
+                                       return input();
+#endif
+                                       }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       yy_c_buf_p = yytext_ptr + offset;
+                                       break;
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
+       *yy_c_buf_p = '\0';     /* preserve yytext */
+       yy_hold_char = *++yy_c_buf_p;
+
+
+       return c;
+       }
+#endif /* YY_NO_INPUT */
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+       {
+       if ( ! yy_current_buffer )
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+       yy_init_buffer( yy_current_buffer, input_file );
+       yy_load_buffer_state();
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+       {
+       if ( yy_current_buffer == new_buffer )
+               return;
+
+       if ( yy_current_buffer )
+               {
+               /* Flush out information for old buffer. */
+               *yy_c_buf_p = yy_hold_char;
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       yy_current_buffer = new_buffer;
+       yy_load_buffer_state();
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       yy_did_buffer_switch_on_eof = 1;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+       {
+       yy_n_chars = yy_current_buffer->yy_n_chars;
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+       yyin = yy_current_buffer->yy_input_file;
+       yy_hold_char = *yy_c_buf_p;
+       }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_is_our_buffer = 1;
+
+       yy_init_buffer( b, file );
+
+       return b;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+       {
+       if ( ! b )
+               return;
+
+       if ( b == yy_current_buffer )
+               yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+       if ( b->yy_is_our_buffer )
+               yy_flex_free( (void *) b->yy_ch_buf );
+
+       yy_flex_free( (void *) b );
+       }
+
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+       {
+       yy_flush_buffer( b );
+
+       b->yy_input_file = file;
+       b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+       b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+       b->yy_is_interactive = 0;
+#else
+       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+       {
+       if ( ! b )
+               return;
+
+       b->yy_n_chars = 0;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[0];
+
+       b->yy_at_bol = 1;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       if ( b == yy_current_buffer )
+               yy_load_buffer_state();
+       }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       if ( size < 2 ||
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||
+            base[size-1] != YY_END_OF_BUFFER_CHAR )
+               /* They forgot to leave room for the EOB's. */
+               return 0;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+       b->yy_buf_pos = b->yy_ch_buf = base;
+       b->yy_is_our_buffer = 0;
+       b->yy_input_file = 0;
+       b->yy_n_chars = b->yy_buf_size;
+       b->yy_is_interactive = 0;
+       b->yy_at_bol = 1;
+       b->yy_fill_buffer = 0;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       yy_switch_to_buffer( b );
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+       {
+       int len;
+       for ( len = 0; yy_str[len]; ++len )
+               ;
+
+       return yy_scan_bytes( yy_str, len );
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+       {
+       YY_BUFFER_STATE b;
+       char *buf;
+       yy_size_t n;
+       int i;
+
+       /* Get memory for full buffer, including space for trailing EOB's. */
+       n = len + 2;
+       buf = (char *) yy_flex_alloc( n );
+       if ( ! buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+       for ( i = 0; i < len; ++i )
+               buf[i] = bytes[i];
+
+       buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+       b = yy_scan_buffer( buf, n );
+       if ( ! b )
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+       /* It's okay to grow etc. this buffer, and we should throw it
+        * away when we're done.
+        */
+       b->yy_is_our_buffer = 1;
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+       {
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )
+               {
+               yy_size_t new_size;
+
+               yy_start_stack_depth += YY_START_STACK_INCR;
+               new_size = yy_start_stack_depth * sizeof( int );
+
+               if ( ! yy_start_stack )
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+               else
+                       yy_start_stack = (int *) yy_flex_realloc(
+                                       (void *) yy_start_stack, new_size );
+
+               if ( ! yy_start_stack )
+                       YY_FATAL_ERROR(
+                       "out of memory expanding start-condition stack" );
+               }
+
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+       BEGIN(new_state);
+       }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+       {
+       if ( --yy_start_stack_ptr < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);
+       }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+       {
+       return yy_start_stack[yy_start_stack_ptr - 1];
+       }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+       {
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+       }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               yytext[yyleng] = yy_hold_char; \
+               yy_c_buf_p = yytext + n; \
+               yy_hold_char = *yy_c_buf_p; \
+               *yy_c_buf_p = '\0'; \
+               yyleng = n; \
+               } \
+       while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+       {
+       register int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+       }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+       {
+       register int n;
+       for ( n = 0; s[n]; ++n )
+               ;
+
+       return n;
+       }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+       {
+       return (void *) malloc( size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+       {
+       /* The cast to (char *) in the following accommodates both
+        * implementations that use char* generic pointers, and those
+        * that use void* generic pointers.  It works with the latter
+        * because both ANSI C and C++ allow castless assignment from
+        * any pointer type to void*, and deal with argument conversions
+        * as though doing an assignment.
+        */
+       return (void *) realloc( (char *) ptr, size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+       {
+       free( ptr );
+       }
+
+#if YY_MAIN
+int main()
+       {
+       yylex();
+       return 0;
+       }
+#endif
+#line 155 "res.l"
+
+
+int my_ResParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_res_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_res_stringinput[flex_res_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_res_stringinput[flex_res_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_res_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_res_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void ResParser_setfileinput(FILE *f){
+       ResParserrestart(NULL);
+
+       flex_res_fileinput = f;
+       flex_res_stringinput = NULL;
+       flex_res_lineno = 1;
+       flex_res_ch = 0;
+}
+
+void ResParser_setstringinput(char *s){
+       ResParserrestart(NULL);
+
+       flex_res_fileinput = NULL;
+       flex_res_stringinput = s;
+       flex_res_stringinput_ptr = 0;
+       flex_res_lineno = 1;
+       flex_res_ch = 0;
+}
+       
+               
+
+
diff --git a/src/ftacmp/schema.tab.cc b/src/ftacmp/schema.tab.cc
new file mode 100644 (file)
index 0000000..cbe45f6
--- /dev/null
@@ -0,0 +1,933 @@
+
+/*  A Bison parser, made from schema.y
+ by  GNU Bison version 1.25
+  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define yyparse SchemaParserparse
+#define yylex SchemaParserlex
+#define yyerror SchemaParsererror
+#define yylval SchemaParserlval
+#define yychar SchemaParserchar
+#define yydebug SchemaParserdebug
+#define yynerrs SchemaParsernerrs
+#define        NAME    258
+#define        SEMICOLON       259
+#define        LEFTBRACE       260
+#define        RIGHTBRACE      261
+#define        TABLE   262
+#define        STREAM  263
+
+#line 8 "schema.y"
+
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "parse_schema.h"
+
+/*             Interface to schemalexer        */
+       int yyparse();
+       void yyerror(char *s);
+       int yylex();
+extern int flex_schema_lineno, flex_schema_ch;
+
+/*             Return value    */
+extern table_list *Schema;
+
+#define YYDEBUG 1
+
+
+#line 40 "schema.y"
+typedef union {
+       char* strval;
+       field_entry *field_t;
+       field_entry_list *field_list_t;
+       table_def *table_def_t;
+       table_list *table_list_t;
+       param_list *plist_t;
+       } YYSTYPE;
+#include <stdio.h>
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define        YYFINAL         31
+#define        YYFLAG          -32768
+#define        YYNTBASE        12
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 263 ? yytranslate[x] : 19)
+
+static const char yytranslate[] = {     0,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     9,
+    10,     2,     2,    11,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
+     6,     7,     8
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     2,     4,     7,    14,    21,    23,    26,    32,    33,
+    37,    39
+};
+
+static const short yyrhs[] = {    13,
+     0,    14,     0,    13,    14,     0,     7,     3,    17,     5,
+    15,     6,     0,     8,     3,    17,     5,    15,     6,     0,
+    16,     0,    15,    16,     0,     3,     3,     3,    17,     4,
+     0,     0,     9,    18,    10,     0,     3,     0,    18,    11,
+     3,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+    68,    70,    71,    74,    76,    80,    81,    84,    88,    90,
+    93,    95
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","NAME","SEMICOLON",
+"LEFTBRACE","RIGHTBRACE","TABLE","STREAM","'('","')'","','","result","table_list",
+"table_def","field_list","field","opt_param_commalist","param_commalist", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+    12,    13,    13,    14,    14,    15,    15,    16,    17,    17,
+    18,    18
+};
+
+static const short yyr2[] = {     0,
+     1,     1,     2,     6,     6,     1,     2,     5,     0,     3,
+     1,     3
+};
+
+static const short yydefact[] = {     0,
+     0,     0,     1,     2,     9,     9,     3,     0,     0,     0,
+    11,     0,     0,     0,    10,     0,     0,     0,     6,     0,
+    12,     0,     4,     7,     5,     9,     0,     8,     0,     0,
+     0
+};
+
+static const short yydefgoto[] = {    29,
+     3,     4,    18,    19,     9,    12
+};
+
+static const short yypact[] = {     2,
+     0,     4,     2,-32768,     5,     5,-32768,    10,    11,    12,
+-32768,     1,    15,    15,-32768,    16,    18,    -2,-32768,    -1,
+-32768,    19,-32768,-32768,-32768,     5,    20,-32768,    23,    25,
+-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,    24,    14,   -12,    -6,-32768
+};
+
+
+#define        YYLAST          28
+
+
+static const short yytable[] = {    10,
+    17,    17,     5,    23,    25,    24,     6,    24,     1,     2,
+    15,    16,    11,     8,     0,    13,    14,    17,    21,    27,
+    22,    26,    30,    28,    31,     0,     7,    20
+};
+
+static const short yycheck[] = {     6,
+     3,     3,     3,     6,     6,    18,     3,    20,     7,     8,
+    10,    11,     3,     9,    -1,     5,     5,     3,     3,    26,
+     3,     3,     0,     4,     0,    -1,     3,    14
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "bison.simple"
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef alloca
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi)
+#include <alloca.h>
+#else /* not sparc */
+#if defined (MSDOS) && !defined (__TURBOC__)
+#include <malloc.h>
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+#include <malloc.h>
+ #pragma alloca
+#else /* not MSDOS, __TURBOC__, or _AIX */
+#ifdef __hpux
+#ifdef __cplusplus
+extern "C" {
+void *alloca (unsigned int);
+};
+#else /* not __cplusplus */
+void *alloca ();
+#endif /* not __cplusplus */
+#endif /* __hpux */
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc.  */
+#endif /* not GNU C.  */
+#endif /* alloca not defined.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+#define YYACCEPT       return(0)
+#define YYABORT        return(1)
+#define YYERROR                goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL         goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    { yychar = (token), yylval = (value);                      \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    { yyerror ("syntax error: cannot back up"); YYERROR; }     \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+#ifndef YYPURE
+#define YYLEX          yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX          yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX          yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX          yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX          yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int    yychar;                 /*  the lookahead symbol                */
+YYSTYPE        yylval;                 /*  the semantic value of the           */
+                               /*  lookahead symbol                    */
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;                        /*  location data for the lookahead     */
+                               /*  symbol                              */
+#endif
+
+int yynerrs;                   /*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;                   /*  nonzero means print parse trace     */
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks      */
+
+#ifndef        YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+int yyparse (void);
+#endif
+\f
+#if __GNUC__ > 1               /* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)     __builtin_memcpy(TO,FROM,COUNT)
+#else                          /* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, int count)
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+\f
+#line 196 "bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;     /*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;             /*  lookahead token as an internal (translated) token number */
+
+  short        yyssa[YYINITDEPTH];     /*  the state stack                     */
+  YYSTYPE yyvsa[YYINITDEPTH];  /*  the semantic value stack            */
+
+  short *yyss = yyssa;         /*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;       /*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];  /*  the location stack                  */
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;               /*  the variable used to return         */
+                               /*  semantic values from the action     */
+                               /*  routines                            */
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+        the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+        but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+                &yyss1, size * sizeof (*yyssp),
+                &yyvs1, size * sizeof (*yyvsp),
+                &yyls1, size * sizeof (*yylsp),
+                &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+                &yyss1, size * sizeof (*yyssp),
+                &yyvs1, size * sizeof (*yyvsp),
+                &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       {
+         yyerror("parser stack overflow");
+         return 2;
+       }
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+      yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1, size * sizeof (*yyssp));
+      yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1, size * sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1, size * sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)             /* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+       {
+         fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+         /* Give the individual parser a way to print the precise meaning
+            of a token, for further debugging info.  */
+#ifdef YYPRINT
+         YYPRINT (stderr, yychar, yylval);
+#endif
+         fprintf (stderr, ")\n");
+       }
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+              yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+       fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 1:
+#line 68 "schema.y"
+{Schema = yyvsp[0].table_list_t;;
+    break;}
+case 2:
+#line 70 "schema.y"
+{yyval.table_list_t = new table_list(yyvsp[0].table_def_t);;
+    break;}
+case 3:
+#line 71 "schema.y"
+{yyval.table_list_t = yyvsp[-1].table_list_t->append_table(yyvsp[0].table_def_t);;
+    break;}
+case 4:
+#line 74 "schema.y"
+{
+                                       yyval.table_def_t=new table_def(yyvsp[-4].strval,yyvsp[-3].plist_t,yyvsp[-1].field_list_t, TABLE_SCHEMA); delete yyvsp[-1].field_list_t;;
+    break;}
+case 5:
+#line 76 "schema.y"
+{
+                                       yyval.table_def_t=new table_def(yyvsp[-4].strval,yyvsp[-3].plist_t,yyvsp[-1].field_list_t, STREAM_SCHEMA); delete yyvsp[-1].field_list_t;;
+    break;}
+case 6:
+#line 80 "schema.y"
+{yyval.field_list_t = new field_entry_list(yyvsp[0].field_t);;
+    break;}
+case 7:
+#line 81 "schema.y"
+{yyval.field_list_t = yyvsp[-1].field_list_t->append_field(yyvsp[0].field_t);;
+    break;}
+case 8:
+#line 85 "schema.y"
+{yyval.field_t = new field_entry(yyvsp[-4].strval,yyvsp[-3].strval,yyvsp[-2].strval,yyvsp[-1].plist_t);;
+    break;}
+case 9:
+#line 89 "schema.y"
+{yyval.plist_t = NULL;;
+    break;}
+case 10:
+#line 90 "schema.y"
+{yyval.plist_t = yyvsp[-1].plist_t;;
+    break;}
+case 11:
+#line 94 "schema.y"
+{yyval.plist_t = new param_list(yyvsp[0].strval);;
+    break;}
+case 12:
+#line 95 "schema.y"
+{yyval.plist_t = yyvsp[-2].plist_t->append(yyvsp[0].strval);;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 498 "bison.simple"
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+       fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+       {
+         int size = 0;
+         char *msg;
+         int x, count;
+
+         count = 0;
+         /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+         for (x = (yyn < 0 ? -yyn : 0);
+              x < (sizeof(yytname) / sizeof(char *)); x++)
+           if (yycheck[x + yyn] == x)
+             size += strlen(yytname[x]) + 15, count++;
+         msg = (char *) malloc(size + 15);
+         if (msg != 0)
+           {
+             strcpy(msg, "parse error");
+
+             if (count < 5)
+               {
+                 count = 0;
+                 for (x = (yyn < 0 ? -yyn : 0);
+                      x < (sizeof(yytname) / sizeof(char *)); x++)
+                   if (yycheck[x + yyn] == x)
+                     {
+                       strcat(msg, count == 0 ? ", expecting `" : " or `");
+                       strcat(msg, yytname[x]);
+                       strcat(msg, "'");
+                       count++;
+                     }
+               }
+             yyerror(msg);
+             free(msg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exceeded");
+       }
+      else
+#endif /* YYERROR_VERBOSE */
+       yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+       YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;             /* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+       fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+}
+#line 98 "schema.y"
+
+
diff --git a/src/ftacmp/schema.tab.cc.h b/src/ftacmp/schema.tab.cc.h
new file mode 100644 (file)
index 0000000..55157f0
--- /dev/null
@@ -0,0 +1,17 @@
+typedef union {
+       char* strval;
+       field_entry *field_t;
+       field_entry_list *field_list_t;
+       table_def *table_def_t;
+       table_list *table_list_t;
+       param_list *plist_t;
+       } YYSTYPE;
+#define        NAME    258
+#define        SEMICOLON       259
+#define        LEFTBRACE       260
+#define        RIGHTBRACE      261
+#define        TABLE   262
+#define        STREAM  263
+
+
+extern YYSTYPE SchemaParserlval;
diff --git a/src/ftacmp/schemalexer.cc b/src/ftacmp/schemalexer.cc
new file mode 100644 (file)
index 0000000..2f08b3b
--- /dev/null
@@ -0,0 +1,1694 @@
+#define yy_create_buffer SchemaParser_create_buffer
+#define yy_delete_buffer SchemaParser_delete_buffer
+#define yy_scan_buffer SchemaParser_scan_buffer
+#define yy_scan_string SchemaParser_scan_string
+#define yy_scan_bytes SchemaParser_scan_bytes
+#define yy_flex_debug SchemaParser_flex_debug
+#define yy_init_buffer SchemaParser_init_buffer
+#define yy_flush_buffer SchemaParser_flush_buffer
+#define yy_load_buffer_state SchemaParser_load_buffer_state
+#define yy_switch_to_buffer SchemaParser_switch_to_buffer
+#define yyin SchemaParserin
+#define yyleng SchemaParserleng
+#define yylex SchemaParserlex
+#define yyout SchemaParserout
+#define yyrestart SchemaParserrestart
+#define yytext SchemaParsertext
+#define yywrap SchemaParserwrap
+
+#line 20 "schemalexer.cc"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /cvsroot/gscpv4/src/ftacmp/schemalexer.cc,v 1.1.1.1 2013/12/02 17:44:57 spatsch Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#include <unistd.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yyleng = (int) (yy_cp - yy_bp); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 12
+#define YY_END_OF_BUFFER 13
+static yyconst short int yy_accept[31] =
+    {   0,
+        0,    0,   13,   11,    9,    8,    6,   11,    3,    7,
+        7,    7,    4,    5,    9,    8,    0,    7,    7,    7,
+        0,   10,    7,    7,    7,    7,    7,    1,    2,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    1,    1,    1,    1,    1,    1,    4,
+        4,    1,    1,    4,    5,    1,    1,    6,    6,    6,
+        6,    6,    6,    6,    6,    6,    6,    1,    7,    1,
+        1,    1,    1,    1,    8,    9,   10,   10,   11,   10,
+       10,   10,   10,   10,   10,   12,   13,   10,   10,   10,
+       10,   14,   15,   16,   10,   10,   10,   10,   10,   10,
+        1,    1,    1,    1,    6,    1,   10,   10,   10,   10,
+
+       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,
+       10,   10,   10,   10,   10,   10,   10,   10,   10,   10,
+       10,   10,   17,    1,   18,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[19] =
+    {   0,
+        1,    1,    2,    1,    1,    3,    1,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    1,    1
+    } ;
+
+static yyconst short int yy_base[34] =
+    {   0,
+        0,    0,   39,   40,   36,    0,   40,   32,   40,    0,
+       20,   27,   40,   40,   32,    0,   30,    0,   18,   22,
+       27,   40,   18,   16,   19,   15,   12,    0,    0,   40,
+       18,   17,   21
+    } ;
+
+static yyconst short int yy_def[34] =
+    {   0,
+       30,    1,   30,   30,   30,   31,   30,   30,   30,   32,
+       32,   32,   30,   30,   30,   31,   33,   32,   32,   32,
+       33,   30,   32,   32,   32,   32,   32,   32,   32,    0,
+       30,   30,   30
+    } ;
+
+static yyconst short int yy_nxt[59] =
+    {   0,
+        4,    5,    6,    7,    8,    4,    9,   10,   10,   10,
+       10,   10,   10,   10,   11,   12,   13,   14,   16,   18,
+       16,   21,   21,   21,   29,   28,   27,   26,   25,   22,
+       24,   23,   22,   15,   20,   19,   17,   15,   30,    3,
+       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
+       30,   30,   30,   30,   30,   30,   30,   30
+    } ;
+
+static yyconst short int yy_chk[59] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,   31,   32,
+       31,   33,   33,   33,   27,   26,   25,   24,   23,   21,
+       20,   19,   17,   15,   12,   11,    8,    5,    3,   30,
+       30,   30,   30,   30,   30,   30,   30,   30,   30,   30,
+       30,   30,   30,   30,   30,   30,   30,   30
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "schema.l"
+#define INITIAL 0
+/*
+       MUST COMPILE WITH
+               flex -PSchemaParser -oschemalexer.cc schema.l
+       (or equivalent).
+*/
+#line 9 "schema.l"
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ #include "parse_schema.h"
+ #include <string.h>
+
+
+
+#include "schema.tab.cc.h"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C"
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int SchemaParserwrap(){return(1);}
+
+extern int SchemaParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_lineno : the line currently being parsed when the error occurs.
+               flexch : the character on the line where the error occurs
+               flex_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_schema_lineno = 1;
+int flex_schema_ch = 0;
+char flex_schema_linebuf[1000];
+
+//void SchemaParsererror(char *s);
+
+void SchemaParsererror(char *s){
+       printf("On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_schema_lineno, flex_schema_ch, s, SchemaParsertext, flex_schema_linebuf );
+       printf("%*s\n",1+flex_schema_ch,"^");
+}
+
+
+/* MKS needs the next line to increase the NFA table */
+#line 466 "schemalexer.cc"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( yy_current_buffer->yy_is_interactive ) \
+               { \
+               int c = '*', n; \
+               for ( n = 0; n < max_size && \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+                       buf[n] = (char) c; \
+               if ( c == '\n' ) \
+                       buf[n++] = (char) c; \
+               if ( c == EOF && ferror( yyin ) ) \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+               result = n; \
+               } \
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+                 && ferror( yyin ) ) \
+               YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+       YY_USER_ACTION
+
+YY_DECL
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp, *yy_bp;
+       register int yy_act;
+
+#line 71 "schema.l"
+
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+#line 634 "schemalexer.cc"
+
+       if ( yy_init )
+               {
+               yy_init = 0;
+
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! yy_start )
+                       yy_start = 1;   /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( ! yy_current_buffer )
+                       yy_current_buffer =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+
+               yy_load_buffer_state();
+               }
+
+       while ( 1 )             /* loops until end-of-file is reached */
+               {
+               yy_cp = yy_c_buf_p;
+
+               /* Support of yytext. */
+               *yy_cp = yy_hold_char;
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = yy_start;
+yy_match:
+               do
+                       {
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               yy_last_accepting_state = yy_current_state;
+                               yy_last_accepting_cpos = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 31 )
+                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 40 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+               if ( yy_act == 0 )
+                       { /* have to back up */
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       yy_act = yy_accept[yy_current_state];
+                       }
+
+               YY_DO_BEFORE_ACTION;
+
+
+do_action:     /* This label is used only to access EOF actions. */
+
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = yy_hold_char;
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 87 "schema.l"
+{ flex_schema_ch+=SchemaParserleng; return TABLE; }
+       YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 88 "schema.l"
+{ flex_schema_ch+=SchemaParserleng; return STREAM; }
+       YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 90 "schema.l"
+{flex_schema_ch+=SchemaParserleng; return SEMICOLON;}
+       YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 91 "schema.l"
+{flex_schema_ch+=SchemaParserleng; return LEFTBRACE;}
+       YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 92 "schema.l"
+{flex_schema_ch+=SchemaParserleng; return RIGHTBRACE;}
+       YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 94 "schema.l"
+{ flex_schema_ch+=SchemaParserleng; return yytext[0]; }
+       YY_BREAK
+/* names */
+case 7:
+YY_RULE_SETUP
+#line 99 "schema.l"
+{ flex_schema_ch+=SchemaParserleng; SchemaParserlval.strval = strdup(yytext); return NAME; }
+       YY_BREAK
+/*                                                                                                                     */
+/*             Newline : advance the error reporting line number       */
+/*             and grab the next line into flex_linebuf                        */
+/*                                                                                                                     */
+case 8:
+YY_RULE_SETUP
+#line 107 "schema.l"
+{flex_schema_ch=0; flex_schema_lineno++;
+                          strcpy(flex_schema_linebuf,SchemaParsertext+1);
+                          yyless(1);
+                          }
+       YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 112 "schema.l"
+{flex_schema_ch+=SchemaParserleng; }   /* white space */
+       YY_BREAK
+case 10:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 114 "schema.l"
+{flex_schema_ch+=SchemaParserleng; };  /* comment */
+       YY_BREAK
+/*             Parse error on anything else.           */
+case 11:
+YY_RULE_SETUP
+#line 117 "schema.l"
+{fprintf(stderr,"Warning: unknown token (ignored)\n");         SchemaParsererror(yytext);}
+       YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 120 "schema.l"
+ECHO;
+       YY_BREAK
+#line 789 "schemalexer.cc"
+case YY_STATE_EOF(INITIAL):
+       yyterminate();
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = yy_hold_char;
+               YY_RESTORE_YY_MORE_OFFSET
+
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between yy_current_buffer and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       yy_n_chars = yy_current_buffer->yy_n_chars;
+                       yy_current_buffer->yy_input_file = yyin;
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state();
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++yy_c_buf_p;
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                               yy_cp = yy_c_buf_p;
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer() )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               yy_did_buffer_switch_on_eof = 0;
+
+                               if ( yywrap() )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               yy_c_buf_p =
+                                       yytext_ptr + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               yy_c_buf_p =
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+       {
+       register char *dest = yy_current_buffer->yy_ch_buf;
+       register char *source = yytext_ptr;
+       register int number_to_move, i;
+       int ret_val;
+
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( yy_current_buffer->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a single character, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+       else
+               {
+               int num_to_read =
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+                       YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = yy_current_buffer;
+
+                       int yy_c_buf_p_offset =
+                               (int) (yy_c_buf_p - b->yy_ch_buf);
+
+                       if ( b->yy_is_our_buffer )
+                               {
+                               int new_size = b->yy_buf_size * 2;
+
+                               if ( new_size <= 0 )
+                                       b->yy_buf_size += b->yy_buf_size / 8;
+                               else
+                                       b->yy_buf_size *= 2;
+
+                               b->yy_ch_buf = (char *)
+                                       /* Include room in for 2 EOB chars. */
+                                       yy_flex_realloc( (void *) b->yy_ch_buf,
+                                                        b->yy_buf_size + 2 );
+                               }
+                       else
+                               /* Can't grow it, we don't own it. */
+                               b->yy_ch_buf = 0;
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = yy_current_buffer->yy_buf_size -
+                                               number_to_move - 1;
+#endif
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+                       yy_n_chars, num_to_read );
+
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       if ( yy_n_chars == 0 )
+               {
+               if ( number_to_move == YY_MORE_ADJ )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       yy_current_buffer->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       yy_n_chars += number_to_move;
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+       return ret_val;
+       }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp;
+
+       yy_current_state = yy_start;
+
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+               {
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       yy_last_accepting_state = yy_current_state;
+                       yy_last_accepting_cpos = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 31 )
+                               yy_c = yy_meta[(unsigned int) yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+               }
+
+       return yy_current_state;
+       }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+       {
+       register int yy_is_jam;
+       register char *yy_cp = yy_c_buf_p;
+
+       register YY_CHAR yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               yy_last_accepting_state = yy_current_state;
+               yy_last_accepting_cpos = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 31 )
+                       yy_c = yy_meta[(unsigned int) yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+       yy_is_jam = (yy_current_state == 30);
+
+       return yy_is_jam ? 0 : yy_current_state;
+       }
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+       {
+       register char *yy_cp = yy_c_buf_p;
+
+       /* undo effects of setting up yytext */
+       *yy_cp = yy_hold_char;
+
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               register int number_to_move = yy_n_chars + 2;
+               register char *dest = &yy_current_buffer->yy_ch_buf[
+                                       yy_current_buffer->yy_buf_size + 2];
+               register char *source =
+                               &yy_current_buffer->yy_ch_buf[number_to_move];
+
+               while ( source > yy_current_buffer->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += (int) (dest - source);
+               yy_bp += (int) (dest - source);
+               yy_current_buffer->yy_n_chars =
+                       yy_n_chars = yy_current_buffer->yy_buf_size;
+
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       *--yy_cp = (char) c;
+
+
+       yytext_ptr = yy_bp;
+       yy_hold_char = *yy_cp;
+       yy_c_buf_p = yy_cp;
+       }
+#endif /* ifndef YY_NO_UNPUT */
+
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+       {
+       int c;
+       static int _xpg = -1;
+
+       if (_xpg == -1)
+               {
+                       char *_xpgenv = getenv("_XPG");
+                       if (_xpgenv == NULL)
+                               _xpg = 0;
+                       else
+                               {
+                               _xpg = atoi(_xpgenv);
+                               if (_xpg < 0)
+                                       _xpg = 0;
+                               }
+               }
+
+       *yy_c_buf_p = yy_hold_char;
+
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       /* This was really a NUL. */
+                       *yy_c_buf_p = '\0';
+
+               else
+                       { /* need more input */
+                       int offset = yy_c_buf_p - yytext_ptr;
+                       ++yy_c_buf_p;
+
+                       switch ( yy_get_next_buffer() )
+                               {
+                               case EOB_ACT_LAST_MATCH:
+                                       /* This happens because yy_g_n_b()
+                                        * sees that we've accumulated a
+                                        * token and flags that we need to
+                                        * try matching the token before
+                                        * proceeding.  But for input(),
+                                        * there's no matching to consider.
+                                        * So convert the EOB_ACT_LAST_MATCH
+                                        * to EOB_ACT_END_OF_FILE.
+                                        */
+
+                                       /* Reset buffer status. */
+                                       yyrestart( yyin );
+
+                                       /* fall through */
+
+                               case EOB_ACT_END_OF_FILE:
+                                       if (_xpg)
+                                               return 0;
+                                       else
+                                               {
+                                               if ( yywrap() )
+                                                       return 0;
+
+                                               if ( ! yy_did_buffer_switch_on_eof )
+                                                       YY_NEW_FILE;
+#ifdef __cplusplus
+                                               return yyinput();
+#else
+                                               return input();
+#endif
+                                               }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       yy_c_buf_p = yytext_ptr + offset;
+                                       break;
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
+       *yy_c_buf_p = '\0';     /* preserve yytext */
+       yy_hold_char = *++yy_c_buf_p;
+
+
+       return c;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+       {
+       if ( ! yy_current_buffer )
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+       yy_init_buffer( yy_current_buffer, input_file );
+       yy_load_buffer_state();
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+       {
+       if ( yy_current_buffer == new_buffer )
+               return;
+
+       if ( yy_current_buffer )
+               {
+               /* Flush out information for old buffer. */
+               *yy_c_buf_p = yy_hold_char;
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       yy_current_buffer = new_buffer;
+       yy_load_buffer_state();
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       yy_did_buffer_switch_on_eof = 1;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+       {
+       yy_n_chars = yy_current_buffer->yy_n_chars;
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+       yyin = yy_current_buffer->yy_input_file;
+       yy_hold_char = *yy_c_buf_p;
+       }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_is_our_buffer = 1;
+
+       yy_init_buffer( b, file );
+
+       return b;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+       {
+       if ( ! b )
+               return;
+
+       if ( b == yy_current_buffer )
+               yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+       if ( b->yy_is_our_buffer )
+               yy_flex_free( (void *) b->yy_ch_buf );
+
+       yy_flex_free( (void *) b );
+       }
+
+
+#ifndef YY_ALWAYS_INTERACTIVE
+#ifndef YY_NEVER_INTERACTIVE
+extern int isatty YY_PROTO(( int ));
+#endif
+#endif
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+       {
+       yy_flush_buffer( b );
+
+       b->yy_input_file = file;
+       b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+       b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+       b->yy_is_interactive = 0;
+#else
+       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+       {
+       if ( ! b )
+               return;
+
+       b->yy_n_chars = 0;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[0];
+
+       b->yy_at_bol = 1;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       if ( b == yy_current_buffer )
+               yy_load_buffer_state();
+       }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       if ( size < 2 ||
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||
+            base[size-1] != YY_END_OF_BUFFER_CHAR )
+               /* They forgot to leave room for the EOB's. */
+               return 0;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+       b->yy_buf_pos = b->yy_ch_buf = base;
+       b->yy_is_our_buffer = 0;
+       b->yy_input_file = 0;
+       b->yy_n_chars = b->yy_buf_size;
+       b->yy_is_interactive = 0;
+       b->yy_at_bol = 1;
+       b->yy_fill_buffer = 0;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       yy_switch_to_buffer( b );
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+       {
+       int len;
+       for ( len = 0; yy_str[len]; ++len )
+               ;
+
+       return yy_scan_bytes( yy_str, len );
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+       {
+       YY_BUFFER_STATE b;
+       char *buf;
+       yy_size_t n;
+       int i;
+
+       /* Get memory for full buffer, including space for trailing EOB's. */
+       n = len + 2;
+       buf = (char *) yy_flex_alloc( n );
+       if ( ! buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+       for ( i = 0; i < len; ++i )
+               buf[i] = bytes[i];
+
+       buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+       b = yy_scan_buffer( buf, n );
+       if ( ! b )
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+       /* It's okay to grow etc. this buffer, and we should throw it
+        * away when we're done.
+        */
+       b->yy_is_our_buffer = 1;
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+       {
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )
+               {
+               yy_size_t new_size;
+
+               yy_start_stack_depth += YY_START_STACK_INCR;
+               new_size = yy_start_stack_depth * sizeof( int );
+
+               if ( ! yy_start_stack )
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+               else
+                       yy_start_stack = (int *) yy_flex_realloc(
+                                       (void *) yy_start_stack, new_size );
+
+               if ( ! yy_start_stack )
+                       YY_FATAL_ERROR(
+                       "out of memory expanding start-condition stack" );
+               }
+
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+       BEGIN(new_state);
+       }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+       {
+       if ( --yy_start_stack_ptr < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);
+       }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+       {
+       return yy_start_stack[yy_start_stack_ptr - 1];
+       }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+       {
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+       }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               yytext[yyleng] = yy_hold_char; \
+               yy_c_buf_p = yytext + n; \
+               yy_hold_char = *yy_c_buf_p; \
+               *yy_c_buf_p = '\0'; \
+               yyleng = n; \
+               } \
+       while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+       {
+       register int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+       }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+       {
+       register int n;
+       for ( n = 0; s[n]; ++n )
+               ;
+
+       return n;
+       }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+       {
+       return (void *) malloc( size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+       {
+       /* The cast to (char *) in the following accommodates both
+        * implementations that use char* generic pointers, and those
+        * that use void* generic pointers.  It works with the latter
+        * because both ANSI C and C++ allow castless assignment from
+        * any pointer type to void*, and deal with argument conversions
+        * as though doing an assignment.
+        */
+       return (void *) realloc( (char *) ptr, size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+       {
+       free( ptr );
+       }
+
+#if YY_MAIN
+int main()
+       {
+       yylex();
+       return 0;
+       }
+#endif
+#line 120 "schema.l"
+
+
+
diff --git a/src/ftacmp/schemaparser.cc b/src/ftacmp/schemaparser.cc
new file mode 100644 (file)
index 0000000..246aae3
--- /dev/null
@@ -0,0 +1,1189 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include"schemaparser_impl.h"
+#include"schemaparser.h"
+#include <string>
+#include "parse_fta.h"
+#include "parse_schema.h"
+#include"generate_utils.h"
+
+#include"host_tuple.h"
+#include"lapp.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+
+//             Interface to FTA definition lexer and parser ...
+
+extern int FtaParserparse(void);
+extern FILE *FtaParserin;
+extern int FtaParserdebug;
+
+//                     This will need to be moved to a parse_fta.cc file.
+fta_parse_t *fta_parse_result;
+var_defs_t *fta_parse_defines;
+
+
+
+using namespace std;
+extern int errno;
+
+static gs_int8_t tmpstr[20000];                        // for returning const char* values.
+
+vector<query_rep *> schema_list;       //      The schemas parsed thus far.
+
+/////////////////////////////////////////////////////////////
+///                                    Version functions
+
+static gs_int32_t curr_version = 4;
+static gs_int32_t accepted_versions[] = { 4, 3, 2, 1, 0 };             // must end with zero.
+
+gs_int32_t get_schemaparser_version(){ return curr_version; }
+
+gs_int32_t *get_schemaparser_accepted_versions(){return accepted_versions;}
+
+gs_int32_t schemaparser_accepts_version(gs_int32_t v){
+       int i;
+       for(i=0;accepted_versions[i]>0;++i){
+               if(accepted_versions[i] == v) return 1;
+       }
+       return 0;
+}
+
+
+/////////////////////////////////////////////////////////////////////
+////////////           Utility Functions
+
+/*
+int fta_field_size(int dt, int *is_udef){
+       switch(dt){
+       case INT_TYPE:
+               return(sizeof(int));
+       case UINT_TYPE:
+       case USHORT_TYPE:
+       case BOOL_TYPE:
+               return(sizeof(unsigned int));
+       case ULLONG_TYPE:
+               return(sizeof(unsigned long long int));
+       case LLONG_TYPE:
+               return(sizeof(long long int));
+       case FLOAT_TYPE:
+               return(sizeof(double));
+       case TIMEVAL_TYPE:
+               return(sizeof(timeval));
+       case VSTR_TYPE:
+               return(sizeof(vstring));
+       default:
+               *is_udef = 1;
+               return(0);
+       }
+       return(0);
+};
+*/
+
+
+/////////////////////////////////////////////////////////////
+///                    Interface fcns
+
+
+////////////           Schema management
+
+static gs_schemahandle_t ftaschema_parse(int prot_ok);
+
+gs_schemahandle_t ftaschema_parse_string(gs_csp_t f){
+                       // prot_ok is by default false in schemaparser.h
+
+         fta_parse_result = new fta_parse_t();
+         gs_sp_t schema = strdup(f);
+
+//       FtaParserin = f;
+         FtaParser_setstringinput(schema);
+
+         if(FtaParserparse()){
+               fprintf(stderr,"FTA parse failed.\n");
+               free (schema);
+               return(-1);
+         }
+         free (schema);
+
+         return ftaschema_parse(false);
+}
+gs_schemahandle_t ftaschema_parse_string_prot(gs_csp_t f){
+                       // prot_ok is by default false in schemaparser.h
+
+         fta_parse_result = new fta_parse_t();
+         gs_sp_t schema = strdup(f);
+
+//       FtaParserin = f;
+         FtaParser_setstringinput(schema);
+
+         if(FtaParserparse()){
+               fprintf(stderr,"FTA parse failed.\n");
+               free (schema);
+               return(-1);
+         }
+         free (schema);
+
+         return ftaschema_parse(true);
+}
+
+gs_schemahandle_t ftaschema_parse_file(FILE *f){
+                       // prot_ok is by default false in schemaparser.h
+
+         fta_parse_result = new fta_parse_t();
+
+//       FtaParserin = f;
+         FtaParser_setfileinput(f);
+
+         if(FtaParserparse()){
+               fprintf(stderr,"FTA parse failed.\n");
+               return(-1);
+         }
+
+         return ftaschema_parse(false);
+}
+gs_schemahandle_t ftaschema_parse_file_prot(FILE *f){
+                       // prot_ok is by default false in schemaparser.h
+
+         fta_parse_result = new fta_parse_t();
+
+//       FtaParserin = f;
+         FtaParser_setfileinput(f);
+
+         if(FtaParserparse()){
+               fprintf(stderr,"FTA parse failed.\n");
+               return(-1);
+         }
+
+         return ftaschema_parse(true);
+}
+
+
+
+
+
+static gs_schemahandle_t ftaschema_parse(int prot_ok){
+
+       if(fta_parse_result->parse_type != STREAM_PARSE){
+               if(!(fta_parse_result->parse_type == TABLE_PARSE && prot_ok!=0)){
+                       fprintf(stderr,"ERROR, input is not a stream file.\n");
+                       return(-1);
+               }
+       }
+
+
+//                     Get the tuple information.
+         if(fta_parse_result->tables->size() != 1){
+               fprintf(stderr,"ERROR parsing schema file: %d tables, expecting 1.\n",
+                       fta_parse_result->tables->size() );
+               return(-1);
+         }
+
+         string table_name = fta_parse_result->tables->get_table_name(0);
+         vector<field_entry *> tuple_flds = fta_parse_result->tables->get_fields(table_name);
+         int n_tuples = tuple_flds.size();
+
+//                     get the parameter info.
+         int n_params = 0;
+         string query_name = table_name;
+         vector<var_pair_t *> query_params;
+         if(fta_parse_result->fta_parse_tree){
+               query_params = fta_parse_result->fta_parse_tree->query_params;
+               n_params = query_params.size();
+
+//                     Get the query name
+               if(fta_parse_result->fta_parse_tree->nmap.count("query_name") == 0){
+                       fprintf(stderr,"WARNING: query name is empty. using default_query.\n");
+                       query_name = "default_query";
+               }else{
+                       query_name = fta_parse_result->fta_parse_tree->nmap["query_name"];
+               }
+
+               if(query_name != table_name){
+                       fprintf(stderr,"WARNING table name (%s) is different than query name (%s).\n",
+                               table_name.c_str(), query_name.c_str() );
+               }
+
+         }
+
+//                     Construct the query representation.
+
+         query_rep *qrep = new query_rep(query_name, n_tuples, n_params);
+
+//                     Pack the tuple information.
+         int fi;
+         for(fi=0;fi<n_tuples;++fi){
+               if((qrep->set_field_info(fi,tuple_flds[fi])) == UNDEFINED_TYPE){
+                       fprintf(stderr,"ERROR tuple field %s (number %d) has undefined type %s.\n",
+                               tuple_flds[fi]->get_name().c_str(), fi, tuple_flds[fi]->get_type().c_str());
+               }
+         }
+         if(qrep->finalize_field_info()){
+               fprintf(stderr,"ERROR undefined type in tuple.\n");
+               return(-1);
+         }
+
+//                     Pack the param info
+         int pi;
+         for(pi=0;pi<n_params;++pi){
+               if((qrep->set_param_info(pi, query_params[pi])) == UNDEFINED_TYPE){
+                       fprintf(stderr,"ERROR parameter %s (number %d) has undefined type %s.\n",
+                               query_params[pi]->name.c_str(), pi, query_params[pi]->val.c_str());
+               }
+         }
+         if(qrep->finalize_param_info()){
+               fprintf(stderr,"ERROR undefined type in parameter block.\n");
+               return(-1);
+         }
+
+//                     finish up
+
+       schema_list.push_back(qrep);
+
+       return(schema_list.size()-1);
+}
+
+
+/*                     Release memory used by the schema representation.
+                       return non-zero on error.
+*/
+//                     Currently, do nothing.  I'll need to
+//                     systematically plug memory leaks and write destructors
+//                     to make implementing this function worth while.
+gs_int32_t ftaschema_free(gs_schemahandle_t sh){
+       return(0);
+}
+
+
+/* name of fta schema null terminated */
+/* Returns NULL if sh is out of bounds.        */
+/* NO ALLOCATION IS PERFORMED!   Must treat result as const. */
+gs_sp_t ftaschema_name(gs_schemahandle_t sh){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(NULL);
+       }
+       strcpy(tmpstr,schema_list[sh]->name.c_str());
+       return(tmpstr);
+}
+
+
+/////////////          Tuple management
+
+
+/* number of entries in a tuple */
+/* Return -1 if the schema handle is out of range.     */
+gs_int32_t ftaschema_tuple_len(gs_schemahandle_t sh){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(-1);
+       }
+       return(schema_list[sh]->field_info.size());
+}
+
+/* field entry name */
+/* Returns NULL if sh or index is out of bounds.       */
+/* NO ALLOCATION IS PERFORMED!   Must treat result as const. */
+gs_sp_t ftaschema_field_name(gs_schemahandle_t sh, gs_uint32_t index){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(NULL);
+       }
+       if(index >= schema_list[sh]->field_info.size()){
+               return(NULL);
+       }
+       strcpy(tmpstr,schema_list[sh]->field_info[index].field_name.c_str());
+       return( tmpstr);
+}
+
+/*                     Direct tuple access functions.
+*/
+gs_uint32_t fta_unpack_uint(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+//     return(htonl(retval));
+       return(retval);
+}
+gs_uint32_t fta_unpack_uint_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+
+gs_uint32_t fta_unpack_ushort(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+//     return(htonl(retval));
+       return(retval);
+}
+gs_uint32_t fta_unpack_ushort_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+
+gs_uint32_t fta_unpack_bool(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+//     return(htonl(retval));
+       return(retval);
+}
+gs_uint32_t fta_unpack_bool_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+//     return(htonl(retval));
+       return(retval);
+}
+
+gs_int32_t fta_unpack_int(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_int32_t retval;
+       if(offset+sizeof(gs_int32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));
+//     return(htonl(retval));
+       return(retval);
+}
+gs_int32_t fta_unpack_int_nocheck(void *data, gs_uint32_t offset){
+       gs_int32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));
+       return(retval);
+}
+
+gs_uint64_t fta_unpack_ullong(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint64_t retval;
+       if(offset+sizeof(gs_uint64_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));
+//     return(htonll(retval));
+       return(retval);
+}
+gs_uint64_t fta_unpack_ullong_nocheck(void *data, gs_uint32_t offset){
+       gs_uint64_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));
+       return(retval);
+}
+
+gs_int64_t fta_unpack_llong(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_int64_t retval;
+       if(offset+sizeof( gs_int64_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));
+//     return(htonl(retval));
+       return(retval);
+}
+gs_int64_t fta_unpack_llong_nocheck(void *data, gs_uint32_t offset){
+       gs_int64_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));
+       return(retval);
+}
+
+gs_float_t fta_unpack_float(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_float_t retval;
+       if(offset+sizeof( gs_float_t) > len){
+               *problem = 1;
+               return(0.0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));
+//     return(ntohf(retval));
+       return(retval);
+}
+gs_float_t fta_unpack_float_nocheck(void *data, gs_uint32_t offset){
+       gs_float_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));
+       return(retval);
+}
+
+timeval fta_unpack_timeval(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       timeval retval;
+       if(offset+sizeof( timeval) > len){
+               *problem = 1;
+               return(retval);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(timeval));
+//     retval.tv_sec = htonl(retval.tv_sec);
+//     retval.tv_usec = htonl(retval.tv_usec);
+       retval.tv_sec = retval.tv_sec;
+       retval.tv_usec = retval.tv_usec;
+       return(retval);
+}
+timeval fta_unpack_timeval_nocheck(void *data, gs_uint32_t offset){
+       timeval retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(timeval));
+       retval.tv_sec = retval.tv_sec;
+       retval.tv_usec = retval.tv_usec;
+       return(retval);
+}
+
+vstring fta_unpack_vstr(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       vstring retval;
+       vstring32 unpack_s;
+
+       if(offset+sizeof( vstring32) > len){
+               *problem = 1;
+               return(retval);
+       }
+
+       memcpy(&unpack_s, ((gs_sp_t)data)+offset, sizeof(vstring32));
+
+//     retval.length = htonl(unpack_s.length);
+//     unpack_s.offset = htonl(unpack_s.offset);
+       retval.length = unpack_s.length;
+       unpack_s.offset = unpack_s.offset;
+       retval.reserved = SHALLOW_COPY;
+
+       if(unpack_s.offset + retval.length > len){
+               *problem = 1;
+               return(retval);
+       }
+       retval.offset = (gs_p_t)data + unpack_s.offset;
+       return(retval);
+}
+
+gs_sp_t fta_unpack_fstring(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       return( (gs_sp_t)(data)+offset);
+}
+
+struct hfta_ipv6_str fta_unpack_ipv6(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+        struct hfta_ipv6_str retval;
+        if(offset+sizeof(hfta_ipv6_str) > len){
+                *problem = 1;
+                return(retval);
+        }
+        memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(hfta_ipv6_str));
+//             htonl(retval.v[0]);
+//             htonl(retval.v[1]);
+//             htonl(retval.v[2]);
+//             htonl(retval.v[3]);
+        return(retval);
+}
+struct hfta_ipv6_str fta_unpack_ipv6_nocheck(void *data, gs_uint32_t offset){
+        struct hfta_ipv6_str retval;
+        memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(hfta_ipv6_str));
+        return(retval);
+}
+
+
+/*
+               Direct tuple access functions, but no ntoh xform.
+*/
+gs_uint32_t fta_unpack_uint_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+gs_uint32_t fta_unpack_uint_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+
+gs_uint32_t fta_unpack_ushort_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+gs_uint32_t fta_unpack_ushort_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+
+gs_uint32_t fta_unpack_bool_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+gs_uint32_t fta_unpack_bool_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+
+gs_int32_t fta_unpack_int_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_int32_t retval;
+       if(offset+sizeof(gs_int32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));
+       return(retval);
+}
+gs_int32_t fta_unpack_int_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_int32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));
+       return(retval);
+}
+
+gs_uint64_t fta_unpack_ullong_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_int64_t retval;
+       if(offset+sizeof( gs_uint64_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));
+       return(retval);
+}
+gs_uint64_t fta_unpack_ullong_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_uint64_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));
+       return(retval);
+}
+
+gs_int64_t fta_unpack_llong_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_int64_t retval;
+       if(offset+sizeof( gs_int64_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));
+       return(retval);
+}
+gs_int64_t fta_unpack_llong_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_int64_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));
+       return(retval);
+}
+
+gs_float_t fta_unpack_float_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_float_t retval;
+       if(offset+sizeof( gs_float_t) > len){
+               *problem = 1;
+               return(0.0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));
+       return(retval);
+}
+gs_float_t fta_unpack_float_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_float_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));
+       return(retval);
+}
+
+timeval fta_unpack_timeval_noxf_nocheck(void *data, gs_uint32_t offset){
+       timeval retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(timeval));
+       return(retval);
+}
+
+vstring fta_unpack_vstr_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       vstring retval;
+       vstring32 unpack_s;
+
+       if(offset+sizeof( vstring32) > len){
+               *problem = 1;
+               return(retval);
+       }
+
+       memcpy(&unpack_s, ((gs_sp_t)data)+offset, sizeof(vstring32));
+
+       retval.length = unpack_s.length;
+       retval.reserved = SHALLOW_COPY;
+
+       if(unpack_s.offset + unpack_s.length > len){
+               *problem = 1;
+               return(retval);
+       }
+       retval.offset = (gs_p_t)data + unpack_s.offset;
+       return(retval);
+}
+
+gs_sp_t fta_unpack_fstring_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       return( (gs_sp_t)(data)+offset);
+}
+
+struct hfta_ipv6_str fta_unpack_ipv6_noxf_nocheck(void *data, gs_uint32_t offset){
+        struct hfta_ipv6_str retval;
+        memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(hfta_ipv6_str));
+        return(retval);
+}
+
+
+/* returns fields offset by name       */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is -1
+*/
+gs_int32_t ftaschema_get_field_offset_by_name(gs_schemahandle_t sh, gs_csp_t fieldname){
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(-1);
+       }
+
+       int f;
+       for(f=0;f<schema_list[sh]->field_info.size();++f){
+               if(strcmp(fieldname, schema_list[sh]->field_info[f].field_name.c_str()) == 0)
+                       return(schema_list[sh]->field_info[f].offset);
+       }
+
+//             Nothing found
+       return(-1);
+
+}
+/* field offset by index, return -1 if sh or idx is out-of-bounds */
+gs_int32_t ftaschema_get_field_offset_by_index(gs_schemahandle_t sh, gs_int32_t idx){
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(-1);
+       }
+       if(idx < 0 || idx >= schema_list[sh]->field_info.size()){
+                       return(-1);
+       }
+
+       return(schema_list[sh]->field_info[idx].offset);
+
+}
+
+
+/* returns fields type by name */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is UNDEFINED_TYPE
+*/
+gs_int32_t ftaschema_get_field_type_by_name(gs_schemahandle_t sh, gs_csp_t fieldname){
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(UNDEFINED_TYPE);
+       }
+
+       int f;
+       for(f=0;f<schema_list[sh]->field_info.size();++f){
+               if(strcmp(fieldname, schema_list[sh]->field_info[f].field_name.c_str()) == 0)
+               return(schema_list[sh]->field_info[f].pdt->type_indicator());
+       }
+
+//             Nothing found
+       return( UNDEFINED_TYPE);
+}
+/* field type by index, rteturn value is UNDEFINED_TYPE if sh or idx 
+ * is out of bounds
+*/
+gs_int32_t ftaschema_get_field_type_by_index(gs_schemahandle_t sh, gs_int32_t idx){
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(UNDEFINED_TYPE);
+       }
+       if(idx < 0 || idx >= schema_list[sh]->field_info.size()){
+                       return(UNDEFINED_TYPE);
+       }
+
+       return(schema_list[sh]->field_info[idx].pdt->type_indicator());
+}
+
+
+/* returns tuple value based on name */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is of type UNDEFINED_TYPE
+*/
+access_result ftaschema_get_field_by_name(gs_schemahandle_t sh, gs_csp_t fieldname,
+                                         void * data, gs_uint32_t len){
+       access_result retval;
+       retval.field_data_type = UNDEFINED_TYPE;
+
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(retval);
+       }
+
+       int f;
+       for(f=0;f<schema_list[sh]->field_info.size();++f){
+               if(strcmp(fieldname, schema_list[sh]->field_info[f].field_name.c_str()) == 0)
+                       return(ftaschema_get_field_by_index(sh,f,data,len));
+       }
+
+//             Nothing found
+       return(retval);
+
+}
+
+/* return tuple value by index */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is of type UNDEFINED_TYPE
+*/
+access_result ftaschema_get_field_by_index(gs_schemahandle_t sh, gs_uint32_t index,
+                                         void * data, gs_uint32_t len){
+       access_result retval;
+       retval.field_data_type = UNDEFINED_TYPE;
+       gs_int32_t problem = 0;
+
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(retval);
+       }
+       if(index >= schema_list[sh]->field_info.size()){
+               return(retval);
+       }
+
+       switch(schema_list[sh]->field_info[index].pdt->get_type()){
+       case u_int_t:
+               retval.r.ui = fta_unpack_uint(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = UINT_TYPE;
+               break;
+       case ip_t:
+               retval.r.ui = fta_unpack_uint(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = IP_TYPE;
+               break;
+       case int_t:
+               retval.r.i = fta_unpack_int(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = INT_TYPE;
+               break;
+       case u_llong_t:
+               retval.r.ul = fta_unpack_ullong(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = ULLONG_TYPE;
+               break;
+       case llong_t:
+               retval.r.l = fta_unpack_llong(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = LLONG_TYPE;
+               break;
+       case u_short_t:
+               retval.r.ui = fta_unpack_ushort(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = USHORT_TYPE;
+               break;
+       case floating_t:
+               retval.r.f = fta_unpack_float(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = FLOAT_TYPE;
+               break;
+       case bool_t:
+               retval.r.ui = fta_unpack_bool(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = BOOL_TYPE;
+               break;
+       case v_str_t:
+               retval.r.vs = fta_unpack_vstr(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = VSTR_TYPE;
+               break;
+       case fstring_t:
+               retval.r.fs.data = fta_unpack_fstring(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               retval.r.fs.size = schema_list[sh]->field_info[index].pdt->type_size();
+               if(!problem) retval.field_data_type = FSTRING_TYPE;
+       case timeval_t:
+               retval.r.t = fta_unpack_timeval(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = TIMEVAL_TYPE;
+               break;
+       case ipv6_t:
+               retval.r.ip6 = fta_unpack_ipv6(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = IPV6_TYPE;
+               break;
+       case undefined_t:
+               break;
+       }
+       return(retval);
+}
+
+
+//             Get location of eof, temporal-tuple metadata.
+gs_int32_t ftaschema_get_tuple_metadata_offset(gs_schemahandle_t sh){
+        if(sh < 0 || sh >= schema_list.size())
+                return 0;               // probably need to return a error instead of just telling its not eof tuple
+
+        return ( schema_list[sh]->min_tuple_size);
+}
+
+
+/* checks whether tuple is temporal
+  return value 1 indicates that tuple istemporal, 0 - not temporal
+*/
+gs_int32_t ftaschema_is_temporal_tuple(gs_schemahandle_t sh, void *data) {
+
+       if(sh < 0 || sh >= schema_list.size())
+               return 0;               // probably need to return a error instead of just telling its not temporal
+
+       return (*((gs_sp_t)data + schema_list[sh]->min_tuple_size) == TEMPORAL_TUPLE);
+}
+//inline gs_int32_t ftaschema_is_temporal_tuple_offset(int metadata_offset, void *data) {
+//     return (*((gs_sp_t)data + metadata_offset) == TEMPORAL_TUPLE);
+//}
+
+
+
+/* checks whether tuple is special end-of_file tuple
+  return value 1 indicates that tuple is eof_tuple, 0 - otherwise
+*/
+gs_int32_t ftaschema_is_eof_tuple(gs_schemahandle_t sh, void *data) {
+        if(sh < 0 || sh >= schema_list.size())
+                return 0;               // probably need to return a error instead of just telling its not eof tuple
+
+        return (*((gs_sp_t)data + schema_list[sh]->min_tuple_size) == EOF_TUPLE);
+
+}
+inline gs_int32_t ftaschema_is_eof_tuple_offset(int metadata_offset, void *data) {
+        return (*((gs_sp_t)data + metadata_offset) == EOF_TUPLE);
+}
+
+
+/* extracts the trace from the temporal tuple
+  return value 0 indicates success, non-zero - error
+*/
+gs_int32_t ftaschema_get_trace(gs_schemahandle_t sh, void* data, gs_int32_t len,
+       gs_uint64_t* trace_id, gs_uint32_t* sz, fta_stat** trace ) {
+
+       if(sh < 0 || sh >= schema_list.size() || *((gs_sp_t)data + schema_list[sh]->min_tuple_size) != TEMPORAL_TUPLE)
+               return 1;
+
+       memcpy(trace_id, (gs_sp_t)data + schema_list[sh]->min_tuple_size + sizeof(gs_int8_t), sizeof(gs_uint64_t));
+       *trace = (fta_stat*)((gs_sp_t)data + schema_list[sh]->min_tuple_size + sizeof(gs_int8_t) + sizeof(gs_uint64_t));
+       *sz = (len - schema_list[sh]->min_tuple_size - sizeof(gs_int8_t)- sizeof(gs_uint64_t)) / sizeof(fta_stat);
+
+       return 0;
+}
+
+
+////////////   Param block management
+
+/* number of parameters */
+/*     Return -1 if sh is out of bounds        */
+gs_int32_t ftaschema_parameter_len(gs_schemahandle_t sh){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(-1);
+       }
+       return(schema_list[sh]->param_info.size());
+}
+
+/* parameter entry name */
+/*     Return NULL if sh or index is out of bounds.    */
+/*     NO COPYING IS PERFORMED */
+gs_sp_t ftaschema_parameter_name(gs_schemahandle_t sh, gs_uint32_t index){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(NULL);
+       }
+    if(index >= schema_list[sh]->param_info.size()){
+       return(NULL);
+    }
+       strcpy(tmpstr,schema_list[sh]->param_info[index].param_name.c_str());
+    return(tmpstr);
+}
+
+/* set parameter value for parameter handle */
+/*     Pass in the parameter in its char string representation. */
+/*  Return value is -1 on error, else 0        */
+gs_int32_t ftaschema_setparam_by_name(gs_schemahandle_t sh, gs_sp_t param_name,
+                              gs_sp_t param_val, gs_int32_t len){
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(-1);
+       }
+
+       int f;
+       for(f=0;f<schema_list[sh]->param_info.size();++f){
+               if(strcmp(param_name, schema_list[sh]->param_info[f].param_name.c_str()) == 0)
+                       return(ftaschema_setparam_by_index(sh,f,param_val,len));
+       }
+
+//             not found
+       return(-1);
+}
+
+/* set parameter value for parameter handle */
+/*     Pass in the parameter in its char string representation. */
+/*  Return value is -1 on error, else 0        */
+gs_int32_t ftaschema_setparam_by_index(gs_schemahandle_t sh, gs_int32_t index,
+                               gs_sp_t param_val, gs_int32_t len){
+
+    void *tmp_ptr;
+       unsigned int ui,d1,d2,d3,d4;
+       int i;
+       unsigned long long int ulli;
+       long long int lli;
+       double f;
+
+
+       if(sh < 0 || sh >= schema_list.size()){
+               return(-1);
+       }
+    if(index >= schema_list[sh]->param_info.size()){
+       return(-1);
+    }
+
+    param_block_info *pb = &(schema_list[sh]->param_info[index]);
+       switch(pb->pdt->get_type()){
+               case int_t:
+                       if(sscanf(param_val,"%d",&i) == 1){
+                               pb->value.r.i=i;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case u_int_t:
+               case u_short_t:
+               case bool_t:
+                       if(sscanf(param_val,"%u",&ui) == 1){
+                               pb->value.r.ui=ui;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case ip_t:
+                       if(sscanf(param_val,"%d.%d.%d.%d",&d1,&d2,&d3,&d4) == 4){
+                               pb->value.r.ui = (d1 << 24)+(d2 << 16)+(d3 << 8)+d4;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+               case u_llong_t:
+                       if(sscanf(param_val,"%llu",&ulli) == 1){
+                               pb->value.r.ul=ulli;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case llong_t:
+                       if(sscanf(param_val,"%lld",&lli) == 1){
+                               pb->value.r.l=lli;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case floating_t:
+                       if(sscanf(param_val,"%lf",&f) == 1){
+                               pb->value.r.f=f;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case timeval_t:
+                       if(sscanf(param_val,"(%d,%d)",&d1, &d2) == 2){
+                               pb->value.r.t.tv_sec = d1;
+                               pb->value.r.t.tv_usec = d2;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case v_str_t:
+                       if(pb->value.r.vs.offset != 0){
+                               tmp_ptr = (void *)(pb->value.r.vs.offset);
+                               free(tmp_ptr);
+                       }
+                       tmp_ptr = malloc(len);
+                       pb->value.r.vs.offset = (gs_p_t)tmp_ptr;
+                       memcpy(tmp_ptr,param_val, len);
+                       pb->value.r.vs.length = len;
+//                     pb->value.r.vs.reserved = 0;
+                       pb->value.r.vs.reserved = INTERNAL;
+                       pb->value_set = true;
+                       return(0);
+                       break;
+               case fstring_t:
+                       fprintf(stderr,"ERROR, fstring parameters not supported, use vstring.\n");
+                       exit(1);
+                       break;
+               case ipv6_t:
+                       fprintf(stderr,"ERROR, ipv6_t parameters not supported.\n");
+                       exit(1);
+                       break;
+               case undefined_t:
+                       fprintf(stderr,"INTERNAL ERROR undefined_t type in ftaschema_setparam_by_index\n");
+                       exit(1);
+               default:
+                       fprintf(stderr,"INTERNAL ERROR unknown type in ftaschema_setparam_by_index\n");
+                       exit(1);
+       }
+
+       return(-1);
+}
+
+gs_int32_t ftaschema_create_param_block(gs_schemahandle_t sh, void ** block, gs_int32_t * size){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(-1);
+       }
+
+       *size = schema_list[sh]->min_param_size;
+       int p;
+
+       for(p=0;p<schema_list[sh]->param_info.size();++p){
+               if(! schema_list[sh]->param_info[p].value_set) return 1;
+
+               switch(schema_list[sh]->param_info[p].pdt->get_type()){
+               case v_str_t:
+                       *size += schema_list[sh]->param_info[p].value.r.vs.length;
+                       break;
+               case fstring_t:
+                       fprintf(stderr,"ERROR, fstring parameters not supported, use vstring.\n");
+                       exit(1);
+                       break;
+               case undefined_t:
+                       return(-1);
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       *block = malloc(*size);
+       if(*block == NULL) return(-1);
+
+       int data_pos = schema_list[sh]->min_param_size;
+
+       gs_int32_t tmp_int;
+       gs_uint32_t tmp_uint;
+       gs_int64_t tmp_ll;
+       gs_uint64_t tmp_ull;
+       gs_float_t tmp_f;
+       timeval tmp_tv;
+       vstring32 tmp_vstr;
+       void *tmp_ptr;
+
+       for(p=0;p<schema_list[sh]->param_info.size();++p){
+               param_block_info *pb = &(schema_list[sh]->param_info[p]);
+               switch(pb->pdt->get_type()){
+                       case int_t:
+//                             tmp_int = htonl(pb->value.r.i);
+                               tmp_int = pb->value.r.i;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_int,sizeof(gs_int32_t));
+                               break;
+                       case u_int_t:
+                       case u_short_t:
+                       case bool_t:
+                       case ip_t:
+//                             tmp_uint = htonl(pb->value.r.ui);
+                               tmp_uint = pb->value.r.ui;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_uint,sizeof(gs_uint32_t));
+                               break;
+                       case u_llong_t:
+//                             tmp_ull = htonll(pb->value.r.ul);
+                               tmp_ull = pb->value.r.ul;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_ull,sizeof(gs_uint64_t));
+                               break;
+                       case llong_t:
+//                             tmp_ll = htonll(pb->value.r.l);
+                               tmp_ll = pb->value.r.l;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_ll,sizeof(gs_int64_t));
+                               break;
+                       case floating_t:
+//                             tmp_f = ntohf(pb->value.r.f);
+                               tmp_f = pb->value.r.f;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_f,sizeof(gs_float_t));
+                               break;
+                       case timeval_t:
+//                             tmp_tv.tv_sec = htonl(pb->value.r.t.tv_sec);
+//                             tmp_tv.tv_usec = htonl(pb->value.r.t.tv_usec);
+                               tmp_tv.tv_sec = pb->value.r.t.tv_sec;
+                               tmp_tv.tv_usec =pb->value.r.t.tv_usec;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_tv,sizeof(timeval));
+                               break;
+                       case v_str_t:
+//                             tmp_vstr.offset = htonl(data_pos);
+//                             tmp_vstr.length = htonl(pb->value.r.vs.length);
+                               tmp_vstr.offset = data_pos;
+                               tmp_vstr.length = pb->value.r.vs.length;
+//                             tmp_vstr.reserved = htonl(pb->value.r.vs.reserved);
+//                             tmp_vstr.reserved = htonl(PACKED);
+                               tmp_vstr.reserved = PACKED;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_vstr,sizeof(vstring32));
+                               tmp_ptr = (void *)(pb->value.r.vs.offset);
+                               memcpy(((gs_sp_t)(*block))+data_pos, tmp_ptr, pb->value.r.vs.length);
+                               data_pos += pb->value.r.vs.length;
+                               break;
+               case fstring_t:
+                       fprintf(stderr,"ERROR, fstring parameters not supported, use vstring.\n");
+                       exit(1);
+                       break;
+               case ipv6_t:
+                       fprintf(stderr,"ERROR, ipv6_t parameters not supported.\n");
+                       exit(1);
+                       break;
+               case undefined_t:
+                       fprintf(stderr,"INTERNAL ERROR undefined_t type in ftaschema_setparam_by_index\n");
+                       exit(1);
+               default:
+                       fprintf(stderr,"INTERNAL ERROR unknown type in ftaschema_create_param_block\n");
+                       exit(1);
+               }
+       }
+       return(0);
+
+}
+
+
+///////////////////////////////////////////////////////////////
+//             Diagnostic functions
+
+void ftaschema_debugdump(gs_int32_t handle){
+       if(handle<0){
+               printf("ftaschema_debugdump: handle is negative.\n");
+               return;
+       }
+       if(handle >= schema_list.size()){
+               printf("ftaschema_debugdump: handle out of bounds (%d, max is %lu)\n",
+                               handle, schema_list.size());
+       }
+
+       query_rep *q = schema_list[handle];
+
+       printf("Handle is %d, query name is <%s>\n",handle,q->name.c_str());
+       printf("Output tuple has %lu fields:\n",q->field_info.size());
+       int f;
+       for(f=0;f<q->field_info.size();++f){
+               printf("\t%s (%s) : %d\n",q->field_info[f].field_name.c_str(),
+                       (q->field_info[f].pdt->get_type_str()).c_str(),
+                       q->field_info[f].offset
+                       );
+       }
+       printf("Min tuple size is %d\n\n",q->min_tuple_size);
+       printf("Param block is:\n");
+       int p;
+       for(p=0;p<q->param_info.size();++p){
+               printf("\t%s (%s) : %d\n",q->param_info[p].param_name.c_str(),
+                       (q->param_info[p].pdt->get_type_str()).c_str(),
+                       q->param_info[p].offset
+                       );
+       }
+       printf("Min param block size is %d\n\n",q->min_param_size);
+
+
+
+}
+
+
diff --git a/src/ftacmp/schemaparser_impl.h b/src/ftacmp/schemaparser_impl.h
new file mode 100644 (file)
index 0000000..dad02a1
--- /dev/null
@@ -0,0 +1,160 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __INTERFACE_IMPL_INCLUDED__
+#define __INTERFACE_IMPL_INCLUDED__
+
+#include"schemaparser.h"
+
+
+ #include"type_indicators.h"
+ #include"type_objects.h"
+ #include"parse_fta.h"
+ #include "gstypes.h"
+
+
+
+
+//     access_result (access_fcn)(char *tuple, int offset);
+class tuple_access_info{
+public:
+       std::string field_name;
+       int offset;
+       data_type *pdt;
+
+
+       tuple_access_info(){
+               pdt = NULL;
+               offset = 0;
+       };
+
+       int init(field_entry *fe){
+               field_name = fe->get_name();
+               pdt = new data_type(fe->get_type());
+               return(pdt->type_indicator());
+       };
+};
+
+class param_block_info{
+public:
+       std::string param_name;
+       access_result value;
+       data_type *pdt;
+       unsigned int offset;
+       bool value_set;
+
+       param_block_info(){
+               pdt = NULL;
+               offset = 0;
+               value_set = false;
+       };
+
+       int init(var_pair_t *vp){
+               value_set = false;
+               param_name = vp->name;
+               pdt = new data_type(vp->val);
+               switch(pdt->get_type()){
+                       case int_t:
+                               value.r.i=0; break;
+                       case u_int_t:
+                       case u_short_t:
+                       case bool_t:
+                               value.r.ui=0; break;
+                       case floating_t:
+                               value.r.f = 0.0; break;
+                       case u_llong_t:
+                               value.r.ul = 0; break;
+                       case llong_t:
+                               value.r.l=0; break;
+                       case timeval_t:
+                               value.r.t.tv_sec=0; value.r.t.tv_usec=0; break;
+                       case v_str_t:
+                               value.r.vs.length = 0; value.r.vs.offset = 0; value.r.vs.reserved=0; break;
+                       case fstring_t:
+                               value.r.fs.data = NULL;
+                               value.r.fs.size = 0;
+                               break;
+                       default:
+                               break;
+               }
+               return(pdt->type_indicator());
+       };
+};
+
+
+
+class query_rep{
+public:
+       std::string name;
+
+       std::vector<tuple_access_info> field_info;
+       int min_tuple_size;
+
+       std::vector<param_block_info> param_info;
+       int min_param_size;
+
+       query_rep(std::string nm, int ntuples, int nparams) :
+               name(nm), field_info(ntuples), param_info(nparams) {
+                       min_tuple_size = 0;
+                       min_param_size = 0;
+       };
+
+       int set_field_info(int f, field_entry *fe){
+               if(f<0 || f>=field_info.size()) return(-1);
+               return(field_info[f].init(fe));
+       };
+
+       int finalize_field_info(){
+               int f;
+               int curr_pos = 0;
+               int fld_undefined = 0;
+               for(f=0;f<field_info.size();++f){
+                       field_info[f].offset = curr_pos;
+                       int sz = field_info[f].pdt->type_size();
+                       if(sz==0) fld_undefined = 1;
+                       curr_pos += sz;
+               }
+               min_tuple_size = curr_pos;
+               if(fld_undefined) return(-1);
+               else return(0);
+       };
+
+       int set_param_info(int p, var_pair_t *vp){
+               if(p<0 || p>=param_info.size()) return(-1);
+               return(param_info[p].init(vp));
+       };
+
+       int finalize_param_info(){
+               int p;
+               int curr_pos = 0;
+               int fld_undefined = 0;
+               for(p=0;p<param_info.size();++p){
+                       param_info[p].offset = curr_pos;
+                       int sz = param_info[p].pdt->type_size();
+                       if(sz==0) fld_undefined = 1;
+                       curr_pos += sz;
+               }
+               min_param_size = curr_pos;
+               if(fld_undefined) return(-1);
+               else return(0);
+       };
+
+
+};
+
+//                     Diagnostic tool.
+void ftaschema_debugdump(int sch_handle);
+
+#endif
+
diff --git a/src/ftacmp/stream_query.cc b/src/ftacmp/stream_query.cc
new file mode 100644 (file)
index 0000000..aacf1b6
--- /dev/null
@@ -0,0 +1,1957 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#include"stream_query.h"
+#include"generate_utils.h"
+#include"analyze_fta.h"
+#include<algorithm>
+#include<utility>
+#include <list>
+
+static char tmpstr[500];
+
+using namespace std;
+
+
+//             Create a query plan from a query node and an existing
+//             query plan.  Use for lfta queries, the parent query plan provides
+//             the annotations.
+stream_query::stream_query(qp_node *qnode, stream_query *parent){
+       query_plan.push_back(qnode);
+       qhead = 0;
+       qtail.push_back(0);
+       attributes = qnode->get_fields();
+       parameters = qnode->get_param_tbl();
+       defines = parent->defines;
+       query_name = qnode->get_node_name();
+}
+
+//             Copy the query plan.
+stream_query::stream_query(stream_query &src){
+       query_plan = src.query_plan;
+       qhead = src.qhead;
+       qtail = src.qtail;
+       attributes = src.attributes;
+       parameters = src.parameters;
+       defines = src.defines;
+       query_name = src.query_name;
+       gid = src.gid;
+}
+
+
+//             Create a query plan from an analyzed parse tree.
+//             Perform analyses to find the output node, input nodes, etc.
+
+stream_query::stream_query(query_summary_class *qs,table_list *Schema){
+//             Generate the query plan nodes from the analyzed parse tree.
+//             There is only one for now, so just assign the return value
+//             of create_query_nodes to query_plan
+       error_code = 0;
+       query_plan = create_query_nodes(qs,Schema);
+    int i;
+if(query_plan.size() == 0){
+  fprintf(stderr,"INTERNAL ERROR, zero-size query plan in stream_query::stream_query\n");
+  exit(1);
+}
+    for(i=0;i<query_plan.size();++i){
+               if(query_plan[i]){
+                       if(query_plan[i]->get_error_code() != 0){
+                               error_code = query_plan[i]->get_error_code();
+                               err_str +=  query_plan[i]->get_error_str();
+                       }
+               }
+       }
+       qhead = query_plan.size()-1;
+       gid = -1;
+
+}
+
+
+stream_query * stream_query::add_query(query_summary_class *qs,table_list *Schema){
+//             Add another query block to the query plan
+       error_code = 0;
+       vector<qp_node *> new_nodes = create_query_nodes(qs, Schema);
+       query_plan.insert(query_plan.end(),new_nodes.begin(), new_nodes.end());
+       return this;
+}
+
+stream_query * stream_query::add_query(stream_query &src){
+//             Add another query block to the query plan
+       error_code = 0;
+       query_plan.insert(query_plan.end(),src.query_plan.begin(), src.query_plan.end());
+       return this;
+}
+
+
+void stream_query::generate_protocol_se(map<string,stream_query *> &sq_map, table_list *Schema){
+       int i,n;
+
+//             Mapping fields to protocol fields requires schema binding.
+//      First ensure all nodes are in the schema.
+    for(n=0;n<query_plan.size();++n){
+        if(query_plan[n] != NULL){
+            Schema->add_table(query_plan[n]->get_fields());
+        }
+    }
+//             Now do schema binding
+       for(n=0;n<query_plan.size();++n){
+               if(query_plan[n] != NULL){
+                       query_plan[n]->bind_to_schema(Schema);
+               }
+       }
+
+//                     create name-to-index map
+       map<string, int> name_to_node;
+       for(n=0;n<query_plan.size();++n){
+               if(query_plan[n]){
+                       name_to_node[query_plan[n]->get_node_name()] = n;
+               }
+       }
+
+//             Create a list of the nodes to process, in order.
+//             Search from the root down.
+//                     ASSUME tree plan.
+
+       list<int> search_q;
+       list<int> work_list;
+
+       search_q.push_back(qhead);
+       while(! search_q.empty()){
+               int the_q = search_q.front();
+               search_q.pop_front(); work_list.push_front(the_q);
+               vector<int> the_pred = query_plan[the_q]->get_predecessors();
+               for(i=0;i<the_pred.size();i++)
+                       search_q.push_back(the_pred[i]);
+       }
+
+//             Scan through the work list, from the front,
+//             gather the qp_node's ref'd, and call the
+//             protocol se generator.  Pass NULL for
+//             sources not found - presumably user-defined operator
+
+       while(! work_list.empty()){
+               int the_q = work_list.front();
+               work_list.pop_front();
+               vector<qp_node *> q_sources;
+               vector<tablevar_t *> q_input_tbls = query_plan[the_q]->get_input_tbls();
+               for(i=0;i<q_input_tbls.size();++i){
+                        string itbl_nm = q_input_tbls[i]->get_schema_name();
+                        if(name_to_node.count(itbl_nm)>0){
+                                q_sources.push_back(query_plan[name_to_node[itbl_nm]]);
+                        }else if(sq_map.count(itbl_nm)>0){
+                                q_sources.push_back(sq_map[itbl_nm]->get_query_head());
+                        }else{
+                                q_sources.push_back(NULL);
+                        }
+               }
+               query_plan[the_q]->create_protocol_se(q_sources, Schema);
+       }
+
+//////////////////////////////////////////////////////////
+//                     trust but verify
+
+
+/*
+       for(i=0;i<query_plan.size();++i){
+               if(query_plan[i]){
+                       printf("query node %s, type=%s:\n",query_plan[i]->get_node_name().c_str(),
+                                       query_plan[i]->node_type().c_str());
+                       map<std::string, scalarexp_t *> *pse_map = query_plan[i]->get_protocol_se();
+                       map<std::string, scalarexp_t *>::iterator mssi;
+                       for(mssi=pse_map->begin();mssi!=pse_map->end();++mssi){
+                               if((*mssi).second)
+                                       printf("\t%s : %s\n",(*mssi).first.c_str(), (*mssi).second->to_string().c_str());
+                               else
+                                       printf("\t%s : NULL\n",(*mssi).first.c_str());
+                       }
+                       if(query_plan[i]->node_type() == "filter_join" || query_plan[i]->node_type() == "join_eq_hash_qpn"){
+                               vector<scalarexp_t *> pse_l;
+                               vector<scalarexp_t *> pse_r;
+                               if(query_plan[i]->node_type() == "filter_join"){
+                                       pse_l = ((filter_join_qpn *)query_plan[i])->get_hash_l();
+                                       pse_r = ((filter_join_qpn *)query_plan[i])->get_hash_r();
+                               }
+                               if(query_plan[i]->node_type() == "join_eq_hash_qpn"){
+                                       pse_l = ((join_eq_hash_qpn *)query_plan[i])->get_hash_l();
+                                       pse_r = ((join_eq_hash_qpn *)query_plan[i])->get_hash_r();
+                               }
+                               int p;
+                               for(p=0;p<pse_l.size();++p){
+                                       if(pse_l[p] != NULL)
+                                               printf("\t\t%s = ",pse_l[p]->to_string().c_str());
+                                       else
+                                               printf("\t\tNULL = ");
+                                       if(pse_r[p] != NULL)
+                                               printf("%s\n",pse_r[p]->to_string().c_str());
+                                       else
+                                               printf("NULL\n");
+                               }
+                       }
+                       if(query_plan[i]->node_type() == "sgah_qpn" || query_plan[i]->node_type() == "rsgah_qpn" || query_plan[i]->node_type() == "sgahcwcb_qpn"){
+                               vector<scalarexp_t *> pseg;
+                if(query_plan[i]->node_type() == "sgah_qpn")
+                                       pseg = ((sgah_qpn *)query_plan[i])->get_gb_sources();
+                if(query_plan[i]->node_type() == "rsgah_qpn")
+                                       pseg = ((rsgah_qpn *)query_plan[i])->get_gb_sources();
+                if(query_plan[i]->node_type() == "sgahcwcb_qpn")
+                                       pseg = ((sgahcwcb_qpn *)query_plan[i])->get_gb_sources();
+                               int g;
+                               for(g=0;g<pseg.size();g++){
+                                       if(pseg[g] != NULL)
+                                               printf("\t\tgb %d = %s\n",g,pseg[g]->to_string().c_str());
+                                       else
+                                               printf("\t\tgb %d = NULL\n",g);
+                               }
+                       }
+               }
+       }
+*/
+
+}
+
+bool stream_query::generate_linkage(){
+       bool create_failed = false;
+       int n, f,s;
+
+//                     Clear any leftover linkages
+       for(n=0;n<query_plan.size();++n){
+               if(query_plan[n]){
+                       query_plan[n]->clear_predecessors();
+                       query_plan[n]->clear_successors();
+               }
+       }
+       qtail.clear();
+
+//                     create name-to-index map
+       map<string, int> name_to_node;
+       for(n=0;n<query_plan.size();++n){
+               if(query_plan[n]){
+                       name_to_node[query_plan[n]->get_node_name()] = n;
+               }
+       }
+
+//             Do the 2-way linkage.
+       for(n=0;n<query_plan.size();++n){
+               if(query_plan[n]){
+                 vector<tablevar_t *> fm  = query_plan[n]->get_input_tbls();
+                 for(f=0;f<fm.size();++f){
+                       string src_tbl = fm[f]->get_schema_name();
+                       if(name_to_node.count(src_tbl)>0){
+                               int s = name_to_node[src_tbl];
+                               query_plan[n]->add_predecessor(s);
+                               query_plan[s]->add_successor(n);
+                       }
+                 }
+               }
+       }
+
+//             Find the head (no successors) and the tails (at least one
+//             predecessor is external).
+//             Verify that there is only one head,
+//             and that all other nodes have one successor (because
+//              right now I can only handle trees).
+
+       qhead = -1;             // no head yet found.
+       for(n=0;n<query_plan.size();++n){
+               if(query_plan[n]){
+                 vector<int> succ = query_plan[n]->get_successors();
+/*
+                 if(succ.size() > 1){
+                       fprintf(stderr,"ERROR, query node %s supplies data to multiple nodes, but currently only tree query plans are supported:\n",query_plan[n]->get_node_name().c_str());
+                       for(s=0;s<succ.size();++s){
+                               fprintf(stderr,"%s ",query_plan[succ[s]]->get_node_name().c_str());
+                       }
+                       fprintf(stderr,"\n");
+                       create_failed = true;
+                 }
+*/
+                 if(succ.size() == 0){
+                       if(qhead >= 0){
+                               fprintf(stderr,"ERROR, query nodes %s and %s both have zero successors.\n",query_plan[n]->get_node_name().c_str(), query_plan[qhead]->get_node_name().c_str());
+                               create_failed = true;
+                       }else{
+                               qhead = n;
+                       }
+                 }
+                 if(query_plan[n]->n_predecessors() < query_plan[n]->get_input_tbls().size()){
+                       qtail.push_back(n);
+                 }
+               }
+       }
+
+       return create_failed;
+}
+
+//             After the collection of query plan nodes is generated,
+//             analyze their structure to link them up into a tree (or dag?).
+//             Verify that the structure is acceptable.
+//             Do some other analysis and verification tasks (?)
+//             then gather summar information.
+int stream_query::generate_plan(table_list *Schema){
+
+//             The first thing to do is verify that the query plan
+//             nodes were successfully created.
+       bool create_failed = false;
+       int n,f,s;
+       for(n=0;n<query_plan.size();++n){
+               if(query_plan[n]!=NULL && query_plan[n]->get_error_code()){
+                       fprintf(stderr,"%s",query_plan[n]->get_error_str().c_str());
+                       create_failed = true;
+               }
+       }
+/*
+for(n=0;n<query_plan.size();++n){
+if(query_plan[n] != NULL){
+string nstr = query_plan[n]->get_node_name();
+printf("In generate_plan, node %d is %s, reads from:\n\t",n,nstr.c_str());
+vector<tablevar_t *> inv = query_plan[n]->get_input_tbls();
+int nn;
+for(nn=0;nn<inv.size();nn++){
+printf("%s (%d) ",inv[nn]->to_string().c_str(),inv[nn]->get_schema_ref());
+}
+printf("\n");
+}
+}
+*/
+
+       if(create_failed) return(1);
+
+//             Here, link up the query nodes, then verify that the
+//             structure is acceptable (single root, no cycles, no stranded
+//             nodes, etc.)
+       create_failed = generate_linkage();
+       if(create_failed) return -1;
+
+
+//             Here, do optimizations such as predicate pushing,
+//             join rearranging, etc.
+//                     Nothing to do yet.
+
+/*
+for(n=0;n<query_plan.size();++n){
+if(query_plan[n] != NULL){
+string nstr = query_plan[n]->get_node_name();
+printf("B generate_plan, node %d is %s, reads from:\n\t",n,nstr.c_str());
+vector<tablevar_t *> inv = query_plan[n]->get_input_tbls();
+int nn;
+for(nn=0;nn<inv.size();nn++){
+printf("%s (%d) ",inv[nn]->to_string().c_str(),inv[nn]->get_schema_ref());
+}
+printf("\n");
+}
+}
+printf("qhead=%d, qtail = ",qhead);
+int nn;
+for(nn=0;nn<qtail.size();++nn)
+printf("%d ",qtail[nn]);
+printf("\n");
+*/
+
+//             Collect query summaries.  The query is reperesented by its head node.
+       query_name = query_plan[qhead]->get_node_name();
+       attributes = query_plan[qhead]->get_fields();
+//             TODO: The params and defines require a lot more thought.
+       parameters = query_plan[qhead]->get_param_tbl();
+       defines = query_plan[qhead]->get_definitions();
+
+       return(0);
+  };
+
+void stream_query::add_output_operator(ospec_str *o){
+       output_specs.push_back(o);
+}
+
+
+void stream_query::get_external_libs(set<string> &libset){
+
+       int qn,i;
+       for(qn=0;qn<query_plan.size();++qn){
+               if(query_plan[qn] != NULL){
+                       vector<string> op_libs = query_plan[qn]->external_libs();
+                       for(i=0;i<op_libs.size();++i){
+                               libset.insert(op_libs[i]);
+                       }
+               }
+       }
+
+       for(qn=0;qn<output_operators.size();++qn){
+               if(output_operators[qn] != NULL){
+                       vector<string> op_libs = output_operators[qn]->external_libs();
+                       for(i=0;i<op_libs.size();++i){
+                               libset.insert(op_libs[i]);
+                       }
+               }
+       }
+}
+
+
+
+//     Split into LFTA, HFTA components.
+//             Split this query into LFTA and HFTA queries.
+//             Four possible outcomes:
+//             1) the query reads from a protocol, but does not need to
+//                     split (can be evaluated as an LFTA).
+//                     The lfta query is the only element in the return vector,
+//                     and hfta_returned is false.
+//             2) the query reads from no protocol, and therefore cannot be split.
+//                     THe hfta query is the only element in the return vector,
+//                     and hfta_returned is true.
+//             3) reads from at least one protocol, but cannot be split : failure.
+//                     return vector is empty, the error conditions are written
+//                     in err_str and error_code
+//             4) The query splits into an hfta query and one or more LFTA queries.
+//                     the return vector has two or more elements, and hfta_returned
+//                     is true.  The last element is the HFTA.
+
+vector<stream_query *> stream_query::split_query(ext_fcn_list *Ext_fcns, table_list *Schema, bool &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx){
+       vector<stream_query *> queries;
+       int l,q,s;
+       int qp_hfta;
+
+       hfta_returned = false;  // assume until proven otherwise
+
+       for(l=0;l<qtail.size();++l){
+               int leaf = qtail[l];
+
+
+               vector<qp_node *> qnodes = query_plan[leaf]->split_node_for_fta(Ext_fcns, Schema, qp_hfta, ifdb, n_virtual_ifaces, hfta_parallelism, hfta_idx);
+
+
+               if(qnodes.size() == 0 || query_plan[leaf]->get_error_code()){   // error
+//printf("error\n");
+                       error_code = query_plan[leaf]->get_error_code();
+                       err_str = query_plan[leaf]->get_error_str();
+                       vector<stream_query *> null_result;
+                       return(null_result);
+               }
+               if(qnodes.size() == 1 && qp_hfta){  // nothing happened
+//printf("no change\n");
+                       query_plan[leaf] = qnodes[0];
+               }
+               if(qnodes.size() == 1 && !qp_hfta){     // push to lfta
+//printf("lfta only\n");
+                       queries.push_back(new stream_query(qnodes[0], this));
+                       vector<int> succ = query_plan[leaf]->get_successors();
+                       for(s=0;s<succ.size();++s){
+                               query_plan[succ[s]]->remove_predecessor(leaf);
+                       }
+                       query_plan[leaf] = NULL;        // delete it?
+               }
+               if(qnodes.size() > 1){  // actual splitting occurred.
+                       if(!qp_hfta){           // internal consistency check.
+                               error_code = 1;
+                               err_str = "INTERNAL ERROR: mulitple nodes returned by split_node_for_fta, but none are hfta nodes.\n";
+                               vector<stream_query *> null_result;
+                               return(null_result);
+                       }
+
+                       for(q=0;q<qnodes.size()-qp_hfta;++q){  // process lfta nodes
+//printf("creating lfta %d (%s)\n",q,qnodes[q]->get_node_name().c_str());
+                               queries.push_back(new stream_query(qnodes[q], this));
+                       }
+//                                     Use new hfta node
+                       query_plan[leaf] = qnodes[qnodes.size()-1];
+//                                     Add in any extra hfta nodes
+                       for(q=qnodes.size()-qp_hfta;q<qnodes.size()-1;++q)
+                               query_plan.push_back(qnodes[q]);
+               }
+       }
+
+    int n_ifprefs = 0;
+       set<string> ifps;
+       for(q=0;q<query_plan.size();++q){
+               if(query_plan[q] != NULL){
+                        n_ifprefs += query_plan[q]->count_ifp_refs(ifps);
+                        hfta_returned = true;
+               }
+       }
+
+       if(n_ifprefs){
+               set<string>::iterator ssi;
+               err_str += "ERROR, unresolved interface parameters in HFTA:\n";
+               for(ssi=ifps.begin();ssi!=ifps.end();++ssi){
+                       err_str += (*ssi)+" ";
+               }
+               err_str += "\n";
+               error_code = 3;
+               vector<stream_query *> null_result;
+               return(null_result);
+       }
+
+
+       if(hfta_returned){
+               if(generate_linkage()){
+                       fprintf(stderr,"INTERNAL ERROR, generate_linkage failed in split_query.\n");
+                       exit(1);
+               }
+               queries.push_back(this);
+       }
+
+       return(queries);
+}
+
+
+
+vector<table_exp_t *> stream_query::extract_opview(table_list *Schema, vector<query_node *> &qnodes, opview_set &opviews, string silo_nm){
+       vector<table_exp_t *> subqueries;
+       int l,q;
+
+       string root_name = this->get_output_tabledef()->get_tbl_name();
+
+
+       for(l=0;l<qtail.size();++l){
+               int leaf = qtail[l];
+               vector<table_exp_t *> new_qnodes = query_plan[leaf]->extract_opview(Schema, qnodes, opviews, root_name, silo_nm);
+
+               for(q=0;q<new_qnodes.size();++q){  // process lfta nodes
+                       subqueries.push_back( new_qnodes[q]);
+               }
+       }
+
+       return(subqueries);
+}
+
+
+
+
+string stream_query::make_schema(){
+       return make_schema(qhead);
+}
+
+string stream_query::make_schema(int q){
+       string ret="FTA{\n\n";
+
+       ret += query_plan[q]->get_fields()->to_string();
+
+       ret += "DEFINE{\n";
+       ret += "\tquery_name '"+query_plan[q]->get_node_name()+"';\n";
+
+       map<string, string> defs = query_plan[q]->get_definitions();
+       map<string, string>::iterator dfi;
+       for(dfi=defs.begin(); dfi!=defs.end(); ++dfi){
+               ret += "\t"+ (*dfi).first + " '" + (*dfi).second + "';\n";
+       }
+       ret += "}\n\n";
+
+       ret += "PARAM{\n";
+       param_table *params = query_plan[q]->get_param_tbl();
+       vector<string> param_names = params->get_param_names();
+       int p;
+       for(p=0;p<param_names.size();p++){
+               data_type *dt = params->get_data_type( param_names[p] );
+               ret += "\t" + param_names[p] + " '" + dt->get_type_str() + "';\n";
+       }
+       ret += "}\n";
+
+       ret += query_plan[q]->to_query_string();
+       ret += "\n}\n\n";
+
+       return(ret);
+
+}
+
+string stream_query::collect_refd_ifaces(){
+       string ret="";
+       int q;
+       for(q=0;q<query_plan.size();++q){
+               if(query_plan[q]){
+                       map<string, string> defs = query_plan[q]->get_definitions();
+                       if(defs.count("_referenced_ifaces")){
+                               if(ret != "") ret += ",";
+                               ret += defs["_referenced_ifaces"];
+                       }
+               }
+       }
+
+       return ret;
+}
+
+
+bool stream_query::stream_input_only(table_list *Schema){
+       vector<tablevar_t *> input_tbls = this->get_input_tables();
+       int i;
+       for(i=0;i<input_tbls.size();++i){
+               int t = Schema->get_table_ref(input_tbls[i]->get_schema_name());
+               if(Schema->get_schema_type(t) == PROTOCOL_SCHEMA) return(false);
+       }
+       return(true);
+}
+
+//             Return input tables.  No duplicate removal performed.
+vector<tablevar_t *> stream_query::get_input_tables(){
+       vector<tablevar_t *> retval;
+
+//                     create name-to-index map
+       int n;
+       map<string, int> name_to_node;
+       for(n=0;n<query_plan.size();++n){
+         if(query_plan[n]){
+               name_to_node[query_plan[n]->get_node_name()] = n;
+         }
+       }
+
+       int l;
+       for(l=0;l<qtail.size();++l){
+               int leaf = qtail[l];
+               vector<tablevar_t *> tmp_v = query_plan[leaf]->get_input_tbls();
+               int i;
+               for(i=0;i<tmp_v.size();++i){
+                       if(name_to_node.count(tmp_v[i]->get_schema_name()) == 0)
+                               retval.push_back(tmp_v[i]);
+               }
+       }
+       return(retval);
+}
+
+
+void stream_query::compute_node_format(int q, vector<int> &nfmt, map<string, int> &op_idx){
+       int netcnt = 0, hostcnt = 0;
+       int i;
+
+       vector<tablevar_t *> itbls = query_plan[q]->get_input_tbls();
+       for(i=0;i<itbls.size();++i){
+               string tname = itbls[i]->get_schema_name();
+               if(op_idx.count(tname)){
+                       int o = op_idx[tname];
+                       if(nfmt[o] == UNKNOWNFORMAT)
+                               compute_node_format(o,nfmt,op_idx);
+                       if(nfmt[o] == NETFORMAT) netcnt++;
+                       else    hostcnt++;
+               }else{
+                       netcnt++;
+               }
+       }
+       if(query_plan[q]->makes_transform()){
+               nfmt[q] = HOSTFORMAT;
+       }else{
+               if(hostcnt>0){
+                       nfmt[q] = HOSTFORMAT;
+               }else{
+                       nfmt[q] = NETFORMAT;
+               }
+       }
+//printf("query plan %d (%s) is ",q,query_plan[q]->get_node_name().c_str());
+//if(nfmt[q] == HOSTFORMAT) printf(" host format.\n");
+//else printf("net format\n");
+}
+
+
+string stream_query::generate_hfta(table_list *Schema, ext_fcn_list *Ext_fcns, opview_set &opviews, bool distributed_mode){
+       int schref, ov_ix, i, q, param_sz;
+       bool dag_graph = false;
+
+
+//             Bind the SEs in all query plan nodes to this schema, and
+//                     Add all tables used by this query to the schema.
+//                     Question: Will I be polluting the global schema by adding all
+//                     query node schemas?
+
+//             First ensure all nodes are in the schema.
+       int qn;
+       for(qn=0;qn<query_plan.size();++qn){
+               if(query_plan[qn] != NULL){
+                       Schema->add_table(query_plan[qn]->get_fields());
+               }
+       }
+//             Now do binding.
+       for(qn=0;qn<query_plan.size();++qn){
+               if(query_plan[qn] != NULL){
+                       query_plan[qn]->bind_to_schema(Schema);
+               }
+       }
+
+//             Is it a DAG plan?
+       set<string> qsources;
+       int n;
+       for(n=0;n<query_plan.size();++n){
+         if(query_plan[n]){
+               vector<tablevar_t *> tmp_v = query_plan[n]->get_input_tbls();
+               int i;
+               for(i=0;i<tmp_v.size();++i){
+                       if(qsources.count(tmp_v[i]->get_schema_name()) > 0)
+                               dag_graph = true;
+                       qsources.insert(tmp_v[i]->get_schema_name());
+               }
+         }
+       }
+
+
+
+//             Collect set of tables ref'd in this HFTA
+       set<int> tbl_set;
+       for(qn=0;qn<query_plan.size();++qn){
+         if(query_plan[qn]){
+//                     get names of the tables
+               vector<tablevar_t *> input_tbls = query_plan[qn]->get_input_tbls();
+               vector<tablevar_t *> output_tbls = query_plan[qn]->get_output_tbls();
+//                     Convert to tblrefs, add to set of ref'd tables
+               int i;
+               for(i=0;i<input_tbls.size();i++){
+//                     int t = Schema->get_table_ref(input_tbls[i]->get_schema_name());
+                       int t = input_tbls[i]->get_schema_ref();
+                       if(t < 0){
+                               fprintf(stderr,"INTERNAL ERROR in generate_hfta. "
+                                                               "query plan node %s references input table %s, which is not in schema.\n",
+                                                               query_name.c_str(), input_tbls[i]->get_schema_name().c_str());
+                               exit(1);
+                       }
+                       tbl_set.insert(t);
+               }
+
+               for(i=0;i<output_tbls.size();i++){
+                       int t = Schema->get_table_ref(output_tbls[i]->get_schema_name());
+                       if(t < 0){
+                               fprintf(stderr,"INTERNAL ERROR in generate_hfta."
+                                                               "query plan node %s references output table %s, which is not in schema.\n",
+                                                               query_name.c_str(), output_tbls[i]->get_schema_name().c_str());
+                               exit(1);
+                       }
+                       tbl_set.insert(t);
+               }
+         }
+       }
+
+//                     Collect map of lftas, query nodes
+       map<string, int> op_idx;
+       for(q=0;q<query_plan.size();q++){
+         if(query_plan[q]){
+               op_idx[query_plan[q]->get_node_name()] = q;
+         }
+       }
+
+//             map of input tables must include query id and input
+//             source (0,1) becuase several queries might reference the same source
+       vector<tablevar_t *> input_tbls = this->get_input_tables();
+       vector<bool> input_tbl_free;
+       for(i=0;i<input_tbls.size();++i){
+               input_tbl_free.push_back(true);
+       }
+       map<string, int> lfta_idx;
+//fprintf(stderr,"%d input tables, %d query nodes\n",input_tbls.size(), query_plan.size());
+       for(q=0;q<query_plan.size();q++){
+         if(query_plan[q]){
+               vector<tablevar_t *> itbls = query_plan[q]->get_input_tbls();
+               int it;
+               for(it=0;it<itbls.size();it++){
+                       string tname = itbls[it]->get_schema_name()+"-"+int_to_string(q)+"-"+int_to_string(it);
+                       string src_tblname = itbls[it]->get_schema_name();
+                       bool src_is_external = false;
+                       for(i=0;i<input_tbls.size();++i){
+                               if(src_tblname == input_tbls[i]->get_schema_name()){
+                                 src_is_external = true;
+                                 if(input_tbl_free[i]){
+                                       lfta_idx[tname] = i;
+                                       input_tbl_free[i] = false;
+//fprintf(stderr,"Adding %s (src_tblname=%s, q=%d, it=%d) to %d.\n",tname.c_str(), src_tblname.c_str(), q, it, i);
+                                       break;
+                                 }
+                               }
+                       }
+                       if(i==input_tbls.size() && src_is_external){
+                               fprintf(stderr,"INTERNAL ERROR in stream_query::generate_hfta, can't find free entry in input_tbls for query %d, intput %d (%s)\n",q,it,src_tblname.c_str());
+                               exit(1);
+                       }
+               }
+         }
+       }
+/*
+       for(i=0;i<input_tbls.size();++i){
+               string src_tblname = input_tbls[i]->get_schema_name();
+               lfta_idx[src_tblname] = i;
+       }
+*/
+
+//             Compute the output formats of the operators.
+       vector<int> node_fmt(query_plan.size(),UNKNOWNFORMAT);
+       compute_node_format(qhead, node_fmt, op_idx);
+
+
+//             Generate the schema strings for the outputs.
+       string schema_str;
+       for(i=0;i<query_plan.size();++i){
+               if(i != qhead && query_plan[i]){
+                       string schema_tmpstr = this->make_schema(i);
+                       schema_str += "gs_csp_t node"+int_to_string(i)+"_schema = "+make_C_embedded_string(schema_tmpstr)+";\n";
+               }
+       }
+
+       attributes = query_plan[qhead]->get_fields();
+
+
+       string schema_tmpstr = this->make_schema();
+       schema_str += "gs_csp_t "+generate_schema_string_name(query_name)+" = "+make_C_embedded_string(schema_tmpstr)+";\n";
+
+//             Generate the collection of tuple defs.
+
+       string tuple_defs = "\n/*\tDefine tuple structures \t*/\n\n";
+       set<int>::iterator si;
+       for(si=tbl_set.begin(); si!=tbl_set.end(); ++si){
+               tuple_defs += generate_host_tuple_struct( Schema->get_table( (*si) ));
+               tuple_defs += "\n\n";
+       }
+
+//             generate the finalize tuple function
+       string finalize_str = generate_hfta_finalize_tuple(attributes);
+
+//             Analyze and make the output operators
+       bool eat_input = false;
+       string src_op = query_name;
+       string pred_op = src_op;
+       int last_op = -1;
+       if(output_specs.size()>0)
+               eat_input = true;
+       if(n_successors>0)
+               eat_input = false;      // must create stream output for successor HFTAs.
+       int n_filestreams = 0;
+       for(i=0;i<output_specs.size();++i){
+               if(output_specs[i]->operator_type == "stream" ){
+                       eat_input = false;
+               }
+               if(output_specs[i]->operator_type == "file" || output_specs[i]->operator_type == "zfile" ){
+                       last_op = i;
+                       n_filestreams++;
+               }
+       }
+       int filestream_id = 0;
+       for(i=0;i<output_specs.size();++i){
+               if(output_specs[i]->operator_type == "file" || output_specs[i]->operator_type == "zfile"){
+
+                       int n_fstreams = output_specs[i]->n_partitions / n_parallel;
+                       if(n_fstreams * n_parallel < output_specs[i]->n_partitions){
+                               n_fstreams++;
+                               if(n_parallel == 1 || query_name.find("__copy1") != string::npos){
+                                       fprintf(stderr,"WARNING, in query %s, %d streams requested for %s output, but it must be a multiple of the hfta parallelism (%d), increasing number of output streams to %d.\n",query_name.c_str(), output_specs[i]->n_partitions,  output_specs[i]->operator_type.c_str(), n_parallel, n_fstreams*n_parallel);
+                               }
+                       }
+//                     output_file_qpn *new_ofq = new output_file_qpn();
+                       string filestream_tag = "";
+                       if(n_filestreams>1){
+                               filestream_tag = "_fileoutput"+int_to_string(filestream_id);
+                               filestream_id++;
+                       }
+                       output_file_qpn *new_ofq = new output_file_qpn(pred_op, src_op, filestream_tag, query_plan[qhead]->get_fields(), output_specs[i], (i==last_op ? eat_input : false) );
+//                     if(n_fstreams > 1){
+                       if(n_fstreams > 0){
+                               string err_str;
+                               bool err_ret = new_ofq->set_splitting_params(n_parallel,parallel_idx,n_fstreams,output_specs[i]->partitioning_flds,err_str);
+                               if(err_ret){
+                                       fprintf(stderr,"%s",err_str.c_str());
+                                       exit(1);
+                               }
+                       }
+                       output_operators.push_back(new_ofq );
+                       pred_op = output_operators.back()->get_node_name();
+               }else if(! (output_specs[i]->operator_type == "stream" || output_specs[i]->operator_type == "Stream" || output_specs[i]->operator_type == "STREAM") ){
+                       fprintf(stderr,"WARNING, output operator type %s (on query %s) is not supported, ignoring\n",output_specs[i]->operator_type.c_str(),query_name.c_str() );
+               }
+       }
+
+
+
+//             Generate functors for the query nodes.
+
+       string functor_defs = "\n/*\tFunctor definitions\t*/\n\n";
+       for(qn=0;qn<query_plan.size();++qn){
+               if(query_plan[qn]!=NULL){
+//                             Compute whether the input needs a ntoh xform.
+                       vector<bool> needs_xform;
+                       vector<tablevar_t *> itbls = query_plan[qn]->get_input_tbls();
+                       for(i=0;i<itbls.size();++i){
+                               string tname = itbls[i]->get_schema_name();
+//                             if(query_plan[qn]->makes_transform()){
+                                       if(op_idx.count(tname)>0){
+                                               if(node_fmt[ op_idx[tname] ] == NETFORMAT){
+                                                       needs_xform.push_back(true);
+                                               }else{
+                                                       needs_xform.push_back(false);
+                                               }
+                                       }else{
+                                               needs_xform.push_back(true);
+                                       }
+//                             }else{
+//                                     if(op_idx.count(tname)>0){
+//                                             if(node_fmt[qn] != node_fmt[ op_idx[tname] ]){
+//                                                     needs_xform.push_back(true);
+//                                             }else{
+//                                                     needs_xform.push_back(false);
+//                                             }
+//                                     }else{
+//                                             if(node_fmt[qn] == HOSTFORMAT){
+//                                                     needs_xform.push_back(true);
+//                                             }else{
+//                                                     needs_xform.push_back(false);
+//                                             }
+//                                     }
+//                             }
+                       }
+
+                       functor_defs += query_plan[qn]->generate_functor(Schema, Ext_fcns, needs_xform);
+               }
+       }
+
+//                     Generate output operator functors
+
+       vector<bool> needs_xform;
+       for(i=0;i<output_operators.size();++i)
+               functor_defs += output_operators[i]->generate_functor(Schema, Ext_fcns, needs_xform);
+
+       string ret =
+"extern \"C\" {\n"
+"#include <lapp.h>\n"
+"#include <fta.h>\n"
+"#include <gshub.h>\n"
+"#include <stdlib.h>\n"
+"#include <stdio.h>\n"
+"#include <limits.h>\n"
+"}\n"
+;
+       if(dag_graph)
+               ret +=
+"#define PLAN_DAG\n"
+;
+       ret +=
+"#include <schemaparser.h>\n"
+"#include<hfta_runtime_library.h>\n"
+"\n"
+"#include <host_tuple.h>\n"
+"#include <hfta.h>\n"
+"#include <hfta_udaf.h>\n"
+"#include <hfta_sfun.h>\n"
+"\n"
+//"#define MAXSCHEMASZ 16384\n"
+"#include <stdio.h>\n\n"
+;
+
+//             Get include file for each of the operators.
+//             avoid duplicate inserts.
+       set<string> include_fls;
+       for(qn=0;qn<query_plan.size();++qn){
+               if(query_plan[qn] != NULL)
+                       include_fls.insert(query_plan[qn]->get_include_file());
+       }
+       for(i=0;i<output_operators.size();++i)
+                       include_fls.insert(output_operators[i]->get_include_file());
+       set<string>::iterator ssi;
+       for(ssi=include_fls.begin();ssi!=include_fls.end();++ssi)
+               ret += (*ssi);
+
+//             Add defines for hash functions
+       ret +=
+"\n"
+"#define hfta_BOOL_to_hash(x) (x)\n"
+"#define hfta_USHORT_to_hash(x) (x)\n"
+"#define hfta_UINT_to_hash(x) (x)\n"
+"#define hfta_IP_to_hash(x) (x)\n"
+"#define hfta_IPV6_to_hash(x) ( (x.v[0]) ^ (x.v[1]) ^ (x.v[2]) ^ (x.v[3]))\n"
+"#define hfta_INT_to_hash(x) (gs_uint32_t)(x)\n"
+"#define hfta_ULLONG_to_hash(x) ( (( (x) >>32)&0xffffffff) ^ ((x)&0xffffffff) )\n"
+"#define hfta_LLONG_to_hash(x) ( (( (x) >>32)&0xffffffff) ^ ((x)&0xffffffff) )\n"
+"#define hfta_FLOAT_to_hash(x) ( (( ((gs_uint64_t)(x)) >>32)&0xffffffff) ^ (((gs_uint64_t)(x))&0xffffffff) )\n"
+"\n"
+;
+
+//     ret += "#define SERIOUS_LFTA \""+input_tbls[0]->get_schema_name()+"\"\n";
+       ret += "#define OUTPUT_HFTA \""+query_name+"\"\n\n";
+
+//             HACK ALERT: I know for now that all query plans are
+//             single operator plans, but while SPX and SGAH can use the
+//             UNOP template, the merge operator must use the MULTOP template.
+//             WORSE HACK ALERT : merge does not translate its input,
+//             so don't apply finalize to the output.
+//             TODO: clean this up.
+
+//     string node_type = query_plan[0]->node_type();
+
+       ret += schema_str;
+       ret += tuple_defs;
+
+//                     Need to work on the input, output xform logic.
+//                     For now, just add it in.
+//     ret += finalize_str;
+
+       if(node_fmt[qhead] == NETFORMAT){
+               ret +=
+"void finalize_tuple(host_tuple &tup){\n"
+"return;\n"
+"}\n"
+"\n";
+       }else{
+               ret += finalize_str;
+       }
+
+       ret += functor_defs;
+
+//                     Parameter block management
+//                     The proper parameter block must be transmitted to each
+//                     external stream source.
+//                     There is a 1-1 mapping between the param blocks returned
+//                     by this list and the registered data sources ...
+//                     TODO: make this more manageable, but for now
+//                     there is no parameter block manipulation so I just
+//                     need to have the same number.
+
+       ret +=
+"int get_lfta_params(gs_int32_t sz, void * value,list<param_block>& lst){\n"
+"              // for now every  lfta receive the full copy of hfta parameters\n"
+"        struct param_block pb;\n";
+
+       set<string> lfta_seen;
+       for(i=0;i<input_tbls.size();++i){
+               string src_tblname = input_tbls[i]->get_schema_name();
+               if(lfta_seen.count(src_tblname) == 0){
+                 lfta_seen.insert(src_tblname);
+                 schref = input_tbls[i]->get_schema_ref();
+                 if(Schema->get_schema_type(schref) == OPERATOR_VIEW_SCHEMA){
+                       ov_ix = input_tbls[i]->get_opview_idx();
+                       opview_entry *opv = opviews.get_entry(ov_ix);
+                       string op_param = "SUBQ:";
+                       int q;
+                       for(q=0;q<opv->subq_names.size();++q){
+                               if(q>0) op_param+=",";
+                               op_param+=opv->subq_names[q];
+                       }
+                       op_param+="\\n";
+                       param_sz = op_param.size()-1;
+
+                       sprintf(tmpstr,"\t\tpb.block_length = %d;\n",param_sz); ret+=tmpstr;
+                       ret+=
+"        pb.data = malloc(pb.block_length);\n";
+                       ret+="\t\tmemcpy(pb.data,\""+op_param+"\",pb.block_length);\n"
+"        lst.push_back(pb);\n\n";
+                 }else{
+                       ret+=
+"        pb.block_length = sz;\n"
+"        pb.data = malloc(pb.block_length);\n"
+"        memcpy(pb.data, value, pb.block_length);\n"
+"        lst.push_back(pb);\n\n";
+                 }
+               }
+       }
+
+       ret +=
+"        return 0;\n"
+"}\n"
+"\n";
+
+               ret+=
+"struct FTA* alloc_hfta (struct FTAID ftaid, gs_uint32_t reusable, gs_int32_t command, gs_int32_t sz, void * value ) {\n"
+"\n"
+"      // find the lftas\n"
+"      list<lfta_info*> *lfta_list = new list<lfta_info*>;\n"
+"\n"
+"      FTAID f;\n"
+"      char schemabuf[MAXSCHEMASZ];\n"
+"      gs_schemahandle_t schema_handle;\n"
+"\n";
+
+//             Register the input data sources.
+//             Register a source only once.
+
+//     vector<string> ext_reg_txt;
+       map<string, int> input_tbl_srcid;
+       for(i=0;i<input_tbls.size();++i){
+               string src_tblname = input_tbls[i]->get_schema_name();
+//                     Use UDOP alias when in distributed mode.
+//                     the cluster manager will make the translation
+//                     using infr from qtree.xml
+               if(distributed_mode && input_tbls[i]->get_udop_alias() != "")
+                       src_tblname = input_tbls[i]->get_udop_alias();
+       if(input_tbl_srcid.count(src_tblname) == 0){
+               int srcid = input_tbl_srcid.size();
+               input_tbl_srcid[src_tblname] = srcid;
+               string tmp_s=
+"\n    // find "+src_tblname+"\n"
+"      if (fta_find(\""+src_tblname+"\",1,&f,schemabuf,MAXSCHEMASZ)!=0) {\n"
+"                          fprintf(stderr,\"HFTA::error:could not find LFTA \\n\");\n"
+"                          return 0;\n"
+"      }\n"
+"      //fprintf(stderr,\"HFTA::FTA found at %u[%u]\\n\",ftamsgid,ftaindex);\n"
+"\n"
+"      // parse the schema and get the schema handle\n"
+"      schema_handle = ftaschema_parse_string(schemabuf);\n"
+"      lfta_info* inf"+int_to_string(srcid)+" = new lfta_info();\n"
+"      inf"+int_to_string(srcid)+"->f = f;\n"
+"      inf"+int_to_string(srcid)+"->fta_name = strdup(\""+src_tblname+"\");\n"
+"      inf"+int_to_string(srcid)+"->schema = strdup(schemabuf);\n"
+"      inf"+int_to_string(srcid)+"->schema_handle = schema_handle;\n"
+"      lfta_list->push_back(inf"+int_to_string(srcid)+");\n\n";
+//             ext_reg_txt.push_back(tmp_s);
+               ret += tmp_s;
+         }
+       }
+
+       ret+="\n";
+       ret += "\tgs_schemahandle_t root_schema_handle = ftaschema_parse_string("+generate_schema_string_name(query_name)+");\n";
+       for(i=0;i<query_plan.size();++i){
+               if(i != qhead && query_plan[i]){
+                       ret += "\tgs_schemahandle_t op"+int_to_string(i)+"_schema_handle = ftaschema_parse_string(node"+int_to_string(i)+"_schema);\n";
+               }
+       }
+       ret+="\n";
+
+//             Create the operators.
+       int n_basic_ops;
+       for(q=0;q<query_plan.size();q++){
+         if(query_plan[q]){
+               ret+=
+"\n"
+"      // create an instance of operator "+int_to_string(q)+" ("+query_plan[q]->get_node_name()+")     \n";
+
+//                     Create parameters for operator construction.
+               string op_params;
+               vector<tablevar_t *> itbls = query_plan[q]->get_input_tbls();
+               string tname = itbls[0]->get_schema_name();
+//             string li_tname = tname +"-"+int_to_string(q)+"-0";
+//             if(lfta_idx.count(li_tname)>0)
+               if(input_tbl_srcid.count(tname)>0){
+//                     ret += ext_reg_txt[lfta_idx[li_tname]];
+//                     op_params += "inf"+int_to_string( lfta_idx[li_tname] )+"->schema_handle";
+                       op_params += "inf"+int_to_string( input_tbl_srcid[tname] )+"->schema_handle";
+               }else if(op_idx.count(tname)>0){
+                       op_params += "op"+int_to_string( op_idx[tname] )+"_schema_handle";
+               }else{
+                       fprintf(stderr,"INTERNAL ERROR, can't identify input table %s when creating operator (3) %d (%s)\n",tname.c_str(),q,query_plan[q]->get_node_name().c_str());
+                       exit(1);
+               }
+               if(itbls.size()>1){
+                       string tname = itbls[1]->get_schema_name();
+//                     string li_tname = tname +"-"+int_to_string(q)+"-1";
+//                     if(lfta_idx.count(li_tname)>0)
+                       if(input_tbl_srcid.count(tname)>0){
+//                             ret += ext_reg_txt[lfta_idx[li_tname]];
+//                             op_params += ",inf"+int_to_string( lfta_idx[li_tname] )+"->schema_handle";
+                               op_params += ",inf"+int_to_string( input_tbl_srcid[tname] )+"->schema_handle";
+                       }else if(op_idx.count(tname)>0){
+                               op_params += ",op"+int_to_string( op_idx[tname] )+"_schema_handle";
+                       }else{
+                               fprintf(stderr,"INTERNAL ERROR, can't identify input table %s when creating operator (4) %d (%s)\n",tname.c_str(),q,query_plan[q]->get_node_name().c_str());
+                               exit(1);
+                       }
+               }
+               ret += query_plan[q]->generate_operator(q,op_params);
+               ret +=
+"      operator_node* node"+int_to_string(q)+" = new operator_node(op"+int_to_string(q)+");\n";
+
+               n_basic_ops = q;
+         }
+       }
+       n_basic_ops++;
+//                     Next for the output operators if any
+       for(i=0;i<output_operators.size();++i){
+               ret += output_operators[i]->generate_operator(n_basic_ops+i,"root_schema_handle");
+               ret +=
+"      operator_node* node"+int_to_string(n_basic_ops+i)+" = new operator_node(op"+int_to_string(n_basic_ops+i)+");\n";
+       }
+
+
+//             Link up operators.
+       for(q=0;q<query_plan.size();++q){
+         if(query_plan[q]){
+//                     NOTE: this code assume that the operator has at most
+//                     two inputs.  But the template code also makes
+//                     this assumption.  Both will need to be changed.
+               vector<tablevar_t *> itbls = query_plan[q]->get_input_tbls();
+               string tname = itbls[0]->get_schema_name();
+//             string li_tname = tname +"-"+int_to_string(q)+"-0";
+//             if(lfta_idx.count(li_tname)>0)
+               if(input_tbl_srcid.count(tname)>0){
+//                     ret += "\tnode"+int_to_string(q)+"->set_left_lfta(inf"+int_to_string( lfta_idx[li_tname] )+");\n";
+                       ret += "\tnode"+int_to_string(q)+"->set_left_lfta(inf"+int_to_string( input_tbl_srcid[tname] )+");\n";
+               }else if(op_idx.count(tname)>0){
+                       ret += "\tnode"+int_to_string(q)+"->set_left_child_node(node"+int_to_string( op_idx[tname] )+");\n";
+               }else{
+                       fprintf(stderr,"INTERNAL ERROR, can't identify input table %s when linking operator (1) %d (%s)\n",tname.c_str(),q,query_plan[q]->get_node_name().c_str());
+                       exit(1);
+               }
+               if(itbls.size()>1){
+                       string tname = itbls[1]->get_schema_name();
+//                     string li_tname = tname +"-"+int_to_string(q)+"-1";
+//                     if(lfta_idx.count(li_tname)>0)
+                       if(input_tbl_srcid.count(tname)>0){
+//                             ret += "\tnode"+int_to_string(q)+"->set_right_lfta(inf"+int_to_string( lfta_idx[li_tname] )+");\n";
+                               ret += "\tnode"+int_to_string(q)+"->set_right_lfta(inf"+int_to_string( input_tbl_srcid[tname] )+");\n";
+                       }else if(op_idx.count(tname)>0){
+                               ret += "\tnode"+int_to_string(q)+"->set_right_child_node(node"+int_to_string( op_idx[tname] )+");\n";
+                       }else{
+                               fprintf(stderr,"INTERNAL ERROR, can't identify input table %s (%s) when linking operator (2) %d (%s)\n",tname.c_str(), tname.c_str(),q,query_plan[q]->get_node_name().c_str());
+                               exit(1);
+                       }
+               }
+         }
+       }
+       for(i=0;i<output_operators.size();++i){
+               if(i==0)
+                       ret += "\tnode"+int_to_string(n_basic_ops)+"->set_left_child_node(node"+int_to_string( qhead )+");\n";
+               else
+                       ret += "\tnode"+int_to_string(n_basic_ops+i)+"->set_left_child_node(node"+int_to_string( n_basic_ops+i-1 )+");\n";
+       }
+
+       // FTA is reusable if reusable option is set explicitly or it doesn't have any parameters
+
+       bool fta_reusable = false;
+       if (query_plan[qhead]->get_val_of_def("reusable") == "yes" ||
+               query_plan[qhead]->get_param_tbl()->size() == 0) {
+               fta_reusable = 1;
+       }
+
+       int root_node = qhead;
+       if(output_operators.size()>0)
+               root_node = n_basic_ops+i-1;
+
+       ret+=
+"\n"
+"\n"
+"      MULTOP_HFTA* ftap = new MULTOP_HFTA(ftaid, OUTPUT_HFTA, command, sz, value, root_schema_handle, node"+int_to_string(root_node)+", lfta_list, " + (fta_reusable ?"true":"false") + ", reusable);\n"
+"      if(ftap->init_failed()){ delete ftap; return 0;}\n"
+"      return (FTA*)ftap;\n"
+"}\n"
+"\n"
+"\n";
+
+
+       string comm_bufsize = "16*1024*1024";
+       if(defines.count("hfta_comm_buf")>0){
+               comm_bufsize = defines["hfta_comm_buf"];
+       }
+
+       ret+=
+"\n"
+"int main(int argc, char * argv[]) {\n"
+"\n"
+"\n"
+"   /* parse the arguments */\n"
+"\n"
+"    gs_int32_t tip1,tip2,tip3,tip4;\n"
+"    endpoint gshub;\n"
+"    gs_sp_t instance_name;\n"
+"    if (argc<3) {\n"
+"                gslog(LOG_EMERG,\"Wrong arguments at startup\");\n"
+"        exit(1);\n"
+"    }\n"
+"\n"
+"    if ((sscanf(argv[1],\"%u.%u.%u.%u:%hu\",&tip1,&tip2,&tip3,&tip4,&(gshub.port)) != 5)) {\n"
+"        gslog(LOG_EMERG,\"HUB IP NOT DEFINED\");\n"
+"        exit(1);\n"
+"    }\n"
+"    gshub.ip=htonl(tip1<<24|tip2<<16|tip3<<8|tip4);\n"
+"    gshub.port=htons(gshub.port);\n"
+"    instance_name=strdup(argv[2]);\n"
+"    if (set_hub(gshub)!=0) {\n"
+"        gslog(LOG_EMERG,\"Could not set hub\");\n"
+"        exit(1);\n"
+"    }\n"
+"    if (set_instance_name(instance_name)!=0) {\n"
+"        gslog(LOG_EMERG,\"Could not set instance name\");\n"
+"        exit(1);\n"
+"    }\n"
+"\n"
+"\n"
+"    /* initialize host library  */\n"
+"\n"
+//"    fprintf(stderr,\"Initializing gscp\\n\");\n"
+"    gsopenlog(argv[0]);\n"
+"\n"
+"    if (hostlib_init(HFTA, "+comm_bufsize+", DEFAULTDEV, 0, 0)!=0) {\n"
+"        fprintf(stderr,\"%s::error:could not initialize gscp\\n\",\n"
+"              argv[0]);\n"
+"        exit(1);\n"
+"    }\n"
+"\n"
+"\n"
+"\n"
+"    FTAID ret = fta_register(OUTPUT_HFTA, " + (fta_reusable?"1":"0") + ", DEFAULTDEV, alloc_hfta, "+generate_schema_string_name(query_name)+", -1, 0ull);\n"
+"    fta_start_service(-1);\n"
+"\n"
+"   return 0;\n"
+"\n"
+"}\n"
+"\n";
+////////////////////
+       return(ret);
+}
+
+
+//             Checks if the node i is compatible with interface partitioning
+//             (can be pushed below the merge that combines partitioned stream)
+//             i - index of the query node in a query plan
+bool stream_query::is_partn_compatible(int index, map<string, int> lfta_names, vector<string> interface_names, vector<string> machine_names, ifq_t *ifaces_db, partn_def_list_t *partn_parse_result) {
+       int i;
+       qp_node* node = query_plan[index];
+       qp_node* child_node = NULL;
+
+       if (node->predecessors.empty())
+               return false;
+
+       // all the node predecessors must be partition merges with the same partition definition
+       partn_def_t* partn_def = NULL;
+       for (i = 0; i < node->predecessors.size(); ++i) {
+               child_node = query_plan[node->predecessors[i]];
+               if (child_node->node_type() != "mrg_qpn")
+                       return false;
+
+               // merge must have only one parent for this optimization to work
+               // check that all its successors are the same
+               for (int j = 1; j < child_node->successors.size(); ++j) {
+                       if (child_node->successors[j] != child_node->successors[0])
+                               return false;
+               }
+
+               partn_def_t* new_partn_def = ((mrg_qpn*)child_node)->get_partn_definition(lfta_names, interface_names, machine_names, ifaces_db, partn_parse_result);
+               if (!new_partn_def)
+                       return false;
+               if (!i)
+                       partn_def = new_partn_def;
+               else if (new_partn_def != partn_def)
+                       return false;
+
+       }
+
+       if (node->node_type() == "spx_qpn")     // spx nodes are always partition compatible
+               return true;
+       else if (node->node_type() == "sgah_qpn") {
+               gb_table gb_tbl = ((sgah_qpn*)node)->gb_tbl;
+               return true; //partn_def->is_compatible(&gb_tbl);
+       }
+       else if (node->node_type() == "rsgah_qpn") {
+               gb_table gb_tbl = ((rsgah_qpn*)node)->gb_tbl;
+               return partn_def->is_compatible(&gb_tbl);
+       }
+       else if (node->node_type() == "sgahcwcb_qpn") {
+               gb_table gb_tbl = ((sgahcwcb_qpn*)node)->gb_tbl;
+               return partn_def->is_compatible(&gb_tbl);
+       }
+       else if (node->node_type() == "join_eq_hash_qpn") {
+               return true;
+       }
+       else
+               return false;
+}
+
+//             Push the operator below the merge that combines
+void stream_query::pushdown_partn_operator(int index) {
+       qp_node* node = query_plan[index];
+       int i;
+       char node_index[128];
+
+//     fprintf(stderr, "Partn pushdown, query %s of type %s\n", node->get_node_name().c_str(), node->node_type().c_str());
+
+
+       // HACK ALERT: When reordering merges we screw up slack computation
+       // since slack should no longer be used, it is not an issue
+
+
+       // we can safely reorder nodes that have one and only one temporal atribute in select list
+       table_def* table_layout = node->get_fields();
+       vector<field_entry*> fields = table_layout->get_fields();
+       int merge_fieldpos = -1;
+
+       data_type* dt;
+       for (i = 0; i < fields.size(); ++i) {
+               data_type dt(fields[i]->get_type(),fields[i]->get_modifier_list());
+               if(dt.is_temporal()) {
+                       if (merge_fieldpos != -1)       // more that one temporal field found
+                               return;
+                       merge_fieldpos = i;
+               }
+       }
+
+       if (merge_fieldpos == -1)       // if no temporal fieldf found
+               return;
+
+       std::vector<colref_t *> mvars;                  // the merge-by columns.
+
+       // reodring procedure is different for unary operators and joins
+       if (node->node_type() == "join_eq_hash_qpn") {
+               vector<qp_node*> new_nodes;
+
+               tablevar_t *left_table_name;
+               tablevar_t *right_table_name;
+               mrg_qpn* left_mrg = (mrg_qpn*)query_plan[node->predecessors[0]];
+               mrg_qpn* right_mrg = (mrg_qpn*)query_plan[node->predecessors[1]];
+
+               // for now we will only consider plans where both child merges
+               // merge the same set of streams
+
+               if (left_mrg->fm.size() != right_mrg->fm.size())
+                       return;
+
+               // maping of interface names to table definitions
+               map<string, tablevar_t*> iface_map;
+               for (i = 0; i < left_mrg->fm.size(); i++) {
+                       left_table_name = left_mrg->fm[i];
+                       iface_map[left_table_name->get_machine() + left_table_name->get_interface()] = left_table_name;
+               }
+
+               for (i = 0; i < right_mrg->fm.size(); i++) {
+                       right_table_name = right_mrg->fm[i];
+
+                       // find corresponding left tabke
+                       if (!iface_map.count(right_table_name->get_machine() + right_table_name->get_interface()))
+                               return;
+
+                       left_table_name = iface_map[right_table_name->get_machine() + right_table_name->get_interface()];
+
+                       // create new join nodes
+                       sprintf(node_index, "_%d", i);
+                       join_eq_hash_qpn* new_node = (join_eq_hash_qpn*)node->make_copy(node_index);
+
+                       // make a copy of right_table_name
+                       right_table_name = right_table_name->duplicate();
+                       left_table_name->set_range_var(((join_eq_hash_qpn*)node)->from[0]->get_var_name());
+                       right_table_name->set_range_var(((join_eq_hash_qpn*)node)->from[1]->get_var_name());
+                       new_node->from[0] = left_table_name;
+                       new_node->from[1] = right_table_name;
+                       new_nodes.push_back(new_node);
+               }
+
+               // make right_mrg a new root
+               right_mrg->set_node_name(node->get_node_name());
+               right_mrg->table_layout = table_layout;
+               right_mrg->merge_fieldpos = merge_fieldpos;
+
+               for (i = 0; i < right_mrg->fm.size(); i++) {
+                       // make newly create joins children of merge
+                       sprintf(node_index, "_%d", i);
+                       right_mrg->fm[i] = new tablevar_t(right_mrg->fm[i]->get_machine().c_str(), right_mrg->fm[i]->get_interface().c_str(), (node->get_node_name() + string(node_index)).c_str());
+                       sprintf(node_index, "_m%d", i);
+                       right_mrg->fm[i]->set_range_var(node_index);
+                       right_mrg->mvars[i]->set_field(table_layout->get_field_name(merge_fieldpos));
+
+               }
+
+               if (left_mrg != right_mrg)
+                       query_plan[node->predecessors[0]] = NULL;       // remove left merge from the plan
+
+               query_plan.insert(query_plan.end(), new_nodes.begin(), new_nodes.end());
+
+       } else {        // unary operator
+               // get the child merge node
+               mrg_qpn* child_mrg = (mrg_qpn*)query_plan[node->predecessors[0]];
+
+               child_mrg->set_node_name(node->get_node_name());
+               child_mrg->table_layout = table_layout;
+               child_mrg->merge_fieldpos = merge_fieldpos;
+
+               // create new nodes for every source stream
+               for (i = 0; i < child_mrg->fm.size(); i++) {
+                       tablevar_t *table_name = child_mrg->fm[i];
+                       sprintf(node_index, "_%d", i);
+                       qp_node* new_node = node->make_copy(node_index);
+
+                       if (node->node_type() == "spx_qpn")
+                               ((spx_qpn*)new_node)->table_name = table_name;
+                       else if (node->node_type() == "sgah_qpn")
+                               ((sgah_qpn*)new_node)->table_name = table_name;
+                       else if (node->node_type() == "rsgah_qpn")
+                               ((rsgah_qpn*)new_node)->table_name = table_name;
+                       else if (node->node_type() == "sgahcwcb_qpn")
+                               ((sgahcwcb_qpn*)new_node)->table_name = table_name;
+                       table_name->set_range_var("_t0");
+
+                       child_mrg->fm[i] = new tablevar_t(table_name->get_machine().c_str(), table_name->get_interface().c_str(), new_node->get_node_name().c_str());
+                       sprintf(node_index, "_m%d", i);
+                       child_mrg->fm[i]->set_range_var(node_index);
+                       child_mrg->mvars[i]->set_field(table_layout->get_field_name(merge_fieldpos));
+
+                       // add new node to query plan
+                       query_plan.push_back(new_node);
+               }
+       }
+       query_plan[index] = NULL;
+       generate_linkage();
+}
+
+
+//             Checks if the node i can be pushed below the merge
+  bool stream_query::is_pushdown_compatible(int index, map<string, int> lfta_names, vector<string> interface_names, vector<string> machine_names) {
+
+       int i;
+       qp_node* node = query_plan[index];
+       qp_node* child_node = NULL;
+
+       if (node->predecessors.size() != 1)
+               return false;
+
+       // node predecessor must be merge that combine streams from multiple hosts
+       child_node = query_plan[node->predecessors[0]];
+       if (child_node->node_type() != "mrg_qpn")
+               return false;
+
+       if (!((mrg_qpn*)child_node)->is_multihost_merge())
+               return false;
+
+       // merge must have only one parent for this optimization to work
+       // check that all its successors are the same
+       for (int j = 1; j < child_node->successors.size(); ++j) {
+               if (child_node->successors[j] != child_node->successors[0])
+                       return false;
+       }
+
+       // selections can always be pushed down, aggregations can always be split into selection/aggr or aggr/aggr pair
+       // and pushed down
+       if (node->node_type() == "spx_qpn")
+               return true;
+       else if (node->node_type() == "sgah_qpn")
+               return true;
+       else
+               return false;
+
+  }
+
+//             Push the operator below the merge
+  void stream_query::pushdown_operator(int index, ext_fcn_list *Ext_fcns, table_list *Schema) {
+       qp_node* node = query_plan[index];
+       int i;
+       char node_suffix[128];
+
+       // we can only safely push down queries that have one and only one temporal atribute in select list
+       table_def* table_layout = node->get_fields();
+       vector<field_entry*> fields = table_layout->get_fields();
+       int merge_fieldpos = -1;
+
+       data_type* dt;
+       for (i = 0; i < fields.size(); ++i) {
+               data_type dt(fields[i]->get_type(),fields[i]->get_modifier_list());
+               if(dt.is_temporal()) {
+                       if (merge_fieldpos != -1)       // more that one temporal field found
+                               return;
+                       merge_fieldpos = i;
+               }
+       }
+
+       if (merge_fieldpos == -1)       // if no temporal field found
+               return;
+
+       std::vector<colref_t *> mvars;                  // the merge-by columns.
+
+       fprintf(stderr, "Regular pushdown, query %s of type %s\n", node->get_node_name().c_str(), node->node_type().c_str());
+
+       // get the child merge node
+       mrg_qpn* child_mrg = (mrg_qpn*)query_plan[node->predecessors[0]];
+
+       tablevar_t *table_name = NULL;
+
+
+       if (node->node_type() == "spx_qpn") {
+               // get the child merge node
+
+               // create new nodes for every source stream
+               for (i = 0; i < child_mrg->fm.size(); i++) {
+                       table_name = child_mrg->fm[i];
+                       sprintf(node_suffix, "_%d", i);
+                       qp_node* new_node = node->make_copy(node_suffix);
+
+                       ((spx_qpn*)new_node)->table_name = table_name;
+                       table_name->set_range_var("_t0");
+
+                       child_mrg->fm[i] = new tablevar_t(table_name->get_machine().c_str(), table_name->get_interface().c_str(), new_node->get_node_name().c_str());
+                       sprintf(node_suffix, "_m%d", i);
+                       child_mrg->fm[i]->set_range_var(node_suffix);
+                       child_mrg->mvars[i]->set_field(table_layout->get_field_name(merge_fieldpos));
+
+                       // add new node to query plan
+                       query_plan.push_back(new_node);
+               }
+               child_mrg->table_layout = table_layout;
+               child_mrg->merge_fieldpos = merge_fieldpos;
+
+       } else {                // aggregation node
+
+               vector<qp_node*> new_nodes;
+
+               // split aggregations into high and low-level part
+               vector<qp_node *> split_nodes = ((sgah_qpn*)node)->split_node_for_hfta(Ext_fcns, Schema);
+               if (split_nodes.size() != 2)
+                       return;
+
+               sgah_qpn* super_aggr = (sgah_qpn*)split_nodes[1];
+               super_aggr->table_name = ((sgah_qpn*)node)->table_name;
+
+               // group all the sources by host
+               map<string, vector<int> > host_map;
+               for (i = 0; i < child_mrg->fm.size(); i++) {
+                       tablevar_t *table_name = child_mrg->fm[i];
+                       if (host_map.count(table_name->get_machine()))
+                               host_map[table_name->get_machine()].push_back(i);
+                       else {
+                               vector<int> tables;
+                               tables.push_back(i);
+                               host_map[table_name->get_machine()] = tables;
+                       }
+               }
+
+               // create a new merge and low-level aggregation for each host
+               map<string, vector<int> >::iterator iter;
+               for (iter = host_map.begin(); iter != host_map.end(); iter++) {
+                       string host_name = (*iter).first;
+                       vector<int> tables = (*iter).second;
+
+                       sprintf(node_suffix, "_%s", host_name.c_str());
+                       string suffix(node_suffix);
+                       untaboo(suffix);
+                       mrg_qpn *new_mrg = (mrg_qpn *)child_mrg->make_copy(suffix);
+                       for (i = 0; i < tables.size(); ++i) {
+                               sprintf(node_suffix, "_m%d", i);
+                               new_mrg->fm.push_back(child_mrg->fm[tables[i]]);
+                               new_mrg->mvars.push_back(child_mrg->mvars[i]);
+                               new_mrg->fm[i]->set_range_var(node_suffix);
+                       }
+                       qp_node* new_node = split_nodes[0]->make_copy(suffix);
+
+                       if (new_node->node_type() == "spx_qpn")  {
+                               ((spx_qpn*)new_node)->table_name = new tablevar_t(host_name.c_str(), "IFACE", new_mrg->get_node_name().c_str());
+                               ((spx_qpn*)new_node)->table_name->set_range_var("_t0");
+                       } else {
+                               ((sgah_qpn*)new_node)->table_name = new tablevar_t(host_name.c_str(), "IFACE", new_mrg->get_node_name().c_str());
+                               ((sgah_qpn*)new_node)->table_name->set_range_var("_t0");
+                       }
+                       query_plan.push_back(new_mrg);
+                       new_nodes.push_back(new_node);
+               }
+
+               child_mrg->merge_fieldpos = merge_fieldpos;
+               if (split_nodes[0]->node_type() == "spx_qpn")
+                       child_mrg->table_layout = create_attributes(child_mrg->get_node_name(), ((spx_qpn*)split_nodes[0])->select_list);
+               else
+                       child_mrg->table_layout = create_attributes(child_mrg->get_node_name(), ((sgah_qpn*)split_nodes[0])->select_list);
+
+
+               // connect newly created nodes with parent multihost merge
+               for (i = 0; i < new_nodes.size(); ++i) {
+                       if (new_nodes[i]->node_type() == "spx_qpn")
+                               child_mrg->fm[i] = new tablevar_t(((spx_qpn*)new_nodes[i])->table_name->get_machine().c_str(), "IFACE", new_nodes[i]->get_node_name().c_str());
+                       else {
+                               child_mrg->fm[i] = new tablevar_t(((sgah_qpn*)new_nodes[i])->table_name->get_machine().c_str(), "IFACE", new_nodes[i]->get_node_name().c_str());
+
+                       }
+                       child_mrg->mvars[i]->set_field(child_mrg->table_layout->get_field_name(merge_fieldpos));
+
+                       sprintf(node_suffix, "_m%d", i);
+                       child_mrg->fm[i]->set_range_var(node_suffix);
+                       query_plan.push_back(new_nodes[i]);
+               }
+               child_mrg->fm.resize(new_nodes.size());
+               child_mrg->mvars.resize(new_nodes.size());
+
+               // push the new high-level aggregation
+               query_plan.push_back(super_aggr);
+
+       }
+       query_plan[index] = NULL;
+       generate_linkage();
+
+  }
+
+//             Extract subtree rooted at node i into separate hfta
+stream_query* stream_query::extract_subtree(int index) {
+
+       vector<int> nodes;
+       stream_query* new_query = new stream_query(query_plan[index], this);
+
+       nodes.push_back(index);
+       for (int i = 0; i < nodes.size(); ++i) {
+               qp_node* node = query_plan[nodes[i]];
+               if (!node)
+                       continue;
+
+               // add all children to nodes list
+               for (int j = 0; j < node->predecessors.size(); ++j)
+                       nodes.push_back(node->predecessors[j]);
+               if (i)
+                       new_query->query_plan.push_back(node);
+
+               query_plan[nodes[i]] = NULL;
+       }
+
+       return new_query;
+}
+
+//             Splits query that combines data from multiple hosts into separate hftas.
+vector<stream_query*> stream_query::split_multihost_query()  {
+
+       vector<stream_query*> ret;
+       char node_suffix[128];
+       int i;
+
+       // find merges combining multiple hosts into per-host groups
+       int plan_size = query_plan.size();
+       vector<mrg_qpn*> new_nodes;
+
+       for (i = 0; i < plan_size; ++i) {
+               qp_node* node = query_plan[i];
+               if (node && node->node_type() == "mrg_qpn") {
+                       mrg_qpn* mrg = (mrg_qpn*)node;
+                       if (mrg->is_multihost_merge()) {
+
+                               // group all the sources by host
+                               map<string, vector<int> > host_map;
+                               for (int j = 0; j < mrg->fm.size(); j++) {
+                                       tablevar_t *table_name = mrg->fm[j];
+                                       if (host_map.count(table_name->get_machine()))
+                                               host_map[table_name->get_machine()].push_back(j);
+                                       else {
+                                               vector<int> tables;
+                                               tables.push_back(j);
+                                               host_map[table_name->get_machine()] = tables;
+                                       }
+                               }
+
+                               // create a new merge for each host
+                               map<string, vector<int> >::iterator iter;
+                               for (iter = host_map.begin(); iter != host_map.end(); iter++) {
+                                       string host_name = (*iter).first;
+                                       vector<int> tables = (*iter).second;
+
+                                       if (tables.size() == 1)
+                                               continue;
+
+                                       sprintf(node_suffix, "_%s", host_name.c_str());
+                                       string suffix(node_suffix);
+                                       untaboo(suffix);
+                                       mrg_qpn *new_mrg = (mrg_qpn *)mrg->make_copy(suffix);
+                                       for (int j = 0; j < tables.size(); ++j) {
+                                               new_mrg->fm.push_back(mrg->fm[tables[j]]);
+                                               new_mrg->mvars.push_back(mrg->mvars[j]);
+                                               sprintf(node_suffix, "m_%d", j);
+                                               new_mrg->fm[j]->set_range_var(node_suffix);
+                                       }
+                                       new_nodes.push_back(new_mrg);
+                               }
+
+                               if (!new_nodes.empty()) {
+                                       // connect newly created merge nodes with parent multihost merge
+                                       for (int j = 0; j < new_nodes.size(); ++j) {
+                                               mrg->fm[j] = new tablevar_t(new_nodes[j]->fm[0]->get_machine().c_str(), "IFACE", new_nodes[j]->get_node_name().c_str());
+                                               query_plan.push_back(new_nodes[j]);
+                                       }
+                                       mrg->fm.resize(new_nodes.size());
+                                       mrg->mvars.resize(new_nodes.size());
+                                       generate_linkage();
+                               }
+
+
+                               // now externalize the sources
+                               for (int j = 0; j < node->predecessors.size(); ++j) {
+                                       //              Extract subtree rooted at node i into separate hfta
+                                       stream_query* q = extract_subtree(node->predecessors[j]);
+                                       if (q) {
+                                               q->generate_linkage();
+                                               ret.push_back(q);
+                                       }
+
+                               }
+                               generate_linkage();
+                       }
+               }
+       }
+
+       return ret;
+}
+
+
+//             Perform local FTA optimizations
+void stream_query::optimize(vector<stream_query *>& hfta_list, map<string, int> lfta_names, vector<string> interface_names, vector<string> machine_names, ext_fcn_list *Ext_fcns, table_list *Schema, ifq_t *ifaces_db, partn_def_list_t *partn_parse_result){
+
+       // Topologically sort the nodes in query plan (leaf-first)
+       int i = 0, j = 0;
+       vector<int> sorted_nodes;
+
+       int num_nodes = query_plan.size();
+       bool* leaf_flags = new bool[num_nodes];
+       memset(leaf_flags, 0, num_nodes * sizeof(bool));
+
+       // run topological sort
+       bool done = false;
+
+       // add all leafs to sorted_nodes
+       while (!done) {
+               done = true;
+               for (i = 0; i < num_nodes; ++i) {
+                       if (!query_plan[i])
+                               continue;
+
+                       if (!leaf_flags[i] && query_plan[i]->predecessors.empty()) {
+                               leaf_flags[i] = true;
+                               sorted_nodes.push_back(i);
+                               done = false;
+
+                               // remove the node from its parents predecessor lists
+                               // since we only care about number of predecessors, it is sufficient just to remove
+                               // one element from the parent's predecessors list
+                               for (int j = query_plan[i]->successors.size() - 1; j >= 0; --j)
+                                       query_plan[query_plan[i]->successors[j]]->predecessors.pop_back();
+                       }
+               }
+       }
+       delete[] leaf_flags;
+       num_nodes = sorted_nodes.size();
+       generate_linkage();             // rebuild the recently destroyed predecessor lists.
+
+       // collect the information about interfaces nodes read from
+       for (i = 0; i < num_nodes; ++i) {
+               qp_node* node = query_plan[sorted_nodes[i]];
+               vector<tablevar_t *> input_tables = node->get_input_tbls();
+               for (j = 0; j <  input_tables.size(); ++j) {
+                       tablevar_t * table = input_tables[j];
+                       if (lfta_names.count(table->schema_name)) {
+                               int index = lfta_names[table->schema_name];
+                               table->set_machine(machine_names[index]);
+                               table->set_interface(interface_names[index]);
+                       }
+               }
+       }
+
+       /*
+
+       // push eligible operators down in the query plan
+       for (i = 0; i < num_nodes; ++i) {
+               if (partn_parse_result && is_partn_compatible(sorted_nodes[i], lfta_names, interface_names, machine_names, ifaces_db, partn_parse_result)) {
+                       pushdown_partn_operator(sorted_nodes[i]);
+               } else if (is_pushdown_compatible(sorted_nodes[i], lfta_names, interface_names, machine_names)) {
+                       pushdown_operator(sorted_nodes[i], Ext_fcns, Schema);
+               }
+       }
+
+       // split the query into multiple hftas if it combines the data from multiple hosts
+       vector<stream_query*> hftas = split_multihost_query();
+       hfta_list.insert(hfta_list.end(), hftas.begin(), hftas.end());
+       */
+
+       num_nodes = query_plan.size();
+       // also split multi-way merges into two-way merges
+       for (i = 0; i < num_nodes; ++i) {
+               qp_node* node = query_plan[i];
+               if (node && node->node_type() == "mrg_qpn") {
+                       vector<mrg_qpn *> split_merge = ((mrg_qpn *)node)->split_sources();
+
+                       query_plan.insert(query_plan.end(), split_merge.begin(), split_merge.end());
+                       // delete query_plan[sorted_nodes[i]];
+                       query_plan[i] = NULL;
+               }
+       }
+
+       generate_linkage();
+}
+
+
+
+table_def *stream_query::get_output_tabledef(){
+       return( query_plan[qhead]->get_fields() );
+}
+
+
+
+//////////////////////////////////////////////////////////
+////           De-siloing.  TO BE REMOVED
+
+void stream_query::desilo_lftas(map<string, int> &lfta_names,vector<string> &silo_names,table_list *Schema){
+       int i,t,s;
+
+       int suffix_len = silo_names.back().size();
+
+       for(i=0;i<qtail.size();++i){
+               vector<tablevar_t *> itbls = query_plan[qtail[i]]->get_input_tbls();
+               for(t=0;t<itbls.size();++t){
+                       string itbl_name = itbls[t]->get_schema_name();
+                       if(lfta_names.count(itbl_name)>0){
+//printf("Query %s input %d references lfta input %s\n",query_plan[qtail[i]]->get_node_name().c_str(),t,itbl_name.c_str());
+                               vector<string> src_names;
+                               string lfta_base = itbl_name.substr(0,itbl_name.size()-suffix_len);
+                               for(s=0;s<silo_names.size();++s){
+                                       string lfta_subsilo = lfta_base + silo_names[s];
+//printf("\t%s\n",lfta_subsilo.c_str());
+                                       src_names.push_back(lfta_subsilo);
+                               }
+                               string merge_node_name = "desilo_"+query_plan[qtail[i]]->get_node_name()+
+                                       "_input_"+int_to_string(t);
+                               mrg_qpn *merge_node = new mrg_qpn(merge_node_name,src_names,Schema);
+                               int m_op_pos = Schema->add_table(merge_node->table_layout);
+                               itbls[t]->set_schema(merge_node_name);
+                               itbls[t]->set_schema_ref(m_op_pos);
+                               query_plan.push_back(merge_node);
+                       }
+               }
+       }
+
+       generate_linkage();
+}
+////////////////////////////////////////
+///            End de-siloing
+
+
+
+//                     Given a collection of LFTA stream queries,
+//                     extract their WHERE predicates
+//                     and pass them to an analysis routine which will extract
+//                     common elements
+//
+void get_common_lfta_filter(std::vector<stream_query *> lfta_list,table_list *Schema,ext_fcn_list *Ext_fcns, vector<cnf_set *> &prefilter_preds, set<unsigned int> &pred_ids){
+       int s;
+       std::vector< std::vector<cnf_elem *> > where_list;
+
+//             still safe to assume that LFTA queries have a single
+//             query node, which is at position 0.
+       for(s=0;s<lfta_list.size();++s){
+               vector<cnf_elem *> cnf_list = lfta_list[s]->query_plan[0]->get_filter_clause();
+               if(lfta_list[s]->query_plan[0]->node_type() == "sgah_qpn"){
+                       gb_table *gtbl = ((sgah_qpn *)(lfta_list[s]->query_plan[0]))->get_gb_tbl();
+                       int c;
+                       for(c=0;c<cnf_list.size();++c){
+                               insert_gb_def_pr(cnf_list[c]->pr,gtbl);
+                       }
+               }
+               where_list.push_back(lfta_list[s]->query_plan[0]->get_filter_clause());
+       }
+
+       find_common_filter(where_list,Schema,Ext_fcns,prefilter_preds, pred_ids);
+}
+
+
+
+
+
+//                     Given a collection of LFTA stream queries,
+//                     extract the union of all temporal attributes referenced in select clauses
+//                     those attributes will need to be unpacked in prefilter
+//
+void get_prefilter_temporal_cids(std::vector<stream_query *> lfta_list, col_id_set &temp_cids){
+       int s, sl;
+       vector<scalarexp_t *> sl_list;
+       gb_table *gb_tbl = NULL;
+
+
+//             still safe to assume that LFTA queries have a single
+//             query node, which is at position 0.
+       for(s=0;s<lfta_list.size();++s){
+
+               if(lfta_list[s]->query_plan[0]->node_type() == "spx_qpn"){
+                       spx_qpn *spx_node = (spx_qpn *)lfta_list[s]->query_plan[0];
+                       sl_list = spx_node->get_select_se_list();
+               }
+               if(lfta_list[s]->query_plan[0]->node_type() == "sgah_qpn"){
+                       sgah_qpn *sgah_node = (sgah_qpn *)lfta_list[s]->query_plan[0];
+                       sl_list = sgah_node->get_select_se_list();
+                       gb_tbl = sgah_node->get_gb_tbl();
+               }
+
+               for(sl=0;sl<sl_list.size();sl++){
+                       data_type *sdt = sl_list[sl]->get_data_type();
+                       if (sdt->is_temporal()) {
+                               gather_se_col_ids(sl_list[sl],temp_cids, gb_tbl);
+                       }
+               }
+       }
+}
+
+
diff --git a/src/ftacmp/stream_query.h b/src/ftacmp/stream_query.h
new file mode 100644 (file)
index 0000000..075d143
--- /dev/null
@@ -0,0 +1,170 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __STREAM_QUERY_H_
+#define __STREAM_QUERY_H_
+
+#include<vector>
+#include<string>
+#include<map>
+
+#include"parse_schema.h"
+#include"parse_fta.h"
+#include"analyze_fta.h"
+#include"query_plan.h"
+#include"parse_partn.h"
+
+
+class stream_query{
+public:
+//             query_plan contains the query nodes, which form a query tree (dag?)
+//             by linking to each other via indices into this vector.
+//             NOTE: there might be holes (NULLs) in this list due to shifting
+//             around operators for optimization.
+       std::vector<qp_node *> query_plan;
+       std::vector<ospec_str *> output_specs;
+       vector<qp_node *> output_operators;
+
+       int qhead;
+       std::vector<int> qtail;
+
+       table_def *attributes;
+       param_table *parameters;
+       std::map<std::string, std::string> defines;
+       std::string query_name;
+
+       int n_parallel;         // If the HFTA has been parallelized, # of copies.
+       int parallel_idx;       // which of the cloned hftas this one is.
+                                               // needed for output splitting.
+
+       int n_successors;       // # of hftas which read from this one.
+
+       int gid;                // global id
+
+//             For error reporting.
+       int error_code;
+       std::string err_str;
+
+  stream_query(){
+       error_code = 0;
+       attributes = NULL;
+       parameters = NULL;
+  };
+
+//             Create stream query for split-off lfta.
+//             The parent stream query provides annotations.
+  stream_query(qp_node *qnode, stream_query *parent);
+
+//             Create stream query from analyzed parse tree.
+  stream_query(query_summary_class *qs,table_list *Schema);
+
+//             Make a copy.
+  stream_query(stream_query &source);
+//     used after making the copy
+  void set_nparallel(int n, int i){n_parallel = n; parallel_idx = i;}
+
+  qp_node *get_query_head(){return query_plan[qhead];};
+  std::string get_sq_name(){return query_plan[qhead]->get_node_name();};
+
+//             Add a parse tree to the query plan.
+  stream_query *add_query(query_summary_class *qs,table_list *Schema);
+  stream_query *add_query(stream_query &sc);
+
+  bool generate_linkage();
+  int generate_plan(table_list *Schema);
+
+
+//             Create a map of fields to scalar expression in Protocol fields
+//             for each query node in the stream.  For partitioning optimizations.
+  void generate_protocol_se(map<string,stream_query *> &sq_map, table_list *Schema);
+
+
+//             Checks if the operator i is compatible with interface partitioning
+//             (can be pushed below the merge that combines partitioned stream)
+  bool is_partn_compatible(int i, map<string, int> lfta_names, vector<string> interface_names, vector<string> machine_names, ifq_t *ifaces_db, partn_def_list_t *partn_parse_result);
+
+//             Checks if the node i can be pushed below the merge
+  bool is_pushdown_compatible(int i, map<string, int> lfta_names, vector<string> interface_names, vector<string> machine_names);
+
+//             Push the operator below the merge that combines partitioned stream
+  void pushdown_partn_operator(int i);
+
+//             Push the operator below the merge that combines regular (non-partitioned streams)
+  void pushdown_operator(int i, ext_fcn_list *Ext_fcns, table_list *Schema);
+
+//             Splits query that combines data from multiple hosts into separate hftas
+  std::vector<stream_query*> split_multihost_query();
+
+//             Extract subtree rooted at node i into separate hfta
+  stream_query* extract_subtree(int i);
+
+//             Extract any external libraries needed by the oeprators in this hfta
+       void get_external_libs(std::set<std::string> &libset);
+
+
+//             Perform local FTA optimizations
+  void optimize(vector<stream_query *>& hfta_list, map<string, int> lfta_names, vector<string> interface_names, vector<string> machine_names, ext_fcn_list *Ext_fcns, table_list *Schema, ifq_t *ifaces_db, partn_def_list_t *partn_parse_result);
+
+  int get_error_code(){return error_code;};
+  std::string get_error_str(){return err_str;};
+
+  void set_gid(int i){gid=i;};
+  int get_gid(){return gid;};
+
+
+  bool stream_input_only(table_list *Schema);
+
+  std::vector<tablevar_t *> get_input_tables();
+
+  table_def *get_output_tabledef();
+
+//             Extract lfta components of the query
+  std::vector<stream_query *> split_query(ext_fcn_list *Ext_fcns, table_list *Schema, bool &hfta_returned, ifq_t *ifdb, int n_virtual_ifaces, int hfta_parallelism, int hfta_idx);
+
+//             Process and register opertor views
+  std::vector<table_exp_t *> extract_opview(table_list *Schema, std::vector<query_node *> &qnodes, opview_set &opviews, std::string silo_nm);
+
+  std::string collect_refd_ifaces();
+
+//                     The serialization function
+  std::string make_schema();
+  std::string make_schema(int i);
+
+//                     hfta generation.  Schema must contain the table_def's
+//                     of all source tables (but extra tables will not hurt).
+  std::string generate_hfta(table_list *Schema, ext_fcn_list *Ext_fcns, opview_set &opviews, bool distributed_mode);
+
+//             De-silo an hfta by replacing refs to lfta inputs with a
+//             merge over all silo'ed lftas.
+//             TO BE REMOVED
+void desilo_lftas(std::map<std::string, int> &lfta_names,std::vector<std::string> &ifq_names,table_list *Schema);
+
+void add_output_operator(ospec_str *);
+
+private:
+//             Helper function for generate_hfta
+void compute_node_format(int q, std::vector<int> &nfmt, std::map<std::string, int> &op_idx);
+
+
+
+};
+
+///////////////////////////////////////////////////////////////////////
+////           Related functions
+void get_common_lfta_filter(std::vector<stream_query *> lfta_list,table_list *Schema,ext_fcn_list *Ext_fcns, std::vector<cnf_set *> &prefilter_preds, std::set<unsigned int> &pred_ids);
+void get_prefilter_temporal_cids(std::vector<stream_query *> lfta_list, col_id_set &temp_cids);
+
+
+
+#endif
diff --git a/src/ftacmp/test_interfacelib.cc b/src/ftacmp/test_interfacelib.cc
new file mode 100644 (file)
index 0000000..1532142
--- /dev/null
@@ -0,0 +1,154 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include <string>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "schemaparser.h"
+#include "schemaparser_impl.h"
+
+//      Interface to FTA definition lexer and parser ...
+
+
+//double htonf(double f){return f;}
+//long long int htonll(long long int l){return l;}
+
+
+using namespace std;
+extern int errno;
+
+// ./test_interfacelib test_param1.q_0.sch  test_param4.q_1.sch
+
+
+
+int main(int argc, char **argv){
+       int i;
+       char tmpstr[1000];
+       void * pblock;
+       int block_size;
+       
+       if(argc < 2){
+               fprintf(stderr,"Usage: %s schema_file [schema_file ... ]\n",argv[0]);
+               exit(1);
+       }
+       
+       int nfiles = argc-1;
+       int f;
+       for(f=0;f<nfiles;++f){
+
+               FILE *infl = fopen(argv[f+1],"r");
+               if(infl == NULL){
+                       fprintf(stderr,"ERROR can't open schema file %s\n",argv[1]);
+                       exit(1);
+               }
+
+               int sch_handle;
+               if(f%2==0){
+                       sch_handle = ftaschema_parse_file(infl);
+               }else{
+                       string fstr;
+                       while(fgets(tmpstr, 1000, infl)){
+                               fstr += tmpstr;
+                               fstr += "\n";
+                       }
+                       sch_handle = ftaschema_parse_string( (char *)(fstr.c_str()) );
+               }
+
+               if(sch_handle < 0){
+                       fprintf(stderr,"ERROR parsing schema file.\n");
+                       exit(1);
+               }
+
+               ftaschema_debugdump(sch_handle);
+               
+               fclose(infl);
+       }
+       
+       printf("Testing access library.\n");
+       
+//                     test_param1.q_0.sch
+
+       printf("Query %s has %d fields and %d parameters.\n",
+               ftaschema_name(0), ftaschema_tuple_len(0), ftaschema_parameter_len(0));
+       printf("The parameters are named:\n");
+       for(i=0;i<ftaschema_parameter_len(0);++i){
+               printf("%s  ",ftaschema_parameter_name(0,i));
+       }
+       printf("\n");
+       printf("Setting parameters by name.\n");
+       sprintf(tmpstr,"%d",1111); printf("min_hdr_length : %s\n",tmpstr);
+       ftaschema_setparam_by_name(0,"min_hdr_length",tmpstr,strlen(tmpstr));
+       sprintf(tmpstr,"%d",2222); printf("unused_param : %s\n",tmpstr);
+       ftaschema_setparam_by_name(0,"unused_param",tmpstr,strlen(tmpstr));
+       printf("Creating param block.\n");
+       ftaschema_create_param_block(0,&pblock, &block_size);
+       printf("Block created, size is %d. Accessing by name.\n",block_size);
+       printf("\t%s=%d (type is %d) %s=%lu (type is %d)\n",
+               "time",
+               (ftaschema_get_field_by_name(0,"time",pblock, block_size)).r.i,
+               (ftaschema_get_field_by_name(0,"time",pblock, block_size)).field_data_type,
+               "hdr_length",
+               (ftaschema_get_field_by_name(0,"hdr_length",pblock, block_size)).r.ul,
+               (ftaschema_get_field_by_name(0,"hdr_length",pblock, block_size)).field_data_type
+       );
+       
+       printf("Query %s has %d fields and %d parameters.\n",
+               ftaschema_name(1), ftaschema_tuple_len(1), ftaschema_parameter_len(1));
+       printf("The parameters are named:\n");
+       for(i=0;i<ftaschema_parameter_len(1);++i){
+               printf("%s  ",ftaschema_parameter_name(1,i));
+       }
+
+       printf("\n");
+       printf("Setting parameters by index.\n");
+       sprintf(tmpstr,"%d",3333); printf("an_ullong_parameter : %s\n",tmpstr);
+       ftaschema_setparam_by_index(1,0,tmpstr,strlen(tmpstr));
+       sprintf(tmpstr,"%d",2222); printf("ullong_parameter2 : %s\n",tmpstr);
+       ftaschema_setparam_by_index(1,1,tmpstr,strlen(tmpstr));
+       sprintf(tmpstr,"%f",4444.0); printf("min_prec : %s\n",tmpstr);
+       ftaschema_setparam_by_index(1,2,tmpstr,strlen(tmpstr)); 
+       sprintf(tmpstr,"%s","Foo"); printf("min_str : %s\n",tmpstr);
+       ftaschema_setparam_by_index(1,3,tmpstr,strlen(tmpstr)+1);       
+       sprintf(tmpstr,"%s","Bar"); printf("min_str : %s\n",tmpstr);
+       ftaschema_setparam_by_index(1,3,tmpstr,strlen(tmpstr)+1);       
+       ftaschema_create_param_block(1,&pblock, &block_size);
+       printf("Block created, size is %d. Accessing by index.\n",block_size);
+       printf("\t%s=%ld, type is %d\n",
+               ftaschema_tuple_name(1,0),
+               (ftaschema_get_field_by_index(1,0,pblock, block_size)).r.ul,
+               (ftaschema_get_field_by_index(1,0,pblock, block_size)).field_data_type
+       );      
+       printf("\t%s=%ld, type is %d\n",
+               ftaschema_tuple_name(1,1),
+               (ftaschema_get_field_by_index(1,1,pblock, block_size)).r.ul,
+               (ftaschema_get_field_by_index(1,1,pblock, block_size)).field_data_type
+       );      
+       printf("\t%s=%lf, type is %d\n",
+               ftaschema_tuple_name(1,2),
+               (ftaschema_get_field_by_index(1,2,pblock, block_size)).r.f,
+               (ftaschema_get_field_by_index(1,2,pblock, block_size)).field_data_type
+       );      
+       printf("\t%s=%s (length=%d), type is %d\n",
+               ftaschema_tuple_name(1,3),
+               (ftaschema_get_field_by_index(1,3,pblock, block_size)).r.vs.offset,
+               (ftaschema_get_field_by_index(1,3,pblock, block_size)).r.vs.length,
+               (ftaschema_get_field_by_index(1,3,pblock, block_size)).field_data_type
+       );      
+       
+       
+       
+}
diff --git a/src/ftacmp/translate_fta.cc b/src/ftacmp/translate_fta.cc
new file mode 100644 (file)
index 0000000..3a18f69
--- /dev/null
@@ -0,0 +1,2990 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include<unistd.h>             // for gethostname
+
+#include <string>
+#include "parse_fta.h"
+#include "parse_schema.h"
+#include "parse_ext_fcns.h"
+#include"analyze_fta.h"
+#include"query_plan.h"
+#include"generate_lfta_code.h"
+#include"stream_query.h"
+#include"generate_utils.h"
+#include"nic_def.h"
+#include"generate_nic_code.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include<ctype.h>
+
+#include<list>
+
+//             for the scandir
+     #include <sys/types.h>
+     #include <dirent.h>
+
+
+#include<errno.h>
+
+//             to verify that some files exist.
+     #include <sys/types.h>
+     #include <sys/stat.h>
+
+#include "parse_partn.h"
+
+#include "print_plan.h"
+
+//             Interface to the xml parser
+
+#include"xml_t.h"
+#include"field_list.h"
+
+extern int xmlParserparse(void);
+extern FILE *xmlParserin;
+extern int xmlParserdebug;
+
+std::vector<std::string> xml_attr_vec;
+std::vector<std::string> xml_val_vec;
+std::string xml_a, xml_v;
+xml_t *xml_leaves = NULL;
+
+//     Interface to the field list verifier
+field_list *field_verifier = NULL;
+
+#define TMPSTRLEN 1000
+
+#ifndef PATH_DELIM
+  #define PATH_DELIM '/'
+#endif
+
+char tmp_schema_str[10000];
+
+// maximum delay between two hearbeats produced
+// by UDOP. Used when its not explicity
+// provided in udop definition
+#define DEFAULT_UDOP_LIVENESS_TIMEOUT 5
+
+//             Default lfta hash table size, must be power of 2.
+int DEFAULT_LFTA_HASH_TABLE_SIZE = 4096;
+
+//             Interface to FTA definition lexer and parser ...
+
+extern int FtaParserparse(void);
+extern FILE *FtaParserin;
+extern int FtaParserdebug;
+
+fta_parse_t *fta_parse_result;
+var_defs_t *fta_parse_defines;
+
+
+
+//             Interface to external function lexer and parser ...
+
+extern int Ext_fcnsParserparse(void);
+extern FILE *Ext_fcnsParserin;
+extern int Ext_fcnsParserdebug;
+
+ext_fcn_list *Ext_fcns;
+
+
+//             Interface to partition definition parser
+extern int PartnParserparse();
+partn_def_list_t *partn_parse_result = NULL;
+
+
+
+using namespace std;
+//extern int errno;
+
+
+//             forward delcaration of local utility function
+void generate_makefile(vector<string> &input_file_names, int nfiles,
+                                          vector<string> &hfta_names, opview_set &opviews,
+                                               vector<string> &machine_names,
+                                               string schema_file_name,
+                                               vector<string> &interface_names,
+                                               ifq_t *ifdb, string &config_dir_path,
+                                               bool use_pads,
+                                               string extra_libs,
+                                               map<string, vector<int> > &rts_hload
+                                       );
+
+//static int split_string(char *instr,char sep, char **words,int max_words);
+#define MAXFLDS 100
+
+  FILE *schema_summary_output = NULL;          // query names
+
+//                     Dump schema summary
+void dump_summary(stream_query *str){
+       fprintf(schema_summary_output,"%s\n",str->query_name.c_str());
+
+       table_def *sch = str->get_output_tabledef();
+
+       vector<field_entry *> flds = sch->get_fields();
+       int f;
+       for(f=0;f<flds.size();++f){
+               if(f>0) fprintf(schema_summary_output,"|");
+               fprintf(schema_summary_output,"%s",flds[f]->get_name().c_str());
+       }
+       fprintf(schema_summary_output,"\n");
+       for(f=0;f<flds.size();++f){
+               if(f>0) fprintf(schema_summary_output,"|");
+               fprintf(schema_summary_output,"%s",flds[f]->get_type().c_str());
+       }
+       fprintf(schema_summary_output,"\n");
+}
+
+//             Globals
+string hostname;               // name of current host.
+int hostname_len;
+bool generate_stats = false;
+string root_path = "../..";
+
+
+int main(int argc, char **argv){
+  char tmpstr[TMPSTRLEN];
+  string err_str;
+  int q,s,h,f;
+
+  set<int>::iterator si;
+
+  vector<string> query_names;                  // for lfta.c registration
+  map<string, vector<int> > mach_query_names;  // list queries of machine
+  vector<int> snap_lengths;                            // for lfta.c registration
+  vector<string> interface_names;                      // for lfta.c registration
+  vector<string> machine_names;                        // machine of interface
+  vector<bool> lfta_reuse_options;                     // for lfta.c registration
+  vector<int> lfta_liveness_timeouts;          // fot qtree.xml generation
+  vector<string> hfta_names;                   // hfta cource code names, for
+                                                                               // creating make file.
+  vector<string> qnames;                               // ensure unique names
+  map<string, int> lfta_names;                 // keep track of unique lftas.
+
+
+//                             set these to 1 to debug the parser
+  FtaParserdebug = 0;
+  Ext_fcnsParserdebug = 0;
+
+  FILE *lfta_out;                              // lfta.c output.
+  FILE *fta_in;                                        // input file
+  FILE *table_schemas_in;              // source tables definition file
+  FILE *query_name_output;             // query names
+  FILE *qtree_output;                  // interconnections of query nodes
+
+  // -------------------------------
+  // Handling of Input Arguments
+  // -------------------------------
+    char optstr[] = "BDpLC:l:HNQMf:PSh:n:cR:";
+       const char *usage_str = "Usage: %s [-B] [-D] [-p] [-L] [-N] [-H] [-Q] [-M] [-C <config directory>] [-l <library directory>] [-f] [-P] [-S] [-n n_virtual_interfaces] [-h hostname] [-R root_path] [schema_file] input_file [input file ...]\n"
+               "\t[-B] : debug only (don't create output files)\n"
+               "\t[-D] : distributed mode (will use cluster.ifq instead of local .ifq file)\n"
+               "\t[-p] : partitioned mode (will use partition information in partition.txt to drive query optimization)\n"
+               "\t[-L] : use live_hosts.txt file to restrict queries to a set of live hosts\n"
+               "\t[-C] : use <config directory> for definition files\n"
+               "\t[-l] : use <library directory> for library queries\n"
+               "\t[-N] : output query names in query_names.txt\n"
+               "\t[-H] : create HFTA only (no schema_file)\n"
+               "\t[-Q] : use query name for hfta suffix\n"
+               "\t[-M] : generate make file and runit, stopit scripts\n"
+               "\t[-S] : enable LFTA statistics (alters Makefile).\n"
+               "\t[-f] : Output schema summary to schema_summary.txt\n"
+               "\t[-P] : link with PADS\n"
+               "\t[-h] : override host name.\n"
+               "\t[-c] : clean out Makefile and hfta_*.cc first.\n"
+               "\t[-R] : path to root of GS-lite\n"
+;
+
+//             parameters gathered from command line processing
+       string external_fcns_path;
+//     string internal_fcn_path;
+       string config_dir_path;
+       string library_path = "./";
+       vector<string> input_file_names;
+       string schema_file_name;
+       bool debug_only = false;
+       bool hfta_only = false;
+       bool output_query_names = false;
+       bool output_schema_summary=false;
+       bool numeric_hfta_flname = true;
+       bool create_makefile = false;
+       bool distributed_mode = false;
+       bool partitioned_mode = false;
+       bool use_live_hosts_file = false;
+       bool use_pads = false;
+       bool clean_make = false;
+       int n_virtual_interfaces = 1;
+
+   char chopt;
+   while((chopt = getopt(argc,argv,optstr)) != -1){
+               switch(chopt){
+               case 'B':
+                       debug_only = true;
+                       break;
+               case 'D':
+                       distributed_mode = true;
+                       break;
+               case 'p':
+                       partitioned_mode = true;
+                       break;
+               case 'L':
+                       use_live_hosts_file = true;
+                       break;
+               case 'C':
+                               if(optarg != NULL)
+                                config_dir_path = string(optarg) + string("/");
+                       break;
+               case 'l':
+                               if(optarg != NULL)
+                                library_path = string(optarg) + string("/");
+                       break;
+               case 'N':
+                       output_query_names = true;
+                       break;
+               case 'Q':
+                       numeric_hfta_flname = false;
+                       break;
+               case 'H':
+                       if(schema_file_name == ""){
+                               hfta_only = true;
+                       }
+                       break;
+               case 'f':
+                       output_schema_summary=true;
+                       break;
+               case 'M':
+                       create_makefile=true;
+                       break;
+               case 'S':
+                       generate_stats=true;
+                       break;
+               case 'P':
+                       use_pads = true;
+                       break;
+               case 'c':
+                       clean_make = true;
+                       break;
+               case 'h':
+                       if(optarg != NULL)
+                               hostname = optarg;
+                       break;
+               case 'R':
+                       if(optarg != NULL)
+                               root_path = optarg;
+                       break;
+               case 'n':
+                       if(optarg != NULL){
+                               n_virtual_interfaces = atoi(optarg);
+                               if(n_virtual_interfaces < 1 || n_virtual_interfaces > 128){
+                                       fprintf(stderr,"Warning, %d virtual interfaces specified, valid values are between 1 and 128 inclusive\n",n_virtual_interfaces);
+                                       n_virtual_interfaces = 1;
+                               }
+                       }
+                       break;
+               case '?':
+                       fprintf(stderr,"Error, argument %c not recognized.\n",optopt);
+                       fprintf(stderr,"%s\n", usage_str);
+                       exit(1);
+               default:
+                       fprintf(stderr, "Argument was %c\n", optopt);
+                       fprintf(stderr,"Invalid arguments\n");
+                       fprintf(stderr,"%s\n", usage_str);
+                       exit(1);
+               }
+       }
+       argc -= optind;
+       argv += optind;
+       for (int i = 0; i < argc; ++i) {
+               if((schema_file_name == "") && !hfta_only){
+                       schema_file_name = argv[i];
+               }else{
+                       input_file_names.push_back(argv[i]);
+               }
+       }
+
+       if(input_file_names.size() == 0){
+               fprintf(stderr,"%s\n", usage_str);
+               exit(1);
+       }
+
+       if(clean_make){
+               string clean_cmd = "rm Makefile hfta_*.cc";
+               int clean_ret = system(clean_cmd.c_str());
+               if(clean_ret){
+                       fprintf(stderr,"Warning, return value %d when trying to clean out old source files.\n", clean_ret);
+               }
+       }
+
+
+       nic_prop_db *npdb = new nic_prop_db(config_dir_path);
+
+//                     Open globally used file names.
+
+       // prepend config directory to schema file
+       schema_file_name = config_dir_path + schema_file_name;
+       external_fcns_path = config_dir_path + string("external_fcns.def");
+    string ifx_fname = config_dir_path + string("ifres.xml");
+
+//             Find interface query file(s).
+       if(hostname == ""){
+               gethostname(tmpstr,TMPSTRLEN);
+               hostname = tmpstr;
+       }
+       hostname_len = strlen(tmpstr);
+    string ifq_fname = config_dir_path + (distributed_mode ? "cluster" : hostname) + string(".ifq");
+       vector<string> ifq_fls;
+
+               ifq_fls.push_back(ifq_fname);
+
+
+//                     Get the field list, if it exists
+       string flist_fl = config_dir_path + "field_list.xml";
+       FILE *flf_in = NULL;
+       if((flf_in = fopen(flist_fl.c_str(), "r")) != NULL) {
+               fprintf(stderr,"Found field list file %s\n",flist_fl.c_str());
+               xml_leaves = new xml_t();
+               xmlParser_setfileinput(flf_in);
+               if(xmlParserparse()){
+                       fprintf(stderr,"WARNING, could not parse field list file %s\n",flist_fl.c_str());
+               }else{
+                       field_verifier = new field_list(xml_leaves);
+               }
+       }
+
+       if(!hfta_only){
+         if((table_schemas_in = fopen(schema_file_name.c_str(), "r")) == NULL) {
+               fprintf(stderr,"Can't open schema file %s\n%s\n",schema_file_name.c_str(),strerror(errno));
+               exit(1);
+         }
+       }
+
+/*
+       if(!(debug_only || hfta_only)){
+         if((lfta_out = fopen("lfta.c","w")) == NULL){
+               fprintf(stderr,"Can't open output file %s\n%s\n","lfta.c",strerror(errno));
+               exit(1);
+         }
+       }
+*/
+
+//             Get the output specification file.
+//             format is
+//                     query, operator, operator_param, directory, bucketwidth, partitioning_se, n_partitions
+       string ospec_fl = "output_spec.cfg";
+       FILE *osp_in = NULL;
+       vector<ospec_str *> output_specs;
+       multimap<string, int> qname_to_ospec;
+       if((osp_in = fopen(ospec_fl.c_str(), "r")) != NULL) {
+               char *flds[MAXFLDS];
+               int o_lineno = 0;
+               while(fgets(tmpstr,TMPSTRLEN,osp_in)){
+                       o_lineno++;
+                       int nflds = split_string(tmpstr,',',flds,MAXFLDS);
+                       if(nflds == 7){
+//             make operator type lowercase
+                               char *tmpc;
+                               for(tmpc=flds[1];*tmpc!='\0';++tmpc)
+                                       *tmpc = tolower(*tmpc);
+
+                               ospec_str *tmp_ospec = new ospec_str();
+                               tmp_ospec->query = flds[0];
+                               tmp_ospec->operator_type = flds[1];
+                               tmp_ospec->operator_param = flds[2];
+                               tmp_ospec->output_directory = flds[3];
+                               tmp_ospec->bucketwidth = atoi(flds[4]);
+                               tmp_ospec->partitioning_flds = flds[5];
+                               tmp_ospec->n_partitions = atoi(flds[6]);
+                               qname_to_ospec.insert(pair<string,int>(tmp_ospec->query,output_specs.size()));
+                               output_specs.push_back(tmp_ospec);
+                       }else{
+                               fprintf(stderr,"Warning, line %d corrupted in output_spec.cfg, has %d fields.\n",o_lineno,nflds);
+                       }
+               }
+               fclose(osp_in);
+       }else{
+               fprintf(stderr,"output_spec.cfg not found.  The query set has no output.  exiting.\n");
+               exit(1);
+       }
+
+//             hfta parallelism
+       string pspec_fl = "hfta_parallelism.cfg";
+       FILE *psp_in = NULL;
+       map<string, int> hfta_parallelism;
+       if((psp_in = fopen(pspec_fl.c_str(), "r")) != NULL){
+               char *flds[MAXFLDS];
+               int o_lineno = 0;
+               while(fgets(tmpstr,TMPSTRLEN,psp_in)){
+                       bool good_entry = true;
+                       o_lineno++;
+                       int nflds = split_string(tmpstr,',',flds,MAXFLDS);
+                       if(nflds == 2){
+                               string hname = flds[0];
+                               int par = atoi(flds[1]);
+                               if(par <= 0 || par > n_virtual_interfaces){
+                                       fprintf(stderr,"Warning, line %d of %s is incorrectly formatted, parallelism is %d, must be between 1 and %d\n",o_lineno,pspec_fl.c_str(),par,n_virtual_interfaces);
+                                       good_entry = false;
+                               }
+                               if(good_entry && n_virtual_interfaces % par != 0){
+                                       fprintf(stderr,"Warning, line %d of %s is incorrectly formatted, parallelism is %d, must divide the number of virtual interfaces (%d), ignoring.\n",o_lineno,pspec_fl.c_str(),par,n_virtual_interfaces);
+                                       good_entry = false;
+                               }
+                               if(good_entry)
+                                       hfta_parallelism[hname] = par;
+                       }
+               }
+       }else{
+               fprintf(stderr,"WARNING, no file %s found, using single copies of hftas.\n",pspec_fl.c_str());
+       }
+
+
+//             LFTA hash table sizes
+       string htspec_fl = "lfta_htsize.cfg";
+       FILE *htsp_in = NULL;
+       map<string, int> lfta_htsize;
+       if((htsp_in = fopen(htspec_fl.c_str(), "r")) != NULL){
+               char *flds[MAXFLDS];
+               int o_lineno = 0;
+               while(fgets(tmpstr,TMPSTRLEN,htsp_in)){
+                       bool good_entry = true;
+                       o_lineno++;
+                       int nflds = split_string(tmpstr,',',flds,MAXFLDS);
+                       if(nflds == 2){
+                               string lfta_name = flds[0];
+                               int htsz = atoi(flds[1]);
+                               if(htsz>0){
+                                       lfta_htsize[lfta_name] = htsz;
+                               }else{
+                                       fprintf(stderr,"Warning, line %d of %s is incorrectly formatted, htsize is %d, must be larger than 0.\n",o_lineno,htspec_fl.c_str(),htsz);
+                               }
+                       }
+               }
+       }else{
+               fprintf(stderr,"WARNING, no file %s found, using default LFTA hash table sizes.\n",htspec_fl.c_str());
+       }
+
+//             LFTA vitual interface hash split
+       string rtlspec_fl = "rts_load.cfg";
+       FILE *rtl_in = NULL;
+       map<string, vector<int> > rts_hload;
+       if((rtl_in = fopen(rtlspec_fl.c_str(), "r")) != NULL){
+               char *flds[MAXFLDS];
+               int r_lineno = 0;
+               string iface_name;
+               vector<int> hload;
+               while(fgets(tmpstr,TMPSTRLEN,rtl_in)){
+                       bool good_entry = true;
+                       r_lineno++;
+                       iface_name = "";
+                       hload.clear();
+                       int nflds = split_string(tmpstr,',',flds,MAXFLDS);
+                       if(nflds >1){
+                               iface_name = flds[0];
+                               int cumm_h = 0;
+                               int j;
+                               for(j=1;j<nflds;++j){
+                                       int h = atoi(flds[j]);
+                                       if(h<=0)
+                                               good_entry = false;
+                                       cumm_h += h;
+                                       hload.push_back(cumm_h);
+                               }
+                       }else{
+                               good_entry = false;
+                       }
+                       if(good_entry){
+                               rts_hload[iface_name] = hload;
+                       }else{
+                               fprintf(stderr,"Warning, line %d of %s is malformed, skipping.\n",r_lineno, rtlspec_fl.c_str());
+                       }
+               }
+       }
+
+
+
+       if(output_query_names){
+         if((query_name_output = fopen("query_names.txt","w")) == NULL){
+               fprintf(stderr,"Can't open output file %s\n%s\n","query_names.txt",strerror(errno));
+               exit(1);
+         }
+       }
+
+       if(output_schema_summary){
+         if((schema_summary_output = fopen("schema_summary.txt","w")) == NULL){
+               fprintf(stderr,"Can't open output file %s\n%s\n","schema_summary.txt",strerror(errno));
+               exit(1);
+         }
+       }
+
+       if((qtree_output = fopen("qtree.xml","w")) == NULL){
+               fprintf(stderr,"Can't open output file %s\n%s\n","qtree.xml",strerror(errno));
+               exit(1);
+       }
+       fprintf(qtree_output,"<?xml version='1.0' encoding='ISO-8859-1'?>\n");
+       fprintf(qtree_output,"<?xml-stylesheet type='text/xsl' href='qtree.xsl'?>\n");
+       fprintf(qtree_output,"<QueryNodes>\n");
+
+
+//                     Get an initial Schema
+       table_list *Schema;
+       if(!hfta_only){
+//                     Parse the table schema definitions.
+         fta_parse_result = new fta_parse_t();
+         FtaParser_setfileinput(table_schemas_in);
+         if(FtaParserparse()){
+               fprintf(stderr,"Table schema parse failed.\n");
+               exit(1);
+         }
+         if(fta_parse_result->parse_type != TABLE_PARSE){
+               fprintf(stderr,"ERROR, file %s is not a table definition file.\n",schema_file_name.c_str());
+               exit(1);
+         }
+         Schema = fta_parse_result->tables;
+
+//                     Process schema field inheritance
+         int retval;
+         retval = Schema->unroll_tables(err_str);
+         if(retval){
+               fprintf(stderr,"Error processing schema filed inheritance:\n %s\n", err_str.c_str() );
+               exit(1);
+         }
+       }else{
+//                     hfta only => we will try to fetch schemas from the registry.
+//                     therefore, start off with an empty schema.
+         Schema = new table_list();
+       }
+
+
+//                     Open and parse the external functions file.
+       Ext_fcnsParserin = fopen(external_fcns_path.c_str(),"r");
+       if(Ext_fcnsParserin == NULL){
+               fprintf(stderr,"Warning, can't find external functions definition file (external_fcns.def).\n");
+               Ext_fcns = new ext_fcn_list();
+       }else{
+               if(Ext_fcnsParserparse()){
+                       fprintf(stderr,"Warning, error parsing external functions definition file (external_fcns.def).\n");
+                       Ext_fcns = new ext_fcn_list();
+               }
+       }
+       if(Ext_fcns->validate_fcns(err_str)){
+               fprintf(stderr,"Error processing external functions definition file (external_fcns.def):\n%s\n",err_str.c_str());
+               exit(1);
+       }
+
+//             Open and parse the interface resources file.
+//     ifq_t *ifaces_db = new ifq_t();
+//   string ierr;
+//     if(ifaces_db->load_ifaces(ifx_fname,use_live_hosts_file,distributed_mode,ierr)){
+//             fprintf(stderr,"ERROR, can't load interface resource file %s :\n%s",
+//                             ifx_fname.c_str(), ierr.c_str());
+//             exit(1);
+//     }
+//     if(ifaces_db->load_ifqs(ifq_fname, ierr)){
+//             fprintf(stderr,"ERROR, can't load interface query file %s :\n%s",
+//                             ifq_fname.c_str(), ierr.c_str());
+//             exit(1);
+//     }
+
+
+//                     The LFTA code string.
+//                     Put the standard preamble here.
+//                     NOTE: the hash macros, fcns should go into the run time
+  map<string, string> lfta_val;
+  map<string, string> lfta_prefilter_val;
+
+  string lfta_header =
+"#include <limits.h>\n\n"
+"#include \"rts.h\"\n"
+"#include \"fta.h\"\n"
+"#include \"lapp.h\"\n"
+"#include \"rts_udaf.h\"\n\n"
+/*
+"#define IS_FILLED(bitmap,bucket) (bitmap[bucket >> 4] & (0x80000000 >> ((bucket & 15)<<1)))\n"
+"#define IS_NEW(bitmap,bucket) (bitmap[bucket >> 4] & (0x80000000 >> (((bucket & 15) << 1) + 1)))\n"
+"#define SET_EMPTY(bitmap,bucket) (bitmap[bucket >> 4] &= (~(0x80000000 >> ((bucket & 15)<<1))))\n"
+"#define SET_FILLED_AND_NEW(bitmap,bucket) (bitmap[bucket >> 4] |= (0xC0000000 >> ((bucket & 15)<<1)))\n"
+*/
+"\n"
+"gs_uint64_t (*lfta_prefilter)(void *pkt) = NULL; // set at fta_init\n"
+"\n"
+"#define SLOT_FILLED 0x04\n"
+"#define SLOT_GEN_BITS 0x03\n"
+"#define SLOT_HASH_BITS 0xfffffff8\n"
+"#define SET_BF_BIT(bf_table, bf_num, bf_index, bucket) (bf_table[(((bucket) * (bf_num)) + (bf_index)) >> 3] |= (0x80 >> ((((bucket) * (bf_num)) + (bf_index)) & 7)))\n"
+"#define IS_BF_SET(bf_table, bf_num, bf_index, bucket) (bf_table[(((bucket) * (bf_num))+(bf_index)) >> 3] & (0x80 >> ((((bucket) * (bf_num))+(bf_index)) & 7)))\n"
+"#define SET_BF_EMPTY(bf_table, bf_num, bf_index, bucket) (bf_table[((bucket * bf_num)+bf_index) >> 3] &= (~0x80 >> (((bucket * bf_num)+bf_index) & 7)))\n"
+"\n\n"
+
+"#define lfta_BOOL_to_hash(x) (x)\n"
+"#define lfta_USHORT_to_hash(x) (x)\n"
+"#define lfta_UINT_to_hash(x) (x)\n"
+"#define lfta_IP_to_hash(x) (x)\n"
+"#define lfta_IPV6_to_hash(x) ( (x.v[0]) ^ (x.v[1]) ^ (x.v[2]) ^ (x.v[3]))\n"
+"#define lfta_INT_to_hash(x) (gs_uint32_t)(x)\n"
+"#define lfta_ULLONG_to_hash(x) ( (( (x) >>32)&0xffffffff) ^ ((x)&0xffffffff) )\n"
+"#define lfta_LLONG_to_hash(x) ( (( (x) >>32)&0xffffffff) ^ ((x)&0xffffffff) )\n"
+"#define lfta_FLOAT_to_hash(x) ( (( ((gs_uint64_t)(x)) >>32)&0xffffffff) ^ (((gs_uint64_t)(x))&0xffffffff) )\n"
+"static gs_uint32_t lfta_V_STR_to_hash(struct gs_string x){\n"
+"      gs_uint32_t i,ret=0,tmp_sum = 0;\n"
+"      for(i=0;i<x.length;++i){\n"
+"              tmp_sum |= (x.data[i]) << (8*(i%4));\n"
+"              if((i%4) == 3){\n"
+"                      ret ^= tmp_sum;\n"
+"                      tmp_sum = 0;\n"
+"              }\n"
+"      }\n"
+"      if((i%4)!=0) ret ^=tmp_sum;\n"
+"      return(ret);\n"
+"}\n\n\n";
+
+
+
+//////////////////////////////////////////////////////////////////
+/////                  Get all of the query parse trees
+
+
+  int i,p;
+  int hfta_count = 0;          // for numeric suffixes to hfta .cc files
+
+//---------------------------
+//             Global info needed for post processing.
+
+//                     Set of operator views ref'd in the query set.
+       opview_set opviews;
+//                     lftas on a per-machine basis.
+       map<string, vector<stream_query *> > lfta_mach_lists;
+       int nfiles = input_file_names.size();
+       vector<stream_query *> hfta_list;               // list of hftas.
+       map<string, stream_query *> sq_map;             // map from query name to stream query.
+
+
+//////////////////////////////////////////
+
+//             Open and parse the interface resources file.
+       ifq_t *ifaces_db = new ifq_t();
+    string ierr;
+       if(ifaces_db->load_ifaces(ifx_fname,use_live_hosts_file,distributed_mode,ierr)){
+               fprintf(stderr,"ERROR, can't load interface resource file %s :\n%s",
+                               ifx_fname.c_str(), ierr.c_str());
+               exit(1);
+       }
+       if(ifaces_db->load_ifqs(ifq_fls[0], ierr)){
+               fprintf(stderr,"ERROR, can't load interface query file %s :\n%s",
+                               ifq_fls[0].c_str(), ierr.c_str());
+               exit(1);
+       }
+
+  map<string, string> qname_to_flname; // for detecting duplicate query names
+
+
+
+//                     Parse the files to create a vector of parse trees.
+//                     Load qnodes with information to perform a topo sort
+//                     based on query dependencies.
+  vector<query_node *> qnodes;                         // for topo sort.
+  map<string,int> name_node_map;                       // map query name to qnodes entry
+  for(i=0;i<input_file_names.size();i++){
+
+         if((fta_in = fopen(input_file_names[i].c_str(), "r")) == NULL) {
+                 fprintf(stderr,"Can't open input file %s\n%s",input_file_names[i].c_str(),strerror(errno));
+                 continue;
+         }
+fprintf(stderr,"Parsing file %s\n",input_file_names[i].c_str());
+
+//                     Parse the FTA query
+         fta_parse_result = new fta_parse_t();
+         FtaParser_setfileinput(fta_in);
+         if(FtaParserparse()){
+               fprintf(stderr,"FTA parse failed.\n");
+               exit(1);
+         }
+         if(fta_parse_result->parse_type != QUERY_PARSE){
+               fprintf(stderr,"ERROR, file %s is not a query file.\n",input_file_names[i].c_str());
+               exit(1);
+         }
+
+//                     returns a list of parse trees
+         vector<table_exp_t *> qlist = fta_parse_result->parse_tree_list->qlist;
+         for(p=0;p<qlist.size();++p){
+           table_exp_t *fta_parse_tree = qlist[p];
+//             query_parse_trees.push_back(fta_parse_tree);
+
+//                     compute the default name -- extract from query name
+               strcpy(tmpstr,input_file_names[i].c_str());
+               char *qname = strrchr(tmpstr,PATH_DELIM);
+               if(qname == NULL)
+                       qname = tmpstr;
+               else
+                       qname++;
+               char *qname_end = strchr(qname,'.');
+               if(qname_end != NULL) *qname_end = '\0';
+               string qname_str = qname;
+               string imputed_qname = impute_query_name(fta_parse_tree, qname_str);
+
+//                     Deternmine visibility.  Should I be attaching all of the output methods?
+               if(qname_to_ospec.count(imputed_qname)>0)
+                       fta_parse_tree->set_visible(true);
+               else
+                       fta_parse_tree->set_visible(false);
+
+
+//                             Create a manipulable repesentation of the parse tree.
+//                             the qnode inherits the visibility assigned to the parse tree.
+           int pos = qnodes.size();
+               qnodes.push_back( new query_node(pos, imputed_qname, input_file_names[i], fta_parse_tree ));
+               name_node_map[ qnodes[pos]->name ] = pos;
+//printf("name_node_map[ %s ] = %d\n",qnodes[pos]->name.c_str(),pos);
+//             qnames.push_back(impute_query_name(fta_parse_tree, qname_str));
+//             qfiles.push_back(i);
+
+//                     Check for duplicate query names
+//                                     NOTE : in hfta-only generation, I should
+//                                     also check with the names of the registered queries.
+               if(qname_to_flname.count(qnodes[pos]->name) > 0){
+                       fprintf(stderr,"ERROR duplicate query name %s in files %s and %s.\n",
+                               qnodes[pos]->name.c_str(), (qname_to_flname[qnodes[pos]->name]).c_str(), input_file_names[i].c_str());
+                       exit(1);
+               }
+               if(Schema->find_tbl(qnodes[pos]->name) >= 0){
+                       fprintf(stderr,"ERROR duplicate query name %s (file %s) was already defined as a PROTOCOL.\n",
+                               qnodes[pos]->name.c_str(), input_file_names[i].c_str());
+                       exit(1);
+               }
+               qname_to_flname[qnodes[pos]->name] = input_file_names[i].c_str();
+
+
+       }
+  }
+
+//             Add the library queries
+
+  int pos;
+  for(pos=0;pos<qnodes.size();++pos){
+       int fi;
+       for(fi = 0;fi<qnodes[pos]->refd_tbls.size();++fi){
+               string src_tbl = qnodes[pos]->refd_tbls[fi];
+               if(qname_to_flname.count(src_tbl) == 0){
+                       int last_sep = src_tbl.find_last_of('/');
+                       if(last_sep != string::npos){
+fprintf(stderr,"Finding library query %s for query %s\n",src_tbl.c_str(),qnodes[pos]->name.c_str());
+                               string target_qname = src_tbl.substr(last_sep+1);
+                               string qpathname = library_path + src_tbl + ".gsql";
+                               if((fta_in = fopen(qpathname.c_str(), "r")) == NULL) {
+                                       fprintf(stderr,"Can't open library file %s, referenced by query %s in file %s\n\t%s\n",qpathname.c_str(),qnodes[pos]->name.c_str(), qname_to_flname[qnodes[pos]->name].c_str(), strerror(errno));
+                                       exit(1);
+                                       fprintf(stderr,"After exit\n");
+                               }
+fprintf(stderr,"Parsing file %s\n",qpathname.c_str());
+//                     Parse the FTA query
+                               fta_parse_result = new fta_parse_t();
+                               FtaParser_setfileinput(fta_in);
+                               if(FtaParserparse()){
+                                       fprintf(stderr,"FTA parse failed.\n");
+                                       exit(1);
+                               }
+                               if(fta_parse_result->parse_type != QUERY_PARSE){
+                                       fprintf(stderr,"ERROR, file %s is not a query file.\n",input_file_names[i].c_str());
+                                       exit(1);
+                               }
+
+                               map<string, int> local_query_map;
+                               vector<string> local_query_names;
+                               vector<table_exp_t *> qlist = fta_parse_result->parse_tree_list->qlist;
+                               for(p=0;p<qlist.size();++p){
+                               table_exp_t *fta_parse_tree = qlist[p];
+                                       fta_parse_tree->set_visible(false);             // assumed to not produce output
+                                       string imputed_qname = impute_query_name(fta_parse_tree, target_qname);
+                                       if(imputed_qname == target_qname)
+                                               imputed_qname = src_tbl;
+                                       if(local_query_map.count(imputed_qname)>0){
+                                               fprintf(stderr,"ERROR, multiple queries named %s in library file %s\n",imputed_qname.c_str(), qpathname.c_str());
+                                               exit(1);
+                                       }
+                                       local_query_map[ imputed_qname ] = p;
+                                       local_query_names.push_back(imputed_qname);
+                               }
+
+                               if(local_query_map.count(src_tbl)==0){
+                                       fprintf(stderr,"ERROR, library query file %s has no query named %s\n",qpathname.c_str(),target_qname.c_str());
+                                       exit(1);
+                               }
+
+                               vector<int> worklist;
+                               set<int> added_queries;
+                               vector<query_node *> new_qnodes;
+                               worklist.push_back(local_query_map[target_qname]);
+                               added_queries.insert(local_query_map[target_qname]);
+                               int qq;
+                               int qpos = qnodes.size();
+                               for(qq=0;qq<worklist.size();++qq){
+                                       int q_id = worklist[qq];
+                                       query_node *new_qnode = new query_node(qpos+qq, local_query_names[q_id], qpathname, qlist[q_id] );
+                                       new_qnodes.push_back( new_qnode);
+                                       vector<string> refd_tbls =  new_qnode->refd_tbls;
+                                       int ff;
+                                       for(ff = 0;ff<refd_tbls.size();++ff){
+                                               if(local_query_map.count(refd_tbls[ff])>0 && added_queries.count(local_query_map[refd_tbls[ff]])==0){
+
+                                                       if(name_node_map.count(refd_tbls[ff])>0){
+                                                               fprintf(stderr,"ERROR, query %s occurs both in the regular query set, file %s,  and in library file %s\n",refd_tbls[ff].c_str(), qname_to_flname[refd_tbls[ff]].c_str(), qpathname.c_str() );
+                                                               exit(1);
+                                                       }else{
+                                                               worklist.push_back(local_query_map[refd_tbls[ff]]);
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               for(qq=0;qq<new_qnodes.size();++qq){
+                                       int qpos = qnodes.size();
+                                       qnodes.push_back(new_qnodes[qq]);
+                                       name_node_map[qnodes[qpos]->name ] = qpos;
+                                       qname_to_flname[qnodes[qpos]->name ] = qpathname;
+                               }
+                       }
+               }
+       }
+  }
+
+
+
+
+
+
+
+
+//---------------------------------------
+
+
+//             Add the UDOPS.
+
+  string udop_missing_sources;
+  for(i=0;i<qnodes.size();++i){
+       int fi;
+       for(fi = 0;fi<qnodes[i]->refd_tbls.size();++fi){
+               int sid = Schema->find_tbl(qnodes[i]->refd_tbls[fi]);
+               if(sid >= 0){
+                       if(Schema->get_schema_type(sid) == OPERATOR_VIEW_SCHEMA){
+                               if(name_node_map.count(qnodes[i]->refd_tbls[fi]) == 0){
+                               int pos = qnodes.size();
+                                       qnodes.push_back( new query_node(pos, qnodes[i]->refd_tbls[fi], Schema));
+                                       name_node_map[ qnodes[pos]->name ] = pos;
+                                       qnodes[pos]->is_externally_visible = false;   // its visible
+       //                                      Need to mark the source queries as visible.
+                                       int si;
+                                       string missing_sources = "";
+                                       for(si=0;si<qnodes[pos]->refd_tbls.size();++si){
+                                               string src_tbl = qnodes[pos]->refd_tbls[si];
+                                               if(name_node_map.count(src_tbl)==0){
+                                                       missing_sources += src_tbl + " ";
+                                               }
+                                       }
+                                       if(missing_sources != ""){
+                                               udop_missing_sources += "\tUDOP "+qnodes[pos]->name+" references undefined tables "+missing_sources+"\n";
+                                       }
+                               }
+                       }
+               }
+       }
+  }
+  if(udop_missing_sources != ""){
+       fprintf(stderr,"ERROR, User Defined OPerators reference source tables that are not part of the query set:\n%s",udop_missing_sources.c_str());
+       exit(1);
+  }
+
+
+
+////////////////////////////////////////////////////////////////////
+///                            Check parse trees to verify that some
+///                            global properties are met :
+///                            if q1 reads from q2, then
+///                              q2 is processed before q1
+///                              q1 can supply q2's parameters
+///                            Verify there is no cycle in the reads-from graph.
+
+//                     Compute an order in which to process the
+//                     queries.
+
+//                     Start by building the reads-from lists.
+//
+
+  for(i=0;i<qnodes.size();++i){
+       int qi, fi;
+       vector<string> refd_tbls =  qnodes[i]->refd_tbls;
+       for(fi = 0;fi<refd_tbls.size();++fi){
+               if(name_node_map.count(refd_tbls[fi])>0){
+//printf("query %d (%s) reads from %s (%d)\n", i, qnodes[i]->name.c_str(),refd_tbls[fi].c_str(),name_node_map[refd_tbls[fi]]);
+                       (qnodes[i]->reads_from).insert(name_node_map[refd_tbls[fi]]);
+               }
+       }
+  }
+
+
+//             If one query reads the result of another,
+//             check for parameter compatibility.  Currently it must
+//             be an exact match.  I will move to requiring
+//             containment after re-ordering, but will require
+//             some analysis for code generation which is not
+//             yet in place.
+//printf("There are %d query nodes.\n",qnodes.size());
+
+
+  for(i=0;i<qnodes.size();++i){
+       vector<var_pair_t *> target_params  = qnodes[i]->params;
+       for(si=qnodes[i]->reads_from.begin();si!=qnodes[i]->reads_from.end();++si){
+               vector<var_pair_t *> source_params  = qnodes[(*si)]->params;
+               if(target_params.size() != source_params.size()){
+                       fprintf(stderr,"ERROR, query %s (in file %s) reads from %s (in file %s), but they do not have identical parameters.\n",qnodes[i]->name.c_str(), qnodes[i]->file.c_str(), qnodes[(*si)]->name.c_str(), qnodes[(*si)]->file.c_str());
+                       exit(1);
+               }
+               int p;
+               for(p=0;p<target_params.size();++p){
+                       if(! (target_params[p]->name == source_params[p]->name &&
+                             target_params[p]->val == source_params[p]->val ) ){
+                       fprintf(stderr,"ERROR, query %s (in file %s) reads from %s (in file %s), but they do not have identical parameters.\n",qnodes[i]->name.c_str(), qnodes[i]->file.c_str(), qnodes[(*si)]->name.c_str(), qnodes[(*si)]->file.c_str());
+                               exit(1);
+                       }
+               }
+       }
+  }
+
+
+//             Find the roots.
+//             Start by counting inedges.
+  for(i=0;i<qnodes.size();++i){
+       for(si=qnodes[i]->reads_from.begin();si!=qnodes[i]->reads_from.end();++si){
+               qnodes[(*si)]->n_consumers++;
+       }
+  }
+
+//             The roots are the nodes with indegree zero.
+  set<int> roots;
+  for(i=0;i<qnodes.size();++i){
+       if(qnodes[i]->n_consumers == 0){
+               if(qnodes[i]->is_externally_visible == false){
+                       fprintf(stderr,"WARNING: query %s (file %s) is a root query but it isn't visible.  Ignored.\n",qnodes[i]->name.c_str(), qnodes[i]->file.c_str());
+               }
+               roots.insert(i);
+       }
+  }
+
+//             Remove the parts of the subtree that produce no output.
+  set<int> valid_roots;
+  set<int> discarded_nodes;
+  set<int> candidates;
+  while(roots.size() >0){
+       for(si=roots.begin();si!=roots.end();++si){
+               if(qnodes[(*si)]->is_externally_visible){
+                       valid_roots.insert((*si));
+               }else{
+                       discarded_nodes.insert((*si));
+                       set<int>::iterator sir;
+                       for(sir=qnodes[(*si)]->reads_from.begin(); sir!=qnodes[(*si)]->reads_from.end();++sir){
+                               qnodes[(*sir)]->n_consumers--;
+                               if(qnodes[(*sir)]->n_consumers == 0)
+                                       candidates.insert( (*sir));
+                       }
+               }
+       }
+       roots = candidates;
+       candidates.clear();
+  }
+  roots = valid_roots;
+  if(discarded_nodes.size()>0){
+       fprintf(stderr,"Warning, the following queries were discarded because they produce no output:\n");
+       int di = 0;
+       for(si=discarded_nodes.begin();si!=discarded_nodes.end();++si){
+               if(di>0 && (di%8)==0) fprintf(stderr,"\n");
+               di++;
+               fprintf(stderr," %s",qnodes[(*si)]->name.c_str());
+       }
+       fprintf(stderr,"\n");
+  }
+
+//             Compute the sources_to set, ignoring discarded nodes.
+  for(i=0;i<qnodes.size();++i){
+       if(discarded_nodes.count(i)==0)
+               for(si=qnodes[i]->reads_from.begin();si!=qnodes[i]->reads_from.end();++si){
+                       qnodes[(*si)]->sources_to.insert(i);
+       }
+  }
+
+
+//             Find the nodes that are shared by multiple visible subtrees.
+//             THe roots become inferred visible nodes.
+
+//             Find the visible nodes.
+       vector<int> visible_nodes;
+       for(i=0;i<qnodes.size();i++){
+               if(qnodes[i]->is_externally_visible){
+                       visible_nodes.push_back(i);
+               }
+       }
+
+//             Find UDOPs referenced by visible nodes.
+  list<int> workq;
+  for(i=0;i<visible_nodes.size();++i){
+       workq.push_back(visible_nodes[i]);
+  }
+  while(!workq.empty()){
+       int node = workq.front();
+       workq.pop_front();
+       set<int>::iterator children;
+       if(qnodes[node]->is_udop && qnodes[node]->is_externally_visible == false){
+               qnodes[node]->is_externally_visible = true;
+               visible_nodes.push_back(node);
+               for(children=qnodes[node]->reads_from.begin();children!=qnodes[node]->reads_from.end();++children){
+                       if(qnodes[(*children)]->is_externally_visible == false){
+                               qnodes[(*children)]->is_externally_visible = true;
+                               visible_nodes.push_back((*children));
+                       }
+               }
+       }
+       for(children=qnodes[node]->reads_from.begin();children!=qnodes[node]->reads_from.end();++children){
+               workq.push_back((*children));
+       }
+  }
+
+       bool done = false;
+       while(!done){
+//     reset the nodes
+               for(i=0;i<qnodes.size();i++){
+                       qnodes[i]->subtree_roots.clear();
+               }
+
+//             Walk the tree defined by a visible node, not descending into
+//             subtrees rooted by a visible node.  Mark the node visited with
+//             the visible node ID.
+               for(i=0;i<visible_nodes.size();++i){
+                       set<int> vroots;
+                       vroots.insert(visible_nodes[i]);
+                       while(vroots.size()>0){
+                               for(si=vroots.begin();si!=vroots.end();++si){
+                                       qnodes[(*si)]->subtree_roots.insert(visible_nodes[i]);
+
+                                       set<int>::iterator sir;
+                                       for(sir=qnodes[(*si)]->reads_from.begin(); sir!=qnodes[(*si)]->reads_from.end();++sir){
+                                               if(! qnodes[(*sir)]->is_externally_visible){
+                                                       candidates.insert( (*sir));
+                                               }
+                                       }
+                               }
+                               vroots = candidates;
+                               candidates.clear();
+                       }
+               }
+//             Find the nodes in multiple visible node subtrees, but with no parent
+//             that has is in multile visible node subtrees.  Mark these as inferred visible nodes.
+               done = true;    // until proven otherwise
+               for(i=0;i<qnodes.size();i++){
+                       if(qnodes[i]->subtree_roots.size()>1){
+                               bool is_new_root = true;
+                               set<int>::iterator sir;
+                               for(sir=qnodes[i]->sources_to.begin(); sir!=qnodes[i]->sources_to.end();++sir){
+                                       if(qnodes[(*sir)]->subtree_roots.size()>1)
+                                               is_new_root = false;
+                               }
+                               if(is_new_root){
+                                       qnodes[i]->is_externally_visible = true;
+                                       qnodes[i]->inferred_visible_node = true;
+                                       visible_nodes.push_back(i);
+                                       done = false;
+                               }
+                       }
+               }
+       }
+
+
+
+
+
+//             get visible nodes in topo ordering.
+//  for(i=0;i<qnodes.size();i++){
+//             qnodes[i]->n_consumers = qnodes[i]->sources_to.size();
+//  }
+  vector<int> process_order;
+  while(roots.size() >0){
+       for(si=roots.begin();si!=roots.end();++si){
+               if(discarded_nodes.count((*si))==0){
+                       process_order.push_back( (*si) );
+               }
+               set<int>::iterator sir;
+               for(sir=qnodes[(*si)]->reads_from.begin(); sir!=qnodes[(*si)]->reads_from.end();++sir){
+                       qnodes[(*sir)]->n_consumers--;
+                       if(qnodes[(*sir)]->n_consumers == 0)
+                               candidates.insert( (*sir));
+               }
+       }
+       roots = candidates;
+       candidates.clear();
+  }
+
+
+//printf("process_order.size() =%d\n",process_order.size());
+
+//             Search for cyclic dependencies
+  string found_dep;
+  for(i=0;i<qnodes.size();++i){
+       if(discarded_nodes.count(i)==0 && qnodes[i]->n_consumers > 0){
+               if(found_dep.size() != 0) found_dep += ", ";
+               found_dep += "query "+qnodes[i]->name+" (file "+qnodes[i]->file+")";
+       }
+  }
+  if(found_dep.size()>0){
+       fprintf(stderr,"ERROR, the following queries contain a cyclic reads-from dependency:\n%s\n",found_dep.c_str());
+       exit(1);
+  }
+
+//             Get a list of query sets, in the order to be processed.
+//             Start at visible root and do bfs.
+//             The query set includes queries referenced indirectly,
+//             as sources for user-defined operators.  These are needed
+//             to ensure that they are added to the schema, but are not part
+//             of the query tree.
+
+//             stream_node_sets contains queries reachable only through the
+//             FROM clause, so I can tell which queries to add to the stream
+//             query. (DISABLED, UDOPS are integrated, does this cause problems?)
+
+//                     NOTE: this code works because in order for data to be
+//                     read by multiple hftas, the node must be externally visible.
+//                     But visible nodes define roots of process sets.
+//                     internally visible nodes can feed data only
+//                     to other nodes in the same query file.
+//                     Therefore, any access can be restricted to a file,
+//                     hfta output sharing is done only on roots
+//                     never on interior nodes.
+
+
+
+
+//             Conpute the base collection of hftas.
+  vector<hfta_node *> hfta_sets;
+  map<string, int> hfta_name_map;
+//  vector< vector<int> > process_sets;
+//  vector< set<int> > stream_node_sets;
+  reverse(process_order.begin(), process_order.end());  // get listing in reverse order.
+                                                                                                               // i.e. process leaves 1st.
+  for(i=0;i<process_order.size();++i){
+       if(qnodes[process_order[i]]->is_externally_visible == true){
+//printf("Visible.\n");
+               int root = process_order[i];
+               hfta_node *hnode = new hfta_node();
+               hnode->name = qnodes[root]-> name;
+               hnode->source_name = qnodes[root]-> name;
+               hnode->is_udop = qnodes[root]->is_udop;
+               hnode->inferred_visible_node = qnodes[root]->inferred_visible_node;
+
+               vector<int> proc_list;  proc_list.push_back(root);
+//                     Ensure that nodes are added only once.
+               set<int> proc_set;      proc_set.insert(root);
+               roots.clear();                  roots.insert(root);
+               candidates.clear();
+               while(roots.size()>0){
+                       for(si=roots.begin();si!=roots.end();++si){
+//printf("Processing root %d\n",(*si));
+                               set<int>::iterator sir;
+                               for(sir=qnodes[(*si)]->reads_from.begin(); sir!=qnodes[(*si)]->reads_from.end();++sir){
+//printf("reads fom %d\n",(*sir));
+                                       if(qnodes[(*sir)]->is_externally_visible==false){
+                                               candidates.insert( (*sir) );
+                                               if(proc_set.count( (*sir) )==0){
+                                                       proc_set.insert( (*sir) );
+                                                       proc_list.push_back( (*sir) );
+                                               }
+                                       }
+                               }
+                       }
+                       roots = candidates;
+                       candidates.clear();
+               }
+
+               reverse(proc_list.begin(), proc_list.end());
+               hnode->query_node_indices = proc_list;
+               hfta_name_map[hnode->name] = hfta_sets.size();
+               hfta_sets.push_back(hnode);
+       }
+  }
+
+//             Compute the reads_from / sources_to graphs for the hftas.
+
+  for(i=0;i<hfta_sets.size();++i){
+       hfta_node *hnode = hfta_sets[i];
+       for(q=0;q<hnode->query_node_indices.size();q++){
+               query_node *qnode = qnodes[hnode->query_node_indices[q]];
+               for(s=0;s<qnode->refd_tbls.size();++s){
+                       if(hfta_name_map.count(qnode->refd_tbls[s])){
+                               int other_hfta = hfta_name_map[qnode->refd_tbls[s]];
+                               hnode->reads_from.insert(other_hfta);
+                               hfta_sets[other_hfta]->sources_to.insert(i);
+                       }
+               }
+       }
+  }
+
+//             Compute a topological sort of the hfta_sets.
+
+  vector<int> hfta_topsort;
+  workq.clear();
+  int hnode_srcs[hfta_sets.size()];
+  for(i=0;i<hfta_sets.size();++i){
+       hnode_srcs[i] = 0;
+       if(hfta_sets[i]->sources_to.size() == 0)
+               workq.push_back(i);
+  }
+
+  while(! workq.empty()){
+       int     node = workq.front();
+       workq.pop_front();
+       hfta_topsort.push_back(node);
+       set<int>::iterator stsi;
+       for(stsi=hfta_sets[node]->reads_from.begin();stsi!=hfta_sets[node]->reads_from.end();++stsi){
+               int parent = (*stsi);
+               hnode_srcs[parent]++;
+               if(hnode_srcs[parent] == hfta_sets[parent]->sources_to.size()){
+                       workq.push_back(parent);
+               }
+       }
+  }
+
+//             Decorate hfta nodes with the level of parallelism given as input.
+
+  map<string, int>::iterator msii;
+  for(msii=hfta_parallelism.begin();msii!=hfta_parallelism.end();++msii){
+       string hfta_name = (*msii).first;
+       int par = (*msii).second;
+       if(hfta_name_map.count(hfta_name) > 0){
+               hfta_sets[ hfta_name_map[hfta_name] ]->n_parallel = par;
+       }else{
+               fprintf(stderr,"Warning, hfta_parallelism.cfg has an entry for %s, but its not a hfta.\n",hfta_name.c_str());
+       }
+  }
+
+//             Propagate levels of parallelism: children should have a level of parallelism
+//             as large as any of its parents.  Adjust children upwards to compensate.
+//             Start at parents and adjust children, auto-propagation will occur.
+
+  for(i=hfta_sets.size()-1;i>=0;i--){
+       set<int>::iterator stsi;
+       for(stsi=hfta_sets[i]->reads_from.begin();stsi!=hfta_sets[i]->reads_from.end();++stsi){
+               if(hfta_sets[i]->n_parallel > hfta_sets[ (*stsi) ]->n_parallel){
+                       hfta_sets[ (*stsi) ]->n_parallel = hfta_sets[i]->n_parallel;
+               }
+       }
+  }
+
+//             Before all the name mangling, check if therey are any output_spec.cfg
+//             or hfta_parallelism.cfg entries that do not have a matching query.
+
+       string dangling_ospecs = "";
+       for(msii=qname_to_ospec.begin();msii!=qname_to_ospec.end();++msii){
+               string oq = (*msii).first;
+               if(hfta_name_map.count(oq) == 0){
+                       dangling_ospecs += " "+(*msii).first;
+               }
+       }
+       if(dangling_ospecs!=""){
+               fprintf(stderr,"WARNING, the following entries in output_spec.cfg don't have a matching query: %s\n",dangling_ospecs.c_str());
+       }
+
+       string dangling_par = "";
+       for(msii=hfta_parallelism.begin();msii!=hfta_parallelism.end();++msii){
+               string oq = (*msii).first;
+               if(hfta_name_map.count(oq) == 0){
+                       dangling_par += " "+(*msii).first;
+               }
+       }
+       if(dangling_par!=""){
+               fprintf(stderr,"WARNING, the following entries in hfta_parallelism.cfg don't have a matching query: %s\n",dangling_par.c_str());
+       }
+
+
+
+//             Replicate parallelized hftas.  Do __copyX name mangling.  Adjust
+//             FROM clauses: retarget any name which is an internal node, and
+//             any which is in hfta_sets (and which is parallelized). Add Merge nodes
+//             when the source hfta has more parallelism than the target node.
+//             Add new nodes to qnodes and hfta_nodes wth the appropriate linkages.
+
+
+  int n_original_hfta_sets = hfta_sets.size();
+  for(i=0;i<n_original_hfta_sets;++i){
+       if(hfta_sets[i]->n_parallel > 1){
+               hfta_sets[i]->do_generation =false;     // set the deletion flag for this entry.
+               set<string> local_nodes;                // names of query nodes in the hfta.
+               for(h=0;h<hfta_sets[i]->query_node_indices.size();++h){
+                       local_nodes.insert(qnodes[ hfta_sets[i]->query_node_indices[h] ]->name);
+               }
+
+               for(p=0;p<hfta_sets[i]->n_parallel;++p){
+                       string mangler = "__copy"+int_to_string(p);
+                       hfta_node *par_hfta  = new hfta_node();
+                       par_hfta->name = hfta_sets[i]->name + mangler;
+                       par_hfta->source_name = hfta_sets[i]->name;
+                       par_hfta->is_udop = hfta_sets[i]->is_udop;
+                       par_hfta->inferred_visible_node = hfta_sets[i]->inferred_visible_node;
+                       par_hfta->n_parallel = hfta_sets[i]->n_parallel;
+                       par_hfta->parallel_idx = p;
+
+                       map<string, int> par_qnode_map; // qnode name-to-idx, aids dependency tracking.
+
+//     Is it a UDOP?
+                       if(hfta_sets[i]->is_udop){
+                               int root = hfta_sets[i]->query_node_indices[0];
+
+                               string unequal_par_sources;
+                               set<int>::iterator rfsii;
+                               for(rfsii=hfta_sets[i]->reads_from.begin();rfsii!=hfta_sets[i]->reads_from.end();++rfsii){
+                                       if(hfta_sets[(*rfsii)]->n_parallel != par_hfta->n_parallel){
+                                               unequal_par_sources = hfta_sets[(*rfsii)]->name+" ("+int_to_string(hfta_sets[(*rfsii)]->n_parallel)+") ";
+                                       }
+                               }
+                               if(unequal_par_sources != ""){
+                                       fprintf(stderr,"ERROR, UDOP %s has parallelism %d, but some of its sources have a different parallelism: %s\n",hfta_sets[i]->name.c_str(), hfta_sets[i]->n_parallel, unequal_par_sources.c_str());
+                                       exit(1);
+                               }
+
+                               int rti;
+                               vector<string> new_sources;
+                               for(rti=0;rti<qnodes[root]->refd_tbls.size();++rti){
+                                       new_sources.push_back(qnodes[root]->refd_tbls[rti]+mangler);
+                               }
+
+                               query_node *new_qn = new query_node(qnodes.size(), qnodes[root]->name, Schema);
+                               new_qn->name += mangler;
+                               new_qn->mangler = mangler;
+                               new_qn->refd_tbls = new_sources;
+                               par_hfta->query_node_indices.push_back(qnodes.size());
+                               par_qnode_map[new_qn->name] = qnodes.size();
+                               name_node_map[ new_qn->name ] = qnodes.size();
+                               qnodes.push_back(new_qn);
+                       }else{
+//             regular query node
+                         for(h=0;h<hfta_sets[i]->query_node_indices.size();++h){
+                               int hqn_idx = hfta_sets[i]->query_node_indices[h];
+                               table_exp_t *dup_pt = dup_table_exp(qnodes[hqn_idx]->parse_tree);
+//                                     rehome the from clause on mangled names.
+//                                     create merge nodes as needed for external sources.
+                               for(f=0;f<dup_pt->fm->tlist.size();++f){
+                                       if(local_nodes.count(dup_pt->fm->tlist[f]->schema_name)>0){
+                                               dup_pt->fm->tlist[f]->schema_name += mangler;
+                                       }else if(hfta_name_map.count(dup_pt->fm->tlist[f]->schema_name)>0){
+//                     Ref's an external HFTA.  No parallelism => leave as is.  Else, if level of parallelism of the two hftas is the same, rename by the mangler.  Else, there mnust be more sources, so create a merge node.
+                                               int other_hidx = hfta_name_map[dup_pt->fm->tlist[f]->schema_name];
+                                               if(par_hfta->n_parallel == hfta_sets[other_hidx]->n_parallel){
+                                                       dup_pt->fm->tlist[f]->schema_name += mangler;
+                                               }else{
+                                                       vector<string> src_tbls;
+                                                       int stride = hfta_sets[other_hidx]->n_parallel / par_hfta->n_parallel;
+                                                       if(stride == 0){
+                                                               fprintf(stderr,"INTERNAL ERROR, parent hfta %s has a larger parallelism than its child %s\n",par_hfta->name.c_str(), hfta_sets[other_hidx]->name.c_str());
+                                                               exit(1);
+                                                       }
+                                                       for(s=0;s<stride;++s){
+                                                               string ext_src_name = hfta_sets[other_hidx]->name+"__copy"+int_to_string(s+stride*p);
+                                                               src_tbls.push_back(ext_src_name);
+                                                       }
+                                                       table_exp_t *merge_pt = table_exp_t::make_deferred_merge(src_tbls);
+                                                       string merge_node_name = qnodes[hqn_idx]->name+"__copy"+int_to_string(p)+"__merge"+int_to_string(f);
+                                                       dup_pt->fm->tlist[f]->schema_name = merge_node_name;
+//                                     Make a qnode to represent the new merge node
+                                                       query_node *qn_pt = new query_node(qnodes.size(),merge_node_name, qnodes[hqn_idx]->file,merge_pt);
+                                                       qn_pt->refd_tbls = src_tbls;
+                                                       qn_pt->is_udop  = false;
+                                                       qn_pt->is_externally_visible = false;
+                                                       qn_pt->inferred_visible_node  = false;
+                                                       par_hfta->query_node_indices.push_back(qnodes.size());
+                                                       par_qnode_map[merge_node_name] = qnodes.size();
+                                                       name_node_map[ merge_node_name ] = qnodes.size();
+                                                       qnodes.push_back(qn_pt);
+                                               }
+                                       }
+                               }
+                               query_node *new_qn = new query_node(qnodes.size(),qnodes[hqn_idx]->name+"__copy"+int_to_string(p),qnodes[hqn_idx]->file,dup_pt);
+                               for(f=0;f<dup_pt->fm->tlist.size();++f){
+                                       new_qn->refd_tbls.push_back(dup_pt->fm->tlist[f]->schema_name);
+                               }
+                               new_qn->params = qnodes[hqn_idx]->params;
+                               new_qn->is_udop = false;
+                               new_qn->is_externally_visible = qnodes[hqn_idx]->is_externally_visible;
+                               new_qn->inferred_visible_node = qnodes[hqn_idx]->inferred_visible_node;
+                               par_hfta->query_node_indices.insert(par_hfta->query_node_indices.begin(),qnodes.size());
+                               par_qnode_map[new_qn->name] = qnodes.size();
+                               name_node_map[ new_qn->name ] = qnodes.size();
+                               qnodes.push_back(new_qn);
+                         }
+                       }
+                       hfta_name_map[par_hfta->name] = hfta_sets.size();
+                       hfta_sets.push_back(par_hfta);
+               }
+       }else{
+//             This hfta isn't being parallelized, but add merge nodes for any parallelized
+//             hfta sources.
+               if(!hfta_sets[i]->is_udop){
+                 for(h=0;h<hfta_sets[i]->query_node_indices.size();++h){
+                       int hqn_idx = hfta_sets[i]->query_node_indices[h];
+                       for(f=0;f<qnodes[hqn_idx]->parse_tree->fm->tlist.size();++f){
+                               if(hfta_name_map.count(qnodes[hqn_idx]->parse_tree->fm->tlist[f]->schema_name)>0){
+//                     Ref's an external HFTA.  No parallelism => leave as is.  Else, if level of parallelism of the two hftas is the same, rename by the mangler.  Else, there mnust be more sources, so create a merge node.
+                                       int other_hidx = hfta_name_map[qnodes[hqn_idx]->parse_tree->fm->tlist[f]->schema_name];
+                                       if(hfta_sets[i]->n_parallel != hfta_sets[other_hidx]->n_parallel){
+                                               vector<string> src_tbls;
+                                               for(s=0;s<hfta_sets[other_hidx]->n_parallel;++s){
+                                                       string ext_src_name = hfta_sets[other_hidx]->name+"__copy"+int_to_string(s);
+                                                       src_tbls.push_back(ext_src_name);
+                                               }
+                                               table_exp_t *merge_pt = table_exp_t::make_deferred_merge(src_tbls);
+                                               string merge_node_name = qnodes[hqn_idx]->name+"__merge"+int_to_string(f);
+                                               qnodes[hqn_idx]->parse_tree->fm->tlist[f]->schema_name = merge_node_name;
+//                                     Make a qnode to represent the new merge node
+                                               query_node *qn_pt = new query_node(qnodes.size(),merge_node_name, qnodes[hqn_idx]->file,merge_pt);
+                                               qn_pt->refd_tbls = src_tbls;
+                                               qn_pt->is_udop  = false;
+                                               qn_pt->is_externally_visible = false;
+                                               qn_pt->inferred_visible_node  = false;
+                                               hfta_sets[i]->query_node_indices.insert(hfta_sets[i]->query_node_indices.begin(),qnodes.size());
+                                               name_node_map[ merge_node_name ] = qnodes.size();
+                                               qnodes.push_back(qn_pt);
+                                       }
+                               }
+                       }
+               }
+         }
+       }
+  }
+
+//                     Rebuild the reads_from / sources_to lists in the qnodes
+  for(q=0;q<qnodes.size();++q){
+       qnodes[q]->reads_from.clear();
+       qnodes[q]->sources_to.clear();
+  }
+  for(q=0;q<qnodes.size();++q){
+       for(s=0;s<qnodes[q]->refd_tbls.size();++s){
+               if(name_node_map.count(qnodes[q]->refd_tbls[s])>0){
+                       int rf = name_node_map[qnodes[q]->refd_tbls[s]];
+                       qnodes[q]->reads_from.insert(rf);
+                       qnodes[rf]->sources_to.insert(q);
+               }
+       }
+  }
+
+//                     Rebuild the reads_from / sources_to lists in hfta_sets
+  for(q=0;q<hfta_sets.size();++q){
+       hfta_sets[q]->reads_from.clear();
+       hfta_sets[q]->sources_to.clear();
+  }
+  for(q=0;q<hfta_sets.size();++q){
+       for(s=0;s<hfta_sets[q]->query_node_indices.size();++s){
+               int node = hfta_sets[q]->query_node_indices[s];
+               set<int>::iterator rfsii;
+               for(rfsii=qnodes[node]->reads_from.begin();rfsii!=qnodes[node]->reads_from.end();++rfsii){
+                       if(hfta_name_map.count(qnodes[(*rfsii)]->name)>0){
+                               hfta_sets[q]->reads_from.insert(hfta_name_map[qnodes[(*rfsii)]->name]);
+                               hfta_sets[hfta_name_map[qnodes[(*rfsii)]->name]]->sources_to.insert(q);
+                       }
+               }
+       }
+  }
+
+/*
+for(q=0;q<qnodes.size();++q){
+ printf("qnode %d reads-from %d:",q,qnodes[q]->reads_from.size());
+ set<int>::iterator rsii;
+ for(rsii=qnodes[q]->reads_from.begin();rsii!=qnodes[q]->reads_from.end();++rsii)
+  printf(" %d",(*rsii));
+  printf(", and sources-to %d:",qnodes[q]->sources_to.size());
+ for(rsii=qnodes[q]->sources_to.begin();rsii!=qnodes[q]->sources_to.end();++rsii)
+  printf(" %d",(*rsii));
+ printf("\n");
+}
+
+for(q=0;q<hfta_sets.size();++q){
+ if(hfta_sets[q]->do_generation==false)
+       continue;
+ printf("hfta %d (%s) reads-from %d:",q,hfta_sets[q]->name.c_str(),hfta_sets[q]->reads_from.size());
+ set<int>::iterator rsii;
+ for(rsii=hfta_sets[q]->reads_from.begin();rsii!=hfta_sets[q]->reads_from.end();++rsii)
+  printf(" %d",(*rsii));
+  printf(", and sources-to %d:",hfta_sets[q]->sources_to.size());
+ for(rsii=hfta_sets[q]->sources_to.begin();rsii!=hfta_sets[q]->sources_to.end();++rsii)
+  printf(" %d",(*rsii));
+ printf("\n");
+}
+*/
+
+
+
+//             Re-topo sort the hftas
+  hfta_topsort.clear();
+  workq.clear();
+  int hnode_srcs_2[hfta_sets.size()];
+  for(i=0;i<hfta_sets.size();++i){
+       hnode_srcs_2[i] = 0;
+       if(hfta_sets[i]->sources_to.size() == 0 && hfta_sets[i]->do_generation){
+               workq.push_back(i);
+       }
+  }
+
+  while(workq.empty() == false){
+       int     node = workq.front();
+       workq.pop_front();
+       hfta_topsort.push_back(node);
+       set<int>::iterator stsii;
+       for(stsii=hfta_sets[node]->reads_from.begin();stsii!=hfta_sets[node]->reads_from.end();++stsii){
+               int child = (*stsii);
+               hnode_srcs_2[child]++;
+               if(hnode_srcs_2[child] == hfta_sets[child]->sources_to.size()){
+                       workq.push_back(child);
+               }
+       }
+  }
+
+//             Ensure that all of the query_node_indices in hfta_sets are topologically
+//             sorted, don't rely on assumptions that all transforms maintain some kind of order.
+  for(i=0;i<hfta_sets.size();++i){
+       if(hfta_sets[i]->do_generation){
+               map<int,int> n_accounted;
+               vector<int> new_order;
+               workq.clear();
+               vector<int>::iterator vii;
+               for(vii=hfta_sets[i]->query_node_indices.begin();vii!=hfta_sets[i]->query_node_indices.end();++vii){
+                       n_accounted[(*vii)]= 0;
+               }
+               for(vii=hfta_sets[i]->query_node_indices.begin();vii!=hfta_sets[i]->query_node_indices.end();++vii){
+                       set<int>::iterator rfsii;
+                       for(rfsii=qnodes[(*vii)]->reads_from.begin();rfsii!=qnodes[(*vii)]->reads_from.end();++rfsii){
+                               if(n_accounted.count((*rfsii)) == 0){
+                                       n_accounted[(*vii)]++;
+                               }
+                       }
+                       if(n_accounted[(*vii)] == qnodes[(*vii)]->reads_from.size()){
+                               workq.push_back((*vii));
+                       }
+               }
+
+               while(workq.empty() == false){
+                       int node = workq.front();
+                       workq.pop_front();
+                       new_order.push_back(node);
+                       set<int>::iterator stsii;
+                       for(stsii=qnodes[node]->sources_to.begin();stsii!=qnodes[node]->sources_to.end();++stsii){
+                               if(n_accounted.count((*stsii))){
+                                       n_accounted[(*stsii)]++;
+                                       if(n_accounted[(*stsii)] == qnodes[(*stsii)]->reads_from.size()){
+                                               workq.push_back((*stsii));
+                                       }
+                               }
+                       }
+               }
+               hfta_sets[i]->query_node_indices = new_order;
+       }
+  }
+
+
+
+
+
+///                    Global checkng is done, start the analysis and translation
+///                    of the query parse tree in the order specified by process_order
+
+
+//                     Get a list of the LFTAs for global lfta optimization
+//                             TODO: separate building operators from spliting lftas,
+//                                     that will make optimizations such as predicate pushing easier.
+       vector<stream_query *> lfta_list;
+
+       stream_query *rootq;
+
+    int qi,qj;
+
+       for(qi=hfta_topsort.size()-1;qi>=0;--qi){
+
+       int hfta_id = hfta_topsort[qi];
+    vector<int> curr_list = hfta_sets[hfta_id]->query_node_indices;
+
+
+
+//             Two possibilities, either its a UDOP, or its a collection of queries.
+//     if(qnodes[curr_list.back()]->is_udop)
+       if(hfta_sets[hfta_id]->is_udop){
+               int node_id = curr_list.back();
+               int udop_schref = Schema->find_tbl(qnodes[node_id]->file);
+               opview_entry *opv = new opview_entry();
+
+//                     Many of the UDOP properties aren't currently used.
+               opv->parent_qname = "no_parent";
+               opv->root_name = qnodes[node_id]->name;
+               opv->view_name = qnodes[node_id]->file;
+               opv->pos = qi;
+               sprintf(tmpstr,"%s_UDOP%d_%s",qnodes[node_id]->name.c_str(),qi,opv->view_name.c_str());
+               opv->udop_alias = tmpstr;
+               opv->mangler = qnodes[node_id]->mangler;
+
+               if(opv->mangler != ""){
+                       int new_udop_schref = Schema->add_duplicate_table(opv->view_name,opv->root_name);
+                       Schema->mangle_subq_names(new_udop_schref,opv->mangler);
+               }
+
+//                     This piece of code makes each hfta which referes to the same udop
+//                     reference a distinct running udop.  Do this at query optimization time?
+//             fmtbl->set_udop_alias(opv->udop_alias);
+
+               opv->exec_fl = Schema->get_op_prop(udop_schref, string("file"));
+               opv->liveness_timeout = atoi(Schema->get_op_prop(udop_schref, string("liveness_timeout")).c_str());
+
+               vector<subquery_spec *> subq = Schema->get_subqueryspecs(udop_schref);
+               int s,f,q;
+               for(s=0;s<subq.size();++s){
+//                             Validate that the fields match.
+                       subquery_spec *sqs = subq[s];
+                       string subq_name = sqs->name + opv->mangler;
+                       vector<field_entry *> flds = Schema->get_fields(subq_name);
+                       if(flds.size() == 0){
+                               fprintf(stderr,"INTERNAL ERROR: the subquery %s of view %s not found in Schema.\n",subq_name.c_str(), opv->view_name.c_str());
+                               return(1);
+                       }
+                       if(flds.size() < sqs->types.size()){
+                               fprintf(stderr,"ERROR: subquery %s of view %s does not have enough fields (%lu found, %lu expected).\n",subq_name.c_str(), opv->view_name.c_str(),flds.size(), sqs->types.size());
+                               return(1);
+                       }
+                       bool failed = false;
+                       for(f=0;f<sqs->types.size();++f){
+                               data_type dte(sqs->types[f],sqs->modifiers[f]);
+                               data_type dtf(flds[f]->get_type(),flds[f]->get_modifier_list());
+                               if(! dte.subsumes_type(&dtf) ){
+                                       fprintf(stderr,"ERROR: subquery %s of view %s does not have the correct type for field %d (%s found, %s expected).\n",subq_name.c_str(), opv->view_name.c_str(),f,dtf.to_string().c_str(), dte.to_string().c_str());
+                                       failed = true;
+                               }
+/*
+                               if(dte.is_temporal() && (dte.get_temporal() != dtf.get_temporal()) ){
+                                       string pstr = dte.get_temporal_string();
+                                       fprintf(stderr,"ERROR: subquery %s of view %s does not have the expected temporal value %s of field %d.\n",sqs->name.c_str(), opv->view_name.c_str(),pstr.c_str(),f);
+                                       failed = true;
+                               }
+*/
+                       }
+                       if(failed)
+                               return(1);
+///                            Validation done, find the subquery, make a copy of the
+///                            parse tree, and add it to the return list.
+                       for(q=0;q<qnodes.size();++q)
+                               if(qnodes[q]->name == subq_name)
+                                       break;
+                       if(q==qnodes.size()){
+                               fprintf(stderr,"INTERNAL ERROR: subquery %s of view %s not found in list of query names.\n",subq_name.c_str(), opv->view_name.c_str());
+                               return(1);
+                       }
+
+               }
+
+//                     Cross-link to from entry(s) in all sourced-to tables.
+               set<int>::iterator sii;
+               for(sii=qnodes[curr_list.back()]->sources_to.begin() ;sii!=qnodes[curr_list.back()]->sources_to.end();++sii){
+//printf("\tUDOP %s sources_to %d (%s)\n",hfta_sets[hfta_id]->name.c_str(),(*sii),hfta_sets[(*sii)]->name.c_str());
+                       vector<tablevar_t *> tblvars = qnodes[(*sii)]->parse_tree->get_from()->get_table_list();
+                       int ii;
+                       for(ii=0;ii<tblvars.size();++ii){
+                               if(tblvars[ii]->schema_name == opv->root_name){
+                                       tblvars[ii]->set_opview_idx(opviews.size());
+                               }
+
+                       }
+               }
+
+               opviews.append(opv);
+       }else{
+
+//                     Analyze the parse trees in this query,
+//                     put them in rootq
+//      vector<int> curr_list = process_sets[qi];
+
+
+////////////////////////////////////////
+
+         rootq = NULL;
+//printf("Process set %d, has %d queries\n",qi,curr_list.size());
+         for(qj=0;qj<curr_list.size();++qj){
+               i = curr_list[qj];
+       fprintf(stderr,"Processing query %s (file %s) is_udop = %d\n",qnodes[i]->name.c_str(), qnodes[i]->file.c_str(),qnodes[i]->is_udop);
+
+//                     Select the current query parse tree
+               table_exp_t *fta_parse_tree = qnodes[i]->parse_tree;
+
+//                     if hfta only, try to fetch any missing schemas
+//                     from the registry (using the print_schema program).
+//                     Here I use a hack to avoid analyzing the query -- all referenced
+//                     tables must be in the from clause
+//                     If there is a problem loading any table, just issue a warning,
+//
+               tablevar_list_t *fm = fta_parse_tree->get_from();
+               vector<string> refd_tbls =  fm->get_src_tbls(Schema);
+//                     iterate over all referenced tables
+               int t;
+               for(t=0;t<refd_tbls.size();++t){
+                 int tbl_ref = Schema->get_table_ref(refd_tbls[t]);
+
+                 if(tbl_ref < 0){      // if this table is not in the Schema
+
+                       if(hfta_only){
+                               string cmd="print_schema "+refd_tbls[t];
+                               FILE *schema_in = popen(cmd.c_str(), "r");
+                               if(schema_in == NULL){
+                                 fprintf(stderr,"ERROR: cannot execute command %s\n",cmd.c_str());
+                               }else{
+                                 string schema_instr;
+                                 while(fgets(tmpstr,TMPSTRLEN,schema_in)){
+                                       schema_instr += tmpstr;
+                                 }
+                         fta_parse_result = new fta_parse_t();
+                                 strcpy(tmp_schema_str,schema_instr.c_str());
+                                 FtaParser_setstringinput(tmp_schema_str);
+                         if(FtaParserparse()){
+                                       fprintf(stderr,"FTA parse failed on result from command %s.\n",cmd.c_str());
+                         }else{
+                                       if( fta_parse_result->tables != NULL){
+                                               int tl;
+                                               for(tl=0;tl<fta_parse_result->tables->size();++tl){
+                                                       Schema->add_table(fta_parse_result->tables->get_table(tl));
+                                               }
+                                       }else{
+                                               fprintf(stderr,"ERROR command %s returned no tables.\n",cmd.c_str());
+                                       }
+                               }
+                       }
+                 }else{
+                               fprintf(stderr,"ERROR, query %s (file %s) references stream %s, which is neither a PROTOCOL nor an externally visible query stream.\n", qnodes[i]->name.c_str(), qnodes[i]->file.c_str(), refd_tbls[t].c_str());
+                               exit(1);
+                 }
+
+               }
+         }
+
+
+//                             Analyze the query.
+         query_summary_class *qs = analyze_fta(fta_parse_tree, Schema, Ext_fcns, qnodes[i]->name);
+         if(qs == NULL){
+               fprintf(stderr,"analyze_fta failed on query %s (file %s) \n",qnodes[i]->name.c_str(),qnodes[i]->file.c_str());
+               exit(1);
+         }
+
+         stream_query new_sq(qs, Schema);
+         if(new_sq.error_code){
+                       fprintf(stderr,"ERROR, can't create query node for query %s (file %s):\n%s\n",qnodes[i]->name.c_str(),qnodes[i]->file.c_str(),new_sq.err_str.c_str());
+                       exit(1);
+         }
+
+//                     Add it to the Schema
+         table_def *output_td = new_sq.get_output_tabledef();
+         Schema->add_table(output_td);
+
+//                     Create a query plan from the analyzed parse tree.
+//                     If its a query referneced via FROM, add it to the stream query.
+         if(rootq){
+               rootq->add_query(new_sq);
+         }else{
+               rootq = new stream_query(new_sq);
+//                     have the stream query object inherit properties form the analyzed
+//                     hfta_node object.
+               rootq->set_nparallel(hfta_sets[hfta_id]->n_parallel,hfta_sets[hfta_id]->parallel_idx);
+               rootq->n_successors = hfta_sets[hfta_id]->sources_to.size();
+         }
+
+
+    }
+
+//             This stream query has all its parts
+//             Build and optimize it.
+//printf("translate_fta: generating plan.\n");
+       if(rootq->generate_plan(Schema)){
+               fprintf(stderr,"INTERNAL ERROR: Can't generate query plan for query %s.\n",rootq->query_name.c_str());
+               continue;
+       }
+
+//     If we've found the query plan head, so now add the output operators
+       if(qname_to_ospec.count(hfta_sets[hfta_id]->source_name)){
+               pair< multimap<string, int>::iterator, multimap<string, int>::iterator > oset;
+               multimap<string, int>::iterator mmsi;
+               oset = qname_to_ospec.equal_range(hfta_sets[hfta_id]->source_name);
+               for(mmsi=oset.first; mmsi!=oset.second; ++mmsi){
+                       rootq->add_output_operator(output_specs[(*mmsi).second]);
+               }
+       }
+
+
+
+//                             Perform query splitting if necessary.
+       bool hfta_returned;
+    vector<stream_query *> split_queries = rootq->split_query(Ext_fcns, Schema, hfta_returned, ifaces_db, n_virtual_interfaces, hfta_sets[hfta_id]->n_parallel, hfta_sets[hfta_id]->parallel_idx);
+
+       int l;
+//for(l=0;l<split_queries.size();++l){
+//printf("split query %d is %s\n",l,split_queries[l]->q`uery_name.c_str());
+//}
+
+
+
+
+    if(split_queries.size() > 0){      // should be at least one component.
+
+//                             Compute the number of LFTAs.
+         int n_lfta = split_queries.size();
+         if(hfta_returned) n_lfta--;
+
+
+//                             Process the LFTA components.
+         for(l=0;l<n_lfta;++l){
+          if(lfta_names.count(split_queries[l]->query_name) == 0){
+//                             Grab the lfta for global optimization.
+               vector<tablevar_t *> tvec =  split_queries[l]->query_plan[0]->get_input_tbls();
+               string liface = tvec[0]->get_interface();
+               string lmach = tvec[0]->get_machine();
+               if (lmach == "")
+                       lmach = hostname;
+               interface_names.push_back(liface);
+               machine_names.push_back(lmach);
+//printf("Machine is %s\n",lmach.c_str());
+
+//                     Set the ht size from the recommendation, if there is one in the rec file
+               if(lfta_htsize.count(split_queries[l]->query_name)>0){
+                       split_queries[l]->query_plan[0]->set_definition("aggregate_slots",int_to_string(lfta_htsize[split_queries[l]->query_name]));
+               }
+
+
+               lfta_names[split_queries[l]->query_name] = lfta_list.size();
+               split_queries[l]->set_gid(lfta_list.size());  // set lfta global id
+               lfta_list.push_back(split_queries[l]);
+               lfta_mach_lists[lmach].push_back(split_queries[l]);
+
+//                     THe following is a hack,
+//                     as I should be generating LFTA code through
+//                     the stream_query object.
+               split_queries[l]->query_plan[0]->bind_to_schema(Schema);
+//             split_queries[l]->query_plan[0]->definitions = split_queries[l]->defines;
+
+/*
+//                             Create query description to embed in lfta.c
+               string lfta_schema_str = split_queries[l]->make_schema();
+               string lfta_schema_embed = make_C_embedded_string(lfta_schema_str);
+
+//                             get NIC capabilities.
+               int erri;
+               nic_property *nicprop = NULL;
+               vector<string> iface_codegen_type = ifaces_db->get_iface_vals(lmach,liface,"iface_codegen_type",erri,err_str);
+               if(iface_codegen_type.size()){
+                       nicprop = npdb->get_nic_property(iface_codegen_type[0],erri);
+                       if(!nicprop){
+                               fprintf(stderr,"ERROR cannot load nic properties %s for interface %s of machine %s for lfta codegen\n",iface_codegen_type[0].c_str(), liface.c_str(), lmach.c_str());
+                                       exit(1);
+                       }
+               }
+
+               lfta_val[lmach] += generate_lfta_block(split_queries[l]->query_plan[0], Schema, split_queries[l]->get_gid(), Ext_fcns, lfta_schema_embed, ifaces_db,nicprop);
+*/
+
+               snap_lengths.push_back(compute_snap_len(split_queries[l]->query_plan[0], Schema));
+               query_names.push_back(split_queries[l]->query_name);
+               mach_query_names[lmach].push_back(query_names.size()-1);
+//                     NOTE: I will assume a 1-1 correspondance between
+//                     mach_query_names[lmach] and lfta_mach_lists[lmach]
+//                     where mach_query_names[lmach][i] contains the index into
+//                     query_names, which names the lfta, and
+//                     mach_query_names[lmach][i] is the stream_query * of the
+//                     corresponding lfta.
+//                     Later, lfta_iface_qnames are the query names matching lfta_iface_lists
+
+
+
+               // check if lfta is reusable
+               // FTA is reusable if reusable option is set explicitly or it doesn't have any parameters
+
+               bool lfta_reusable = false;
+               if (split_queries[l]->query_plan[0]->get_val_of_def("reusable") == "yes" ||
+                       split_queries[l]->query_plan[0]->get_param_tbl()->size() == 0) {
+                       lfta_reusable = true;
+               }
+               lfta_reuse_options.push_back(lfta_reusable);
+
+               // LFTA will inherit the liveness timeout specification from the containing query
+               // it is too conservative as lfta are expected to spend less time per tuple
+               // then full query
+
+               // extract liveness timeout from query definition
+               int liveness_timeout = atoi(split_queries[l]->query_plan[0]->get_val_of_def("liveness_timeout").c_str());
+               if (!liveness_timeout) {
+//                 fprintf(stderr, "WARNING: No liveness timeout specified for lfta %s, using default value of %d\n",
+//                   split_queries[l]->query_name.c_str(), DEFAULT_UDOP_LIVENESS_TIMEOUT);
+                   liveness_timeout = DEFAULT_UDOP_LIVENESS_TIMEOUT;
+               }
+               lfta_liveness_timeouts.push_back(liveness_timeout);
+
+//                     Add it to the schema
+               table_def *td = split_queries[l]->get_output_tabledef();
+               Schema->append_table(td);
+//printf("added lfta %d (%s)\n",l,split_queries[l]->query_name.c_str());
+
+         }
+        }
+
+//                             If the output is lfta-only, dump out the query name.
+      if(split_queries.size() == 1 && !hfta_returned){
+        if(output_query_names ){
+           fprintf(query_name_output,"%s L\n",split_queries[0]->query_name.c_str());
+               }
+/*
+else{
+           fprintf(stderr,"query name is %s\n",split_queries[0]->query_name.c_str());
+               }
+*/
+
+/*
+//                             output schema summary
+               if(output_schema_summary){
+                       dump_summary(split_queries[0]);
+               }
+*/
+      }
+
+
+         if(hfta_returned){            // query also has an HFTA component
+               int hfta_nbr = split_queries.size()-1;
+
+                       hfta_list.push_back(split_queries[hfta_nbr]);
+
+//                                     report on generated query names
+        if(output_query_names){
+                       string hfta_name =split_queries[hfta_nbr]->query_name;
+               fprintf(query_name_output,"%s H\n",hfta_name.c_str());
+                       for(l=0;l<hfta_nbr;++l){
+                               string lfta_name =split_queries[l]->query_name;
+                       fprintf(query_name_output,"%s L\n",lfta_name.c_str());
+                       }
+               }
+//             else{
+//             fprintf(stderr,"query names are ");
+//                     for(l=0;l<hfta_nbr;++l){
+//                             if(l>0) fprintf(stderr,",");
+//                             string fta_name =split_queries[l]->query_name;
+//                     fprintf(stderr," %s",fta_name.c_str());
+//                     }
+//                     fprintf(stderr,"\n");
+//             }
+         }
+
+  }else{
+         fprintf(stderr,"ERROR, query in file %s has a bug.\n",qnodes[i]->file.c_str());
+         fprintf(stderr,"%s\n",rootq->get_error_str().c_str());
+         exit(1);
+  }
+ }
+}
+
+
+//-----------------------------------------------------------------
+//             Compute and propagate the SE in PROTOCOL fields compute a field.
+//-----------------------------------------------------------------
+
+for(i=0;i<lfta_list.size();i++){
+       lfta_list[i]->generate_protocol_se(sq_map, Schema);
+       sq_map[lfta_list[i]->get_sq_name()] = lfta_list[i];
+}
+for(i=0;i<hfta_list.size();i++){
+       hfta_list[i]->generate_protocol_se(sq_map, Schema);
+       sq_map[hfta_list[i]->get_sq_name()] = hfta_list[i];
+}
+
+
+
+//------------------------------------------------------------------------
+//             Perform  individual FTA optimizations
+//-----------------------------------------------------------------------
+
+if (partitioned_mode) {
+
+       // open partition definition file
+       string part_fname = config_dir_path + "partition.txt";
+
+       FILE* partfd = fopen(part_fname.c_str(), "r");
+       if (!partfd) {
+               fprintf(stderr,"ERROR, unable to open partition definition file %s\n",part_fname.c_str());
+               exit(1);
+       }
+       PartnParser_setfileinput(partfd);
+       if (PartnParserparse()) {
+               fprintf(stderr,"ERROR, unable to parse partition definition file %s\n",part_fname.c_str());
+               exit(1);
+       }
+       fclose(partfd);
+}
+
+
+print_hftas("preopt_hfta_info.txt", hfta_list, lfta_names, query_names, interface_names);
+
+int num_hfta = hfta_list.size();
+for(i=0; i < hfta_list.size(); ++i){
+       hfta_list[i]->optimize(hfta_list, lfta_names, interface_names, machine_names, Ext_fcns, Schema, ifaces_db, partn_parse_result);
+}
+
+//                     Add all new hftas to schema
+for(i=num_hfta; i < hfta_list.size(); ++i){
+               table_def *td = hfta_list[i]->get_output_tabledef();
+               Schema->append_table(td);
+}
+
+print_hftas("postopt_hfta_info.txt", hfta_list, lfta_names, query_names, interface_names);
+
+
+
+//------------------------------------------------------------------------
+//             Do global (cross-fta) optimization
+//-----------------------------------------------------------------------
+
+
+
+
+
+
+set<string> extra_external_libs;
+
+for(i=0;i<hfta_list.size();++i){               // query also has an HFTA component
+
+               if(! debug_only){
+//                                     build hfta file name, create output
+           if(numeric_hfta_flname){
+            sprintf(tmpstr,"hfta_%d",hfta_count);
+                       hfta_names.push_back(tmpstr);
+            sprintf(tmpstr,"hfta_%d.cc",hfta_count);
+         }else{
+            sprintf(tmpstr,"hfta_%s",hfta_list[i]->query_name.c_str());
+                       hfta_names.push_back(tmpstr);
+            sprintf(tmpstr,"hfta_%s.cc",hfta_list[i]->query_name.c_str());
+          }
+                 FILE *hfta_fl = fopen(tmpstr,"w");
+                 if(hfta_fl == NULL){
+                       fprintf(stderr,"ERROR can't open fta output file %s\n",tmpstr);
+                       exit(1);
+                 }
+                 fprintf(hfta_fl,"%s\n\n",hfta_list[i]->generate_hfta(Schema, Ext_fcns, opviews, distributed_mode).c_str());
+
+//                     If there is a field verifier, warn about
+//                     lack of compatability
+//                             NOTE : this code assumes that visible non-lfta queries
+//                             are those at the root of a stream query.
+                 string hfta_comment;
+                 string hfta_title;
+                 string hfta_namespace;
+                 if(hfta_list[i]->defines.count("comment")>0)
+                       hfta_comment = hfta_list[i]->defines["comment"];
+                 if(hfta_list[i]->defines.count("Comment")>0)
+                       hfta_comment = hfta_list[i]->defines["Comment"];
+                 if(hfta_list[i]->defines.count("COMMENT")>0)
+                       hfta_comment = hfta_list[i]->defines["COMMENT"];
+                 if(hfta_list[i]->defines.count("title")>0)
+                       hfta_title = hfta_list[i]->defines["title"];
+                 if(hfta_list[i]->defines.count("Title")>0)
+                       hfta_title = hfta_list[i]->defines["Title"];
+                 if(hfta_list[i]->defines.count("TITLE")>0)
+                       hfta_title = hfta_list[i]->defines["TITLE"];
+                 if(hfta_list[i]->defines.count("namespace")>0)
+                       hfta_namespace = hfta_list[i]->defines["namespace"];
+                 if(hfta_list[i]->defines.count("Namespace")>0)
+                       hfta_namespace = hfta_list[i]->defines["Namespace"];
+                 if(hfta_list[i]->defines.count("Namespace")>0)
+                       hfta_namespace = hfta_list[i]->defines["Namespace"];
+
+                 if(field_verifier != NULL){
+                       string warning_str;
+                       if(hfta_comment == "")
+                               warning_str += "\tcomment not found.\n";
+                       if(hfta_title == "")
+                               warning_str += "\ttitle not found.\n";
+                       if(hfta_namespace == "")
+                               warning_str += "\tnamespace not found.\n";
+
+                       vector<field_entry *> flds = hfta_list[i]->get_output_tabledef()->get_fields();
+                       int fi;
+                       for(fi=0;fi<flds.size();fi++){
+                               field_verifier->verify_field(flds[fi]->get_name(),flds[fi]->get_type(),warning_str);
+                       }
+                       if(warning_str != "")
+                               fprintf(stderr,"Warning, in HFTA stream %s:\n%s",
+                                       hfta_list[i]->get_output_tabledef()->get_tbl_name().c_str(),warning_str.c_str());
+                 }
+
+                 fprintf(qtree_output,"\t<HFTA name='%s'>\n",hfta_list[i]->get_output_tabledef()->get_tbl_name().c_str());
+                 if(hfta_comment != "")
+                       fprintf(qtree_output,"\t\t<Description value='%s' />\n",hfta_comment.c_str());
+                 if(hfta_title != "")
+                       fprintf(qtree_output,"\t\t<Title value='%s' />\n",hfta_title.c_str());
+                 if(hfta_namespace != "")
+                       fprintf(qtree_output,"\t\t<Namespace value='%s' />\n",hfta_namespace.c_str());
+                 fprintf(qtree_output,"\t\t<FileName value='%s' />\n",tmpstr);
+                 fprintf(qtree_output,"\t\t<Rate value='100' />\n");
+
+//                             write info about fields to qtree.xml
+                 vector<field_entry *> flds = hfta_list[i]->get_output_tabledef()->get_fields();
+                 int fi;
+                 for(fi=0;fi<flds.size();fi++){
+                       fprintf(qtree_output,"\t\t<Field name='%s' pos='%d' type='%s' ",flds[fi]->get_name().c_str(), fi, flds[fi]->get_type().c_str());
+                       if(flds[fi]->get_modifier_list()->size()){
+                               fprintf(qtree_output,"mods='%s' ", flds[fi]->get_modifier_list()->to_string().c_str());
+                       }
+                       fprintf(qtree_output," />\n");
+                 }
+
+                 // extract liveness timeout from query definition
+                 int liveness_timeout = atoi(hfta_list[i]->query_plan[hfta_list[i]->qhead]->get_val_of_def("liveness_timeout").c_str());
+                 if (!liveness_timeout) {
+//                 fprintf(stderr, "WARNING: No liveness timeout specified for hfta %s, using default value of %d\n",
+//                   hfta_list[i]->get_output_tabledef()->get_tbl_name().c_str(), DEFAULT_UDOP_LIVENESS_TIMEOUT);
+                   liveness_timeout = DEFAULT_UDOP_LIVENESS_TIMEOUT;
+                 }
+                 fprintf(qtree_output,"\t\t<LivenessTimeout value='%d' />\n", liveness_timeout);
+
+                 vector<tablevar_t *> tmp_tv = hfta_list[i]->get_input_tables();
+                 int itv;
+                 for(itv=0;itv<tmp_tv.size();++itv){
+                       fprintf(qtree_output,"\t\t<ReadsFrom value='%s' />\n",tmp_tv[itv]->get_schema_name().c_str());
+                 }
+                 string ifrs = hfta_list[i]->collect_refd_ifaces();
+                 if(ifrs != ""){
+                       fprintf(qtree_output,"\t\t<Ifaces_referenced value='%s'/>\n",ifrs.c_str());
+                 }
+                 fprintf(qtree_output,"\t</HFTA>\n");
+
+                 fclose(hfta_fl);
+               }else{
+//                                     debug only -- do code generation to catch generation-time errors.
+                 hfta_list[i]->generate_hfta(Schema, Ext_fcns,opviews, distributed_mode);
+               }
+
+               hfta_count++;   // for hfta file names with numeric suffixes
+
+               hfta_list[i]->get_external_libs(extra_external_libs);
+
+         }
+
+string ext_lib_string;
+set<string>::iterator ssi_el;
+for(ssi_el=extra_external_libs.begin();ssi_el!=extra_external_libs.end();++ssi_el)
+       ext_lib_string += (*ssi_el)+" ";
+
+
+
+//                     Report on the set of operator views
+  for(i=0;i<opviews.size();++i){
+       opview_entry *opve = opviews.get_entry(i);
+       fprintf(qtree_output,"\t<UDOP name='%s' >\n",opve->view_name.c_str());
+       fprintf(qtree_output,"\t\t<FileName value='%s' />\n",opve->exec_fl.c_str());
+       fprintf(qtree_output,"\t\t<Parent value='%s' />\n",opve->root_name.c_str());
+       fprintf(qtree_output,"\t\t<Alias value='%s' />\n",opve->udop_alias.c_str());
+       fprintf(qtree_output,"\t\t<Rate value='100' />\n");
+
+       if (!opve->liveness_timeout) {
+//             fprintf(stderr, "WARNING: No liveness timeout specified for view %s, using default value of %d\n",
+//                     opve->view_name.c_str(), DEFAULT_UDOP_LIVENESS_TIMEOUT);
+               opve->liveness_timeout = DEFAULT_UDOP_LIVENESS_TIMEOUT;
+       }
+       fprintf(qtree_output,"\t\t<LivenessTimeout value='%d' />\n", opve->liveness_timeout);
+    int j;
+       for(j=0;j<opve->subq_names.size();j++)
+               fprintf(qtree_output,"\t\t<ReadsFrom value='%s' />\n",opve->subq_names[j].c_str());
+       fprintf(qtree_output,"\t</UDOP>\n");
+  }
+
+
+//-----------------------------------------------------------------
+
+//                     Create interface-specific meta code files.
+//                             first, open and parse the interface resources file.
+       ifaces_db = new ifq_t();
+    ierr = "";
+       if(ifaces_db->load_ifaces(ifx_fname,use_live_hosts_file,distributed_mode,ierr)){
+               fprintf(stderr,"ERROR, can't load interface resource file %s :\n%s",
+                               ifx_fname.c_str(), ierr.c_str());
+               exit(1);
+       }
+
+       map<string, vector<stream_query *> >::iterator svsi;
+       for(svsi=lfta_mach_lists.begin(); svsi!=lfta_mach_lists.end(); ++svsi){
+               string lmach = (*svsi).first;
+
+       //              For this machine, create a set of lftas per interface.
+               vector<stream_query *> mach_lftas = (*svsi).second;
+               map<string, vector<stream_query *> > lfta_iface_lists;
+               int li;
+               for(li=0;li<mach_lftas.size();++li){
+                       vector<tablevar_t *> tvec =  mach_lftas[li]->query_plan[0]->get_input_tbls();
+                       string lfta_iface = tvec[0]->get_interface();
+                       lfta_iface_lists[lfta_iface].push_back(mach_lftas[li]);
+               }
+
+               map<string, vector<stream_query *> >::iterator lsvsi;
+               for(lsvsi=lfta_iface_lists.begin(); lsvsi!=lfta_iface_lists.end(); ++lsvsi){
+                       int erri;
+                       string liface = (*lsvsi).first;
+                       vector<stream_query *> iface_lftas = (*lsvsi).second;
+                       vector<string> iface_codegen_type = ifaces_db->get_iface_vals(lmach,liface,"iface_codegen_type",erri,err_str);
+                       if(iface_codegen_type.size()){
+                               nic_property *nicprop = npdb->get_nic_property(iface_codegen_type[0],erri);
+                               if(!nicprop){
+                                       fprintf(stderr,"ERROR cannot load nic properties %s for interface %s of machine %s\n",iface_codegen_type[0].c_str(), liface.c_str(), lmach.c_str());
+                                       exit(1);
+                               }
+                               string mcs = generate_nic_code(iface_lftas, nicprop);
+                               string mcf_flnm;
+                               if(lmach != "")
+                                 mcf_flnm = lmach + "_"+liface+".mcf";
+                               else
+                                 mcf_flnm = hostname + "_"+liface+".mcf";
+                               FILE *mcf_fl ;
+                               if((mcf_fl = fopen(mcf_flnm.c_str(),"w")) == NULL){
+                                       fprintf(stderr,"Can't open output file %s\n%s\n",mcf_flnm.c_str(),strerror(errno));
+                                       exit(1);
+                               }
+                               fprintf(mcf_fl,"%s",mcs.c_str());
+                               fclose(mcf_fl);
+//printf("mcs of machine %s, iface %s of type %s is \n%s\n",
+//lmach.c_str(), liface.c_str(),iface_codegen_type[0].c_str(), mcs.c_str());
+                       }
+               }
+
+
+       }
+
+
+
+//-----------------------------------------------------------------
+
+
+//                     Find common filter predicates in the LFTAs.
+//                     in addition generate structs to store the temporal attributes unpacked by prefilter
+       
+       map<string, vector<stream_query *> >::iterator ssqi;
+       for(ssqi=lfta_mach_lists.begin(); ssqi!=lfta_mach_lists.end(); ++ssqi){
+
+               string lmach = (*ssqi).first;
+               bool packed_return = false;
+               int li, erri;
+
+
+//     The LFTAs of this machine.
+               vector<stream_query *> mach_lftas = (*ssqi).second;
+//     break up on a per-interface basis.
+               map<string, vector<stream_query *> > lfta_iface_lists;
+               map<string, vector<int> > lfta_iface_qname_ix; // need the query name
+                                                        // for fta_init
+               for(li=0;li<mach_lftas.size();++li){
+                       vector<tablevar_t *> tvec =  mach_lftas[li]->query_plan[0]->get_input_tbls();
+                       string lfta_iface = tvec[0]->get_interface();
+                       lfta_iface_lists[lfta_iface].push_back(mach_lftas[li]);
+                       lfta_iface_qname_ix[lfta_iface].push_back(mach_query_names[lmach][li]);
+               }
+
+
+//     Are the return values "packed"?
+//     This should be done on a per-interface basis.
+//     But this is defunct code for gs-lite
+               for(li=0;li<mach_lftas.size();++li){
+                 vector<tablevar_t *> tvec =  mach_lftas[li]->query_plan[0]->get_input_tbls();
+                 string liface = tvec[0]->get_interface();
+                 vector<string> iface_codegen_type = ifaces_db->get_iface_vals(lmach,liface,"iface_codegen_type",erri,err_str);
+                 if(iface_codegen_type.size()){
+                       if(npdb->get_nic_prop_val(iface_codegen_type[0],"Return",erri) == "Packed"){
+                         packed_return = true;
+                       }
+                 }
+               }
+
+
+// Separate lftas by interface, collect results on a per-interface basis.
+
+               vector<cnf_set *> no_preds;     // fallback if there is no prefilter
+               map<string, vector<cnf_set *> > prefilter_preds;
+               set<unsigned int> pred_ids;     // this can be global for all interfaces
+               for(auto mvsi=lfta_iface_lists.begin(); mvsi!=lfta_iface_lists.end(); ++mvsi){
+                       string liface = (*mvsi).first;
+                       vector<cnf_set *> empty_list;
+                       prefilter_preds[liface] = empty_list;
+                       if(! packed_return){
+                               get_common_lfta_filter(lfta_iface_lists[liface], Schema,Ext_fcns, prefilter_preds[liface], pred_ids);
+                       }
+
+//                             get NIC capabilities.  (Is this needed?)
+                       nic_property *nicprop = NULL;
+                       vector<string> iface_codegen_type = ifaces_db->get_iface_vals(lmach,liface,"iface_codegen_type",erri,err_str);
+                       if(iface_codegen_type.size()){
+                               nicprop = npdb->get_nic_property(iface_codegen_type[0],erri);
+                               if(!nicprop){
+                                       fprintf(stderr,"ERROR cannot load nic properties %s for interface %s of machine %s for lfta codegen\n",iface_codegen_type[0].c_str(), liface.c_str(), lmach.c_str());
+                                       exit(1);
+                               }
+                       }
+               }
+
+
+//             Now that we know the prefilter preds, generate the lfta code.
+//     Do this for all lftas in this machine.
+               for(li=0;li<mach_lftas.size();++li){
+                       set<unsigned int> subsumed_preds;
+                       set<unsigned int>::iterator sii;
+#ifdef PREFILTER_OK
+                       for(sii=pred_ids.begin();sii!=pred_ids.end();++sii){
+                               int pid = (*sii);
+                               if((pid>>16) == li){
+                                       subsumed_preds.insert(pid & 0xffff);
+                               }
+                       }
+#endif
+                       string lfta_schema_str = mach_lftas[li]->make_schema();
+                       string lfta_schema_embed = make_C_embedded_string(lfta_schema_str);
+                       nic_property *nicprop = NULL; // no NIC properties?
+                       lfta_val[lmach] += generate_lfta_block(mach_lftas[li]->query_plan[0], Schema, mach_lftas[li]->get_gid(), Ext_fcns, lfta_schema_embed, ifaces_db,nicprop,subsumed_preds);
+               }
+
+
+//                     generate structs to store the temporal attributes
+//                     unpacked by prefilter
+               col_id_set temp_cids;
+               get_prefilter_temporal_cids(lfta_mach_lists[lmach], temp_cids);
+               lfta_prefilter_val[lmach] = generate_lfta_prefilter_struct(temp_cids, Schema);
+
+//                     Compute the lfta bit signatures and the lfta colrefs
+//     do this on a per-interface basis
+#ifdef PREFILTER_OK
+                       lfta_prefilter_val[lmach] += "#define PREFILTER_DEFINED 1;\n\n";
+#endif
+               map<string, vector<long long int> > lfta_sigs; // used again later
+               for(auto mvsi=lfta_iface_lists.begin(); mvsi!=lfta_iface_lists.end(); ++mvsi){
+                       string liface = (*mvsi).first;
+                       vector<long long int> empty_list;
+                       lfta_sigs[liface] = empty_list;
+
+                       vector<col_id_set> lfta_cols;
+                       vector<int> lfta_snap_length;
+                       for(li=0;li<lfta_iface_lists[liface].size();++li){
+                               unsigned long long int mask=0, bpos=1;
+                               int f_pos;
+                               for(f_pos=0;f_pos<prefilter_preds[liface].size();++f_pos){
+                                       if(prefilter_preds[liface][f_pos]->lfta_id.count(li))
+                                               mask |= bpos;
+                                       bpos = bpos << 1;
+                               }
+                               lfta_sigs[liface].push_back(mask);
+                               lfta_cols.push_back(lfta_iface_lists[liface][li]->query_plan[0]->get_colrefs(true,Schema));
+                               lfta_snap_length.push_back(compute_snap_len(lfta_iface_lists[liface][li]->query_plan[0], Schema));
+                       }
+
+//for(li=0;li<mach_lftas.size();++li){
+//printf("lfta %d, msak is %llu\n",li,lfta_sigs[li]);
+//col_id_set::iterator tcisi;
+//for(tcisi=lfta_cols[li].begin(); tcisi!=lfta_cols[li].end();++tcisi){
+//printf("\t%s %d (%d)\n",(*tcisi).field.c_str(),(*tcisi).schema_ref, (*tcisi).tblvar_ref);
+//}
+//}
+
+
+//                     generate the prefilter
+//     Do this on a per-interface basis, except for the #define
+#ifdef PREFILTER_OK
+//                     lfta_prefilter_val[lmach] += "#define PREFILTER_DEFINED 1;\n\n";
+                       lfta_val[lmach] += generate_lfta_prefilter(prefilter_preds[liface], temp_cids, Schema, Ext_fcns, lfta_cols, lfta_sigs[liface], lfta_snap_length, liface);
+#else
+                       lfta_val[lmach] += generate_lfta_prefilter(no_preds, temp_cids, Schema,Ext_fcns,  lfta_cols, lfta_sigs[liface], lfta_snap_length, liface);
+
+#endif
+               }
+
+//                     Generate interface parameter lookup function
+         lfta_val[lmach] += "// lookup interface properties by name\n";
+         lfta_val[lmach] += "// mulitple values of given property returned in the same string separated by commas\n";
+         lfta_val[lmach] += "// returns NULL if given property does not exist\n";
+         lfta_val[lmach] += "gs_sp_t get_iface_properties (const gs_sp_t iface_name, const gs_sp_t property_name) {\n";
+
+//       collect a lit of interface names used by queries running on this host
+         set<std::string> iface_names;
+         for(i=0;i<mach_query_names[lmach].size();i++){
+               int mi = mach_query_names[lmach][i];
+               stream_query *lfta_sq = lfta_mach_lists[lmach][i];
+
+               if(interface_names[mi]=="")
+                       iface_names.insert("DEFAULTDEV");
+               else
+                       iface_names.insert(interface_names[mi]);
+         }
+
+//       generate interface property lookup code for every interface
+         set<std::string>::iterator sir;
+         for (sir = iface_names.begin(); sir != iface_names.end(); sir++) {
+               if (sir == iface_names.begin())
+                       lfta_val[lmach] += "\tif (!strcmp(iface_name, \"" + *sir + "\")) {\n";
+               else
+                       lfta_val[lmach] += "\t} else if (!strcmp(iface_name, \"" + *sir + "\")) {\n";
+
+               // iterate through interface properties
+               vector<string> iface_properties = ifaces_db->get_iface_properties(lmach,*sir,erri,err_str);
+               if (erri) {
+                       fprintf(stderr,"ERROR cannot retrieve interface properties for %s.%s, %s\n",lmach.c_str(), sir->c_str(), err_str.c_str());
+                       exit(1);
+               }
+               if (iface_properties.empty())
+                       lfta_val[lmach] += "\t\treturn NULL;\n";
+               else {
+                       for (int i = 0; i < iface_properties.size(); ++i) {
+                               if (i == 0)
+                                       lfta_val[lmach] += "\t\tif (!strcmp(property_name, \"" + iface_properties[i] + "\")) {\n";
+                               else
+                                       lfta_val[lmach] += "\t\t} else if (!strcmp(property_name, \"" + iface_properties[i] + "\")) {\n";
+
+                               // combine all values for the interface property using comma separator
+                               vector<string> vals = ifaces_db->get_iface_vals(lmach,*sir,iface_properties[i],erri,err_str);
+                               for (int j = 0; j < vals.size(); ++j) {
+                                       lfta_val[lmach] += "\t\t\treturn \"" + vals[j];
+                                       if (j != vals.size()-1)
+                                               lfta_val[lmach] += ",";
+                               }
+                               lfta_val[lmach] += "\";\n";
+                       }
+                       lfta_val[lmach] += "\t\t} else\n";
+                       lfta_val[lmach] += "\t\t\treturn NULL;\n";
+               }
+         }
+         lfta_val[lmach] += "\t} else\n";
+         lfta_val[lmach] += "\t\treturn NULL;\n";
+         lfta_val[lmach] += "}\n\n";
+
+
+//                     Generate a full list of FTAs for clearinghouse reference
+         lfta_val[lmach] += "// list of FTAs clearinghouse expects to register themselves\n";
+         lfta_val[lmach] += "const gs_sp_t fta_names[] = {";
+
+         for (i = 0; i < query_names.size(); ++i) {
+                  if (i)
+                         lfta_val[lmach] += ", ";
+                  lfta_val[lmach] += "\"" + query_names[i] + "\"";
+         }
+         for (i = 0; i < hfta_list.size(); ++i) {
+                  lfta_val[lmach] += ", \"" + hfta_list[i]->query_name + "\"";
+         }
+         lfta_val[lmach] += ", NULL};\n\n";
+
+
+//                     Add the initialization function to lfta.c
+//     Change to accept the interface name, and 
+//     set the prefilter function accordingly.
+//     see the example in demo/err2
+         lfta_val[lmach] += "void fta_init(gs_sp_t device){\n";
+
+//       for(i=0;i<mach_query_names[lmach].size();i++)
+//             int mi = mach_query_names[lmach][i];
+//             stream_query *lfta_sq = lfta_mach_lists[lmach][i];
+
+         for(auto mvsi=lfta_iface_lists.begin(); mvsi!=lfta_iface_lists.end(); ++mvsi){
+               string liface = (*mvsi).first;
+               vector<stream_query *> lfta_list = (*mvsi).second;
+               for(i=0;i<lfta_list.size();i++){
+                       stream_query *lfta_sq = lfta_list[i];
+                       int mi = lfta_iface_qname_ix[liface][i];
+               
+                       fprintf(stderr,"interface %s, LFTA %d, snap length is %d\n",liface.c_str(),mi,snap_lengths[mi]);
+
+               lfta_val[lmach] += "\tfta_register(\""+query_names[mi]+"\", " + (lfta_reuse_options[mi]?"1":"0") + ", ";
+               if(interface_names[mi]=="")
+                               lfta_val[lmach]+="DEFAULTDEV";
+               else
+                               lfta_val[lmach]+='"'+interface_names[mi]+'"';
+
+               lfta_val[lmach] += ", "+generate_alloc_name(query_names[mi])
+                       +"\n#ifndef LFTA_IN_NIC\n\t,"+generate_schema_string_name(query_names[mi])
+                       +"\n#endif\n";
+                               sprintf(tmpstr,",%d",snap_lengths[mi]);
+                       lfta_val[lmach] += tmpstr;
+
+//                     unsigned long long int mask=0, bpos=1;
+//                     int f_pos;
+//                     for(f_pos=0;f_pos<prefilter_preds.size();++f_pos){
+//                             if(prefilter_preds[f_pos]->lfta_id.count(i))
+//                                     mask |= bpos;
+//                             bpos = bpos << 1;
+//                     }
+
+#ifdef PREFILTER_OK
+//                     sprintf(tmpstr,",%lluull",mask);
+                       sprintf(tmpstr,",%lluull",lfta_sigs[liface][i]);
+                       lfta_val[lmach]+=tmpstr;
+#else
+                       lfta_val[lmach] += ",0ull";
+#endif
+
+                       lfta_val[lmach] += ");\n";
+
+
+
+//    End of lfta prefilter stuff
+// --------------------------------------------------
+
+//                     If there is a field verifier, warn about
+//                     lack of compatability
+                 string lfta_comment;
+                 string lfta_title;
+                 string lfta_namespace;
+                 map<string,string> ldefs = lfta_sq->query_plan[0]->get_definitions();
+                 if(ldefs.count("comment")>0)
+                       lfta_comment = lfta_sq->defines["comment"];
+                 if(ldefs.count("Comment")>0)
+                       lfta_comment = lfta_sq->defines["Comment"];
+                 if(ldefs.count("COMMENT")>0)
+                       lfta_comment = lfta_sq->defines["COMMENT"];
+                 if(ldefs.count("title")>0)
+                       lfta_title = lfta_sq->defines["title"];
+                 if(ldefs.count("Title")>0)
+                       lfta_title = lfta_sq->defines["Title"];
+                 if(ldefs.count("TITLE")>0)
+                       lfta_title = lfta_sq->defines["TITLE"];
+                 if(ldefs.count("NAMESPACE")>0)
+                       lfta_namespace = lfta_sq->defines["NAMESPACE"];
+                 if(ldefs.count("Namespace")>0)
+                       lfta_namespace = lfta_sq->defines["Namespace"];
+                 if(ldefs.count("namespace")>0)
+                       lfta_namespace = lfta_sq->defines["namespace"];
+
+                 string lfta_ht_size;
+                 if(lfta_sq->query_plan[0]->node_type()== "sgah_qpn" || lfta_sq->query_plan[0]->node_type()== "rsgah_qpn")
+                       lfta_ht_size = int_to_string(DEFAULT_LFTA_HASH_TABLE_SIZE);
+                 if(ldefs.count("aggregate_slots")>0){
+                       lfta_ht_size = ldefs["aggregate_slots"];
+                 }
+
+//                     NOTE : I'm assuming that visible lftas do not start with _fta.
+//                             -- will fail for non-visible simple selection queries.
+               if(field_verifier != NULL && query_names[mi].substr(0,1) != "_"){
+                       string warning_str;
+                       if(lfta_comment == "")
+                               warning_str += "\tcomment not found.\n";
+                       if(lfta_title == "")
+                               warning_str += "\ttitle not found.\n";
+                       if(lfta_namespace == "")
+                               warning_str += "\tnamespace not found.\n";
+
+                       vector<field_entry *> flds = lfta_sq->get_output_tabledef()->get_fields();
+                       int fi;
+                       for(fi=0;fi<flds.size();fi++){
+                               field_verifier->verify_field(flds[fi]->get_name(),flds[fi]->get_type(),warning_str);
+                       }
+                       if(warning_str != "")
+                               fprintf(stderr,"Warning, in LFTA stream %s:\n%s",
+                                       query_names[mi].c_str(),warning_str.c_str());
+               }
+
+
+//                     Create qtree output
+               fprintf(qtree_output,"\t<LFTA name='%s' >\n",query_names[mi].c_str());
+                  if(lfta_comment != "")
+                        fprintf(qtree_output,"\t\t<Description value='%s' />\n",lfta_comment.c_str());
+                  if(lfta_title != "")
+                        fprintf(qtree_output,"\t\t<Title value='%s' />\n",lfta_title.c_str());
+                  if(lfta_namespace != "")
+                        fprintf(qtree_output,"\t\t<Namespace value='%s' />\n",lfta_namespace.c_str());
+                  if(lfta_ht_size != "")
+                        fprintf(qtree_output,"\t\t<HtSize value='%s' />\n",lfta_ht_size.c_str());
+               if(lmach != "")
+                 fprintf(qtree_output,"\t\t<Host value='%s' />\n",lmach.c_str());
+               else
+                 fprintf(qtree_output,"\t\t<Host value='%s' />\n",hostname.c_str());
+               fprintf(qtree_output,"\t\t<Interface  value='%s' />\n",interface_names[mi].c_str());
+               fprintf(qtree_output,"\t\t<ReadsFrom value='%s' />\n",interface_names[mi].c_str());
+               fprintf(qtree_output,"\t\t<Rate value='100' />\n");
+               fprintf(qtree_output,"\t\t<LivenessTimeout value='%d' />\n", lfta_liveness_timeouts[mi]);
+//                             write info about fields to qtree.xml
+                 vector<field_entry *> flds = lfta_sq->get_output_tabledef()->get_fields();
+                 int fi;
+                 for(fi=0;fi<flds.size();fi++){
+                       fprintf(qtree_output,"\t\t<Field name='%s' pos='%d' type='%s' ",flds[fi]->get_name().c_str(), fi, flds[fi]->get_type().c_str());
+                       if(flds[fi]->get_modifier_list()->size()){
+                               fprintf(qtree_output,"mods='%s' ", flds[fi]->get_modifier_list()->to_string().c_str());
+                       }
+                       fprintf(qtree_output," />\n");
+                 }
+               fprintf(qtree_output,"\t</LFTA>\n");
+
+
+           }
+         }
+
+         for(auto mvsi=lfta_iface_lists.begin(); mvsi!=lfta_iface_lists.end(); ++mvsi){
+                       string liface = (*mvsi).first;
+                       lfta_val[lmach] += 
+"      if (!strcmp(device, \""+liface+"\")) \n"
+"              lfta_prefilter = &lfta_prefilter_"+liface+"; \n"
+;
+               }
+               lfta_val[lmach] += 
+"      if(lfta_prefilter == NULL){\n"
+"              fprintf(stderr, \"Error, interface %s not found in fta_init.\\n\",device);\n"
+"              exit(1);\n"
+"      }\n"
+;
+
+
+
+         lfta_val[lmach] += "}\n\n";
+
+      if(!(debug_only || hfta_only) ){
+               string lfta_flnm;
+               if(lmach != "")
+                 lfta_flnm = lmach + "_lfta.c";
+               else
+                 lfta_flnm = hostname + "_lfta.c";
+               if((lfta_out = fopen(lfta_flnm.c_str(),"w")) == NULL){
+                       fprintf(stderr,"Can't open output file %s\n%s\n","lfta.c",strerror(errno));
+                       exit(1);
+               }
+             fprintf(lfta_out,"%s",lfta_header.c_str());
+             fprintf(lfta_out,"%s",lfta_prefilter_val[lmach].c_str());
+             fprintf(lfta_out,"%s",lfta_val[lmach].c_str());
+               fclose(lfta_out);
+         }
+       }
+
+//             Say what are the operators which must execute
+       if(opviews.size()>0)
+               fprintf(stderr,"The queries use the following external operators:\n");
+       for(i=0;i<opviews.size();++i){
+               opview_entry *opv = opviews.get_entry(i);
+               fprintf(stderr,"\t%s\n",opv->view_name.c_str());
+       }
+
+       if(create_makefile)
+               generate_makefile(input_file_names, nfiles, hfta_names, opviews,
+               machine_names, schema_file_name,
+               interface_names,
+               ifaces_db, config_dir_path,use_pads,ext_lib_string, rts_hload);
+
+
+       fprintf(qtree_output,"</QueryNodes>\n");
+
+       return(0);
+}
+
+////////////////////////////////////////////////////////////
+
+void generate_makefile(vector<string> &input_file_names, int nfiles,
+                                          vector<string> &hfta_names, opview_set &opviews,
+                                               vector<string> &machine_names,
+                                               string schema_file_name,
+                                               vector<string> &interface_names,
+                                               ifq_t *ifdb, string &config_dir_path,
+                                               bool use_pads,
+                                               string extra_libs,
+                                               map<string, vector<int> > &rts_hload
+                                        ){
+       int i,j;
+
+       if(config_dir_path != ""){
+               config_dir_path = "-C "+config_dir_path;
+       }
+
+       struct stat sb;
+       bool libz_exists = stat((root_path+"/lib/libz.a").c_str(),&sb) >= 0;
+       bool libast_exists = stat((root_path+"/lib/libast.a").c_str(),&sb) >= 0;
+
+//     if(libz_exists && !libast_exists){
+//             fprintf(stderr,"Configuration ERROR: ../../lib/libz.a exists but ../../lib/libast.a dows not.\n");
+//             exit(1);
+//     }
+
+//                     Get set of operator executable files to run
+       set<string> op_fls;
+       set<string>::iterator ssi;
+       for(i=0;i<opviews.size();++i){
+               opview_entry *opv = opviews.get_entry(i);
+               if(opv->exec_fl != "") op_fls.insert(opv->exec_fl);
+       }
+
+       FILE *outfl = fopen("Makefile", "w");
+       if(outfl==NULL){
+               fprintf(stderr,"Can't open Makefile for write, exiting.\n");
+               exit(0);
+       }
+
+       fputs(
+("CPP= g++ -O3 -g -I "+root_path+"/include  -I "+root_path+"/include/hfta\n"
+"CC= gcc -O3 -g -I . -I "+root_path+"/include -I "+root_path+"/include/lfta"
+).c_str(), outfl
+);
+       if(generate_stats)
+               fprintf(outfl,"  -DLFTA_STATS");
+
+       fprintf(outfl,
+"\n"
+"\n"
+"all: rts");
+       for(i=0;i<hfta_names.size();++i)
+               fprintf(outfl," %s",hfta_names[i].c_str());
+       fputs(
+("\n"
+"\n"
+"rts: lfta.o "+root_path+"/lib/libgscphost.a "+root_path+"/lib/libgscplftaaux.a "+root_path+"/lib/libgscprts.a  "+root_path+"/lib/libclearinghouse.a\n"
+"\tg++ -O3 -g -o rts lfta.o ").c_str(), outfl);
+       if(use_pads)
+               fprintf(outfl,"-L. ");
+       fputs(
+("-L"+root_path+"/lib -lgscplftaaux ").c_str(), outfl);
+       if(use_pads)
+               fprintf(outfl,"-lgscppads -lpads ");
+       fprintf(outfl,
+"-lgscprts -lgscphost -lm -lgscpaux -lgscplftaaux  -lclearinghouse -lresolv -lpthread -lgscpinterface -lz");
+       if(use_pads)
+               fprintf(outfl, "-lpz -lz -lbz ");
+       if(libz_exists && libast_exists)
+               fprintf(outfl,"-last ");
+       if(use_pads)
+               fprintf(outfl, "-ldll -ldl ");
+       fprintf(outfl," -lgscpaux");
+#ifdef GCOV
+       fprintf(outfl," -fprofile-arcs");
+#endif
+       fprintf(outfl,
+"\n"
+"\n"
+"lfta.o: %s_lfta.c\n"
+"\t$(CC) -o lfta.o -c %s_lfta.c\n"
+"\n"
+"%s_lfta.c: external_fcns.def %s ",hostname.c_str(), hostname.c_str(), hostname.c_str(),schema_file_name.c_str());
+       for(i=0;i<nfiles;++i)
+               fprintf(outfl," %s",input_file_names[i].c_str());
+       if(hostname == ""){
+               fprintf(outfl,"\n\t%s/bin/translate_fta %s %s ",root_path.c_str(), config_dir_path.c_str(),schema_file_name.c_str());
+       }else{
+               fprintf(outfl,"\n\t%s/bin/translate_fta -h %s %s %s ", root_path.c_str(), hostname.c_str(), config_dir_path.c_str(),schema_file_name.c_str());
+       }
+       for(i=0;i<nfiles;++i)
+               fprintf(outfl," %s",input_file_names[i].c_str());
+       fprintf(outfl,"\n");
+
+       for(i=0;i<hfta_names.size();++i)
+               fprintf(outfl,
+("%s: %s.o\n"
+"\t$(CPP) -o %s %s.o -L"+root_path+"/lib -lgscpapp -lgscphostaux -lgscphost -lgscpinterface -lgscphftaaux -lgscphostaux -lm -lgscpaux -lclearinghouse -lresolv -lpthread -lgscpaux -lgscphftaaux -lgscpaux %s\n"
+"\n"
+"%s.o: %s.cc\n"
+"\t$(CPP) -o %s.o -c %s.cc\n"
+"\n"
+"\n").c_str(),
+    hfta_names[i].c_str(), hfta_names[i].c_str(),
+       hfta_names[i].c_str(), hfta_names[i].c_str(), extra_libs.c_str(),
+       hfta_names[i].c_str(), hfta_names[i].c_str(),
+       hfta_names[i].c_str(), hfta_names[i].c_str()
+               );
+
+       fprintf(outfl,
+("\n"
+"packet_schema.txt:\n"
+"\tln -s "+root_path+"/cfg/packet_schema.txt .\n"
+"\n"
+"external_fcns.def:\n"
+"\tln -s "+root_path+"/cfg/external_fcns.def .\n"
+"\n"
+"clean:\n"
+"\trm -rf core rts *.o  %s_lfta.c  external_fcns.def packet_schema.txt").c_str(),hostname.c_str());
+       for(i=0;i<hfta_names.size();++i)
+               fprintf(outfl," %s %s.cc",hfta_names[i].c_str(),hfta_names[i].c_str());
+       fprintf(outfl,"\n");
+
+       fclose(outfl);
+
+
+
+//             Gather the set of interfaces
+//             TODO : must update to hanndle machines
+//             TODO : lookup interface attributes and add them as a parameter to rts process
+       outfl = fopen("runit", "w");
+       if(outfl==NULL){
+               fprintf(stderr,"Can't open runit for write, exiting.\n");
+               exit(0);
+       }
+
+//             Gather the set of interfaces
+//             Also, gather "base interface names" for use in computing
+//             the hash splitting to virtual interfaces.
+//             TODO : must update to hanndle machines
+       set<string> ifaces;
+       set<string> base_vifaces;       // base interfaces of virtual interfaces
+       map<string, string> ifmachines;
+       map<string, string> ifattrs;
+       for(i=0;i<interface_names.size();++i){
+               ifaces.insert(interface_names[i]);
+               ifmachines[interface_names[i]] = machine_names[i];
+
+               size_t Xpos = interface_names[i].find_last_of("X");
+               if(Xpos!=string::npos){
+                       string iface = interface_names[i].substr(0,Xpos);
+                       base_vifaces.insert(iface);
+               }
+               // get interface attributes and add them to the list
+       }
+
+       fputs(
+("#!/bin/sh\n"
+"./stopit\n"
++root_path+"/bin/gshub.py> /dev/null 2>&1 &\n"
+"sleep 5\n"
+"if [ ! -f gshub.log ]\n"
+"then\n"
+"\techo \"Failed to start bin/gshub.py\"\n"
+"\texit -1\n"
+"fi\n"
+"ADDR=`cat gshub.log`\n"
+"ps opgid= $! >> gs.pids\n"
+"./rts $ADDR default ").c_str(), outfl);
+       int erri;
+       string err_str;
+       for(ssi=ifaces.begin();ssi!=ifaces.end();++ssi){
+               string ifnm = (*ssi);
+               fprintf(outfl, "%s ",ifnm.c_str());
+               vector<string> ifv = ifdb->get_iface_vals(ifmachines[ifnm],ifnm, "Command", erri, err_str);
+               for(j=0;j<ifv.size();++j)
+                       fprintf(outfl, "%s ",ifv[j].c_str());
+       }
+       fprintf(outfl, " &\n");
+       fprintf(outfl, "echo $! >> gs.pids\n");
+       for(i=0;i<hfta_names.size();++i)
+               fprintf(outfl,"./%s $ADDR default &\n",hfta_names[i].c_str());
+
+       for(j=0;j<opviews.opview_list.size();++j){
+               fprintf(outfl,"%s/views/%s %s &\n",root_path.c_str(),opviews.opview_list[j]->exec_fl.c_str(), opviews.opview_list[j]->mangler.c_str());
+       }
+
+       fclose(outfl);
+       system("chmod +x runit");
+
+       outfl = fopen("stopit", "w");
+       if(outfl==NULL){
+               fprintf(stderr,"Can't open stopit for write, exiting.\n");
+               exit(0);
+       }
+
+       fprintf(outfl,"#!/bin/sh\n"
+"rm -f gshub.log\n"
+"if [ ! -f gs.pids ]\n"
+"then\n"
+"exit\n"
+"fi\n"
+"for pgid in `cat gs.pids`\n"
+"do\n"
+"kill -TERM -$pgid\n"
+"done\n"
+"sleep 1\n"
+"for pgid in `cat gs.pids`\n"
+"do\n"
+"kill -9 -$pgid\n"
+"done\n"
+"rm gs.pids\n");
+
+       fclose(outfl);
+       system("chmod +x stopit");
+
+//-----------------------------------------------
+
+/* For now disable support for virtual interfaces
+       outfl = fopen("set_vinterface_hash.bat", "w");
+       if(outfl==NULL){
+               fprintf(stderr,"Can't open set_vinterface_hash.bat for write, exiting.\n");
+               exit(0);
+       }
+
+//             The format should be determined by an entry in the ifres.xml file,
+//             but for now hardcode the only example I have.
+       for(ssi=base_vifaces.begin();ssi!=base_vifaces.end();++ssi){
+               if(rts_hload.count((*ssi))){
+                       string iface_name = (*ssi);
+                       string iface_number = "";
+                       for(j=iface_name.size()-1; j>0 && iface_number == ""; j--){
+                               if(isdigit(iface_name[j])){
+                                       iface_number = iface_name[j];
+                                       if(j>0 && isdigit(iface_name[j-1]))
+                                               iface_number = iface_name[j-1] + iface_number;
+                               }
+                       }
+
+                       fprintf(outfl,"dagconfig -d%s -S hat_range=",iface_number.c_str());
+                       vector<int> halloc = rts_hload[iface_name];
+                       int prev_limit = 0;
+                       for(j=0;j<halloc.size();++j){
+                               if(j>0)
+                                       fprintf(outfl,":");
+                               fprintf(outfl,"%d-%d",prev_limit,halloc[j]);
+                               prev_limit = halloc[j];
+                       }
+                       fprintf(outfl,"\n");
+               }
+       }
+       fclose(outfl);
+       system("chmod +x set_vinterface_hash.bat");
+*/
+}
+
+//             Code for implementing a local schema
+/*
+               table_list qpSchema;
+
+//                             Load the schemas of any LFTAs.
+               int l;
+               for(l=0;l<hfta_nbr;++l){
+                       stream_query *sq0 = split_queries[l];
+                       table_def *td = sq0->get_output_tabledef();
+                       qpSchema.append_table(td);
+               }
+//                             load the schemas of any other ref'd tables.
+//                             (e.g., hftas)
+               vector<tablevar_t *>  input_tbl_names = split_queries[hfta_nbr]->get_input_tables();
+               int ti;
+               for(ti=0;ti<input_tbl_names.size();++ti){
+                       int tbl_ref = qpSchema.get_table_ref(input_tbl_names[ti]->get_schema_name());
+                       if(tbl_ref < 0){
+                               tbl_ref = Schema->get_table_ref(input_tbl_names[ti]->get_schema_name());
+                               if(tbl_ref < 0){
+                                       fprintf(stderr,"ERROR file %s references table %s, which is not in the schema.\n",input_file_names[i].c_str(), (input_tbl_names[ti]->get_schema_name()).c_str());
+                                       exit(1);
+                               }
+                               qpSchema.append_table(Schema->get_table(tbl_ref));
+                       }
+               }
+*/
+
+//             Functions related to parsing.
+
+/*
+static int split_string(char *instr,char sep, char **words,int max_words){
+   char *loc;
+   char *str;
+   int nwords = 0;
+
+   str = instr;
+   words[nwords++] = str;
+   while( (loc = strchr(str,sep)) != NULL){
+        *loc = '\0';
+        str = loc+1;
+        if(nwords >= max_words){
+                fprintf(stderr,"Error in split_string, too many words discovered (max is %d)\n",max_words);
+                nwords = max_words-1;
+        }
+        words[nwords++] = str;
+   }
+
+   return(nwords);
+}
+
+*/
+
diff --git a/src/ftacmp/type_indicators.h b/src/ftacmp/type_indicators.h
new file mode 100644 (file)
index 0000000..1160db1
--- /dev/null
@@ -0,0 +1,37 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef _TYPE_INDICATORS_DEFINED__
+#define _TYPE_INDICATORS_DEFINED__
+
+//     WARNING!
+//     This file replicated in gscpv2/include
+//     These files must be synched!
+
+#define UINT_TYPE 0
+#define INT_TYPE 1
+#define ULLONG_TYPE 2
+#define LLONG_TYPE 3
+#define USHORT_TYPE 4
+#define FLOAT_TYPE 5
+#define BOOL_TYPE 6
+#define VSTR_TYPE 7
+#define TIMEVAL_TYPE 8
+#define IP_TYPE 9
+#define FSTRING_TYPE 10
+#define IPV6_TYPE 11
+#define UNDEFINED_TYPE 12
+
+#endif
+
diff --git a/src/ftacmp/type_objects.cc b/src/ftacmp/type_objects.cc
new file mode 100644 (file)
index 0000000..04f5c86
--- /dev/null
@@ -0,0 +1,1903 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include"type_objects.h"
+
+#include <stdio.h>
+
+using namespace std;
+
+void data_type::assign_schema_type(){
+       char tmps[100];
+       switch(type){
+       case bool_t:
+               schema_type = "BOOL";
+               break;
+       case u_short_t:
+               schema_type = "USHORT";
+               break;
+       case u_int_t:
+               schema_type = "UINT";
+               break;
+       case int_t:
+               schema_type = "INT";
+               break;
+       case u_llong_t:
+               schema_type = "ULLONG";
+               break;
+       case llong_t:
+               schema_type = "LLONG";
+               break;
+       case floating_t:
+               schema_type = "FLOAT";
+               break;
+       case v_str_t:
+               schema_type = "V_STR";
+               break;
+       case timeval_t:
+               schema_type = "TIMEVAL";
+               break;
+       case ip_t:
+               schema_type = "IP";
+               break;
+       case ipv6_t:
+               schema_type = "IPV6";
+               break;
+       case fstring_t:
+               sprintf(tmps,"FSTRING%d",size);
+               schema_type = tmps;
+               break;
+       default:
+               schema_type = "UNDEFINED_TYPE";
+               break;
+       }
+}
+
+
+data_type::data_type(string st){
+       size=0;
+       temporal = varying_t;
+       subtype = "";
+       assign_type_from_string(st);
+}
+
+
+//             Assign data type of a colref using information about
+//             modifiers as well as data type.  This should be made robust.
+data_type::data_type(string st, param_list *modifiers){
+       size=0;
+       temporal = varying_t;
+       subtype="";
+       assign_type_from_string(st);
+
+    if(modifiers != NULL){
+               int i;
+               for(i=0;i<modifiers->size();i++){
+                       if(     modifiers->contains_key("increasing") ||
+                               modifiers->contains_key("Increasing") ||
+                               modifiers->contains_key("INCREASING")){
+                                       temporal = increasing_t;
+                       }
+                       if(     modifiers->contains_key("decreasing") ||
+                               modifiers->contains_key("Decreasing") ||
+                               modifiers->contains_key("DECREASING")){
+                                       temporal = decreasing_t;
+                       }
+                       if(modifiers->contains_key("subtype")){
+                               subtype = modifiers->val_of("subtype");
+                       }
+               }
+       }
+}
+
+
+void data_type::assign_type_from_string(string st){
+       if(st == "bool" || st == "Bool" || st == "BOOL"){
+               type = bool_t;
+               assign_schema_type();
+               return;
+       }
+       if(st == "ushort" || st == "Ushort" || st == "USHORT"){
+               type = u_short_t;
+               assign_schema_type();
+               return;
+       }
+       if(st == "uint" || st == "Uint" || st == "UINT"){
+               type = u_int_t;
+               assign_schema_type();
+               return;
+       }
+       if(st == "int" || st == "Int" || st == "INT"){
+               type = int_t;
+               assign_schema_type();
+               return;
+       }
+       if(st == "ullong" || st == "Ullong" || st == "ULLONG"){
+               type = u_llong_t;
+               assign_schema_type();
+               return;
+       }
+       if(st == "llong" || st == "llong" || st == "LLONG"){
+               type = llong_t;
+               assign_schema_type();
+               return;
+       }
+       if(st == "float" || st == "Float" || st == "FLOAT"){
+               type = floating_t;
+               assign_schema_type();
+               return;
+       }
+       if(st == "string" || st == "String" || st == "STRING" ||
+               st == "v_str" || st == "V_str" || st == "V_STR"){
+               type = v_str_t;
+               assign_schema_type();
+               return;
+       }
+       if(st == "timeval" || st == "Timeval" || st == "TIMEVAL"){
+               type = timeval_t;
+               assign_schema_type();
+               return;
+       }
+       if(st == "IP"){
+               type = ip_t;
+               assign_schema_type();
+               return;
+       }
+       if(st == "IPV6" || st == "IPv6"){
+               type = ipv6_t;
+               assign_schema_type();
+               return;
+       }
+       if(sscanf(st.c_str(),"fstring%d",&size)>0){
+               type = fstring_t;
+               assign_schema_type();
+               return;
+       }
+       if(sscanf(st.c_str(),"Fstring%d",&size)>0){
+               type = fstring_t;
+               assign_schema_type();
+               return;
+       }
+       if(sscanf(st.c_str(),"FSTRING%d",&size)>0){
+               type = fstring_t;
+               assign_schema_type();
+               return;
+       }
+
+       type = undefined_t;
+       assign_schema_type();
+}
+
+
+data_type::data_type(data_type *lhs, string &op){
+
+//  type = undefined_t;
+//  temporal_type l_tempo = lhs->get_temporal();;
+//  if(l_tempo == constant_t) temporal = constant_t;
+//  else temporal = varying_t;
+       size=0;
+       temporal = compute_temporal_type(lhs->get_temporal(),op);
+
+  if(op == "-"){
+       switch(lhs->get_type()){
+       case int_t:
+               type = int_t;
+               break;
+       case u_int_t:
+       case u_short_t:
+               type = int_t;
+//             if(l_tempo == increasing_t) temporal = decreasing_t;
+//             if(l_tempo == decreasing_t) temporal = increasing_t;
+               break;
+       case u_llong_t:
+       case llong_t:
+               type = llong_t;
+//             if(l_tempo == increasing_t) temporal = decreasing_t;
+//             if(l_tempo == decreasing_t) temporal = increasing_t;
+               break;
+       case floating_t:
+               type = floating_t;
+//             if(l_tempo == increasing_t) temporal = decreasing_t;
+//             if(l_tempo == decreasing_t) temporal = increasing_t;
+               break;
+       default:
+               break;
+       }
+  }
+
+  if(op == "!"){
+       switch(lhs->get_type()){
+       case int_t:
+       case u_int_t:
+       case u_short_t:
+       case u_llong_t:
+       case llong_t:
+       case bool_t:
+       case ip_t:
+               type = lhs->get_type();
+               break;
+       default:
+               break;
+       }
+  }
+
+  if(op == "~"){
+       switch(lhs->get_type()){
+       case int_t:
+       case u_int_t:
+       case u_short_t:
+       case u_llong_t:
+       case llong_t:
+       case ip_t:
+               type = lhs->get_type();
+               break;
+       default:
+               break;
+       }
+  }
+
+  subtype = lhs->subtype;
+  assign_schema_type();
+}
+
+temporal_type data_type::compute_temporal_type(temporal_type l_tempo, string &op){
+       temporal_type ret;
+
+  if(l_tempo == constant_t) ret = constant_t;
+  else ret = varying_t;
+
+  if(op == "-"){
+       if(l_tempo == increasing_t) ret = decreasing_t;
+       else if(l_tempo == decreasing_t) ret = increasing_t;
+  }
+  return ret;
+
+}
+
+data_type::data_type(data_type *lhs, data_type *rhs, const string &op){
+       size=0;
+
+  type = undefined_t;
+  dtype l_type = lhs->get_type();
+  dtype r_type = rhs->get_type();
+
+//             First, deduce the type of the result.
+  if( (op=="-")||(op=="+")||(op=="/")||(op=="*")||(op=="%")||(op==">>")||(op=="<<") ){
+       switch(lhs->get_type()){
+       case u_short_t:
+               switch(rhs->get_type()){
+               case u_short_t:
+               case u_int_t:
+               case int_t:
+                       type = rhs->get_type();
+                       break;
+               case llong_t:
+               case u_llong_t:
+                       if(op != ">>" && op != "<<")
+                               type = rhs->get_type();
+                       break;
+               case floating_t:
+                       if(op != "%" && op != ">>" && op != "<<")
+                               type = floating_t;
+                       break;
+               case timeval_t:
+                       if(op == "+") type = timeval_t;
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case u_int_t:
+               switch(rhs->get_type()){
+               case u_short_t:
+               case int_t:
+               case u_int_t:
+                       type = u_int_t;
+                       break;
+               case llong_t:
+               case u_llong_t:
+                       if(op != ">>" && op != "<<")
+                               type = rhs->get_type();
+                       break;
+               case floating_t:
+                       if(op != "%" && op != ">>" && op != "<<")
+                               type = floating_t;
+                       break;
+               case timeval_t:
+                       if(op == "+") type = timeval_t;
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case int_t:
+               switch(rhs->get_type()){
+               case int_t:
+               case u_short_t:
+                       type = int_t;
+                       break;
+               case u_int_t:
+                       type = rhs->get_type();
+                       break;
+               case llong_t:
+               case u_llong_t:
+                       if(op != ">>" && op != "<<")
+                               type = rhs->get_type();
+                       break;
+               case floating_t:
+                       if(op != "%" && op != ">>" && op != "<<")
+                               type = floating_t;
+                       break;
+               case timeval_t:
+                       if(op == "+") type = timeval_t;
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case llong_t:
+               switch(rhs->get_type()){
+               case int_t:
+               case u_int_t:
+               case u_short_t:
+                       type = llong_t;
+                       break;
+               case llong_t:
+                       if(op != ">>" && op != "<<")
+                               type = llong_t;
+                       break;
+               case u_llong_t:
+                       if(op != ">>" && op != "<<")
+                               type = u_llong_t;
+                       break;
+               case floating_t:
+                       if(op != "%" && op != ">>" && op != "<<")
+                               type = floating_t;
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case u_llong_t:
+               switch(rhs->get_type()){
+               case int_t:
+               case u_int_t:
+               case u_short_t:
+                       type = u_llong_t;
+                       break;
+               case u_llong_t:
+               case llong_t:
+                       if(op != ">>" && op != "<<")
+                               type = u_llong_t;
+                       break;
+               case floating_t:
+                       if(op != "%" && op != ">>" && op != "<<")
+                               type = floating_t;
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case floating_t:
+         if(op != "%" && op != ">>" && op != "<<"){
+               switch(rhs->get_type()){
+               case int_t:
+               case floating_t:
+               case u_int_t:
+               case u_short_t:
+               case llong_t:
+               case u_llong_t:
+                       type = floating_t;
+                       break;
+               default:
+                       break;
+               }
+         }
+         break;
+
+       case timeval_t:
+               switch(rhs->get_type()){
+               case int_t:
+               case u_int_t:
+               case u_short_t:
+                       if(op == "+" || op == "-" || op == "/"){
+                               type = timeval_t;
+                       }
+                       break;
+               case timeval_t:
+                       if(op == "-"){
+                               type = int_t;
+                       }
+                       break;
+               default:
+                       break;
+               }
+       default:
+               break;
+
+       }
+  }
+
+  if( (op == "|") || (op == "&") ){
+       switch(lhs->get_type()){
+       case u_short_t:
+               switch(rhs->get_type()){
+               case u_short_t:
+               case u_int_t:
+               case int_t:
+               case llong_t:
+               case u_llong_t:
+                       type = rhs->get_type();
+                       break;
+               case bool_t:
+                       type = bool_t;
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case u_int_t:
+               switch(rhs->get_type()){
+               case u_short_t:
+               case u_int_t:
+               case int_t:
+                       type = u_int_t;
+                       break;
+               case llong_t:
+               case u_llong_t:
+                       type = rhs->get_type();
+                       break;
+               case bool_t:
+                       type = bool_t;
+                       break;
+                       case ip_t:
+                               type = ip_t;
+                               break;
+               default:
+                       break;
+               }
+               break;
+       case int_t:
+               switch(rhs->get_type()){
+               case int_t:
+               case u_short_t:
+                       type = int_t;
+                       break;
+               case bool_t:
+                       type = bool_t;
+                       break;
+               case u_int_t:
+               case llong_t:
+               case u_llong_t:
+                       type = rhs->get_type();
+                       break;
+                       case ip_t:
+                               type = ip_t;
+                               break;
+               default:
+                       break;
+               }
+               break;
+       case llong_t:
+               switch(rhs->get_type()){
+               case int_t:
+               case u_int_t:
+               case u_short_t:
+               case llong_t:
+                       type = llong_t;
+                       break;
+               case u_llong_t:
+                       type = rhs->get_type();
+                       break;
+               case bool_t:
+                       type = bool_t;
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case u_llong_t:
+               switch(rhs->get_type()){
+               case int_t:
+               case u_int_t:
+               case u_short_t:
+               case llong_t:
+               case u_llong_t:
+                       type = u_llong_t;
+                       break;
+               case bool_t:
+                       type = bool_t;
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case bool_t:
+               switch(rhs->get_type()){
+               case int_t:
+               case u_int_t:
+               case u_short_t:
+               case llong_t:
+               case u_llong_t:
+               case bool_t:
+                       type = bool_t;
+                       break;
+               default:
+                       break;
+               }
+               break;
+               case ip_t:
+                       switch(rhs->get_type()){
+                       case int_t:
+                       case u_int_t:
+                       case ip_t:
+                               type = ip_t;
+                               break;
+                       default:
+                               break;
+                       }
+                       break;
+               case ipv6_t:
+                       if(rhs->get_type() == ipv6_t)
+                               type = ipv6_t;
+                       break;
+               default:
+                       break;
+               }
+       }
+       assign_schema_type();
+       temporal = compute_temporal_type(lhs->get_temporal(),rhs->get_temporal(),lhs->get_type(), rhs->get_type(), op);
+       if(lhs->subtype == rhs->subtype){
+               subtype = lhs->subtype;
+       }else{
+               subtype = "";
+       }
+}
+
+
+temporal_type data_type::compute_temporal_type(temporal_type l_tempo, temporal_type r_tempo, dtype l_type, dtype r_type, const string &op){
+       temporal_type ret;
+
+//                     Next, deduce the temporalness of the result.
+//                     One complication : if the value of the RHS or LHS is
+//                     negative, we can't deduce anything about the temporality
+//                     of the result.
+  ret = varying_t;
+//  temporal_type l_tempo = lhs->get_temporal();
+//  temporal_type r_tempo = rhs->get_temporal();
+//  dtype l_type = lhs->get_type();
+//  dtype r_type = rhs->get_type();
+
+  if(op == "+"){
+       if(l_tempo == constant_t) ret = r_tempo;
+       if(r_tempo == constant_t) ret = l_tempo;
+       if(l_tempo == r_tempo) ret = r_tempo;
+  }
+  if(op == "-"){
+       if(l_tempo == constant_t && r_tempo == constant_t) ret = constant_t;
+       if((l_tempo == constant_t || l_tempo ==decreasing_t) &&
+                    r_tempo == increasing_t &&
+                       (r_type != int_t && r_type != floating_t) ) ret = decreasing_t;
+       if((l_tempo == constant_t || l_tempo ==increasing_t) &&
+                        r_tempo == decreasing_t &&
+                       (r_type != int_t && r_type != floating_t) ) ret = increasing_t;
+  }
+
+//             If the value might be negative, can't deduce anything
+//                      However Java doesn't have unsigned types so the logic which forbids int has to be relaxed.
+  if(op == "*"){
+//     if((l_type!=int_t && l_type!=floating_t && l_type!=llong_t) && (r_type!=int_t && r_type!=floating_t && r_type!=llong_t)){
+        if(!((l_type==int_t || l_type==floating_t || l_type==llong_t) && (r_type==int_t || r_type==floating_t || r_type==llong_t))){
+               if(l_tempo == constant_t) ret = r_tempo;
+               if(r_tempo == constant_t) ret = l_tempo;
+               if(l_tempo == r_tempo) ret = r_tempo;
+        }
+  }
+  if(op == "/"){
+//     if((l_type!=int_t && l_type!=floating_t && l_type!=llong_t) && (r_type!=int_t && r_type!=floating_t && r_type!=llong_t)){
+        if(!((l_type==int_t || l_type==floating_t || l_type==llong_t) && (r_type==int_t || r_type==floating_t || r_type==llong_t))){
+               if((l_tempo == constant_t || l_tempo ==decreasing_t) &&
+                                (r_tempo == increasing_t)) ret = decreasing_t;
+               if((l_tempo == constant_t || l_tempo ==increasing_t) &&
+                                (r_tempo == decreasing_t )) ret = increasing_t;
+               if(r_tempo == constant_t) ret = l_tempo;
+       }
+  }
+
+  return(ret);
+
+}
+
+
+data_type *data_type::duplicate(){
+    data_type *ret = new data_type();
+    ret->schema_type = schema_type;
+       ret->size = size;
+    ret->type = type;
+    ret->temporal = temporal;
+       ret->subtype = subtype;
+
+    return(ret);
+}
+
+field_entry *data_type::make_field_entry(string n){
+       field_entry *fe = new field_entry(n, schema_type);
+    if(temporal == increasing_t)
+        fe->add_modifier("INCREASING");
+    if(temporal == decreasing_t)
+        fe->add_modifier("DECREASING");
+       if(subtype != "") fe->add_modifier("subtype",subtype.c_str());
+       return fe;
+}
+
+bool data_type::fta_legal_operation(
+                        data_type *lhs, data_type *rhs, string &op){
+
+  dtype l_type = lhs->get_type();
+  dtype r_type = rhs->get_type();
+
+
+//             Currently, anything goes.  Should be controlled by
+//             a config file.
+
+       return(true);
+
+//      Only +, -, *, /, |, & are legal in the fta.
+//      The only ops on a llong or ullong are +, -
+//      no ops on float, timeval permitted, but these
+//      are illegal data types in the FTA and are handled elsewhere.
+
+  if(!( (op == "-") || (op == "+") || (op == "/") || (op == "*")  || (op == "|") || (op == "&")))
+        return(false);
+
+  if( (l_type == llong_t) || (l_type == u_llong_t) || (r_type == llong_t) || (r_type == u_llong_t)){
+      if(op == "*" || op == "/")
+          return(false);
+  }
+
+  return(true);
+
+}
+
+
+bool data_type::fta_legal_operation(data_type *lhs, string &op){
+
+
+//      negation and not are as legal at the fta on all fta-legal types
+//      as at the user level.
+    return(true);
+}
+
+bool data_type::fta_legal_type(){
+
+//                     Currently, anything goes.
+//                     Should control by a config file.
+//      Currently, only the float and the timeval are not legal at the fta.
+//    if(type == floating_t || type == timeval_t) return(false);
+
+    return(true);
+}
+
+
+//             The data type of a literal
+
+data_type::data_type(int it){
+       temporal = constant_t;
+       subtype = "";
+    switch(it){
+       case LITERAL_INT:
+               type = u_int_t;
+               break;
+       case LITERAL_LONGINT:
+               type = u_llong_t;
+               break;
+       case LITERAL_FLOAT:
+               type = floating_t;
+               break;
+       case LITERAL_STRING:
+               type = v_str_t;
+               break;
+       case LITERAL_BOOL:
+               type = bool_t;
+               break;
+       case LITERAL_TIMEVAL:
+               type = timeval_t;
+               break;
+       case LITERAL_IP:
+               type = ip_t;
+               break;
+       case LITERAL_IPV6:
+               type = ipv6_t;
+               break;
+       default:
+               type = undefined_t;
+               break;
+       }
+
+       assign_schema_type();
+}
+
+void data_type::set_aggr_data_type(const string &op, data_type *dt){
+       dtype se_type = dt->type;
+       type = undefined_t;
+       temporal = varying_t;
+
+    if(op == "AVG"){
+        if((se_type == u_int_t)||(se_type == u_short_t)||(se_type == int_t)||
+            (se_type == u_llong_t)||(se_type == llong_t)||(se_type == floating_t))
+            type = floating_t;
+    }
+
+
+       if(op == "SUM"){
+               if((se_type == u_int_t) || (se_type == u_short_t) || (se_type == bool_t))
+                       type = u_int_t;
+               if((se_type == int_t) || (se_type == u_llong_t) ||
+                         (se_type == llong_t) || (se_type == floating_t) )
+                       type = se_type;
+//             temporal = dt->temporal;        // temporal not preserved by sum.
+               subtype = dt->subtype;
+       }
+       if(op == "MIN" || op == "MAX"){
+               type = se_type;
+//             temporal = dt->temporal;        // temporal not preserved by min or max.
+               subtype = dt->subtype;
+       }
+       if(op == "AND_AGGR" || op == "OR_AGGR" || op == "XOR_AGGR"){
+               if( (se_type == u_int_t) || (se_type == u_short_t) ||
+                       (se_type == int_t) || (se_type == llong_t) ||
+                       (se_type == u_llong_t) || (se_type == bool_t) )
+                               type = se_type;
+               subtype = dt->subtype;
+       }
+  assign_schema_type();
+}
+
+
+
+
+bool data_type::is_comparable(data_type *rhs, string op){
+
+       switch(type){
+       case u_short_t:
+       case int_t:
+       case u_int_t:
+       case u_llong_t:
+       case llong_t:
+       case floating_t:
+       case ip_t:
+               switch(rhs->type){
+               case int_t:
+               case floating_t:
+               case u_short_t:
+               case u_int_t:
+               case u_llong_t:
+               case llong_t:
+               case ip_t:
+                       return(true);
+               default:
+                       return(false);
+               }
+
+       case v_str_t:
+               switch(rhs->type){
+               case v_str_t:
+                       return(true);
+               default:
+                       return(false);
+               }
+
+       case bool_t:
+               switch(rhs->type){
+               case bool_t:
+                       return(true);
+               default:
+                       return(false);
+               }
+       case timeval_t:
+               switch(rhs->type){
+               case timeval_t:
+                       return(true);
+               default:
+                       return(false);
+               }
+       case ipv6_t:
+               if(rhs->type == ipv6_t)
+                       return true;
+               else
+                       return false;
+       default:
+               return(false);
+       }
+
+       return(false);
+}
+
+
+//                     type string to get val from pass-by-ref fcn.
+//                     (Does not seem to be used ?)
+string data_type::get_CC_accessor_type(){
+       switch(type){
+       case int_t:
+               return("gs_int32_t *");
+       case bool_t:
+       case u_short_t:
+       case u_int_t:
+       case ip_t:
+               return("gs_uint32_t *");
+       case u_llong_t:
+               return("gs_uint64_t *");
+       case llong_t:
+               return("gs_int64_t *");
+       case floating_t:
+               return("gs_float_t *");
+       case v_str_t:
+               return("struct gs_string *");
+       case fstring_t:
+               return("gs_int8_t *");
+       case timeval_t:
+               return("struct timeval *");
+       case ipv6_t:
+               return("struct ipv6_str *");
+       default:
+               return("ERROR: Unknown type in data_type::get_CC_accessor_type\n");
+       }
+}
+
+//             type of a variable holding this value.
+string data_type::get_cvar_type(){
+       char tmps[100];
+       switch(type){
+       case int_t:
+               return("gs_int32_t ");
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return("gs_uint32_t ");
+       case u_llong_t:
+               return("gs_uint64_t ");
+       case llong_t:
+               return("gs_int64_t ");
+       case floating_t:
+               return("gs_float_t ");
+       case v_str_t:
+               return("struct gs_string");
+       case ipv6_t:
+               return("struct ipv6_str");
+       case fstring_t:
+               sprintf(tmps,"gs_int8_t[%d] ",size);
+               return(tmps);
+       case timeval_t:
+               return("struct timeval ");
+       default:
+               return("ERROR: Unknown type in data_type::get_cvar_type\n");
+       }
+}
+
+//             type of a variable holding this value.
+string data_type::get_tuple_cvar_type(){
+       char tmps[100];
+       switch(type){
+       case int_t:
+               return("gs_int32_t ");
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return("gs_uint32_t ");
+       case u_llong_t:
+               return("gs_uint64_t ");
+       case llong_t:
+               return("gs_int64_t ");
+       case floating_t:
+               return("gs_float_t ");
+       case v_str_t:
+               return("struct string32");
+       case ipv6_t:
+               return("struct ipv6_str");
+       case fstring_t:
+               sprintf(tmps,"gs_int8_t[%d] ",size);
+               return(tmps);
+       case timeval_t:
+               return("struct timeval ");
+       default:
+               return("ERROR: Unknown type in data_type::get_cvar_type\n");
+       }
+}
+
+
+
+//             type of an in-memory variable holding this value.
+//             TODO: use get_cvar_type as a subroutine
+string data_type::make_cvar(std::string v){
+       char tmps[100];
+       switch(type){
+       case int_t:
+               return("gs_int32_t "+v);
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return("gs_uint32_t "+v);
+       case u_llong_t:
+               return("gs_uint64_t "+v);
+       case llong_t:
+               return("gs_int64_t "+v);
+       case floating_t:
+               return("gs_float_t "+v);
+       case v_str_t:
+               return("struct gs_string "+v);
+       case ipv6_t:
+               return("struct ipv6_str "+v);
+       case fstring_t:
+               sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);
+               return(tmps);
+       case timeval_t:
+               return("struct timeval "+v);
+       default:
+               return("ERROR: Unknown type in data_type::make_cvar\n");
+       }
+}
+
+//             type of a tuple variable holding this value.
+//             TODO: use get_tuple_cvar_type as a subroutine
+string data_type::make_tuple_cvar(std::string v){
+       char tmps[100];
+       switch(type){
+       case int_t:
+               return("gs_int32_t "+v);
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return("gs_uint32_t "+v);
+       case u_llong_t:
+               return("gs_uint64_t "+v);
+       case llong_t:
+               return("gs_int64_t "+v);
+       case floating_t:
+               return("gs_float_t "+v);
+       case v_str_t:
+               return("struct string32 "+v);
+       case ipv6_t:
+               return("struct ipv6_str "+v);
+       case fstring_t:
+               sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);
+               return(tmps);
+       case timeval_t:
+               return("struct timeval "+v);
+       default:
+               return("ERROR: Unknown type in data_type::make_cvar\n");
+       }
+}
+
+
+//             type of a variable holding this value.
+//             The type at the host might be different (esp. string vs. vstring)
+string data_type::get_host_cvar_type(){
+       char tmps[100];
+       switch(type){
+       case int_t:
+               return("gs_int32_t ");
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return("gs_uint32_t ");
+       case u_llong_t:
+               return("gs_uint64_t ");
+       case llong_t:
+               return("gs_int64_t ");
+       case floating_t:
+               return("gs_float_t ");
+       case v_str_t:
+               return("struct vstring");
+       case ipv6_t:
+               return("struct hfta_ipv6_str");
+       case fstring_t:
+               sprintf(tmps,"gs_int8_t[%d] ",size);
+               return(tmps);
+       case timeval_t:
+               return("struct timeval ");
+       default:
+               return("ERROR: Unknown type in data_type::get_host_cvar_type\n");
+       }
+}
+
+
+//             type of a variable holding this value.
+//             The type at the host might be different (esp. string vs. vstring)
+string data_type::make_host_cvar(std::string v){
+       char tmps[100];
+       switch(type){
+       case int_t:
+               return("gs_int32_t "+v);
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return("gs_uint32_t "+v);
+       case u_llong_t:
+               return("gs_uint64_t "+v);
+       case llong_t:
+               return("gs_int64_t "+v);
+       case floating_t:
+               return("gs_float_t "+v);
+       case v_str_t:
+               return("struct vstring "+v);
+       case ipv6_t:
+               return("struct hfta_ipv6_str "+v);
+       case fstring_t:
+               sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);
+               return(tmps);
+       case timeval_t:
+               return("struct timeval "+v);
+       default:
+               return("ERROR: Unknown type in data_type::make_host_cvar\n");
+       }
+}
+
+string data_type::make_host_tuple_cvar(std::string v){
+       char tmps[100];
+       switch(type){
+       case int_t:
+               return("gs_int32_t "+v);
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return("gs_uint32_t "+v);
+       case u_llong_t:
+               return("gs_uint64_t "+v);
+       case llong_t:
+               return("gs_int64_t "+v);
+       case floating_t:
+               return("gs_float_t "+v);
+       case v_str_t:
+               return("struct vstring32 "+v);
+       case ipv6_t:
+               return("struct hfta_ipv6_str "+v);
+       case fstring_t:
+               sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);
+               return(tmps);
+       case timeval_t:
+               return("struct timeval "+v);
+       default:
+               return("ERROR: Unknown type in data_type::make_host_cvar\n");
+       }
+}
+
+
+
+string data_type::get_hfta_unpack_fcn(){
+       switch(type){
+       case int_t:
+               return("fta_unpack_int");
+       case u_int_t:
+       case ip_t:
+               return("fta_unpack_uint");
+       case u_short_t:
+               return("fta_unpack_ushort");
+       case bool_t:
+               return("fta_unpack_bool");
+       case u_llong_t:
+               return("fta_unpack_ullong");
+       case llong_t:
+               return("fta_unpack_llong");
+       case floating_t:
+               return("fta_unpack_float");
+       case v_str_t:
+               return("fta_unpack_vstr");
+       case fstring_t:
+               return("fta_unpack_fstring");
+       case timeval_t:
+               return("fta_unpack_timeval");
+       case ipv6_t:
+               return("fta_unpack_ipv6");
+       default:
+               return("ERROR: Unknown type in dtype::get_hfta_unpack_fcn\n");
+       }
+}
+
+string data_type::get_hfta_unpack_fcn_noxf(){
+       switch(type){
+       case int_t:
+               return("fta_unpack_int_noxf");
+       case u_int_t:
+       case ip_t:
+               return("fta_unpack_uint_noxf");
+       case u_short_t:
+               return("fta_unpack_ushort_noxf");
+       case bool_t:
+               return("fta_unpack_bool_noxf");
+       case u_llong_t:
+               return("fta_unpack_ullong_noxf");
+       case llong_t:
+               return("fta_unpack_llong_noxf");
+       case floating_t:
+               return("fta_unpack_float_noxf");
+       case v_str_t:
+               return("fta_unpack_vstr_noxf");
+       case fstring_t:
+               return("fta_unpack_fstring_noxf");
+       case timeval_t:
+               return("fta_unpack_timeval_noxf");
+       case ipv6_t:
+               return("fta_unpack_ipv6_noxf");
+       default:
+               return("ERROR: Unknown type in dtype::get_hfta_unpack_fcn_noxf\n");
+       }
+}
+
+
+//             Return true if comparing these types requires
+//             a special function.
+//             Note:
+//               1) the function should act like strcmp (-1, 0, 1)
+//               2) this fcn assumes that type checking
+//                       has already been done.
+bool data_type::complex_comparison(data_type *dt){
+  switch(type){
+       case timeval_t:
+       case ipv6_t:
+       case v_str_t:
+       case fstring_t:
+               return(true);
+       default:
+               return(false);
+       }
+}
+
+string data_type::get_comparison_fcn(data_type *dt){
+  switch(type){
+       case timeval_t:
+               return("Compare_Timeval");
+       case v_str_t:
+               return("str_compare");
+       case ipv6_t:
+               return("ipv6_compare");
+       default:
+               return("ERROR_NO_SUCH_COMPARISON_FCN");
+       }
+
+
+}
+
+string data_type::get_hfta_comparison_fcn(data_type *dt){
+  switch(type){
+       case timeval_t:
+               return("hfta_Compare_Timeval");
+       case v_str_t:
+               return("hfta_vstr_compare");
+       case ipv6_t:
+               return("hfta_ipv6_compare");
+       default:
+               return("ERROR_NO_SUCH_COMPARISON_FCN");
+       }
+}
+
+//             Return true if operating on  these types requires
+//             a special function for this operator.
+//             Note:
+//               1) the function should act like
+//                             int operator_fcn(*retun_val, *lhs, *rhs)
+//               2) this fcn assumes that type checking
+//                       has already been done.
+bool data_type::complex_operator(data_type *dt, string &op){
+       switch(type){
+       case int_t:
+               switch(dt->type){
+               case timeval_t:
+                       if(op == "+")
+                               return(true);
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case timeval_t:
+               switch(dt->type){
+               case int_t:
+               case u_int_t:
+               case u_short_t:
+                       if(op == "+" || op == "-" || op == "/")
+                               return(true);
+                       break;
+               case timeval_t:
+                       if(op == "-")
+                               return(true);
+                       break;
+               default:
+                       break;
+               }
+       case ipv6_t:
+               if((op=="&" || op=="|") && dt->type == ipv6_t)
+                       return true;
+       break;
+       default:
+               break;
+       }
+
+       return(false);
+}
+
+bool data_type::complex_operator(string &op){
+       return(false);
+}
+
+string data_type::get_complex_operator(data_type *dt, string &op){
+       switch(type){
+       case int_t:
+               switch(dt->type){
+               case timeval_t:
+                       if(op == "+")
+                               return("Add_Int_Timeval");
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case timeval_t:
+               switch(dt->type){
+               case int_t:
+               case u_int_t:
+               case u_short_t:
+                       if(op == "+")
+                               return("Add_Timeval_Int");
+                       if(op == "-")
+                               return("Subtract_Timeval_Int");
+                       if(op == "/")
+                               return("Divide_Timeval_Int");
+                       break;
+               case timeval_t:
+                       if(op == "-")
+                               return("Subtract_Timeval_Timeval");
+                       break;
+               default:
+                       break;
+               }
+               break;
+       case ipv6_t:
+               if(dt->type == ipv6_t){
+                       if(op == "&")
+                               return("And_Ipv6");
+                       if(op == "|")
+                               return("Or_Ipv6");
+               }
+               break;
+       default:
+               break;
+       }
+
+       return("ERROR_NO_COMPLEX_BINARY_OPERATOR");
+}
+
+string data_type::get_complex_operator(string &op){
+
+       return("ERROR_NO_COMPLEX_UNARY_OPERATOR");
+}
+
+
+bool data_type::use_hashfunc(){
+       switch(type){
+       case int_t:
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return(false);
+       case u_llong_t:
+       case llong_t:
+       case floating_t:
+       case timeval_t:
+       case ipv6_t:
+       case v_str_t:
+               return(true);
+       default:
+               fprintf(stderr,"ERROR: Unknown type in data_type::use_hashfunc\n");
+               exit(1);
+               return(false);
+       }
+}
+string data_type::get_hfta_hashfunc(){
+       switch(type){
+       case int_t:
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return("ERROR NO HFTA HASHFUNC");
+
+       case u_llong_t:
+               //return("hfta_ullong_hashfunc");
+               return("hfta_ULLONG_to_hash");
+       case llong_t:
+               //return("hfta_ullong_hashfunc");
+               return("hfta_LLONG_to_hash");
+       case floating_t:
+               //return("hfta_float_hashfunc");
+               return("hfta_FLOAT_to_hash");
+
+       case ipv6_t:
+               return("hfta_IPV6_to_hash");
+       case timeval_t:
+               return("hfta_timeval_hashfunc");
+       case v_str_t:
+               return("hfta_vstr_hashfunc");
+       default:
+               fprintf(stderr,"ERROR: Unknown type in data_type::get_hfta_hashfunc\n");
+               exit(1);
+               return("false"); // to make compiler happy
+       }
+}
+
+//             Return true if the data type contains a ptr to a
+//             memory buffer.  (copying sometimes requires special cate).
+//             ASSUMPTION:
+bool data_type::is_buffer_type(){
+       switch(type){
+       case int_t:
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case u_llong_t:
+       case llong_t:
+       case floating_t:
+       case timeval_t:
+       case ipv6_t:
+       case ip_t:
+       case fstring_t:
+               return(false);
+       case v_str_t:
+               return(true);
+       default:
+               fprintf(stderr,"ERROR: Unknown type in dtype::is_buffer_type\n");
+               exit(1);
+               return(false);
+       }
+}
+
+//             Fcns which return the names of functions for
+//             handling complex types.
+
+//-----------------------------
+//             LFTA functions
+
+string data_type::get_buffer_assign_copy(){
+  switch(type){
+       case v_str_t:
+               return("str_assign_with_copy");
+       default:
+               break;
+       }
+
+       return("ERROR_NO_SUCH_buffer_assign_copy_FCN");
+}
+
+string data_type::get_buffer_tuple_copy(){
+  switch(type){
+       case v_str_t:
+               return("str_assign_with_copy_in_tuple");
+       default:
+               break;
+       }
+
+       return("ERROR_NO_SUCH_buffer_tuple_copy_FCN");
+}
+
+string data_type::get_buffer_replace(){
+  switch(type){
+       case v_str_t:
+               return("str_replace");
+       default:
+               break;
+       }
+
+       return("ERROR_NO_SUCH_buffer_replace_FCN");
+}
+
+string data_type::get_buffer_size(){
+  switch(type){
+       case v_str_t:
+               return("str_length");
+       default:
+               break;
+       }
+
+       return("ERROR_NO_SUCH_buffer_size_FCN");
+}
+
+string data_type::get_buffer_destroy(){
+  switch(type){
+       case v_str_t:
+               return("str_destroy");
+       default:
+               break;
+       }
+
+       return("ERROR_NO_SUCH_buffer_destroy_FCN");
+}
+
+//-----------------------------
+//             HFTA fcns
+
+string data_type::get_hfta_buffer_assign_copy(){
+  switch(type){
+       case v_str_t:
+               return("hfta_vstr_assign_with_copy");
+       default:
+               break;
+       }
+
+       return("ERROR_NO_SUCH_buffer_assign_copy_FCN");
+}
+
+string data_type::get_hfta_buffer_tuple_copy(){
+  switch(type){
+       case v_str_t:
+               return("hfta_vstr_assign_with_copy_in_tuple");
+       default:
+               break;
+       }
+
+       return("ERROR_NO_SUCH_buffer_tuple_copy_FCN");
+}
+
+string data_type::get_hfta_buffer_replace(){
+  switch(type){
+       case v_str_t:
+               return("hfta_vstr_replace");
+       default:
+               break;
+       }
+
+       return("ERROR_NO_SUCH_buffer_replace_FCN");
+}
+
+string data_type::get_hfta_buffer_size(){
+  switch(type){
+       case v_str_t:
+               return("hfta_vstr_length");
+       default:
+               break;
+       }
+
+       return("ERROR_NO_SUCH_buffer_size_FCN");
+}
+
+string data_type::get_hfta_buffer_destroy(){
+  switch(type){
+       case v_str_t:
+               return("hfta_vstr_destroy");
+       default:
+               break;
+       }
+
+       return("ERROR_NO_SUCH_buffer_destroy_FCN");
+}
+//-----------------------------
+
+
+//             Return true if the data type is represented by a strucutre.
+bool data_type::is_structured_type(){
+       switch(type){
+       case int_t:
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case u_llong_t:
+       case llong_t:
+       case floating_t:
+       case ip_t:
+               return(false);
+       case timeval_t:
+       case ipv6_t:
+       case v_str_t:
+       case fstring_t:
+               return(true);
+       default:
+               fprintf(stderr,"ERROR: Unknown type in dtype::is_structured_type\n");
+               exit(1);
+               return(false);
+       }
+}
+
+
+//             type of a variable holding this value.
+//                     Seems to be a relic
+/*
+string data_type::get_interface_type(){
+       char tmps[100];
+       switch(type){
+       case int_t:
+               return("int ");
+       case u_int_t:
+               return("unsigned int ");
+       case u_short_t:
+               return("unsigned short int ");
+       case bool_t:
+               return("int ");
+       case u_llong_t:
+               return("unsigned long long int ");
+       case llong_t:
+               return("long long int ");
+       case floating_t:
+               return("double ");
+       case v_str_t:
+               return("ERROR");
+       case fstring_t:
+               sprintf(tmps,"char[%d] ",size);
+               return(tmps);
+       case timeval_t:
+               return("ERROR ");
+       case ipv6_t:
+               return "ERROR";
+       default:
+               return("ERROR: Unknown type in dtype::get_interface_type\n");
+       }
+}
+*/
+
+
+//             This type of handle registration is obsolete
+
+string data_type::handle_registration_name(){
+
+               switch(type){
+               case v_str_t:
+                       return("str_register_search_string");
+               default:
+                       return("");
+               }
+               return("ERROR UNKNOWN LITERAL");
+       };
+
+string data_type::hfta_handle_registration_name(){
+
+               switch(type){
+               case v_str_t:
+                       return("vstr_register_search_string");
+               default:
+                       return("");
+               }
+               return("ERROR UNKNOWN LITERAL");
+       };
+
+
+string data_type::get_handle_destructor(){
+
+               switch(type){
+               case v_str_t:
+                       return("str_release_search_string");
+               default:
+                       return("");
+               }
+               return("ERROR UNKNOWN LITERAL");
+       };
+
+
+//  should be the inverse of
+//      data_type::data_type(string st, param_list *modifiers)
+vector<string> data_type::get_param_keys(){
+    vector<string> retval;
+
+    if(temporal == increasing_t)
+        retval.push_back("INCREASING");
+    if(temporal == decreasing_t)
+        retval.push_back("DECREASING");
+       if(subtype != "") retval.push_back("subtype");
+
+    return(retval);
+}
+
+string data_type::get_param_val(string k){
+       if(k=="subtype") return subtype;
+       return "";
+}
+
+std::string data_type::get_temporal_string(){
+    if(temporal == increasing_t)
+        return("INCREASING");
+    if(temporal == decreasing_t)
+        return("DECREASING");
+       return("");
+}
+
+
+bool data_type::needs_hn_translation(){
+       switch(type){
+       case int_t:
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case u_llong_t:
+       case llong_t:
+       case floating_t:
+       case timeval_t:
+       case ipv6_t:
+       case v_str_t:
+       case ip_t:
+               return(true);
+       case fstring_t:
+               return(false);
+       default:
+               fprintf(stderr,"INTERNAL ERROR: Unknown type in dtype::needs_hn_translation\n");
+               exit(1);
+               return(false);
+       }
+}
+
+std::string data_type::hton_translation(){
+fprintf(stderr,"INTERNAL ERROR, hton_translation called.\n");
+return("");
+
+       switch(type){
+       case int_t:
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return("htonl");
+               break;
+       case u_llong_t:
+       case llong_t:
+               return("htonll");
+               break;
+       case floating_t:
+               return("htonf");
+               break;
+       case timeval_t:
+               return("htontv");
+               break;
+       case ipv6_t:
+               return("hton_ipv6");
+               break;
+       case v_str_t:
+               return("INTERNAL ERROR, net translation for buffered types needs special handling.\n");
+       default:
+               fprintf(stderr,"INTERNAL ERROR: Unknown type in dtype::hton_translation\n");
+               exit(1);
+               return("INTERNAL ERROR: NO SUCH TYPE IN hton_translation");
+       }
+}
+
+std::string data_type::ntoh_translation(){
+fprintf(stderr,"INTERNAL ERROR, ntoh_translation called.\n");
+return("");
+
+       switch(type){
+       case int_t:
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return("ntohl");
+               break;
+       case u_llong_t:
+       case llong_t:
+               return("ntohll");
+               break;
+       case floating_t:
+               return("ntohf");
+               break;
+       case timeval_t:
+               return("ntohtv");
+               break;
+       case ipv6_t:
+               return("ntoh_ipv6");
+               break;
+       case v_str_t:
+               return("INTERNAL ERROR, net translation for buffered types needs special handling.\n");
+       default:
+               fprintf(stderr,"INTERNAL ERROR: Unknown type in dtype::ntoh_translation\n");
+               exit(1);
+               return("INTERNAL ERROR: NO SUCH TYPE IN ntoh_translation");
+       }
+}
+
+int data_type::type_indicator(){
+       switch(type){
+       case int_t:
+               return(INT_TYPE);
+       case u_int_t:
+               return(UINT_TYPE);
+       case u_short_t:
+               return(USHORT_TYPE);
+       case bool_t:
+               return(BOOL_TYPE);
+       case u_llong_t:
+               return(ULLONG_TYPE);
+       case llong_t:
+               return(LLONG_TYPE);
+       case floating_t:
+               return(FLOAT_TYPE);
+       case timeval_t:
+               return(TIMEVAL_TYPE);
+       case ipv6_t:
+               return(IPV6_TYPE);
+       case ip_t:
+               return(IP_TYPE);
+       case v_str_t:
+               return(VSTR_TYPE);
+       case fstring_t:
+               return(FSTRING_TYPE);
+       default:
+               return(UNDEFINED_TYPE);
+       }
+       return(UNDEFINED_TYPE);
+}
+
+//             for schemaparser
+
+int data_type::type_size(){
+       switch(type){
+       case int_t:
+               return(sizeof(gs_int32_t));
+       case u_int_t:
+       case u_short_t:
+       case bool_t:
+       case ip_t:
+               return(sizeof(gs_uint32_t));
+       case u_llong_t:
+               return(sizeof(gs_uint64_t));
+       case llong_t:
+               return(sizeof(gs_int64_t));
+       case floating_t:
+               return(sizeof(gs_float_t));
+       case timeval_t:
+               return(sizeof(timeval));                // IMPLEMENTATION DEPENDENT
+       case ipv6_t:
+               return(sizeof(hfta_ipv6_str));          // IMPLEMENTATION DEPENDENT
+       case v_str_t:
+               return(sizeof(vstring32));              // IMPLEMENTATION DEPENDENT
+       case fstring_t:
+               return(size);
+       default:
+               return(0);
+       }
+       return(0);
+}
+
+//             for external functions and predicates
+
+/*
+bool data_type::call_compatible(data_type *o){
+       if(type != o->get_type()) return(false);
+       if(type == fstring_t){
+               if(size != 0 && size != o->type_size()) return(false);
+       }
+       return(true);
+}
+
+//             test for equality : used by bind_to_schema and by testing for
+//             mergability.
+
+bool data_type::equal(data_type *o){
+       if(type != o->get_type()) return(false);
+       if(type == fstring_t){
+               if(size != o->type_size()) return(false);
+       }
+       return(true);
+}
+*/
+
+bool data_type::subsumes_type(data_type *o){
+       if(type != o->get_type()) return(false);
+       if(type == fstring_t){
+               if(size != o->type_size()) return(false);
+       }
+       if(this->is_temporal() && temporal != o->get_temporal()) return false;
+       if(subtype != "" && subtype != o->subtype) return false;
+
+       return(true);
+}
+
+bool data_type::equals(data_type *o){
+       if(type != o->get_type()) return(false);
+       if(type == fstring_t){
+               if(size != o->type_size()) return(false);
+       }
+       if(temporal != o->get_temporal()) return false;
+       if(subtype != o->subtype) return false;
+
+       return(true);
+}
+
+bool data_type::equal_subtypes(data_type *o){
+       if(type != o->get_type()) return(false);
+       if(type == fstring_t){
+               if(size != o->type_size()) return(false);
+       }
+       if(subtype != o->subtype) return false;
+
+       return(true);
+}
+
+
+string data_type::to_string(){
+       string ret = schema_type;
+       if(this->is_temporal() || subtype != ""){
+               ret += " (";
+                if(temporal == increasing_t)
+               ret += "INCREASING";
+       if(temporal == decreasing_t)
+               ret += "DECREASING";
+               if(this->is_temporal() && subtype != "")
+                       ret += ", ";
+               if(subtype != "")
+                       ret += "subtype "+subtype;
+               ret += ")";
+       }
+       return ret;
+}
+
+
+
+string data_type::get_min_literal() {
+       switch(type){
+       case int_t:
+               return("INT_MIN");
+       case bool_t:
+       case u_short_t:
+       case u_int_t:
+       case ip_t:
+               return("0");
+       case u_llong_t:
+               return("0");
+       case llong_t:
+               return("LLONG_MIN");
+       case floating_t:
+               return("DBL_MIN");
+       case timeval_t:
+               return("{0,0}");
+       case ipv6_t:
+               return("0000:0000:0000:0000:0000:0000:0000:0000");
+       case v_str_t:
+       case fstring_t:
+               return("ERROR: Min literal is undefined for strings\n");
+       default:
+               return("ERROR: Unknown type in data_type::get_min_literal\n");
+       }
+}
+
+string data_type::get_max_literal() {
+       switch(type){
+       case int_t:
+               return("INT_MAX");
+       case bool_t:
+       case u_short_t:
+       case u_int_t:
+       case ip_t:
+               return("UINT_MAX");
+       case u_llong_t:
+               return("ULLONG_MAX");
+       case llong_t:
+               return("LLONG_MAX");
+       case floating_t:
+               return("DBL_MAX");
+       case timeval_t:
+               return("{UINT_MAX,UINT_MAX}");
+       case ipv6_t:
+               return("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
+       case v_str_t:
+       case fstring_t:
+               return("ERROR: Max literal is undefined for strings\n");
+       default:
+               return("ERROR: Unknown type in data_type::get_max_literal\n");
+       }
+
+}
+
diff --git a/src/ftacmp/type_objects.h b/src/ftacmp/type_objects.h
new file mode 100644 (file)
index 0000000..2f73026
--- /dev/null
@@ -0,0 +1,162 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __TYPE_OBJECTS_H_DEFINED__
+#define __TYPE_OBJECTS_H_DEFINED__
+
+#include <string>
+#include<vector>
+
+#include"literal_types.h"
+#include"parse_schema.h"
+#include"type_indicators.h"
+#include"gstypes.h"
+#include"vstring.h"
+
+enum dtype {u_int_t, int_t, u_llong_t, llong_t, u_short_t, floating_t,
+                       bool_t, v_str_t, timeval_t, ip_t, ipv6_t, fstring_t, undefined_t};
+
+enum temporal_type {increasing_t, decreasing_t, constant_t, varying_t};
+               // varying_t means I don't know.
+        // constant_t MUST MEAN THAT ALL VALUES IN THE SE TREE ARE LITERALS!
+
+
+class data_type{
+private:
+  std::string schema_type;             // String representation of the data type.
+  dtype type;                                  // Internal representation of the data type.
+  std::string subtype;                         // specialization of the type.
+                                                               // use to restrict access and provide annotation
+  temporal_type temporal;              // How does the value change over time.
+  int size;                                            // # bytes, it it can't be readily determined
+
+  void assign_schema_type();
+  void assign_type_from_string(std::string st);
+
+public:
+  data_type(){type = undefined_t; assign_schema_type();        size=0; temporal=varying_t;};
+  data_type(std::string st);
+  data_type(std::string st, param_list *modifiers);
+  data_type(int it);
+  data_type(data_type *lhs, std::string &op);
+  data_type(data_type *lhs, data_type *rhs, const std::string &op);
+
+  static temporal_type compute_temporal_type(temporal_type l_tempo,  std::string &op);
+  static temporal_type compute_temporal_type(temporal_type l_tempo, temporal_type r_tempo,  dtype l_type, dtype r_type, const std::string &op);
+
+  data_type *duplicate();
+  field_entry *make_field_entry(std::string n);
+
+  void set_aggr_data_type(const std::string &op, data_type *dt);
+
+  int type_indicator();
+
+  dtype get_type(){return type;                                                };
+  std::string get_type_str(){return schema_type;       };
+  std::string to_string();
+
+  temporal_type get_temporal(){return temporal;                };
+  void set_temporal(temporal_type t){temporal = t;             };
+  void reset_temporal(){ if(this->is_temporal()) temporal = varying_t;};
+  bool is_temporal(){return( temporal == increasing_t || temporal == decreasing_t);};
+  bool is_increasing(){return( temporal == increasing_t );};
+  bool is_decreasing(){return( temporal == decreasing_t );};
+
+  std::string get_temporal_string();
+  std::vector<std::string> get_param_keys();
+  std::string get_param_val(std::string k);
+
+  bool is_defined(){return(type != undefined_t);       };
+
+  bool is_comparable(data_type *rhs, std::string op);
+
+  std::string get_CC_accessor_type();
+  std::string get_cvar_type();
+  std::string get_tuple_cvar_type();
+  std::string make_cvar(std::string v);
+  std::string make_tuple_cvar(std::string v);
+  std::string get_host_cvar_type();
+  std::string make_host_cvar(std::string v);
+  std::string make_host_tuple_cvar(std::string v);
+  std::string get_hfta_unpack_fcn();
+  std::string get_hfta_unpack_fcn_noxf();
+
+  bool complex_comparison(data_type *dt);
+  std::string get_comparison_fcn(data_type *dt);
+  std::string get_hfta_comparison_fcn(data_type *dt);
+
+  bool complex_operator(data_type *dt, std::string &op);
+  std::string get_complex_operator(data_type *dt, std::string &op);
+
+  bool complex_operator(std::string &op);
+  std::string get_complex_operator(std::string &op);
+
+    bool use_hashfunc();
+       std::string get_hfta_hashfunc();
+
+  bool needs_hn_translation();
+  std::string hton_translation();
+  std::string ntoh_translation();
+
+  bool is_buffer_type();
+//             LFTA functions
+  std::string get_buffer_assign_copy();
+  std::string get_buffer_tuple_copy();
+  std::string get_buffer_replace();
+  std::string get_buffer_size();
+  std::string get_buffer_destroy();
+//             HFTA functions
+  std::string get_hfta_buffer_assign_copy();
+  std::string get_hfta_buffer_tuple_copy();
+  std::string get_hfta_buffer_replace();
+  std::string get_hfta_buffer_size();
+  std::string get_hfta_buffer_destroy();
+
+  bool is_structured_type();
+//  std::string get_interface_type();
+
+//             These functions are obsolete
+  std::string handle_registration_name();
+  std::string hfta_handle_registration_name();
+  std::string get_handle_destructor();
+
+  bool fta_legal_type();
+  static bool fta_legal_operation(data_type *lhs, data_type *rhs, std::string &op);
+  static bool fta_legal_operation(data_type *lhs, std::string &op);
+
+//             for schemaparser
+  int type_size();
+
+/*
+//             for external functions and predicates
+bool call_compatible(data_type *o);
+
+//             test for equality : used by bind_to_schema and by testing for
+//             mergability.
+bool equal(data_type *o);
+*/
+
+  bool subsumes_type(data_type *o);
+  bool equals(data_type *o);
+  bool equal_subtypes(data_type *o);
+
+// literals corresponding to minimum and maximum values
+  std::string get_min_literal();
+  std::string get_max_literal();
+
+
+};
+
+
+#endif
diff --git a/src/ftacmp/xml.l b/src/ftacmp/xml.l
new file mode 100644 (file)
index 0000000..d394d27
--- /dev/null
@@ -0,0 +1,224 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+/*
+       MUST COMPILE WITH
+               flex -PxmlParser -oxmllexer.cc xml.l
+       (or equivalent).
+*/     
+
+%{
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ // #include "parse_fta.h"
+ #include <string.h>
+
+
+
+#include "xml.tab.hh"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int xmlParserwrap(){return(1);}
+
+extern int xmlParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_xml_lineno : the line currently being parsed when the error occurs.
+               flex_xml_ch : the character on the line where the error occurs
+               flex_xml_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_xml_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_xml_lineno = 1;
+int flex_xml_ch = 0;
+char flex_xml_linebuf[20000];
+
+char *flex_xml_stringinput = NULL;
+int flex_xml_stringinput_ptr = 0;
+FILE *flex_xml_fileinput = NULL;
+int my_xmlParser_yyinput(char *buf, int max_size);
+
+
+
+void xmlParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_xml_lineno, flex_xml_ch, s, xmlParsertext, flex_xml_linebuf );
+    for(i=0;i<flex_xml_ch;i++){
+               if(flex_xml_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_xml_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_xmlParser_yyinput(b,ms))
+
+%}
+       /* MKS needs the next line to increase the NFA table */
+%e 1200
+%option noyywrap
+
+%%
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+
+
+
+[<>=/] { flex_xml_ch+=xmlParserleng; return yytext[0]; }
+
+       /* names */
+
+[A-Za-z_][A-Za-z0-9_:]*        { flex_xml_ch+=xmlParserleng; xmlParserlval.strval = strdup(yytext); return NAME; }
+
+
+       /* strings */
+
+\"[^\"\n]*\"   {
+               
+               int c;
+               
+               xmlParserlval.strval = strdup(xmlParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_xml_ch+=xmlParserleng; 
+                       xmlParserlval.strval[xmlParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+               
+\"[^\"\n]*$    { flex_xml_ch+=xmlParserleng; xmlParsererror("Unterminated string"); }
+
+ /*                                                                                                                    */
+ /*            Newline : advance the error reporting line number       */
+ /*            and grab the next line into flex_xml_linebuf                    */
+ /*                                                                                                                    */
+
+\n.*           {flex_xml_ch=0; flex_xml_lineno++;
+                          strcpy(flex_xml_linebuf,xmlParsertext+1);
+                          yyless(1);
+                          }
+
+[ \t\r]+       {flex_xml_ch+=xmlParserleng; }  /* white space */
+
+"--".*$                {flex_xml_ch+=xmlParserleng; }; /* comment */
+"//".*$                {flex_xml_ch+=xmlParserleng; }; /* comment */
+"<?xml".*$      {flex_xml_ch+=xmlParserleng; }; /* comment */
+
+.|\n            {flex_xml_ch+=xmlParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  xmlParsererror(yytext);}
+
+%%
+
+int my_xmlParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_xml_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_xml_stringinput[flex_xml_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_xml_stringinput[flex_xml_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_xml_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_xml_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void xmlParser_setfileinput(FILE *f){
+       xmlParserrestart(NULL);
+
+       flex_xml_fileinput = f;
+       flex_xml_stringinput = NULL;
+       flex_xml_lineno = 1;
+       flex_xml_ch = 0;
+}
+
+void xmlParser_setstringinput(char *s){
+       xmlParserrestart(NULL);
+
+       flex_xml_fileinput = NULL;
+       flex_xml_stringinput = s;
+       flex_xml_stringinput_ptr = 0;
+       flex_xml_lineno = 1;
+       flex_xml_ch = 0;
+}
+       
+               
+
+
+
diff --git a/src/ftacmp/xml.tab.cc b/src/ftacmp/xml.tab.cc
new file mode 100644 (file)
index 0000000..0167d88
--- /dev/null
@@ -0,0 +1,1282 @@
+/* A Bison parser, made by GNU Bison 1.875c.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 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, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* If NAME_PREFIX is specified substitute the variables and functions
+   names.  */
+#define yyparse xmlParserparse
+#define yylex   xmlParserlex
+#define yyerror xmlParsererror
+#define yylval  xmlParserlval
+#define yychar  xmlParserchar
+#define yydebug xmlParserdebug
+#define yynerrs xmlParsernerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259
+   };
+#endif
+#define NAME 258
+#define STRING_TOKEN 259
+
+
+
+
+/* Copy the first part of user declarations.  */
+#line 8 "xml.y"
+
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "xml_t.h"
+
+
+extern std::vector<std::string> xml_attr_vec;
+extern std::vector<std::string> xml_val_vec;
+extern std::string xml_a, xml_v;
+extern xml_t *xml_leaves;
+
+extern int xmlParserdebug;
+extern void xmlParsererror(char *s);
+extern int xmlParserlex();
+
+
+#define YYDEBUG 1
+
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 42 "xml.y"
+typedef union YYSTYPE {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       /*                      for FTA definition.     */
+
+} YYSTYPE;
+/* Line 191 of yacc.c.  */
+#line 134 "xml.tab.cc"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 214 of yacc.c.  */
+#line 146 "xml.tab.cc"
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   define YYSTACK_ALLOC alloca
+#  endif
+# else
+#  if defined (alloca) || defined (_ALLOCA_H)
+#   define YYSTACK_ALLOC alloca
+#  else
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+        || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined (__GNUC__) && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         register YYSIZE_T yyi;                \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];            \
+       }                                       \
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  6
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   25
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  9
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  9
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  14
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  26
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   259
+
+#define YYTRANSLATE(YYX)                                               \
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     6,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       5,     8,     7,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned char yyprhs[] =
+{
+       0,     0,     3,     5,     9,    12,    18,    23,    28,    30,
+      33,    35,    36,    38,    41
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      10,     0,    -1,    11,    -1,    12,    14,    13,    -1,    12,
+      13,    -1,     5,     3,    15,     6,     7,    -1,     5,     3,
+      15,     7,    -1,     5,     6,     3,     7,    -1,    11,    -1,
+      14,    11,    -1,    16,    -1,    -1,    17,    -1,    16,    17,
+      -1,     3,     8,     4,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned char yyrline[] =
+{
+       0,    60,    60,    64,    65,    66,    72,    76,    81,    82,
+      86,    87,    91,    93,    98
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "NAME", "STRING_TOKEN", "'<'", "'/'",
+  "'>'", "'='", "$accept", "parse_result", "resource", "start_tag",
+  "end_tag", "xml_list", "opt_val_list", "val_list", "val", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short yytoknum[] =
+{
+       0,   256,   257,   258,   259,    60,    47,    62,    61
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,     9,    10,    11,    11,    11,    12,    13,    14,    14,
+      15,    15,    16,    16,    17
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     1,     3,     2,     5,     4,     4,     1,     2,
+       1,     0,     1,     2,     3
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       0,     0,     0,     2,     0,    11,     1,     0,     8,     4,
+       0,     0,     0,    10,    12,     0,     9,     3,     0,     0,
+       6,    13,     0,    14,     5,     7
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yysigned_char yydefgoto[] =
+{
+      -1,     2,     3,     4,     9,    10,    12,    13,    14
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -5
+static const yysigned_char yypact[] =
+{
+      -3,     0,     5,    -5,     4,     7,    -5,    -2,    -5,    -5,
+       4,     3,     1,     7,    -5,     9,    -5,    -5,    10,     6,
+      -5,    -5,     8,    -5,    -5,    -5
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yysigned_char yypgoto[] =
+{
+      -5,    -5,    -4,    -5,    11,    -5,    -5,    -5,    12
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
+{
+       8,     5,     1,     5,    15,     6,    16,    19,    20,     7,
+      11,    18,    22,    24,    23,    25,     0,     0,     0,     0,
+       0,    17,     0,     0,     0,    21
+};
+
+static const yysigned_char yycheck[] =
+{
+       4,     3,     5,     3,     6,     0,    10,     6,     7,     5,
+       3,     8,     3,     7,     4,     7,    -1,    -1,    -1,    -1,
+      -1,    10,    -1,    -1,    -1,    13
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,     5,    10,    11,    12,     3,     0,     5,    11,    13,
+      14,     3,    15,    16,    17,     6,    11,    13,     8,     6,
+       7,    17,     3,     4,     7,     7
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                (-2)
+#define YYEOF          0
+
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT                goto yyabortlab
+#define YYERROR                goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL         goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yytoken = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");\
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)               \
+   ((Current).first_line   = (Rhs)[1].first_line,      \
+    (Current).first_column = (Rhs)[1].first_column,    \
+    (Current).last_line    = (Rhs)[N].last_line,       \
+    (Current).last_column  = (Rhs)[N].last_column)
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+
+# define YYDSYMPRINT(Args)                     \
+do {                                           \
+  if (yydebug)                                 \
+    yysymprint Args;                           \
+} while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location)           \
+do {                                                           \
+  if (yydebug)                                                 \
+    {                                                          \
+      YYFPRINTF (stderr, "%s ", Title);                                \
+      yysymprint (stderr,                                      \
+                  Token, Value);       \
+      YYFPRINTF (stderr, "\n");                                        \
+    }                                                          \
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short *bottom, short *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    short *bottom;
+    short *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (/* Nothing. */; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)                           \
+do {                                                           \
+  if (yydebug)                                                 \
+    yy_stack_print ((Bottom), (Top));                          \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+    int yyrule;
+#endif
+{
+  int yyi;
+  unsigned int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+             yyrule - 1, yylno);
+  /* Print the symbols being reduced, and their result.  */
+  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+    YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+  YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule)         \
+do {                                   \
+  if (yydebug)                         \
+    yy_reduce_print (Rule);            \
+} while (0)
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+\f
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+\f
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+    }
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yytype, yyvaluep)
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  switch (yytype)
+    {
+
+      default:
+        break;
+    }
+}
+\f
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM);
+# else
+int yyparse ();
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+  void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+  
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule.  */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+
+                   &yystacksize);
+
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 5:
+#line 67 "xml.y"
+    {xml_leaves->add_leaf(new xml_leaf_t(yyvsp[-3].strval, xml_attr_vec, xml_val_vec));
+               ;}
+    break;
+
+  case 11:
+#line 87 "xml.y"
+    {xml_attr_vec.clear(); xml_val_vec.clear();;}
+    break;
+
+  case 12:
+#line 91 "xml.y"
+    {xml_attr_vec.clear();  xml_attr_vec.push_back(xml_a);
+                        xml_val_vec.clear(); xml_val_vec.push_back(xml_v); ;}
+    break;
+
+  case 13:
+#line 93 "xml.y"
+    {xml_attr_vec.push_back(xml_a);
+                                       xml_val_vec.push_back(xml_v); ;}
+    break;
+
+  case 14:
+#line 98 "xml.y"
+    {xml_a = yyvsp[-2].strval; xml_v = yyvsp[0].strval;;}
+    break;
+
+
+    }
+
+/* Line 993 of yacc.c.  */
+#line 1054 "xml.tab.cc"
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+
+
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         int yytype = YYTRANSLATE (yychar);
+         const char* yyprefix;
+         char *yymsg;
+         int yyx;
+
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         int yyxbegin = yyn < 0 ? -yyn : 0;
+
+         /* Stay within bounds of both yycheck and yytname.  */
+         int yychecklim = YYLAST - yyn;
+         int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+         int yycount = 0;
+
+         yyprefix = ", expecting ";
+         for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+           if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+             {
+               yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
+               yycount += 1;
+               if (yycount == 5)
+                 {
+                   yysize = 0;
+                   break;
+                 }
+             }
+         yysize += (sizeof ("syntax error, unexpected ")
+                    + yystrlen (yytname[yytype]));
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[yytype]);
+
+             if (yycount < 5)
+               {
+                 yyprefix = ", expecting ";
+                 for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+                   if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+                     {
+                       yyp = yystpcpy (yyp, yyprefix);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yyprefix = " or ";
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("syntax error; also virtual memory exhausted");
+       }
+      else
+#endif /* YYERROR_VERBOSE */
+       yyerror ("syntax error");
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      if (yychar <= YYEOF)
+        {
+          /* If at end of input, pop the error token,
+            then the rest of the stack, then return failure.  */
+         if (yychar == YYEOF)
+            for (;;)
+              {
+                YYPOPSTACK;
+                if (yyssp == yyss)
+                  YYABORT;
+                YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+                yydestruct (yystos[*yyssp], yyvsp);
+              }
+        }
+      else
+       {
+         YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+         yydestruct (yytoken, &yylval);
+         yychar = YYEMPTY;
+
+       }
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+#ifdef __GNUC__
+  /* Pacify GCC when the user code never invokes YYERROR and the label
+     yyerrorlab therefore never appears in user code.  */
+  if (0)
+     goto yyerrorlab;
+#endif
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+       {
+         yyn += YYTERROR;
+         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+           {
+             yyn = yytable[yyn];
+             if (0 < yyn)
+               break;
+           }
+       }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+       YYABORT;
+
+      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+      yydestruct (yystos[yystate], yyvsp);
+      YYPOPSTACK;
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+
+
+#line 105 "xml.y"
+
+
+
+
diff --git a/src/ftacmp/xml.tab.hh b/src/ftacmp/xml.tab.hh
new file mode 100644 (file)
index 0000000..74de19a
--- /dev/null
@@ -0,0 +1,63 @@
+/* A Bison parser, made by GNU Bison 1.875c.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 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, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259
+   };
+#endif
+#define NAME 258
+#define STRING_TOKEN 259
+
+
+
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 42 "xml.y"
+typedef union YYSTYPE {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       /*                      for FTA definition.     */
+
+} YYSTYPE;
+/* Line 1268 of yacc.c.  */
+#line 55 "xml.tab.hh"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+extern YYSTYPE xmlParserlval;
+
+
+
diff --git a/src/ftacmp/xml.y b/src/ftacmp/xml.y
new file mode 100644 (file)
index 0000000..cf45ff4
--- /dev/null
@@ -0,0 +1,122 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+       MUST COMPILE WITH
+       bison --verbose -d -p xmlParser  -o xml.tab.cc xml.y
+
+        (or equivalent).
+*/
+
+%{
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "xml_t.h"
+
+
+extern std::vector<std::string> xml_attr_vec;
+extern std::vector<std::string> xml_val_vec;
+extern std::string xml_a, xml_v;
+extern xml_t *xml_leaves;
+
+extern int xmlParserdebug;
+extern void xmlParsererror(char *s);
+extern int xmlParserlex();
+
+
+#define YYDEBUG 1
+
+%}
+
+
+       /* symbolic tokens */
+
+%union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+
+       /*                      for FTA definition.     */
+
+}
+
+%token <strval> NAME
+%token <strval> STRING_TOKEN
+
+
+
+
+%%
+
+parse_result:  resource
+       ;
+
+resource:
+       start_tag xml_list end_tag
+       | start_tag end_tag
+       | '<' NAME opt_val_list '/' '>'
+               {xml_leaves->add_leaf(new xml_leaf_t($2, xml_attr_vec, xml_val_vec));
+               }
+       ;
+
+start_tag:
+       '<' NAME opt_val_list '>'       
+       ;
+
+end_tag:
+       '<' '/' NAME '>'        
+       ;
+
+
+xml_list:
+       resource
+       | xml_list resource
+       ;
+
+opt_val_list:
+       val_list
+       |               {xml_attr_vec.clear(); xml_val_vec.clear();}
+       ;
+
+val_list:
+       val             {xml_attr_vec.clear();  xml_attr_vec.push_back(xml_a);
+                        xml_val_vec.clear(); xml_val_vec.push_back(xml_v); }
+       | val_list val {xml_attr_vec.push_back(xml_a);
+                                       xml_val_vec.push_back(xml_v); }
+       ;
+
+val:
+       NAME '=' STRING_TOKEN   {xml_a = $1; xml_v = $3;}
+       ;
+       
+
+
+
+
+%%
+
+
diff --git a/src/ftacmp/xml_t.h b/src/ftacmp/xml_t.h
new file mode 100644 (file)
index 0000000..392f476
--- /dev/null
@@ -0,0 +1,56 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+#ifndef __XML_T_DEFINED_
+#define __XML_T_DEFINED_
+
+#include <stdio.h>
+#include<vector>
+#include<string>
+#include<map>
+#include<set>
+#include<algorithm>
+
+
+void xmlParser_setfileinput(FILE *f);
+void xmlParser_setstringinput(char *s);
+
+
+//                     Represent leaf-level xml nodes
+class xml_leaf_t{
+public:
+       std::string name;
+       std::vector<std::string> attrs;
+       std::vector<std::string> vals;
+
+       xml_leaf_t(const char *n, std::vector<std::string> &a, std::vector<std::string> &v){
+               name = n;
+               attrs = a;
+               vals = v;
+       }
+};
+
+class xml_t{
+public:
+       std::vector<xml_leaf_t *> leaves;
+
+       xml_t(){}
+
+       void add_leaf(xml_leaf_t *l){
+               leaves.push_back(l);
+       }
+};
+
+#endif
+
diff --git a/src/ftacmp/xmllexer.cc b/src/ftacmp/xmllexer.cc
new file mode 100644 (file)
index 0000000..a763ec5
--- /dev/null
@@ -0,0 +1,1779 @@
+#define yy_create_buffer xmlParser_create_buffer
+#define yy_delete_buffer xmlParser_delete_buffer
+#define yy_scan_buffer xmlParser_scan_buffer
+#define yy_scan_string xmlParser_scan_string
+#define yy_scan_bytes xmlParser_scan_bytes
+#define yy_flex_debug xmlParser_flex_debug
+#define yy_init_buffer xmlParser_init_buffer
+#define yy_flush_buffer xmlParser_flush_buffer
+#define yy_load_buffer_state xmlParser_load_buffer_state
+#define yy_switch_to_buffer xmlParser_switch_to_buffer
+#define yyin xmlParserin
+#define yyleng xmlParserleng
+#define yylex xmlParserlex
+#define yyout xmlParserout
+#define yyrestart xmlParserrestart
+#define yytext xmlParsertext
+
+#line 19 "xmllexer.cc"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /cvsroot/gscpv4/src/ftacmp/xmllexer.cc,v 1.1.1.1 2013/12/02 17:44:57 spatsch Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <unistd.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yytext_ptr -= yy_more_len; \
+       yyleng = (int) (yy_cp - yytext_ptr); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 11
+#define YY_END_OF_BUFFER 12
+static yyconst short int yy_accept[32] =
+    {   0,
+        0,    0,   12,   10,    6,    5,   10,   10,    1,    1,
+        1,    2,    6,    5,    0,    4,    3,    0,    0,    0,
+        2,    0,    7,    0,    8,    0,    0,    0,    0,    9,
+        0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    4,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    5,    1,    6,    7,    7,    7,
+        7,    7,    7,    7,    7,    7,    7,    7,    1,    8,
+        9,    9,   10,    1,   11,   11,   11,   11,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
+        1,    1,    1,    1,   11,    1,   11,   11,   11,   11,
+
+       11,   11,   11,   11,   11,   11,   11,   12,   13,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   14,
+       11,   11,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[15] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    3,    1,    1,    1,
+        3,    3,    3,    3
+    } ;
+
+static yyconst short int yy_base[38] =
+    {   0,
+        0,    0,   48,   49,   45,    0,   12,   41,   39,   34,
+       49,    0,   41,    0,   14,   49,   49,   39,   38,   26,
+        0,   36,   49,   35,   49,   24,   24,   32,   31,   49,
+       49,   18,   21,   17,   24,   27,   30
+    } ;
+
+static yyconst short int yy_def[38] =
+    {   0,
+       31,    1,   31,   31,   31,   32,   33,   31,   31,   31,
+       31,   34,   31,   32,   33,   31,   31,   35,   36,   31,
+       34,   35,   31,   36,   31,   31,   31,   37,   37,   31,
+        0,   31,   31,   31,   31,   31,   31
+    } ;
+
+static yyconst short int yy_nxt[64] =
+    {   0,
+        4,    5,    6,    7,    8,    9,    4,   10,   11,    4,
+       12,   12,   12,   12,   16,   17,   16,   17,   14,   21,
+       14,   15,   15,   15,   22,   22,   22,   24,   24,   24,
+       29,   29,   29,   30,   30,   28,   27,   25,   23,   26,
+       25,   23,   13,   20,   19,   18,   13,   31,    3,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31
+    } ;
+
+static yyconst short int yy_chk[64] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    7,    7,   15,   15,   32,   34,
+       32,   33,   33,   33,   35,   35,   35,   36,   36,   36,
+       37,   37,   37,   29,   28,   27,   26,   24,   22,   20,
+       19,   18,   13,   10,    9,    8,    5,    3,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+static int yy_more_flag = 0;
+static int yy_more_len = 0;
+#define yymore() (yy_more_flag = 1)
+#define YY_MORE_ADJ yy_more_len
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "xml.l"
+#define INITIAL 0
+/*
+       MUST COMPILE WITH
+               flex -PxmlParser -oxmllexer.cc xml.l
+       (or equivalent).
+*/     
+#line 9 "xml.l"
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ // #include "parse_fta.h"
+ #include <string.h>
+
+
+
+#include "xml.tab.hh"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int xmlParserwrap(){return(1);}
+
+extern int xmlParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_xml_lineno : the line currently being parsed when the error occurs.
+               flex_xml_ch : the character on the line where the error occurs
+               flex_xml_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_xml_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_xml_lineno = 1;
+int flex_xml_ch = 0;
+char flex_xml_linebuf[20000];
+
+char *flex_xml_stringinput = NULL;
+int flex_xml_stringinput_ptr = 0;
+FILE *flex_xml_fileinput = NULL;
+int my_xmlParser_yyinput(char *buf, int max_size);
+
+
+
+void xmlParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_xml_lineno, flex_xml_ch, s, xmlParsertext, flex_xml_linebuf );
+    for(i=0;i<flex_xml_ch;i++){
+               if(flex_xml_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_xml_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_xmlParser_yyinput(b,ms))
+
+/* MKS needs the next line to increase the NFA table */
+#line 490 "xmllexer.cc"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( yy_current_buffer->yy_is_interactive ) \
+               { \
+               int c = '*', n; \
+               for ( n = 0; n < max_size && \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+                       buf[n] = (char) c; \
+               if ( c == '\n' ) \
+                       buf[n++] = (char) c; \
+               if ( c == EOF && ferror( yyin ) ) \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+               result = n; \
+               } \
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+                 && ferror( yyin ) ) \
+               YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+       YY_USER_ACTION
+
+YY_DECL
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp = NULL, *yy_bp = NULL;
+       register int yy_act;
+
+#line 88 "xml.l"
+
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+
+
+
+#line 663 "xmllexer.cc"
+
+       if ( yy_init )
+               {
+               yy_init = 0;
+
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! yy_start )
+                       yy_start = 1;   /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( ! yy_current_buffer )
+                       yy_current_buffer =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+
+               yy_load_buffer_state();
+               }
+
+       while ( 1 )             /* loops until end-of-file is reached */
+               {
+               yy_more_len = 0;
+               if ( yy_more_flag )
+                       {
+                       yy_more_len = yy_c_buf_p - yytext_ptr;
+                       yy_more_flag = 0;
+                       }
+               yy_cp = yy_c_buf_p;
+
+               /* Support of yytext. */
+               *yy_cp = yy_hold_char;
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = yy_start;
+yy_match:
+               do
+                       {
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               yy_last_accepting_state = yy_current_state;
+                               yy_last_accepting_cpos = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 32 )
+                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 49 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+               if ( yy_act == 0 )
+                       { /* have to back up */
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       yy_act = yy_accept[yy_current_state];
+                       }
+
+               YY_DO_BEFORE_ACTION;
+
+
+do_action:     /* This label is used only to access EOF actions. */
+
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = yy_hold_char;
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 109 "xml.l"
+{ flex_xml_ch+=xmlParserleng; return yytext[0]; }
+       YY_BREAK
+/* names */
+case 2:
+YY_RULE_SETUP
+#line 113 "xml.l"
+{ flex_xml_ch+=xmlParserleng; xmlParserlval.strval = strdup(yytext); return NAME; }
+       YY_BREAK
+/* strings */
+case 3:
+YY_RULE_SETUP
+#line 118 "xml.l"
+{
+               
+               int c;
+               
+               xmlParserlval.strval = strdup(xmlParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_xml_ch+=xmlParserleng; 
+                       xmlParserlval.strval[xmlParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+       YY_BREAK
+case 4:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 135 "xml.l"
+{ flex_xml_ch+=xmlParserleng; xmlParsererror("Unterminated string"); }
+       YY_BREAK
+/*                                                                                                                     */
+/*             Newline : advance the error reporting line number       */
+/*             and grab the next line into flex_xml_linebuf                    */
+/*                                                                                                                     */
+case 5:
+YY_RULE_SETUP
+#line 142 "xml.l"
+{flex_xml_ch=0; flex_xml_lineno++;
+                          strcpy(flex_xml_linebuf,xmlParsertext+1);
+                          yyless(1);
+                          }
+       YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 147 "xml.l"
+{flex_xml_ch+=xmlParserleng; } /* white space */
+       YY_BREAK
+case 7:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 149 "xml.l"
+{flex_xml_ch+=xmlParserleng; };        /* comment */
+       YY_BREAK
+case 8:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 150 "xml.l"
+{flex_xml_ch+=xmlParserleng; };        /* comment */
+       YY_BREAK
+case 9:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 151 "xml.l"
+{flex_xml_ch+=xmlParserleng; }; /* comment */
+       YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 153 "xml.l"
+{flex_xml_ch+=xmlParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  xmlParsererror(yytext);}
+       YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 155 "xml.l"
+ECHO;
+       YY_BREAK
+#line 843 "xmllexer.cc"
+case YY_STATE_EOF(INITIAL):
+       yyterminate();
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = yy_hold_char;
+               YY_RESTORE_YY_MORE_OFFSET
+
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between yy_current_buffer and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       yy_n_chars = yy_current_buffer->yy_n_chars;
+                       yy_current_buffer->yy_input_file = yyin;
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state();
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++yy_c_buf_p;
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                               yy_cp = yy_c_buf_p;
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer() )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               yy_did_buffer_switch_on_eof = 0;
+
+                               if ( yywrap() )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               yy_c_buf_p =
+                                       yytext_ptr + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               yy_c_buf_p =
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+       {
+       register char *dest = yy_current_buffer->yy_ch_buf;
+       register char *source = yytext_ptr;
+       register int number_to_move, i;
+       int ret_val;
+
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( yy_current_buffer->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a single character, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+       else
+               {
+               int num_to_read =
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+                       YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = yy_current_buffer;
+
+                       int yy_c_buf_p_offset =
+                               (int) (yy_c_buf_p - b->yy_ch_buf);
+
+                       if ( b->yy_is_our_buffer )
+                               {
+                               int new_size = b->yy_buf_size * 2;
+
+                               if ( new_size <= 0 )
+                                       b->yy_buf_size += b->yy_buf_size / 8;
+                               else
+                                       b->yy_buf_size *= 2;
+
+                               b->yy_ch_buf = (char *)
+                                       /* Include room in for 2 EOB chars. */
+                                       yy_flex_realloc( (void *) b->yy_ch_buf,
+                                                        b->yy_buf_size + 2 );
+                               }
+                       else
+                               /* Can't grow it, we don't own it. */
+                               b->yy_ch_buf = 0;
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = yy_current_buffer->yy_buf_size -
+                                               number_to_move - 1;
+#endif
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+                       yy_n_chars, num_to_read );
+
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       if ( yy_n_chars == 0 )
+               {
+               if ( number_to_move == YY_MORE_ADJ )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       yy_current_buffer->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       yy_n_chars += number_to_move;
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+       return ret_val;
+       }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp;
+
+       yy_current_state = yy_start;
+
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+               {
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       yy_last_accepting_state = yy_current_state;
+                       yy_last_accepting_cpos = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 32 )
+                               yy_c = yy_meta[(unsigned int) yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+               }
+
+       return yy_current_state;
+       }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+       {
+       register int yy_is_jam;
+       register char *yy_cp = yy_c_buf_p;
+
+       register YY_CHAR yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               yy_last_accepting_state = yy_current_state;
+               yy_last_accepting_cpos = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 32 )
+                       yy_c = yy_meta[(unsigned int) yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+       yy_is_jam = (yy_current_state == 31);
+
+       return yy_is_jam ? 0 : yy_current_state;
+       }
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+       {
+       register char *yy_cp = yy_c_buf_p;
+
+       /* undo effects of setting up yytext */
+       *yy_cp = yy_hold_char;
+
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               register int number_to_move = yy_n_chars + 2;
+               register char *dest = &yy_current_buffer->yy_ch_buf[
+                                       yy_current_buffer->yy_buf_size + 2];
+               register char *source =
+                               &yy_current_buffer->yy_ch_buf[number_to_move];
+
+               while ( source > yy_current_buffer->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += (int) (dest - source);
+               yy_bp += (int) (dest - source);
+               yy_current_buffer->yy_n_chars =
+                       yy_n_chars = yy_current_buffer->yy_buf_size;
+
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       *--yy_cp = (char) c;
+
+
+       yytext_ptr = yy_bp;
+       yy_hold_char = *yy_cp;
+       yy_c_buf_p = yy_cp;
+       }
+#endif /* ifndef YY_NO_UNPUT */
+
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+       {
+       int c;
+
+       *yy_c_buf_p = yy_hold_char;
+
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       /* This was really a NUL. */
+                       *yy_c_buf_p = '\0';
+
+               else
+                       { /* need more input */
+                       int offset = yy_c_buf_p - yytext_ptr;
+                       ++yy_c_buf_p;
+
+                       switch ( yy_get_next_buffer() )
+                               {
+                               case EOB_ACT_LAST_MATCH:
+                                       /* This happens because yy_g_n_b()
+                                        * sees that we've accumulated a
+                                        * token and flags that we need to
+                                        * try matching the token before
+                                        * proceeding.  But for input(),
+                                        * there's no matching to consider.
+                                        * So convert the EOB_ACT_LAST_MATCH
+                                        * to EOB_ACT_END_OF_FILE.
+                                        */
+
+                                       /* Reset buffer status. */
+                                       yyrestart( yyin );
+
+                                       /* fall through */
+
+                               case EOB_ACT_END_OF_FILE:
+                                       {
+                                       if ( yywrap() )
+                                               return EOF;
+
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+#ifdef __cplusplus
+                                       return yyinput();
+#else
+                                       return input();
+#endif
+                                       }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       yy_c_buf_p = yytext_ptr + offset;
+                                       break;
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
+       *yy_c_buf_p = '\0';     /* preserve yytext */
+       yy_hold_char = *++yy_c_buf_p;
+
+
+       return c;
+       }
+#endif /* YY_NO_INPUT */
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+       {
+       if ( ! yy_current_buffer )
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+       yy_init_buffer( yy_current_buffer, input_file );
+       yy_load_buffer_state();
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+       {
+       if ( yy_current_buffer == new_buffer )
+               return;
+
+       if ( yy_current_buffer )
+               {
+               /* Flush out information for old buffer. */
+               *yy_c_buf_p = yy_hold_char;
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       yy_current_buffer = new_buffer;
+       yy_load_buffer_state();
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       yy_did_buffer_switch_on_eof = 1;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+       {
+       yy_n_chars = yy_current_buffer->yy_n_chars;
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+       yyin = yy_current_buffer->yy_input_file;
+       yy_hold_char = *yy_c_buf_p;
+       }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_is_our_buffer = 1;
+
+       yy_init_buffer( b, file );
+
+       return b;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+       {
+       if ( ! b )
+               return;
+
+       if ( b == yy_current_buffer )
+               yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+       if ( b->yy_is_our_buffer )
+               yy_flex_free( (void *) b->yy_ch_buf );
+
+       yy_flex_free( (void *) b );
+       }
+
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+       {
+       yy_flush_buffer( b );
+
+       b->yy_input_file = file;
+       b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+       b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+       b->yy_is_interactive = 0;
+#else
+       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+       {
+       if ( ! b )
+               return;
+
+       b->yy_n_chars = 0;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[0];
+
+       b->yy_at_bol = 1;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       if ( b == yy_current_buffer )
+               yy_load_buffer_state();
+       }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       if ( size < 2 ||
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||
+            base[size-1] != YY_END_OF_BUFFER_CHAR )
+               /* They forgot to leave room for the EOB's. */
+               return 0;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+       b->yy_buf_pos = b->yy_ch_buf = base;
+       b->yy_is_our_buffer = 0;
+       b->yy_input_file = 0;
+       b->yy_n_chars = b->yy_buf_size;
+       b->yy_is_interactive = 0;
+       b->yy_at_bol = 1;
+       b->yy_fill_buffer = 0;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       yy_switch_to_buffer( b );
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+       {
+       int len;
+       for ( len = 0; yy_str[len]; ++len )
+               ;
+
+       return yy_scan_bytes( yy_str, len );
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+       {
+       YY_BUFFER_STATE b;
+       char *buf;
+       yy_size_t n;
+       int i;
+
+       /* Get memory for full buffer, including space for trailing EOB's. */
+       n = len + 2;
+       buf = (char *) yy_flex_alloc( n );
+       if ( ! buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+       for ( i = 0; i < len; ++i )
+               buf[i] = bytes[i];
+
+       buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+       b = yy_scan_buffer( buf, n );
+       if ( ! b )
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+       /* It's okay to grow etc. this buffer, and we should throw it
+        * away when we're done.
+        */
+       b->yy_is_our_buffer = 1;
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+       {
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )
+               {
+               yy_size_t new_size;
+
+               yy_start_stack_depth += YY_START_STACK_INCR;
+               new_size = yy_start_stack_depth * sizeof( int );
+
+               if ( ! yy_start_stack )
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+               else
+                       yy_start_stack = (int *) yy_flex_realloc(
+                                       (void *) yy_start_stack, new_size );
+
+               if ( ! yy_start_stack )
+                       YY_FATAL_ERROR(
+                       "out of memory expanding start-condition stack" );
+               }
+
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+       BEGIN(new_state);
+       }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+       {
+       if ( --yy_start_stack_ptr < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);
+       }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+       {
+       return yy_start_stack[yy_start_stack_ptr - 1];
+       }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+       {
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+       }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               yytext[yyleng] = yy_hold_char; \
+               yy_c_buf_p = yytext + n; \
+               yy_hold_char = *yy_c_buf_p; \
+               *yy_c_buf_p = '\0'; \
+               yyleng = n; \
+               } \
+       while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+       {
+       register int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+       }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+       {
+       register int n;
+       for ( n = 0; s[n]; ++n )
+               ;
+
+       return n;
+       }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+       {
+       return (void *) malloc( size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+       {
+       /* The cast to (char *) in the following accommodates both
+        * implementations that use char* generic pointers, and those
+        * that use void* generic pointers.  It works with the latter
+        * because both ANSI C and C++ allow castless assignment from
+        * any pointer type to void*, and deal with argument conversions
+        * as though doing an assignment.
+        */
+       return (void *) realloc( (char *) ptr, size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+       {
+       free( ptr );
+       }
+
+#if YY_MAIN
+int main()
+       {
+       yylex();
+       return 0;
+       }
+#endif
+#line 155 "xml.l"
+
+
+int my_xmlParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_xml_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_xml_stringinput[flex_xml_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_xml_stringinput[flex_xml_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_xml_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_xml_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void xmlParser_setfileinput(FILE *f){
+       xmlParserrestart(NULL);
+
+       flex_xml_fileinput = f;
+       flex_xml_stringinput = NULL;
+       flex_xml_lineno = 1;
+       flex_xml_ch = 0;
+}
+
+void xmlParser_setstringinput(char *s){
+       xmlParserrestart(NULL);
+
+       flex_xml_fileinput = NULL;
+       flex_xml_stringinput = s;
+       flex_xml_stringinput_ptr = 0;
+       flex_xml_lineno = 1;
+       flex_xml_ch = 0;
+}
+       
+               
+
+
+
diff --git a/src/lib/Makefile b/src/lib/Makefile
new file mode 100644 (file)
index 0000000..8e1936e
--- /dev/null
@@ -0,0 +1,56 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+all: mgscphost mgscphostaux mgscplftaaux mgscphftaaux mgscprts mgscpapp mgscpaux
+
+clean:
+       cd gscphost ; make clean
+       cd gscphostaux ; make clean
+       cd gscplftaaux ; make clean
+       cd gscphftaaux ; make clean
+       cd gscprts ; make clean
+       cd gscpapp; make clean
+       cd gscpaux; make clean
+
+install:
+       cd gscphost ; make install
+       cd gscphostaux ; make install
+       cd gscplftaaux ; make install
+       cd gscphftaaux ; make install
+       cd gscprts ; make install
+       cd gscpapp; make install
+       cd gscpaux; make install
+
+mgscphost:
+       cd gscphost ; make
+
+mgscphostaux:
+       cd gscphostaux ; make
+
+mgscplftaaux:
+       cd gscplftaaux ; make
+
+mgscphftaaux:
+       cd gscphftaaux ; make
+
+mgscprts:
+       cd gscprts ; make
+
+mgscpapp:
+       cd gscpapp; make
+
+mgscpaux:
+       cd gscpaux; make
+
diff --git a/src/lib/gscpapp/Makefile b/src/lib/gscpapp/Makefile
new file mode 100644 (file)
index 0000000..55c2cbb
--- /dev/null
@@ -0,0 +1,36 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+CC=gcc -O3  -fexpensive-optimizations  -I ../../../include
+
+SOURCE = appinterface.c
+
+OBJECTS = $(SOURCE:.c=.o)
+
+all: libgscpapp.a
+       cp libgscpapp.a ../../../lib; ranlib ../../../lib/libgscpapp.a
+
+libgscpapp.a: $(OBJECTS) Makefile 
+       ar  rc libgscpapp.a $(OBJECTS) 
+
+INCDIR=../../../include
+
+appinterface.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) $(INCDIR/app.h) $(INCDIR/fta.h) $(INCDIR/lapp.h) 
+
+install: all
+
+clean:
+       rm -f *.o *.a core
+
diff --git a/src/lib/gscpapp/appinterface.c b/src/lib/gscpapp/appinterface.c
new file mode 100644 (file)
index 0000000..961926f
--- /dev/null
@@ -0,0 +1,372 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "app.h"
+#include "fta.h"
+#include "lapp.h"
+#include "string.h"
+#include "stdio.h"
+#include "stdlib.h"
+#include "schemaparser.h"
+#include "gshub.h"
+
+
+// Defined here to avoid link errors as this array is auto generated for the lfta and referenced in the clearinghouse library which gets linked against the hfta
+gs_sp_t fta_names[]={0};
+
+
+/* HIGH LEVEL APPLICATION INTERFACE */
+/* ================================ */
+
+struct fta_instance {
+    gs_sp_t name;
+    FTAID ftaid;
+    gs_int32_t used;
+    gs_schemahandle_t schema;
+};
+
+
+struct fta_instance * instance_array=0;
+gs_int32_t instance_array_sz=0;
+
+static gs_retval_t
+add_fta(gs_sp_t name, FTAID ftaid,
+        gs_schemahandle_t schema)
+{
+    gs_int32_t x;
+    if ( instance_array_sz == 0) {
+        if ((instance_array = malloc(sizeof(struct fta_instance)*STARTSZ))==0) {
+            gslog(LOG_EMERG,"ERROR:Out of memory ftacallback\n");
+            return -1;
+        }
+        memset(instance_array,0,sizeof(struct fta_instance)*STARTSZ);
+        instance_array_sz = STARTSZ;
+    }
+    for(x=0;(x<instance_array_sz)&&(instance_array[x].used!=0);x++);
+    if (x == instance_array_sz) {
+        gs_int32_t y;
+        instance_array_sz = 2*instance_array_sz;
+        if ((instance_array =
+             realloc(instance_array,instance_array_sz*
+                     sizeof(struct fta_instance)))==0) {
+                 gslog(LOG_EMERG,"ERROR:Out of memory ftacallback\n");
+                 return -1;
+             }
+        for (y=x;y<instance_array_sz;x++)
+            instance_array[y].used=0;
+    }
+    instance_array[x].name=strdup(name);
+    instance_array[x].ftaid=ftaid;
+    instance_array[x].schema=schema;
+    instance_array[x].used=1;
+    return 0;
+}
+
+static gs_retval_t
+rm_fta(FTAID ftaid)
+{
+    gs_int32_t x;
+    for (x=0;x<instance_array_sz;x++) {
+        if ( (instance_array[x].ftaid.ip=ftaid.ip)
+            && (instance_array[x].ftaid.port==ftaid.port)
+            && (instance_array[x].ftaid.index==ftaid.index)
+            && (instance_array[x].ftaid.streamid==ftaid.streamid)){
+            instance_array[x].used=0;
+        }
+    }
+    return 0;
+}
+
+
+static struct fta_instance *
+get_fta(FTAID ftaid)
+{
+    gs_int32_t x;
+    for (x=0;x<instance_array_sz;x++) {
+        if (( instance_array[x].used!=0 )
+            && (instance_array[x].ftaid.ip==ftaid.ip)
+            && (instance_array[x].ftaid.port==ftaid.port)
+            && (instance_array[x].ftaid.index==ftaid.index)
+            && (instance_array[x].ftaid.streamid==ftaid.streamid))
+        {
+            return &instance_array[x];
+        }
+    }
+    return 0;
+}
+
+
+
+gs_retval_t
+ftaapp_init(gs_uint32_t bufsz)
+{
+    
+    endpoint gshub;
+    FTAID myftaid;
+    gs_sp_t name = "app\0";
+    if (hostlib_init(APP,bufsz,DEFAULTDEV,0,0)!=0) {
+        gslog(LOG_EMERG,"ftaap_init::error:could not initialize hostlib\n");
+        return -1;
+    }
+    if (get_hub(&gshub)!=0) {
+         gslog(LOG_EMERG,"ERROR:could not find gshub in appinterface init");
+         return -1;
+    }
+    myftaid=gscpipc_getftaid();
+    if (set_ftainstance(gshub,get_instance_name(),(gs_sp_t)name,&myftaid)!=0) {
+        gslog(LOG_EMERG,"ERROR:could not set_ftainstance");
+        return -1;
+    }
+    return 0;
+}
+
+/* this should be used before exiting to make sure everything gets
+ cleaned up
+ */
+gs_retval_t
+ftaapp_exit()
+{
+    gs_int32_t x;
+    for (x=0;x<instance_array_sz;x++) {
+        if (instance_array[x].used!=0) {
+            ftaapp_remove_fta(instance_array[x].ftaid,1);
+        }
+    }
+    hostlib_free();
+    return 0;
+}
+
+/* adds an FTA by key returns unique streamid which can be used to reference FTA*/
+
+
+FTAID
+ftaapp_add_fta(FTAname name, gs_uint32_t reuse, gs_uint32_t reusable,
+               gs_int32_t command, gs_int32_t sz, void *  data)
+{
+    gs_int8_t schemabuf[MAXSCHEMASZ];
+    gs_schemahandle_t schema;
+    FTAID f;
+    FTAID ferr;
+    ferr.ip=0;
+    ferr.port=0;
+    ferr.index=0;
+    ferr.streamid=0;
+    
+    
+    if (fta_find(name,reuse,&f,schemabuf,MAXSCHEMASZ)!=0) {
+        gslog(LOG_EMERG,"ftaapp_add_fta::error:could not find FTA\n");
+        return ferr;
+    }
+    
+    
+    if ((schema=ftaschema_parse_string(schemabuf))<0) {
+        gslog(LOG_EMERG,"ftaapp_add_fta::error:could not parse schema\n");
+        fprintf(stderr,"/n%s\n",schemabuf);
+        return ferr;
+    }
+    
+    if ((fta_alloc_instance(gscpipc_getftaid(),&f,name,schemabuf,reusable,
+                            command,sz,data))!=0) {
+        gslog(LOG_EMERG,"ftaapp_add_fta::error:could instantiate a FTA\n");
+        ftaschema_free(schema);
+        return ferr;
+    }
+    
+    if (f.streamid==0) {
+        gslog(LOG_EMERG,"ftaapp_add_fta::error:could instantiate a FTA\n");
+        ftaschema_free(schema);
+        return ferr;
+    }
+    
+    //gslog(LOG_EMERG,"apptrace adding fta %u %u %u %u\n",f.ip,f.port,f.index,f.streamid);
+    if (add_fta((gs_sp_t)name,f,schema)<0) {
+        gslog(LOG_EMERG,"ftaapp_add_fta::error:could not add fta to internal db\n");
+        fta_free_instance(gscpipc_getftaid(),f,1);
+        ftaschema_free(schema);
+        return ferr;
+    }
+    
+    return f;
+}
+
+FTAID ftaapp_add_fta_print(FTAname name, gs_uint32_t reuse, gs_uint32_t reusable,
+                           gs_int32_t command, gs_int32_t sz,
+                           void *  data,gs_sp_t path,
+                           gs_sp_t basename, gs_sp_t temporal_field, gs_sp_t split_field,
+                           gs_uint32_t delta, gs_uint32_t split) {
+    gs_int8_t schemabuf[MAXSCHEMASZ];
+    gs_schemahandle_t schema;
+    FTAID f;
+    FTAID ferr;
+    ferr.ip=0;
+    ferr.port=0;
+    ferr.index=0;
+    ferr.streamid=0;
+    
+    
+    if (fta_find(name,reuse,&f,schemabuf,MAXSCHEMASZ)!=0) {
+        gslog(LOG_EMERG,"ftaapp_add_fta::error:could not find FTA\n");
+        return ferr;
+    }
+    
+    if ((schema=ftaschema_parse_string(schemabuf))<0) {
+        gslog(LOG_EMERG,"ftaapp_add_fta::error:could not parse schema\n");
+        return ferr;
+    }
+    
+    if ((fta_alloc_print_instance(gscpipc_getftaid(),
+                                  &f,name,schemabuf,reusable,
+                                  command,sz,data,path,
+                                  basename,temporal_field,split_field,delta,split))!=0) {
+        gslog(LOG_EMERG,"ftaapp_add_fta::error:could instantiate a FTA\n");
+        ftaschema_free(schema);
+        return ferr;
+    }
+    
+    if (f.streamid==0) {
+        gslog(LOG_EMERG,"ftaapp_add_fta::error:could instantiate a FTA\n");
+        ftaschema_free(schema);
+        return ferr;
+    }
+    
+    if (add_fta((gs_sp_t)name,f,schema)<0) {
+        gslog(LOG_EMERG,"ftaapp_add_fta::error:could not add fta to internal db\n");
+        fta_free_instance(gscpipc_getftaid(),f,1);
+        ftaschema_free(schema);
+        return ferr;
+    }
+    
+    return f;
+}
+
+/* get the schema definition of an FTA */
+gs_schemahandle_t
+ftaapp_get_fta_schema(FTAID ftaid)
+{
+    struct fta_instance * fi;
+    
+    //gslog(LOG_EMERG,"apptrace checking fta %u %u %u %u\n",ftaid.ip,ftaid.port,ftaid.index,ftaid.streamid);
+    
+    if ((fi=get_fta(ftaid))==0) {
+        gslog(LOG_EMERG,"ftaapp_get_fta_schema::error:unknown streamid\n");
+        return -1;
+    }
+    return fi->schema;
+}
+
+/* get the asci schema definition for the FTA associated with the FTA name */
+gs_schemahandle_t ftaapp_get_fta_schema_by_name(gs_sp_t name)
+{
+    FTAID f;
+    gs_int8_t schemabuf[MAXSCHEMASZ];
+    gs_schemahandle_t schema;
+    if (fta_find(name,0,&f,schemabuf,MAXSCHEMASZ)!=0) {
+        gslog(LOG_EMERG,"ftaapp_get_fta_schema_by_name::error:could not find FTA\n");
+        return -1;
+    }
+    if ((schema=ftaschema_parse_string(schemabuf))<0) {
+        gslog(LOG_EMERG,"ftaapp_get_fta_schema_by_name::error:could not parse schema\n");
+        return -1;
+    }
+    return schema;
+}
+
+/* get the asci schema definition for the FTA associated with the FTA name */
+gs_sp_t  ftaapp_get_fta_ascii_schema_by_name(gs_sp_t name)
+{
+    FTAID f;
+    static gs_int8_t schemabuf[MAXSCHEMASZ];
+    if (fta_find(name,0,&f,schemabuf,MAXSCHEMASZ)!=0) {
+        gslog(LOG_EMERG,"ftaapp_get_fta_schema_by_name::error:could not find FTA\n");
+        return 0;
+    }
+    return schemabuf;
+}
+
+/* control operations keyed of one to one mapping of stream id */
+gs_retval_t
+ftaapp_control(FTAID f, gs_int32_t command, gs_int32_t sz, void *  data)
+{
+    struct fta_instance * fi;
+    if ((fi=get_fta(f))<0) {
+        gslog(LOG_EMERG,"ftaapp_control::error:unknown streamid\n");
+        return -1;
+    }
+    return fta_control(gscpipc_getftaid(),fi->ftaid,command,sz,data);
+}
+
+/* remove FTA keyed of stream id */
+gs_retval_t
+ftaapp_remove_fta(FTAID f, gs_uint32_t recursive)
+{
+    struct fta_instance * fi;
+    if ((fi=get_fta(f))<0) {
+        gslog(LOG_EMERG,"ftaapp_control::error:unknown streamid\n");
+        return -1;
+    }
+    
+    fta_free_instance(gscpipc_getftaid(),fi->ftaid,recursive);
+    ftaschema_free(fi->schema);
+    rm_fta(f);
+    
+    return 0;
+}
+
+/* same as sgroup_get_buffer just repeated to have a complet ftapp interface and remove
+ the heartbeat tuples*/
+gs_retval_t
+ftaapp_get_tuple(FTAID * ftaid, gs_uint32_t * size, void *tbuffer,
+                 gs_int32_t tbuf_size, gs_int32_t timeout)
+{
+    gs_uint64_t trace_id;
+    gs_uint32_t sz;
+    fta_stat * trace;
+    gs_sp_t trace_buffer;
+    gs_retval_t res;
+    
+get_tuple_again:
+    res=gscp_get_buffer(ftaid,(gs_int32_t *)size,tbuffer,tbuf_size,timeout);
+    
+    if ((res==0) && (ftaschema_is_temporal_tuple(get_fta(*ftaid)->schema, tbuffer))) {
+        FTAID myftaid;
+        myftaid=gscpipc_getftaid();
+        /* extract trace */
+        if (ftaschema_get_trace(get_fta(*ftaid)->schema,
+                                tbuffer, *size, &trace_id, &sz, &trace))
+        {
+            gslog(LOG_EMERG, "ftaapp_get_tuple:Error: temporal tuple with no trace\n");
+            goto get_tuple_again;
+        }
+        
+               if ((trace_buffer=(gs_sp_t)malloc((sz+1)*sizeof(fta_stat)))==0) {
+            gslog(LOG_EMERG,"ftaapp_get_tuple::Error: allocation for trace tuple failed\n");
+            goto get_tuple_again;
+        }
+        
+        /* generate a heartbeat */
+        memcpy(trace_buffer, trace, sz * sizeof(fta_stat));
+        /* append producers fta_stat to the trace */
+        /* for now we will just fill the FTAID part with 0 of fta_stat, the rest will be cleared */
+        memset(trace_buffer + (sz * sizeof(fta_stat)), 0, sizeof(fta_stat));
+
+        memcpy(trace_buffer + (sz * sizeof(fta_stat)), &myftaid, sizeof(FTAID));
+
+        fta_heartbeat(gscpipc_getftaid(), trace_id, sz+1, (fta_stat *)trace_buffer);
+               free(trace_buffer);
+        res=2; //indicate that it is a temporal tuple
+    }
+    return res;
+}
diff --git a/src/lib/gscpaux/Makefile b/src/lib/gscpaux/Makefile
new file mode 100644 (file)
index 0000000..d266fe9
--- /dev/null
@@ -0,0 +1,36 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+CPPFLAGS = -DNDEBUG -DSTAND_ALONE -I. -I../../../include/
+CC = gcc  -O4 -g
+CPP = g++ -O4 -g
+
+all: libgscpaux.a
+
+install : all
+       cp libgscpaux.a ../../../lib/
+
+libgscpaux.a :  gshub.o simple_http.o json.o block_allocator.o
+               ar cr $@ $?
+               ( ranlib $@ ) 2>/dev/null || true
+       cp libgscpaux.a ../../../lib/
+
+INCDIR=../../../include
+LFTA_DIR=$(INCDIR/lfta)
+HFTA_DIR=$(INCDIR/hfta)
+
+
+clean: 
+       rm -f */*.o */*/*.o *.o libgscpaux.a
diff --git a/src/lib/gscpaux/block_allocator.cpp b/src/lib/gscpaux/block_allocator.cpp
new file mode 100644 (file)
index 0000000..5d0fbdc
--- /dev/null
@@ -0,0 +1,52 @@
+// Distributed under the MIT license. Copyright (c) 2010, Ivan Vashchaev
+
+#include <stdlib.h>
+#include <algorithm>
+#include "block_allocator.h"
+
+block_allocator::block_allocator(size_t blocksize): m_head(0), m_blocksize(blocksize)
+{
+}
+
+block_allocator::~block_allocator()
+{
+       while (m_head)
+       {
+               block *temp = m_head->next;
+               ::free(m_head);
+               m_head = temp;
+       }
+}
+
+void block_allocator::swap(block_allocator &rhs)
+{
+       std::swap(m_blocksize, rhs.m_blocksize);
+       std::swap(m_head, rhs.m_head);
+}
+
+void *block_allocator::malloc(size_t size)
+{
+       if ((m_head && m_head->used + size > m_head->size) || !m_head)
+       {
+               // calc needed size for allocation
+               size_t alloc_size = std::max(sizeof(block) + size, m_blocksize);
+
+               // create new block
+               char *buffer = (char *)::malloc(alloc_size);
+               block *b = reinterpret_cast<block *>(buffer);
+               b->size = alloc_size;
+               b->used = sizeof(block);
+               b->buffer = buffer;
+               b->next = m_head;
+               m_head = b;
+       }
+
+       void *ptr = m_head->buffer + m_head->used;
+       m_head->used += size;
+       return ptr;
+}
+
+void block_allocator::free()
+{
+       block_allocator(0).swap(*this);
+}
diff --git a/src/lib/gscpaux/block_allocator.h b/src/lib/gscpaux/block_allocator.h
new file mode 100644 (file)
index 0000000..ae9fc4f
--- /dev/null
@@ -0,0 +1,37 @@
+// Distributed under the MIT license. Copyright (c) 2010, Ivan Vashchaev
+
+#ifndef BLOCK_ALLOCATOR_H
+#define BLOCK_ALLOCATOR_H
+
+class block_allocator
+{
+private:
+       struct block
+       {
+               size_t size;
+               size_t used;
+               char *buffer;
+               block *next;
+       };
+
+       block *m_head;
+       size_t m_blocksize;
+
+       block_allocator(const block_allocator &);
+       block_allocator &operator=(block_allocator &);
+
+public:
+       block_allocator(size_t blocksize);
+       ~block_allocator();
+
+       // exchange contents with rhs
+       void swap(block_allocator &rhs);
+
+       // allocate memory
+       void *malloc(size_t size);
+
+       // free all allocated blocks
+       void free();
+};
+
+#endif
diff --git a/src/lib/gscpaux/gshub.cpp b/src/lib/gscpaux/gshub.cpp
new file mode 100644 (file)
index 0000000..b21ca0f
--- /dev/null
@@ -0,0 +1,294 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include "gshub.h"
+#include "gslog.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+
+#include "simple_http.h"
+#include "json.h"
+
+// maximum length of URL for http requests
+#define MAX_URL_LEN 64 * 1024
+
+// maximu length of JSON response
+#define MAX_JSON_LEN 64 * 1024
+
+// sleep time between HTTP request retries
+#define HTTP_RETRY_INTERVAL 5
+
+// GSHUB endpoint
+endpoint hub;
+
+// GSHUB instance_name
+gs_sp_t instance_name=0;
+
+
+// retrieve the endpoint of gs instance, source or sink identified by url
+gs_retval_t get_service_endpoint (endpoint gshub, gs_csp_t url, endpoint* instance, gs_bool_t block) {
+       int res, ret;
+       gs_uint32_t http_code;
+       char json[MAX_JSON_LEN];
+
+       while (true) {
+               res = http_get_request(gshub, url, &http_code, json);
+               if(res) {
+                       fprintf(stderr, "http_get_request() failed\n");
+                       ret = -1;
+               }
+               else {
+                       // in blocking mode we will keep retrying
+                       if (http_code == 400) {
+                               if (block) {
+                                       sleep(HTTP_RETRY_INTERVAL);
+                                       continue;
+                               } else {
+                                       ret = 1;
+                                       break;
+                               }
+
+                       }
+                       if (http_code == 200 ) {
+                               // if instance is NULL there is no need to parse json
+                               if (!instance) {
+                                       ret = 0;
+                                       break;
+                               }
+
+                               // now parse json response
+                               char *errorPos = 0;
+                               char *errorDesc = 0;
+                               int errorLine = 0;
+                               block_allocator allocator(1 << 10); // 1 KB per block
+
+                               json_value *root = json_parse(json, &errorPos, (const char**)&errorDesc, &errorLine, &allocator);
+                               if (!root) {
+                                       fprintf(stderr, "GSHUB returned invalid json response, error description - %s, error line - %d\n", errorDesc, errorLine);
+                                       ret = -1;
+                               } else {
+                                       unsigned long json_ip = 0;
+                                       bool ip_set = false;
+                                       unsigned json_port = 0;
+                                       bool port_set = false;
+                                       for (json_value *it = root->first_child; it; it = it->next_sibling) {
+                                               if (it->name) {
+                                                       if (!strcmp(it->name, "ip") && it->type == JSON_STRING) {
+                                                               inet_pton(AF_INET, it->string_value, &json_ip);
+                                                               ip_set = true;
+                                                       } else if (!strcmp(it->name, "port") && it->type == JSON_INT) {
+                                                               json_port = htons(it->int_value);
+                                                               port_set = true;
+                                                       }
+                                               }
+                                       }
+
+                                       if (!ip_set || !port_set) {
+                                               fprintf(stderr, "GSHUB returned json response with missing ip or port fields");
+                                               ret = -1;
+                                       }
+                                       instance->ip = json_ip;
+                                       instance->port = json_port;
+
+                                       ret = 0;
+                               }
+                       } else
+                               ret = -1;
+               }
+               break;
+       }
+
+       return ret;
+
+}
+
+// announce gs instance/sink/source to gshub. GSHUB is identified by URL, instance/sink/source information is in application/json
+gs_retval_t set_endpoint_info (endpoint gshub, gs_csp_t url, char* info) {
+       int res;
+       gs_uint32_t http_code;
+
+       res = http_post_request(gshub, url, info, &http_code);
+       if (res) {
+               fprintf(stderr, "http_post_request() failed\n");
+               return -1;
+       }
+
+       if (http_code == 200)
+               return 0;
+       else
+               return -1;
+}
+
+extern "C" gs_retval_t set_instance_name(gs_sp_t instancename){
+       instance_name=strdup(instancename);
+
+       return 0;
+}
+
+extern "C" gs_sp_t get_instance_name() {
+       return instance_name;
+}
+
+// save gshub endpoint
+extern "C" gs_retval_t set_hub(endpoint gshub) {
+       hub.ip = gshub.ip;
+       hub.port = gshub.port;
+
+       return 0;
+}
+
+// retrieve gsbub endpoint
+extern "C" gs_retval_t get_hub(endpoint* gshub) {
+
+       if (hub.ip==0)
+               return -1;
+       gshub->ip = hub.ip;
+       gshub->port = hub.port;
+
+       return 0;
+}
+
+// Discover gs instance endpoint by name.
+extern "C" gs_retval_t get_instance(endpoint gshub, gs_sp_t instance_name, endpoint* instance, gs_bool_t block) {
+       char url[MAX_URL_LEN];
+
+       sprintf(url, "%s/%s", DISCOVER_INSTANCE_URL, instance_name);
+
+       return get_service_endpoint(gshub, url, instance, block);
+}
+
+// Discover initialized gs instance endpoint by name.
+extern "C" gs_retval_t get_initinstance(endpoint gshub, gs_sp_t instance_name, endpoint* instance, gs_bool_t block) {
+       char url[MAX_URL_LEN];
+
+       sprintf(url, "%s/%s", DISCOVER_INITINSTANCE_URL, instance_name);
+
+       return get_service_endpoint(gshub, url, instance, block);
+}
+
+// Discover stream source endpoint by name.
+extern "C" gs_retval_t get_streamsource(endpoint gshub, gs_sp_t source_name, endpoint* source, gs_bool_t block) {
+       char url[MAX_URL_LEN];
+
+       sprintf(url, "%s/%s", DISCOVER_SOURCE_URL, source_name);
+
+       return get_service_endpoint(gshub, url, source, block);
+}
+
+// Discover stream sink endpoint by name.
+extern "C" gs_retval_t get_streamsink(endpoint gshub, gs_sp_t sink_name, endpoint* sink, gs_bool_t block) {
+       char url[MAX_URL_LEN];
+
+       sprintf(url, "%s/%s", DISCOVER_SINK_URL, sink_name);
+
+       return get_service_endpoint(gshub, url, sink, block);
+}
+
+// Discover if an isntance should start processing
+gs_retval_t get_startprocessing(endpoint gshub, gs_sp_t instance_name, gs_bool_t block) {
+       char url[MAX_URL_LEN];
+
+       sprintf(url, "%s/%s", DISCOVER_STARTPROCESSING_URL, instance_name);
+
+       return get_service_endpoint(gshub, url, NULL, block);
+}
+
+// Announce gs instance endpoint to gshub
+extern "C" gs_retval_t set_instance(endpoint gshub, gs_sp_t instance_name, endpoint instance) {
+       char ipstr[16];
+       char info[MAX_JSON_LEN];
+
+       inet_ntop(AF_INET, &instance.ip, ipstr, INET_ADDRSTRLEN);
+       sprintf(info, "{\"name\": \"%s\", \"ip\": \"%s\", \"port\": %d}", instance_name, ipstr, ntohs(instance.port));
+
+       return set_endpoint_info(gshub, ANNOUNCE_INSTANCE_URL, info);
+}
+
+// Announce initialized gs instance endpoint to gshub
+extern "C" gs_retval_t set_initinstance(endpoint gshub, gs_sp_t instance_name) {
+       char info[MAX_JSON_LEN];
+
+       sprintf(info, "{\"name\": \"%s\"}", instance_name);
+
+       return set_endpoint_info(gshub, ANNOUNCE_INITINSTANCE_URL, info);
+}
+
+// Announce stream source endpoint to gshub
+extern "C" gs_retval_t set_streamsource(endpoint gshub, gs_sp_t source_name, endpoint source) {
+       char ipstr[16];
+       char info[MAX_JSON_LEN];
+
+       inet_ntop(AF_INET, &source.ip, ipstr, INET_ADDRSTRLEN);
+       sprintf(info, "{\"name\": \"%s\", \"ip\": \"%s\", \"port\": %d}", source_name, ipstr, ntohs(source.port));
+
+       return set_endpoint_info(gshub, ANNOUNCE_SOURCE_URL, info);
+}
+
+// Announce stream source endpoint to gshub
+extern "C" gs_retval_t set_streamsink(endpoint gshub, gs_sp_t sink_name, endpoint sink) {
+       char ipstr[16];
+       char info[MAX_JSON_LEN];
+
+       inet_ntop(AF_INET, &sink.ip, ipstr, INET_ADDRSTRLEN);
+       sprintf(info, "{\"name\": \"%s\", \"ip\": \"%s\", \"port\": %d}", sink_name, ipstr, ntohs(sink.port));
+
+       return set_endpoint_info(gshub, ANNOUNCE_SINK_URL, info);
+}
+
+// Announce to gshub that an instance can start processin
+extern "C" gs_retval_t set_startprocessing(endpoint gshub, gs_sp_t instance_name) {
+       char info[MAX_JSON_LEN];
+
+       sprintf(info, "{\"name\": \"%s\"}", instance_name);
+
+       return set_endpoint_info(gshub, ANNOUNCE_STARTPROCESSING_URL, info);
+}
+
+// Announce stream subscriptino to gshub
+extern "C" gs_retval_t set_streamsubscription(endpoint gshub, gs_sp_t instance_name, gs_sp_t sink_name) {
+       char info[MAX_JSON_LEN];
+
+       sprintf(info, "{\"name\": \"%s\", \"sink\": \"%s\"}", instance_name, sink_name);
+
+       return set_endpoint_info(gshub, ANNOUNCE_STREAM_SUBSCRIPTION, info);
+}
+
+// Announce new fta instantiation to gshub
+extern "C" gs_retval_t set_ftainstance(endpoint gshub, gs_sp_t instance_name, gs_sp_t ftainstance_name, FTAID* id) {
+       char info[MAX_JSON_LEN];
+
+       sprintf(info, "{\"name\": \"%s\", \"fta_name\": \"%s\", \"ftaid\": {\"ip\": %u, \"port\": %u, \"index\": %u, \"streamid\": %lli}}",
+               instance_name, ftainstance_name, id->ip, id->port, id->index, id->streamid);
+
+       return set_endpoint_info(gshub, ANNOUNCE_FTA_INSTANCE, info);
+}
+
+// Announce fta instance stats to gshub
+extern "C" gs_retval_t set_instancestats(endpoint gshub, gs_sp_t instance_name, fta_stat* stats) {
+       char url[MAX_URL_LEN];
+       char info[MAX_JSON_LEN];
+
+       sprintf(info, "{\"name\": \"%s\", \"ftaid\": {\"ip\": %u, \"port\": %u, \"index\": %u, \"streamid\": %llu}, "
+               "\"metrics\": {\"in_tuple_cnt\": %u, \"out_tuple_cnt\": %u, \"out_tuple_sz\": %u, \"accepted_tuple_cnt\": %u, \"cycle_cnt\": %llu, \"collision_cnt\": %u, \"eviction_cnt\": %u, \"sampling_rate\": %f}}",
+               instance_name, stats->ftaid.ip, stats->ftaid.port, stats->ftaid.index, stats->ftaid.streamid,
+               stats->in_tuple_cnt, stats->out_tuple_cnt, stats->out_tuple_sz, stats->accepted_tuple_cnt, stats->cycle_cnt, stats->collision_cnt, stats->eviction_cnt, stats->sampling_rate);
+
+       return set_endpoint_info(gshub, ANNOUNCE_METRICS, info);
+}
+
diff --git a/src/lib/gscpaux/json.cpp b/src/lib/gscpaux/json.cpp
new file mode 100644 (file)
index 0000000..149c4c5
--- /dev/null
@@ -0,0 +1,475 @@
+// Distributed under the MIT license. Copyright (c) 2010, Ivan Vashchaev
+
+#include <string.h>
+#include "json.h"
+
+// true if character represent a digit
+#define IS_DIGIT(c) (c >= '0' && c <= '9')
+
+// convert string to integer
+static char *atoi(char *first, char *last, int *out)
+{
+       int sign = 1;
+       if (first != last)
+       {
+               if (*first == '-')
+               {
+                       sign = -1;
+                       ++first;
+               }
+               else if (*first == '+')
+               {
+                       ++first;
+               }
+       }
+
+       int result = 0;
+       for (; first != last && IS_DIGIT(*first); ++first)
+       {
+               result = 10 * result + (*first - '0');
+       }
+       *out = result * sign;
+
+       return first;
+}
+
+// convert hexadecimal string to unsigned integer
+static char *hatoui(char *first, char *last, unsigned int *out)
+{
+       unsigned int result = 0;
+       for (; first != last; ++first)
+       {
+               int digit;
+               if (IS_DIGIT(*first))
+               {
+                       digit = *first - '0';
+               }
+               else if (*first >= 'a' && *first <= 'f')
+               {
+                       digit = *first - 'a' + 10;
+               }
+               else if (*first >= 'A' && *first <= 'F')
+               {
+                       digit = *first - 'A' + 10;
+               }
+               else
+               {
+                       break;
+               }
+               result = 16 * result + (unsigned int)digit;
+       }
+       *out = result;
+
+       return first;
+}
+
+// convert string to floating point
+static char *atof(char *first, char *last, float *out)
+{
+       // sign
+       float sign = 1;
+       if (first != last)
+       {
+               if (*first == '-')
+               {
+                       sign = -1;
+                       ++first;
+               }
+               else if (*first == '+')
+               {
+                       ++first;
+               }
+       }
+
+       // integer part
+       float result = 0;
+       for (; first != last && IS_DIGIT(*first); ++first)
+       {
+               result = 10 * result + (float)(*first - '0');
+       }
+
+       // fraction part
+       if (first != last && *first == '.')
+       {
+               ++first;
+
+               float inv_base = 0.1f;
+               for (; first != last && IS_DIGIT(*first); ++first)
+               {
+                       result += (float)(*first - '0') * inv_base;
+                       inv_base *= 0.1f;
+               }
+       }
+
+       // result w\o exponent
+       result *= sign;
+
+       // exponent
+       bool exponent_negative = false;
+       int exponent = 0;
+       if (first != last && (*first == 'e' || *first == 'E'))
+       {
+               ++first;
+
+               if (*first == '-')
+               {
+                       exponent_negative = true;
+                       ++first;
+               }
+               else if (*first == '+')
+               {
+                       ++first;
+               }
+
+               for (; first != last && IS_DIGIT(*first); ++first)
+               {
+                       exponent = 10 * exponent + (*first - '0');
+               }
+       }
+
+       if (exponent)
+       {
+               float power_of_ten = 10;
+               for (; exponent > 1; exponent--)
+               {
+                       power_of_ten *= 10;
+               }
+
+               if (exponent_negative)
+               {
+                       result /= power_of_ten;
+               }
+               else
+               {
+                       result *= power_of_ten;
+               }
+       }
+
+       *out = result;
+
+       return first;
+}
+
+static inline json_value *json_alloc(block_allocator *allocator)
+{
+       json_value *value = (json_value *)allocator->malloc(sizeof(json_value));
+       memset(value, 0, sizeof(json_value));
+       return value;
+}
+
+static inline void json_append(json_value *lhs, json_value *rhs)
+{
+       rhs->parent = lhs;
+       if (lhs->last_child)
+       {
+               lhs->last_child = lhs->last_child->next_sibling = rhs;
+       }
+       else
+       {
+               lhs->first_child = lhs->last_child = rhs;
+       }
+}
+
+#define ERROR(it, desc)\
+       *error_pos = it;\
+       *error_desc = desc;\
+       *error_line = 1 - escaped_newlines;\
+       for (char *c = it; c != source; --c)\
+               if (*c == '\n') ++*error_line;\
+       return 0
+
+#define CHECK_TOP() if (!top) {ERROR(it, "Unexpected character");}
+
+json_value *json_parse(char *source, char **error_pos, const char **error_desc, int *error_line, block_allocator *allocator)
+{
+       json_value *root = 0;
+       json_value *top = 0;
+
+       char *name = 0;
+       char *it = source;
+
+       int escaped_newlines = 0;
+
+       while (*it)
+       {
+               // skip white space
+               while (*it == '\x20' || *it == '\x9' || *it == '\xD' || *it == '\xA')
+               {
+                       ++it;
+               }
+
+               switch (*it)
+               {
+               case '\0':
+                       break;
+               case '{':
+               case '[':
+                       {
+                               // create new value
+                               json_value *object = json_alloc(allocator);
+
+                               // name
+                               object->name = name;
+                               name = 0;
+
+                               // type
+                               object->type = (*it == '{') ? JSON_OBJECT : JSON_ARRAY;
+
+                               // skip open character
+                               ++it;
+
+                               // set top and root
+                               if (top)
+                               {
+                                       json_append(top, object);
+                               }
+                               else if (!root)
+                               {
+                                       root = object;
+                               }
+                               else
+                               {
+                                       ERROR(it, "Second root. Only one root allowed");
+                               }
+                               top = object;
+                       }
+                       break;
+
+               case '}':
+               case ']':
+                       {
+                               if (!top || top->type != ((*it == '}') ? JSON_OBJECT : JSON_ARRAY))
+                               {
+                                       ERROR(it, "Mismatch closing brace/bracket");
+                               }
+
+                               // skip close character
+                               ++it;
+
+                               // set top
+                               top = top->parent;
+                       }
+                       break;
+
+               case ':':
+                       if (!top || top->type != JSON_OBJECT)
+                       {
+                               ERROR(it, "Unexpected character");
+                       }
+                       ++it;
+                       break;
+
+               case ',':
+                       CHECK_TOP();
+                       ++it;
+                       break;
+
+               case '"':
+                       {
+                               CHECK_TOP();
+
+                               // skip '"' character
+                               ++it;
+
+                               char *first = it;
+                               char *last = it;
+                               while (*it)
+                               {
+                                       if ((unsigned char)*it < '\x20')
+                                       {
+                                               ERROR(first, "Control characters not allowed in strings");
+                                       }
+                                       else if (*it == '\\')
+                                       {
+                                               switch (it[1])
+                                               {
+                                               case '"':
+                                                       *last = '"';
+                                                       break;
+                                               case '\\':
+                                                       *last = '\\';
+                                                       break;
+                                               case '/':
+                                                       *last = '/';
+                                                       break;
+                                               case 'b':
+                                                       *last = '\b';
+                                                       break;
+                                               case 'f':
+                                                       *last = '\f';
+                                                       break;
+                                               case 'n':
+                                                       *last = '\n';
+                                                       ++escaped_newlines;
+                                                       break;
+                                               case 'r':
+                                                       *last = '\r';
+                                                       break;
+                                               case 't':
+                                                       *last = '\t';
+                                                       break;
+                                               case 'u':
+                                                       {
+                                                               unsigned int codepoint;
+                                                               if (hatoui(it + 2, it + 6, &codepoint) != it + 6)
+                                                               {
+                                                                       ERROR(it, "Bad unicode codepoint");
+                                                               }
+
+                                                               if (codepoint <= 0x7F)
+                                                               {
+                                                                       *last = (char)codepoint;
+                                                               }
+                                                               else if (codepoint <= 0x7FF)
+                                                               {
+                                                                       *last++ = (char)(0xC0 | (codepoint >> 6));
+                                                                       *last = (char)(0x80 | (codepoint & 0x3F));
+                                                               }
+                                                               else if (codepoint <= 0xFFFF)
+                                                               {
+                                                                       *last++ = (char)(0xE0 | (codepoint >> 12));
+                                                                       *last++ = (char)(0x80 | ((codepoint >> 6) & 0x3F));
+                                                                       *last = (char)(0x80 | (codepoint & 0x3F));
+                                                               }
+                                                       }
+                                                       it += 4;
+                                                       break;
+                                               default:
+                                                       ERROR(first, "Unrecognized escape sequence");
+                                               }
+
+                                               ++last;
+                                               it += 2;
+                                       }
+                                       else if (*it == '"')
+                                       {
+                                               *last = 0;
+                                               ++it;
+                                               break;
+                                       }
+                                       else
+                                       {
+                                               *last++ = *it++;
+                                       }
+                               }
+
+                               if (!name && top->type == JSON_OBJECT)
+                               {
+                                       // field name in object
+                                       name = first;
+                               }
+                               else
+                               {
+                                       // new string value
+                                       json_value *object = json_alloc(allocator);
+
+                                       object->name = name;
+                                       name = 0;
+
+                                       object->type = JSON_STRING;
+                                       object->string_value = first;
+
+                                       json_append(top, object);
+                               }
+                       }
+                       break;
+
+               case 'n':
+               case 't':
+               case 'f':
+                       {
+                               CHECK_TOP();
+
+                               // new null/bool value
+                               json_value *object = json_alloc(allocator);
+
+                               object->name = name;
+                               name = 0;
+
+                               // null
+                               if (it[0] == 'n' && it[1] == 'u' && it[2] == 'l' && it[3] == 'l')
+                               {
+                                       object->type = JSON_NULL;
+                                       it += 4;
+                               }
+                               // true
+                               else if (it[0] == 't' && it[1] == 'r' && it[2] == 'u' && it[3] == 'e')
+                               {
+                                       object->type = JSON_BOOL;
+                                       object->int_value = 1;
+                                       it += 4;
+                               }
+                               // false
+                               else if (it[0] == 'f' && it[1] == 'a' && it[2] == 'l' && it[3] == 's' && it[4] == 'e')
+                               {
+                                       object->type = JSON_BOOL;
+                                       object->int_value = 0;
+                                       it += 5;
+                               }
+                               else
+                               {
+                                       ERROR(it, "Unknown identifier");
+                               }
+
+                               json_append(top, object);
+                       }
+                       break;
+
+               case '-':
+               case '0':
+               case '1':
+               case '2':
+               case '3':
+               case '4':
+               case '5':
+               case '6':
+               case '7':
+               case '8':
+               case '9':
+                       {
+                               CHECK_TOP();
+
+                               // new number value
+                               json_value *object = json_alloc(allocator);
+
+                               object->name = name;
+                               name = 0;
+
+                               object->type = JSON_INT;
+
+                               char *first = it;
+                               while (*it != '\x20' && *it != '\x9' && *it != '\xD' && *it != '\xA' && *it != ',' && *it != ']' && *it != '}')
+                               {
+                                       if (*it == '.' || *it == 'e' || *it == 'E')
+                                       {
+                                               object->type = JSON_FLOAT;
+                                       }
+                                       ++it;
+                               }
+
+                               if (object->type == JSON_INT && atoi(first, it, &object->int_value) != it)
+                               {
+                                       ERROR(first, "Bad integer number");
+                               }
+
+                               if (object->type == JSON_FLOAT && atof(first, it, &object->float_value) != it)
+                               {
+                                       ERROR(first, "Bad float number");
+                               }
+
+                               json_append(top, object);
+                       }
+                       break;
+
+               default:
+                       ERROR(it, "Unexpected character");
+               }
+       }
+
+       if (top)
+       {
+               ERROR(it, "Not all objects/arrays have been properly closed");
+       }
+
+       return root;
+}
diff --git a/src/lib/gscpaux/json.h b/src/lib/gscpaux/json.h
new file mode 100644 (file)
index 0000000..b8bed06
--- /dev/null
@@ -0,0 +1,39 @@
+// Distributed under the MIT license. Copyright (c) 2010, Ivan Vashchaev
+
+#ifndef JSON_H
+#define JSON_H
+
+#include "block_allocator.h"
+
+enum json_type
+{
+       JSON_NULL,
+       JSON_OBJECT,
+       JSON_ARRAY,
+       JSON_STRING,
+       JSON_INT,
+       JSON_FLOAT,
+       JSON_BOOL,
+};
+
+struct json_value
+{
+       json_value *parent;
+       json_value *next_sibling;
+       json_value *first_child;
+       json_value *last_child;
+
+       char *name;
+       union
+       {
+               char *string_value;
+               int int_value;
+               float float_value;
+       };
+
+       json_type type;
+};
+
+json_value *json_parse(char *source, char **error_pos, const char **error_desc, int *error_line, block_allocator *allocator);
+
+#endif
diff --git a/src/lib/gscpaux/simple_http.cpp b/src/lib/gscpaux/simple_http.cpp
new file mode 100644 (file)
index 0000000..92107b6
--- /dev/null
@@ -0,0 +1,241 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/wait.h>
+#include <netdb.h>
+#include <unistd.h>
+
+#include "simple_http.h"
+
+#define MAX_HTTP_REQUEST 64 * 1024
+
+
+// perform HTTP GET and retrieve the json response
+int http_get_request(endpoint addr, gs_csp_t url, gs_uint32_t* http_code, gs_sp_t json_response) {
+
+       int sockfd;
+       struct sockaddr_in servaddr;
+       char request_buf[MAX_HTTP_REQUEST];
+       char response_buf[MAX_HTTP_REQUEST];
+       char temp_buf[MAX_HTTP_REQUEST];
+       char content_type[MAX_HTTP_REQUEST];
+       int n;
+
+       char ipstr[16];
+       inet_ntop(AF_INET, &addr.ip, ipstr, INET_ADDRSTRLEN);
+
+       sockfd = socket(AF_INET, SOCK_STREAM, 0);
+       if (!sockfd) {
+               fprintf(stderr, "Unable to create socket for HTTP connection\n");
+               return -1;
+       }
+
+       bzero(&servaddr, sizeof(servaddr));
+       servaddr.sin_family = AF_INET;
+       servaddr.sin_port = addr.port;
+       servaddr.sin_addr.s_addr = addr.ip;
+
+       if (connect(sockfd, (sockaddr*)&servaddr, sizeof(servaddr))) {
+               fprintf(stderr, "Unable to connect to HTTP server\n");
+               return -1;
+       }
+
+       // construct HTTP request
+       sprintf(request_buf, "GET %s HTTP/1.0\r\n"
+                       "Host: %s\r\n"
+                       "Accept: application/json\r\n"
+                       "Connection: close\r\n\r\n",
+                       url, ipstr);
+
+       write(sockfd, request_buf, strlen(request_buf));
+
+       // retrive HTTP response
+       char* write_pos = response_buf;
+       while ((n = read(sockfd, write_pos, MAX_HTTP_REQUEST)) > 0)
+               write_pos += n;
+       *write_pos = '\0';
+       close(sockfd);
+
+       // split HTTP response into header and the main body
+       char* header_end = strstr(response_buf, "\r\n\r\n");
+       *header_end = 0;
+       strcpy(json_response, header_end + 4);
+
+       // parse HTTP header
+       char* header_line = strtok(response_buf, "\r\n");
+       int ver1, ver2;
+
+       // extract http response code
+       sscanf (header_line, "HTTP/%d.%d %d %s", &ver1, &ver2, http_code, temp_buf);
+
+       // extract content-type
+       *content_type = 0;
+       while ((header_line = strtok(NULL, "\r\n"))) {
+               if (!strncmp(header_line, "Content-Type: ", strlen("Content-Type: "))) {
+                       strcpy(content_type, header_line + strlen("Content-Type: "));
+                       if (strcmp(content_type, "application/json")) {
+                               fprintf(stderr, "Invalid Content-Type %s, application/json expected\n", content_type);
+                               return -1;
+                       }
+                       break;          // we only care about Content-Type headers
+               }
+       }
+
+       if ((*http_code == 200) && (*content_type == 0)) {
+               fprintf(stderr, "Missing Content-Type in server response, application/json expected\n");
+               return -1;
+       }
+
+
+       return 0;
+}
+
+// perform HTTP POST request ignoring the response
+int http_post_request(endpoint addr, gs_csp_t url, gs_sp_t json_request, gs_uint32_t* http_code) {
+       int sockfd;
+       struct sockaddr_in servaddr;
+       char request_buf[MAX_HTTP_REQUEST];
+       char response_buf[MAX_HTTP_REQUEST];
+       char temp_buf[MAX_HTTP_REQUEST];
+       int n;
+
+       char ipstr[16];
+       inet_ntop(AF_INET, &addr.ip, ipstr, INET_ADDRSTRLEN);
+
+       sockfd = socket(AF_INET, SOCK_STREAM, 0);
+       if (!sockfd) {
+               fprintf(stderr, "Unable to create socket for HTTP connection\n");
+               return -1;
+       }
+
+       bzero(&servaddr, sizeof(servaddr));
+       servaddr.sin_family = AF_INET;
+       servaddr.sin_port = addr.port;
+       servaddr.sin_addr.s_addr = addr.ip;
+
+       if (connect(sockfd, (sockaddr*)&servaddr, sizeof(servaddr))) {
+               fprintf(stderr, "Unable to connect to HTTP server\n");
+               return -1;
+       }
+
+       // construct HTTP request
+       sprintf(request_buf, "POST %s HTTP/1.0\r\n"
+                       "Host: %s\r\n"
+                       "Content-Type: application/json\r\n"
+                       "Content-Length: %lu\r\n"
+                       "Connection: close\r\n\r\n"
+                       "%s",
+                       url, ipstr, strlen(json_request), json_request);
+
+       write(sockfd, request_buf, strlen(request_buf));
+
+       // retrive HTTP response
+       char* write_pos = response_buf;
+       while ((n = read(sockfd, write_pos, MAX_HTTP_REQUEST)) > 0)
+               write_pos += n;
+       *write_pos = '\0';
+       close(sockfd);
+
+       // parse HTTP header
+       char* header_line = strtok(response_buf, "\r\n");
+       int ver1, ver2;
+
+       // extract http response code
+       sscanf (header_line, "HTTP/%d.%d %d %s", &ver1, &ver2, http_code, temp_buf);
+
+       return 0;
+}
+
+
+// perform HTTP POST request ignoring the response
+int http_post_request_hdr(endpoint addr, gs_csp_t url, gs_sp_t json_request, gs_uint32_t* http_code, gs_sp_t extra_headers) {
+       int sockfd;
+       struct sockaddr_in servaddr;
+       char request_buf[MAX_HTTP_REQUEST];
+       char response_buf[MAX_HTTP_REQUEST];
+       char temp_buf[MAX_HTTP_REQUEST];
+       int n;
+
+       char ipstr[16];
+       inet_ntop(AF_INET, &addr.ip, ipstr, INET_ADDRSTRLEN);
+
+       sockfd = socket(AF_INET, SOCK_STREAM, 0);
+       if (!sockfd) {
+               fprintf(stderr, "Unable to create socket for HTTP connection\n");
+               return -1;
+       }
+
+       bzero(&servaddr, sizeof(servaddr));
+       servaddr.sin_family = AF_INET;
+       servaddr.sin_port = addr.port;
+       servaddr.sin_addr.s_addr = addr.ip;
+
+       if (connect(sockfd, (sockaddr*)&servaddr, sizeof(servaddr))) {
+               fprintf(stderr, "Unable to connect to HTTP server\n");
+               return -1;
+       }
+
+       // construct HTTP request
+       if(strlen(extra_headers)==0){
+               sprintf(request_buf, "POST %s HTTP/1.0\r\n"
+                       "Host: %s\r\n"
+                       "Content-Type: application/json\r\n"
+                       "Content-Length: %lu\r\n"
+                       "\r\n"
+                       "%s",
+                       url, ipstr, strlen(json_request), json_request);
+       }else{
+               sprintf(request_buf, "POST %s HTTP/1.0\r\n"
+                       "Host: %s\r\n"
+                       "Content-Type: application/json\r\n"
+                       "Content-Length: %lu\r\n"
+                       "%s\r\n\r\n"
+                       "%s",
+                       url, ipstr, strlen(json_request), extra_headers, json_request);
+       }
+
+       write(sockfd, request_buf, strlen(request_buf));
+
+       // retrive HTTP response
+       char* write_pos = response_buf;
+       while ((n = read(sockfd, write_pos, MAX_HTTP_REQUEST)) > 0)
+               write_pos += n;
+       *write_pos = '\0';
+       close(sockfd);
+       if(write_pos==response_buf){
+               fprintf(stderr,"Empty response from HTTP server.\n");
+               return -1;
+       }
+
+       // parse HTTP header
+       char* header_line = strtok(response_buf, "\r\n");
+       if(header_line==NULL){
+               fprintf(stderr,"unparseable response from HTTP server.\n");
+               return -1;
+       }
+       int ver1, ver2;
+
+       // extract http response code
+       sscanf (header_line, "HTTP/%d.%d %d %s", &ver1, &ver2, http_code, temp_buf);
+
+       return 0;
+}
diff --git a/src/lib/gscphftaaux/Makefile b/src/lib/gscphftaaux/Makefile
new file mode 100644 (file)
index 0000000..a6e87b1
--- /dev/null
@@ -0,0 +1,48 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+CXX= g++ -O3  -fexpensive-optimizations -g -I ../gscpaux/ -I ../../../include  -I ../../../include/hfta -I ../../../include/lfta
+CC= gcc  -fexpensive-optimizations -O3 -I ../../../include -I ../../../include/lfta 
+
+INCDIR=../../../include
+HFTA_DIR=$(INCDIR/hfta)
+LFTA_DIR=$(INCDIR/lfta)
+
+all: libgscphftaaux.a
+
+install: all
+       cp libgscphftaaux.a ../../../lib ; ranlib ../../../lib/libgscphftaaux.a
+
+libgscphftaaux.a:   SSstateful_count_distinct.o Manku_HH.o hfta_runtime_library.o  Makefile  hfta_udaf.o  
+       ar  rc libgscphftaaux.a  SSstateful_count_distinct.o Manku_HH.o  hfta_runtime_library.o   hfta_udaf.o  
+
+hfta_runtime_library.o: hfta_runtime_library.cc
+
+hfta_runtime_library.cc : $(HFTA_DIR/host_tuple.h) $(INCDIR/fta.h)
+
+hfta_udaf.o: hfta_udaf.cc
+
+hfta_udaf.cc : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) $(HFTA_DIR/hfta_udaf.h) $(LFTA_DIR/rts_udaf.h)
+
+Manku_HH.o: Manku_HH.cc
+       $(CXX) -c -o Manku_HH.o Manku_HH.cc
+
+SSstateful_count_distinct.o: SSstateful_count_distinct.cc
+       $(CXX) -c -o SSstateful_count_distinct.o SSstateful_count_distinct.cc
+
+
+clean:
+       rm -f *.o *.a core
+
diff --git a/src/lib/gscphftaaux/Manku_HH.cc b/src/lib/gscphftaaux/Manku_HH.cc
new file mode 100644 (file)
index 0000000..24c3393
--- /dev/null
@@ -0,0 +1,73 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+//#########################################
+// Stateful functions for Manku and Motwani
+// heavy hitters algorithm
+//########################################
+
+#include <iostream>
+#define max(x,y) ((x)>(y)?(x):(y))
+
+struct MankuHHstate {
+    unsigned int count;
+    unsigned int count_bucket;
+    unsigned int need_to_clean;
+};
+
+void _sfun_state_clean_init_manku_hh_state(void *s){
+    struct MankuHHstate *state = (struct MankuHHstate *)s;
+    
+    state->count = 0;
+    state->count_bucket = 1;
+    state->need_to_clean = 0;
+    
+}
+
+void _sfun_state_dirty_init_manku_hh_state(void *s_new, void *s_old, int curr_num_samples){
+    struct MankuHHstate *state_new  = (struct MankuHHstate *)s_new;
+    struct MankuHHstate *state_old  = (struct MankuHHstate *)s_old;
+    
+    state_new->count = 0;
+    state_new->count_bucket = 1;
+}
+
+void _sfun_state_final_init_manku_hh_state(void *s, int curr_num_samples){
+    struct MankuHHstate *state  = (struct MankuHHstate *)s;
+}
+
+int local_count(void *s,int curr_num_samples, unsigned int bucket_size){
+    struct MankuHHstate *state  = (struct MankuHHstate *)s;
+    
+    state->count++;
+    if(state->count >= bucket_size){
+        //cout << "bucket_size: " << bucket_size << "\n";
+        state->count_bucket++;
+        state->need_to_clean = 1;
+        //cout << "bucket_count: " << state->count_bucket << "\n";
+        //cout << "packet count: " << state->count << "\n";
+        state->count = 0;
+        return 1;
+    }
+    return 0;
+}
+
+unsigned int current_bucket(void *s, int curr_num_samples){
+    struct MankuHHstate *state  = (struct MankuHHstate *)s;
+    if(state->need_to_clean == 1){
+        state->need_to_clean = 0;
+        return (state->count_bucket)-1;
+    }
+    return state->count_bucket;
+}
diff --git a/src/lib/gscphftaaux/SSstateful_count_distinct.cc b/src/lib/gscphftaaux/SSstateful_count_distinct.cc
new file mode 100644 (file)
index 0000000..0adec27
--- /dev/null
@@ -0,0 +1,623 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+///////////////////////////////////////////////
+////   State, functions for adaptive smart sampling
+///            written by Irina Rozenbaum
+
+#include <iostream>
+#define max(x,y) ((x)>(y)?(x):(y))
+#define _BURST_SOOTHING_FACTOR 10.0
+
+struct SSstate {
+    //unsigned long long int count;   // count to sample small packets with certain probability
+    double count;
+    double gcount;  // count for clean_with() function
+    double fcount;  // count for final_clean() function
+    double z;       //z is the threshold for a size of the packet
+    double z_prev;  // value of threshold from the previos cleaning phase
+    double gamma;   //tolerance parameter for emergency control over the
+    //number of samples, should be >= 1
+    int do_clean; // trigger cleaning phase
+    int bcount;  //count for number of packets that exceed threshold ,
+    //need it for one of the variations of algorithms for
+    //threshold adjustment
+    int s_size;  //need to remember sample size for _sfun_state_init()
+    int final_z; //bool that indicated if z was adjusted to its filnal value
+    //before the final clean
+    int time;    //timestamp from previously processed packet
+    //used in detecting frequency of the clening phases with aggregation
+    
+    int packet_count; //count for number of packets per time window
+    int do_clean_count; //count number of cleaning phases per time window
+    bool do_sooth; //turn on _BURST_SOOTHING_FACTOR
+    
+    // flow sampling
+    int count_closed; //bool indicates that counting phase is being triggered
+    int count_closed_flows; //count for closed flows
+    int count_notsampled_new; //count for the number of new groups that were not sampled during
+    // the final sampling phase will be used in next time window to compute resonable
+    // approximation for threshold before final sampling phase
+    
+    // for reporting
+    int delay; //interval within which there was no packets that belong to the current flow
+    //thus flow is considered to be closed.
+    //parameter specified by the query
+    int closing_now; //count for groups that are closing at the final cleraning phase
+    //or were closed during the most recent counting phase (newly closed)
+    
+    //for debugging
+    int how_many_cleaned;
+};
+
+
+// the function is called once at the initial initialization of the state
+void _sfun_state_clean_init_smart_sampling_state(void *s){
+    struct SSstate *state  = (struct SSstate *)s;
+    
+    state->count = 0;
+    state->gcount = 0;
+    state->fcount = 0;
+    state->z = 200; //need to figure out good initial value for z
+    //    cout << "clean init Z: " <<  state->z << "\n";
+    state->z_prev = 0;
+    //    cout << "clean init Z prev: " <<  state->z << "\n";
+    state->gamma = 2;
+    state->do_clean = 0;
+    state->bcount = 0;
+    state->s_size = 0;
+    state->final_z = 0;
+    state->time = 0;
+    state->count_closed = 0;
+    state->count_closed_flows = 0;
+    state->count_notsampled_new = 0;
+    
+    state->packet_count = 0;
+    state->do_clean_count = 0;
+    state->do_sooth = true;
+    
+    state->how_many_cleaned = 0;
+    state->delay = 0;
+    state->closing_now = 0;
+};
+
+
+// the function will be called at the beginning of every time window
+void _sfun_state_dirty_init_smart_sampling_state(void *s_new, void *s_old, int curr_num_samples){
+    struct SSstate *state_new  = (struct SSstate *)s_new;
+    struct SSstate *state_old  = (struct SSstate *)s_old;
+    
+    //    cout << "**flows were sampled: " << state_old->how_many_cleaned << "\n";
+    //    cout << "***dirty current num of samples: " << curr_num_samples << "\n";
+    //    cout << "dirty init Z old: " <<  state_old->z << "\n";
+    if(curr_num_samples < state_old->s_size){
+        // state_new->z = state_old->z*((max((double)curr_num_samples-(double)state_old->bcount,1))/((double)state_old->s_size-(double)state_old->bcount));
+        
+        //temp fix for early aggregation
+        state_new->z = (state_old->z)/2;
+        
+        if(state_old->do_sooth)
+            state_new->z = state_old->z / _BURST_SOOTHING_FACTOR;
+    }
+    else {
+        if(curr_num_samples >= state_old->s_size){
+            //cout << "yes\n";
+            state_new->z = state_old->z*((double)curr_num_samples/(double)state_old->s_size);
+            
+            if(state_old->do_sooth)
+                state_new->z = state_old->z / _BURST_SOOTHING_FACTOR;
+        }
+    }
+    
+    if(state_new->z <= 1.0)
+        state_new->z = 1;
+    //    cout << "dirty init Z new: " <<  state_new->z << "\n";
+    
+    state_new->gamma = state_old->gamma;
+    state_new->do_clean = state_old->do_clean;
+    state_new->s_size = state_old->s_size;
+    state_new->bcount = 0;
+    state_new->gcount = 0;
+    state_new->count = 0;
+    state_new->fcount = 0;
+    state_new->final_z = 0;
+    state_new->time = 0;
+    state_new->count_closed = 0;
+    state_new->count_closed_flows = 0;
+    state_new->count_notsampled_new = state_old->count_notsampled_new;
+    
+    state_new->packet_count = 0;
+    state_new->do_clean_count = 0;
+    state_new->do_sooth = true;
+    
+    state_new->how_many_cleaned = 0;
+    state_new->delay = 0;
+    state_new->closing_now = 0;
+    
+    //  cout << "dirty init gamma: " <<   state_new->gamma << "\n";
+    //     cout << "dirty init do_clean: " <<  state_new->do_clean << "\n";
+    //     cout << "dirty init s_size: " <<  state_new->s_size << "\n";
+    //     cout << "dirty init bcount: " <<  state_new->bcount << "\n";
+    //     cout << "dirty init gcount: " <<  state_new->gcount << "\n";
+    //     cout << "dirty init count: " <<  state_new->count << "\n";
+    //     cout << "dirty init fcount: " <<  state_new->fcount << "\n";
+    //     cout << "dirty init final_z: " <<  state_new->final_z << "\n";
+    //     cout << "dirty init time " <<  state_new->time  << "\n";
+    //     cout << "dirty init count_closed: " <<  state_new->count_closed << "\n";
+    //     cout << "dirty init count_closed_flows: " <<  state_new->count_closed_flows << "\n";
+    
+    //     cout << "dirty init packet count: " <<  state_new->packet_count  << "\n";
+    //     cout << "dirty init do_clean_count: " <<  state_new->do_clean_count  << "\n";
+    
+};
+
+// function is called in two cases:
+// adjustment of threshold before the cleaning phase is being triggered
+// adjustment of threshold at the window border for the old state, this new
+// threshold will be used by partial_flush() and flush() functions (final_clean())
+
+void _sfun_state_final_init_smart_sampling_state(void *s, int curr_num_samples){
+    struct SSstate *state  = (struct SSstate *)s;
+    
+    //  cout << "final init Z old: " <<  state->z << "\n";
+    
+    if(state->final_z == 0){
+        
+        // just returned from the counting phase
+        // case when the time window is changed right after the counting phase
+        if(state->count_closed == 1){
+            state->count_closed = 0;
+            state->count_closed_flows = 0;
+            state->how_many_cleaned = 0;
+        }
+        
+        state->z_prev = state->z;
+        //    cout << "final current num of samples: " << curr_num_samples << "\n";
+        //    cout << "final count not sampled new: " << state->count_notsampled_new << "\n";
+        // adjust count for current number of sampled based on statistics
+        // gathered in the previous time window
+        // otherwise we overestimate it
+        if(state->count_notsampled_new != 0)
+            curr_num_samples -= state->count_notsampled_new;
+        
+        if(curr_num_samples < state->s_size){
+            //state->z = state->z*((max((double)curr_num_samples-(double)state->bcount,1))/((double)state->s_size-(double)state->bcount));
+            
+            //temp fix for early aggregation
+            state->z = state->z/2;
+        }
+        else {
+            if(curr_num_samples >= state->s_size){
+                state->z = state->z*((double)curr_num_samples/(double)state->s_size);
+            }
+        }
+        
+        if(state->z <= 0)
+            state->z = 1;
+        //    cout << "final init Z new: " <<  state->z << "\n";
+        
+        state->bcount = 0;
+        state->final_z = 1;
+        state->do_clean_count++;
+        state->count_notsampled_new = 0;
+        
+    }
+    
+    //  cout << "final init gamma: " <<   state->gamma << "\n";
+    //     cout << "final init do_clean: " <<  state->do_clean << "\n";
+    //     cout << "final init s_size: " <<  state->s_size << "\n";
+    //     cout << "final init bcount: " <<  state->bcount << "\n";
+    //     cout << "final init gcount: " <<  state->gcount << "\n";
+    //     cout << "final init count: " <<  state->count << "\n";
+    //     cout << "final init fcount: " <<  state->fcount << "\n";
+    //     cout << "final init final_z: " <<  state->final_z << "\n";
+    //     cout << "final init time " <<  state->time  << "\n";
+    //     cout << "final init count_closed: " <<  state->count_closed << "\n";
+    //     cout << "final init count_closed_flows: " <<  state->count_closed_flows << "\n";
+    
+    //     cout << "final init packet count: " <<  state->packet_count  << "\n";
+    //     cout << "final init do_clean_count: " <<  state->do_clean_count  << "\n";
+    
+};
+
+int ssample(void *s,int curr_num_samples, unsigned long long int len, unsigned int sample_size){
+    struct SSstate *state  = (struct SSstate *)s;
+    
+    state->packet_count++;
+    
+    state->s_size = sample_size;
+    int sampled = 0;
+    
+    //just returned from the cleaning phase
+    if(state->do_clean == 1){
+        state->gcount = 0;
+        state->do_clean = 0;
+    }
+    
+    //sampling
+    if(len > state->z){
+        state->bcount++;
+        sampled=1;
+    }
+    else{
+        state->count += len;
+        if(state->count >= state->z){
+            sampled=1;
+            state->count -= state->z;
+        }
+    }
+    return sampled;
+    
+};
+
+int flow_ssample(void *s,int curr_num_samples, unsigned int sample_size){
+    struct SSstate *state  = (struct SSstate *)s;
+    
+    state->packet_count++;
+    
+    state->s_size = sample_size;
+    int sampled = 0;
+    
+    //just returned from the counting phase
+    if(state->count_closed == 1)
+        //      cout << "closed flows after counting phase: " << state->count_closed_flows << "\n";
+        
+        //just returned from the cleaning phase
+        if(state->do_clean == 1){
+            //      cout << "flows were sampled: " << state->how_many_cleaned << "\n";
+            state->how_many_cleaned = 0;
+            state->gcount = 0;
+            state->do_clean = 0;
+        }
+    
+    return 1;
+    
+};
+
+
+int ssfinal_clean(void *s, int curr_num_samples, unsigned long long int glen){
+    struct SSstate *state  = (struct SSstate *)s;
+    
+    state->do_sooth = true;
+    
+    // for ssample() where just returned from the clening phase
+    state->do_clean = 1;
+    
+    int sampled = 0;
+    double new_len = 0;
+    
+    if (glen < state->z_prev)
+        new_len = state->z_prev;
+    else
+        new_len = glen;
+    
+    //no need to clean
+    if(curr_num_samples <= state->s_size){
+        return 1;
+    }
+    else{
+        if(new_len > state->z){
+            sampled = 1;
+            state->bcount++;
+        }
+        else{
+            state->fcount += new_len;
+            if(state->fcount >= state->z){
+                sampled = 1;
+                state->fcount -= state->z;
+            }
+            //else{
+            //state->scount--;
+            //}
+        }
+        
+        return sampled;
+    }
+    
+};
+
+int flow_ssfinal_clean(void *s, int curr_num_samples, unsigned int ccondition, unsigned int delay, unsigned int maxtime, unsigned long long int glen){
+    struct SSstate *state  = (struct SSstate *)s;
+    
+    state->do_sooth = true;
+    // only for reporting
+    state->delay = delay;
+    
+    //for ssample() where just returned from the clening phase
+    state->do_clean = 1;
+    
+    int sampled = 0;
+    double new_len = 0;
+    // group is newly closed or not closed yet
+    int new_group = 1;
+    
+    // the flow is closed
+    if((ccondition == 1)||((state->time-maxtime)>=delay)){
+        
+        new_group = 0;
+        
+        // TF case or TT case for ccondition and delay
+        if(ccondition == 1){
+            if((state->time-maxtime) <= 1){ // 1 is time interval for count of closed flows
+                // the flow was closed in the previous counting slot
+                new_group = 1;
+            }
+        }
+        //FT case for ccondition and delay
+        else{
+            if((state->time-maxtime) <= (delay+1)){ // 1 is time interval for count of closed flows
+                // the flow was closed in the previous counting slot
+                new_group = 1;
+            }
+        }
+        // the flow was closed earlier than previous counting slot
+        // it is closed and old and new_group = 0
+    }
+    
+    //adjust size only for old closed groups
+    if(new_group == 0){
+        if (glen < state->z_prev)
+            new_len = state->z_prev;
+        else
+            new_len = glen;
+    }
+    // newly closed group
+    else{
+        state->closing_now++;
+        new_len = glen;
+    }
+    
+    
+    //no need to clean
+    if(curr_num_samples <= state->s_size){
+        state->count_notsampled_new = 0;
+        return 1;
+    }
+    else{
+        if(new_len > state->z){
+            sampled = 1;
+            state->bcount++;
+        }
+        else{
+            state->fcount += new_len;
+            if(state->fcount >= state->z){
+                sampled = 1;
+                state->fcount -= state->z;
+            }
+            //count number of not sampled newly closed groups
+            //will use in the next time window at the final cleaning phase
+            else{
+                if(new_group == 1)
+                    state->count_notsampled_new++;
+            }
+            
+        }
+        
+        state->how_many_cleaned += sampled;
+        
+        return sampled;
+    }
+    
+};
+
+
+int ssdo_clean(void *s, int curr_num_samples){
+    struct SSstate *state  = (struct SSstate *)s;
+    
+    //emergency control
+    //bcount will be different after the cleaning phase
+    if(curr_num_samples > (state->gamma*state->s_size)){
+        state->z_prev = state->z;
+        state->z=(double)state->gamma*state->z;
+        state->do_clean = 1;
+        state->bcount = 0;
+        state->count = 0;
+        state->gcount = 0;
+        
+        state->do_clean_count++;
+    }
+    
+    return state->do_clean;
+};
+
+int flow_ssdo_clean(void *s, int curr_num_samples, unsigned int maxtime){
+    struct SSstate *state  = (struct SSstate *)s;
+    
+    // initialize timestamp with first seen packet from the current timewindow
+    if(state->time == 0)
+        state->time = maxtime;
+    
+    // detect next counting time slot
+    if(state->time != maxtime){
+        //      cout << "need to count\n";
+        state->time = maxtime;
+        state->count_closed = 1;
+        return 1;
+    }
+    
+    //emergency control
+    //bcount will be different after the cleaning phase
+    //if(curr_num_samples > (state->gamma*state->s_size)){
+    if(state->count_closed_flows > (state->gamma*state->s_size)){
+        //      cout << "need to clean, num closed flows: " << state->count_closed_flows << "\n";
+        state->z_prev = state->z;
+        //      cout << "do clean Z old: " <<  state->z << "\n";
+        state->z=(((double)state->count_closed_flows)/((double)state->s_size))*state->z;
+        //      cout << "do clean Z new: " <<  state->z << "\n";
+        state->do_clean = 1;
+        state->bcount = 0;
+        state->count = 0;
+        state->gcount = 0;
+        
+        state->do_clean_count++;
+    }
+    
+    //just returned from the counting iteration
+    if(state->count_closed == 1){
+        state->count_closed = 0;
+        //      cout << "number of closed flows: " << state->count_closed_flows << "\n";
+        state->count_closed_flows = 0;
+        //initialize gcount since was used for sampling of new closed flows during counting phase
+        state->gcount = 0;
+    }
+    
+    return state->do_clean;
+};
+
+double ssthreshold(void *s, int curr_num_samples){
+    struct SSstate *state = (struct SSstate *)s;
+    
+    return state->z;
+};
+
+int count_distinct(void *s, int curr_num_samples){
+    return curr_num_samples;
+};
+
+int ssclean_with(void *s,int curr_num_samples, unsigned long long int glen){
+    struct SSstate *state  = (struct SSstate *)s;
+    
+    //cleaning condition
+    int sampled = 0;
+    double new_len = 0;
+    
+    if (glen < state->z_prev)
+        new_len = state->z_prev;
+    else
+        new_len = glen;
+    
+    if(new_len > state->z){
+        state->bcount++;
+        sampled = 1;
+    }
+    else{
+        state->gcount += new_len;
+        if(state->gcount >= state->z){
+            sampled = 1;
+            state->gcount -= state->z;
+        }
+        //else{
+        //state->scount--;
+        //}
+    }
+    
+    return sampled;
+};
+
+int flow_ssclean_with(void *s,int curr_num_samples, unsigned int ccondition, unsigned int delay, unsigned int maxtime, unsigned long long int glen){
+    struct SSstate *state  = (struct SSstate *)s;
+    
+    //cleaning condition
+    int sampled = 0;
+    double new_len = 0;
+    int new_group = 0;
+    
+    //need to count closed flows
+    if(state->count_closed == 1){
+        //the flow is closed
+        if((ccondition == 1)||((state->time-maxtime)>=delay)){
+            state->count_closed_flows++;
+            // TF case or TT case for ccondition and delay
+            if(ccondition == 1){
+                if((state->time-maxtime) <= 1) //1 is time interval for count of closed flows
+                    new_group = 1;
+            }
+            //FT case for ccondition and delay
+            else{
+                if((state->time-maxtime) <= (delay+1)) //1 is time interval for count of closed flows
+                    new_group = 1;
+            }
+        }
+        
+        // if flow is closed but old, no need to subsample it
+        if (new_group == 0)
+            return true;
+        
+    }
+    
+    // clean only closed flows FF case
+    // the flow is still open
+    if((ccondition == 0)&&((state->time-maxtime)<delay)){
+        return true;
+    }
+    
+    // use glen for a new group and z_prev for old one
+    if(new_group == 0){
+        if (glen < state->z_prev)
+            new_len = state->z_prev;
+        else
+            new_len = glen;
+    }
+    //the group is new
+    else{
+        new_len = glen;
+    }
+    
+    // at this point either flow is closed and old and we are at the cleaning phase
+    // or flow is closed and new and we are at the counting phase
+    if(new_len > state->z){
+        state->bcount++;
+        sampled = 1;
+    }
+    else{
+        state->gcount += new_len;
+        if(state->gcount >= state->z){
+            sampled = 1;
+            state->gcount -= state->z;
+        }
+        //new_group is not sampled during counting phase
+        else{
+            if(state->count_closed == 1)
+                state->count_closed_flows--;
+        }
+        
+    }
+    
+    if(state->do_clean == 1)
+        state->how_many_cleaned += sampled;
+    
+    return sampled;
+};
+
+int packet_count(void *s, int curr_num_samples){
+    struct SSstate *state = (struct SSstate *)s;  
+    return state->packet_count;
+};
+
+double gamma(void *s, int curr_num_samples){
+    struct SSstate *state = (struct SSstate *)s;  
+    return state->gamma;
+};
+
+int do_clean_count(void *s, int curr_num_samples){
+    struct SSstate *state = (struct SSstate *)s;  
+    return state->do_clean_count;
+};
+
+int delay(void *s, int curr_num_samples){
+    struct SSstate *state = (struct SSstate *)s;  
+    return state->delay;
+};
+
+// number of groups which are newly closed (in the most recent
+// counting phase or not closed at all during the final
+// cleaning phase
+int newly_closed(void *s, int curr_num_samples){
+    struct SSstate *state = (struct SSstate *)s;  
+    return state->closing_now;
+};
+
+
+
+
diff --git a/src/lib/gscphftaaux/hfta_runtime_library.cc b/src/lib/gscphftaaux/hfta_runtime_library.cc
new file mode 100644 (file)
index 0000000..ab94a01
--- /dev/null
@@ -0,0 +1,520 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include <sys/types.h>
+#include <iostream>
+extern "C" {
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <regex.h>
+#include <rdtsc.h>
+#include <stringhash.h>
+#include <errno.h>
+#include <unistd.h>
+}
+#include <stdio.h>
+#include <string.h>
+
+#include <vstring.h>
+#include <host_tuple.h>
+#include <fta.h>
+
+// for htonl,ntohl
+#include <netinet/in.h>
+
+#define MAX_PATTERN_LEN 1024
+
+// Defined here to avoid link errors as this array is auto generated for the lfta and referenced in the clearinghouse library which gets linked against the hfta
+extern "C" gs_sp_t fta_names[]={0};
+
+
+//             Only used to construct constant strings ...
+gs_retval_t Vstring_Constructor(vstring *tmp, gs_csp_t str) {
+       tmp->length = strlen(str);
+       if(tmp->length)
+               tmp->offset = (gs_p_t)strdup(str);
+       tmp->reserved = SHALLOW_COPY;
+       return 0;
+}
+
+//             Assume str is INTERNAL or SHALLOW_COPY.
+void hfta_vstr_destroy(vstring * str) {
+       if (str->length && str->reserved == INTERNAL) {
+               free((gs_sp_t)str->offset);
+       }
+       str->length = 0;
+}
+
+
+gs_retval_t hfta_vstr_length(vstring *str) {
+       return str->length;
+}
+
+//             Assume that SRC is either INTERNAL or SHALLOW_COPY
+void hfta_vstr_assign_with_copy_in_tuple(vstring32 * target, vstring * src,
+       gs_sp_t data_offset,  gs_retval_t int_offset) {
+       target->length = src->length;
+       target->offset = int_offset;
+       target->reserved = PACKED;
+       if ( src->length)
+               memcpy(data_offset, (gs_sp_t)src->offset, src->length);
+}
+
+//             Ted wrote the following function.
+//             make deep copy of src.  Assume that dst is already empty.
+//             Assume that SRC is either INTERNAL or SHALLOW_COPY
+void hfta_vstr_assign_with_copy(vstring *dst, vstring *src){
+       dst->length=src->length;
+       if(src->length){
+               dst->offset=(gs_p_t)malloc(dst->length);
+               memcpy((gs_sp_t)(dst->offset),(gs_sp_t)(src->offset),dst->length);
+       }
+       dst->reserved=INTERNAL;
+}
+
+//             Ted wrote the following function.
+//             Make a deep copy of src.  garbage collect dst if needed.
+//             Assume that SRC is either INTERNAL or SHALLOW_COPY
+void hfta_vstr_replace(vstring *dst, vstring *src){
+       hfta_vstr_destroy(dst);
+       hfta_vstr_assign_with_copy(dst,src);
+}
+
+#define HFTA_VSTR_HASHFUNC_PRIME 2995999
+gs_uint32_t hfta_vstr_hashfunc(const vstring *s) {
+       gs_uint32_t hash_code;
+       gs_int32_t n_steps;
+       gs_int32_t substr_len;
+       gs_int32_t j;
+       gs_uint32_t k, sub_hash;
+       gs_sp_t sv;
+
+
+       sv=(gs_sp_t)(s->offset);
+       hash_code = 0;
+       n_steps = s->length / 4;
+       if(4*n_steps < s->length) n_steps++;
+
+       for (j = 0; j <  n_steps; j++) {
+               if(4*(j+1) < s->length) substr_len = 4;
+               else                  substr_len = s->length - 4*j;
+
+               sub_hash = 0;
+               for(k=0;k<4;k++){
+                 if(k < substr_len)
+                       sub_hash = (sub_hash << 4) + *sv;
+                 else
+                       sub_hash = (sub_hash << 4);
+                 sv++;
+               }
+
+               hash_code = (sub_hash + hash_code * HFTA_VSTR_HASHFUNC_PRIME);
+       }
+
+       return(hash_code);
+}
+
+//     return negative if s1 < s2, 0 if s1==s2, positive if s1>s2
+gs_retval_t hfta_vstr_compare(const vstring * s1, const vstring * s2) {
+       gs_int32_t minlen,cmp_ret;
+       minlen=(s1->length<s2->length?s1->length:s2->length);
+       cmp_ret=memcmp((void *)s1->offset,(void *)s2->offset,minlen);
+
+       if(cmp_ret) return cmp_ret;
+       return(s1->length - s2->length);
+}
+
+
+
+gs_param_handle_t register_handle_for_str_regex_match_slot_1(vstring* pattern) {
+    regex_t * reg;
+    gs_int32_t res;
+
+    if ((reg=(regex_t *) malloc(sizeof(regex_t)))==0)  {
+       gslog(LOG_EMERG, "No memory for regular expression %s\n",
+               (gs_sp_t)(pattern->offset));
+       return 0;
+    }
+
+    if (regcomp(reg,(char*)(pattern->offset), REG_NEWLINE|REG_EXTENDED|REG_NOSUB)!=0) {
+       gslog(LOG_EMERG, "Illegal regular expression %s\n",
+               (gs_sp_t)(pattern->offset));
+       return 0;
+    }
+    return (gs_param_handle_t) reg;
+}
+
+gs_uint32_t str_regex_match(vstring* str, gs_param_handle_t pattern_handle) {
+    regex_t * reg = (regex_t *) pattern_handle ;
+    gs_int32_t res;
+    static gs_sp_t d=0;
+    static gs_uint32_t dlen=0;
+    // grow our static buffer to the longest string we ever see
+    if ((str->length+1) >= dlen) {
+        if (d!=0) free((void*)d);
+        dlen=0;
+        d=0;
+        if ((d=(gs_sp_t)malloc(str->length+1))==0) return 0;
+        dlen=str->length+1;
+    }
+    
+    if (str->length==0) return 0;
+    
+    // copy the string and 0 terminate it
+    memcpy((void *)d,(void *) str->offset, str->length);
+    d[str->length]=0;
+    
+    res = REG_NOMATCH;
+    res = regexec(reg, d, 0, NULL, 0);
+    return (res==REG_NOMATCH)?0:1;
+}
+
+gs_retval_t deregister_handle_for_str_regex_match_slot_1(gs_param_handle_t handle) {
+    regex_t * x = (regex_t *) handle;
+    regfree(x);
+    if (x!=0) free(x);
+    return 0;
+}
+
+gs_param_handle_t register_handle_for_str_partial_regex_match_slot_1(vstring* pattern) {
+    regex_t * reg;
+    gs_int32_t res;
+
+    if ((reg=(regex_t *) malloc(sizeof(regex_t)))==0)  {
+       gslog(LOG_EMERG, "No memory for regular expression %s\n",
+               (gs_sp_t)(pattern->offset));
+       return 0;
+    }
+
+    if (regcomp(reg,(gs_sp_t)(pattern->offset), REG_NEWLINE|REG_EXTENDED|REG_NOSUB)!=0) {
+       gslog(LOG_EMERG, "Illegal regular expression %s\n",
+               (gs_sp_t)(pattern->offset));
+       return 0;
+    }
+    return (gs_param_handle_t) reg;
+}
+
+gs_uint32_t str_partial_regex_match(vstring* str, gs_param_handle_t pattern_handle,
+                            uint maxlen) {
+    regex_t * reg = (regex_t *) pattern_handle ;
+    gs_int32_t res;
+    gs_int32_t end;
+    static gs_sp_t d=0;
+    static gs_uint32_t dlen=0;
+    // grow our static buffer to the longest string we ever see
+    if ((str->length+1) >= dlen) {
+        if (d!=0) free((void*)d);
+        dlen=0;
+        d=0;
+        if ((d=(gs_sp_t)malloc(str->length+1))==0) return 0;
+        dlen=str->length+1;
+    }
+    
+    if (str->length==0) return 0;
+    
+    end=(maxlen>(str->length))?(str->length):maxlen;
+    
+    // copy the string and 0 terminate it
+    memcpy((void *)d,(void *) str->offset, end);
+    d[end]=0;
+    res = REG_NOMATCH;
+    res = regexec(reg, d,0, NULL, 0);
+    return (res==REG_NOMATCH)?0:1;
+}
+
+
+gs_retval_t deregister_handle_for_str_partial_regex_match_slot_1(
+                                            gs_param_handle_t handle) {
+    regex_t * x = (regex_t *) handle;
+    regfree(x);
+    if (x!=0) free(x);
+    return 0;
+}
+
+gs_param_handle_t register_handle_for_str_extract_regex_slot_1(vstring* pattern) {
+    regex_t * reg;
+    
+    if ((reg=(regex_t *) malloc(sizeof(regex_t)))==0)  {
+        gslog(LOG_EMERG, "No memory for regular expression %s\n",
+              (gs_sp_t)(pattern->offset));
+        return 0;
+    }
+    if (regcomp(reg,(gs_sp_t)(pattern->offset), REG_EXTENDED)!=0) {
+        gslog(LOG_EMERG, "Illegal regular expression %s\n",
+              (gs_sp_t)(pattern->offset));
+        return 0;
+    }
+    return (gs_param_handle_t) reg;
+}
+
+
+/* partial function return 0 if the value is valid */
+gs_retval_t str_extract_regex( vstring * result, vstring * str, gs_param_handle_t handle) {
+    regex_t * reg = (regex_t *) handle ;
+    gs_sp_t source = (gs_sp_t)(str->offset);
+    gs_retval_t res;
+    regmatch_t match;
+    static gs_sp_t d=0;
+    static gs_uint32_t dlen=0;
+    // grow our static buffer to the longest string we ever see
+    if ((str->length+1) >= dlen) {
+        if (d!=0) free((void*)d);
+        dlen=0;
+        d=0;
+        if ((d=(gs_sp_t)malloc(str->length+1))==0) return 1;
+        dlen=str->length+1;
+    }
+    
+    if (str->length==0) return 1;
+    
+    // copy the string and 0 terminate it
+    memcpy((void *)d,(void *) str->offset, str->length);
+    d[str->length]=0;
+
+    res = REG_NOMATCH;
+    res = regexec(reg, d, 1, &match, 0);
+    if (res==REG_NOMATCH) return 1;
+    result->offset= (gs_p_t) &source[match.rm_so];
+    result->length=match.rm_eo-match.rm_so;
+    result->reserved = SHALLOW_COPY;
+    return 0;
+}
+
+gs_retval_t deregister_handle_for_str_extract_regex_slot_1(gs_param_handle_t handle) {
+    regex_t * x = (regex_t *) handle;
+    regfree(x);
+    if (x!=0) free(x);
+    return 0;
+}
+
+
+static gs_uint32_t nextint(struct vstring *str , gs_uint32_t * offset, gs_uint32_t *res) {
+       gs_uint8_t * s = (gs_uint8_t *)(str->offset);
+       int v = 0;
+       *res = 0;
+       while(*offset<str->length) {
+               if ((s[*offset]>='0') && (s[*offset]<='9')) {
+                       v=1;
+                       *res= (*res*10) + (gs_uint32_t) (s[*offset]-'0');
+               } else {
+                       if (v!=0) { // got some valid result
+                               return 1;
+                       } // otherwise skip leading grabage
+               }
+               (*offset)++;
+       }
+       return v;
+}
+
+gs_uint32_t strtoi(gs_uint32_t * r, struct vstring * s)
+{
+       gs_uint32_t offset;
+       offset=0;
+       if (nextint(s,&offset,r)==0) return 1;
+       return 0;
+}
+
+gs_param_handle_t register_handle_for_strtoi_c_slot_0(vstring* istr) {
+       gs_uint32_t offset,r;
+       offset=0;
+       if (nextint(istr,&offset,&r)!=0)
+               return (gs_param_handle_t) r;
+       return (gs_param_handle_t) 0;
+}
+gs_retval_t deregister_handle_for_strtoi_c_slot_0(gs_param_handle_t h) {
+       return 0;
+}
+
+
+gs_uint32_t strtoip(gs_uint32_t * r, struct vstring * s)
+{
+        gs_uint32_t ip1,ip2,ip3,ip4,offset;
+        offset=0;
+        if (nextint(s,&offset,&ip1)==0) return 1;
+        //fprintf (stderr, "1 %u %u\n",ip1,offset);
+        if (nextint(s,&offset,&ip2)==0) return 1;
+        //fprintf (stderr, "2 %u %u\n",ip2,offset);
+        if (nextint(s,&offset,&ip3)==0) return 1;
+        //fprintf (stderr, "3 %u %u\n",ip3,offset);
+        if (nextint(s,&offset,&ip4)==0) return 1;
+        //fprintf (stderr, "4 %u %u\n",ip4,offset);
+        *r=ip1<<24|ip2<<16|ip3<<8|ip4;
+        return 0;
+}
+
+gs_param_handle_t register_handle_for_strtoip_c_slot_0(vstring* istr) {
+        gs_uint32_t ip1,ip2,ip3,ip4,offset,r;
+        offset=0;
+        if (nextint(istr,&offset,&ip1)==0) return (gs_param_handle_t)0;
+        if (nextint(istr,&offset,&ip2)==0) return (gs_param_handle_t)0;
+        if (nextint(istr,&offset,&ip3)==0) return (gs_param_handle_t)0;
+        if (nextint(istr,&offset,&ip4)==0) return (gs_param_handle_t)0;
+        r=ip1<<24|ip2<<16|ip3<<8|ip4;
+               return (gs_param_handle_t)r;
+}
+gs_retval_t deregister_handle_for_strtoip_c_slot_0(gs_param_handle_t h) {
+       return 0;
+}
+
+gs_uint32_t partn_hash(  gs_uint32_t ip1, gs_uint32_t ip2) {
+    return (ip1^ip2);
+}
+
+gs_uint32_t rand_hash() {
+    return rand();
+}
+
+///////////////////////////////////////
+//             IPv6 fcns.
+//     return negative if s1 < s2, 0 if s1==s2, positive if s1>s2
+gs_retval_t hfta_ipv6_compare(const hfta_ipv6_str &i1, const hfta_ipv6_str &i2) {
+    if(i1.v[0] > i2.v[0])
+        return 1;
+    if(i1.v[0] < i2.v[0])
+        return -1;
+    if(i1.v[1] > i2.v[1])
+        return 1;
+    if(i1.v[1] < i2.v[1])
+        return -1;
+    if(i1.v[2] > i2.v[2])
+        return 1;
+    if(i1.v[2] < i2.v[2])
+        return -1;
+    if(i1.v[3] > i2.v[3])
+        return 1;
+    if(i1.v[3] < i2.v[3])
+        return -1;
+
+    return 0;
+}
+
+hfta_ipv6_str And_Ipv6(const hfta_ipv6_str &i1, const hfta_ipv6_str &i2){
+       hfta_ipv6_str ret;
+       ret.v[0] = i1.v[0] & i2.v[0];
+       ret.v[1] = i1.v[1] & i2.v[1];
+       ret.v[2] = i1.v[2] & i2.v[2];
+       ret.v[3] = i1.v[3] & i2.v[3];
+       return ret;
+}
+
+hfta_ipv6_str Or_Ipv6(const hfta_ipv6_str &i1, const hfta_ipv6_str &i2){
+       hfta_ipv6_str ret;
+       ret.v[0] = i1.v[0] | i2.v[0];
+       ret.v[1] = i1.v[1] | i2.v[1];
+       ret.v[2] = i1.v[2] | i2.v[2];
+       ret.v[3] = i1.v[3] | i2.v[3];
+       return ret;
+}
+
+gs_uint32_t hfta_ipv6_hashfunc(const hfta_ipv6_str *s) {
+       return s->v[0] ^ s->v[1] ^ s->v[2] ^ s->v[3];
+}
+
+hfta_ipv6_str hton_ipv6(hfta_ipv6_str s){
+       hfta_ipv6_str ret;
+
+//     ret.v[0] = htonl(s.v[0]);
+//     ret.v[1] = htonl(s.v[1]);
+//     ret.v[2] = htonl(s.v[2]);
+//     ret.v[3] = htonl(s.v[3]);
+       ret.v[0] = s.v[0];
+       ret.v[1] = s.v[1];
+       ret.v[2] = s.v[2];
+       ret.v[3] = s.v[3];
+       return ret;
+}
+
+hfta_ipv6_str ntoh_ipv6(hfta_ipv6_str s){
+       hfta_ipv6_str ret;
+//     ret.v[0] = ntohl(s.v[0]);
+//     ret.v[1] = ntohl(s.v[1]);
+//     ret.v[2] = ntohl(s.v[2]);
+//     ret.v[3] = ntohl(s.v[3]);
+       ret.v[0] = s.v[0];
+       ret.v[1] = s.v[1];
+       ret.v[2] = s.v[2];
+       ret.v[3] = s.v[3];
+       return ret;
+}
+
+int HFTA_Ipv6_Constructor(hfta_ipv6_str *s, gs_csp_t l) {
+        gs_uint32_t i0=0,i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0;
+        sscanf(l,"%x:%x:%x:%x:%x:%x:%x:%x",&i0,&i1,&i2,&i3,&i4,&i5,&i6,&i7);
+        s->v[0] = ((i0 & 0xffff) << 16) | (i1 & 0xffff);
+        s->v[1] = ((i2 & 0xffff) << 16) | (i3 & 0xffff);
+        s->v[2] = ((i4 & 0xffff) << 16) | (i5 & 0xffff);
+        s->v[3] = ((i6 & 0xffff) << 16) | (i7 & 0xffff);
+    return(0);
+}
+
+gs_retval_t str_exists_substr(vstring * s1,vstring * s2)
+{
+  gs_uint8_t *st1 = (gs_uint8_t *)s1->offset;
+  gs_uint8_t *st2 = (gs_uint8_t *)s2->offset;
+  gs_uint8_t *s2f = (gs_uint8_t *)s2->offset;
+  gs_uint8_t len1 = s1->length-s2->length;
+  gs_uint8_t len2 = s2->length;
+  gs_uint8_t x,y;
+
+  for (x=0; x<len1 ; x++)
+  {
+      if (st1[x]== *s2f)
+       {
+         for (y=0; y<len2 && st1[x+y]==st2[y];y++);
+         if (y==len2)
+             return 1;
+       }
+  }
+  return 0;
+}
+
+gs_retval_t str_compare(vstring *s1,vstring *s2)
+{
+  return hfta_vstr_compare(s1,s2);
+}
+
+gs_uint32_t str_match_offset( gs_uint32_t offset, vstring *s1, vstring *s2)
+{
+  gs_uint8_t *st1 = (gs_uint8_t *)s1->offset;
+  gs_uint8_t *st2 = &(((gs_uint8_t *)s2->offset)[offset]);
+  gs_int32_t x;
+  gs_int32_t len2 = s2->length-offset;
+  gs_int32_t len1 = s1->length;
+
+  if (len2 < len1)
+    return 0;
+
+  for(x = 0; x < len1; x++)
+    {
+      if (st1[x] != st2[x])
+       return 0;
+    }
+  return 1;
+}
+
+gs_uint32_t byte_match_offset( gs_uint32_t offset, gs_uint32_t val,vstring *s2)
+{
+  gs_uint8_t *st2 = (gs_uint8_t *)s2->offset;
+  gs_uint8_t v = (unsigned char) val;
+
+//  if ((s2->length <= offset)||(offset<0))
+  if (s2->length <= offset)
+      return 0;
+
+  return (st2[offset]==v)?1:0;
+}
+
+
diff --git a/src/lib/gscphftaaux/hfta_udaf.cc b/src/lib/gscphftaaux/hfta_udaf.cc
new file mode 100644 (file)
index 0000000..fb0f1d5
--- /dev/null
@@ -0,0 +1,434 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "hfta_udaf.h"
+#include "rts_udaf.h"
+#include <stdio.h>
+#include <limits.h>
+#include <math.h>
+//#include <memory.h>
+#include <string.h>
+#include <sys/time.h>
+#include <iostream>
+
+#include "hfta_runtime_library.h"
+
+
+#define max(a,b) ((a) > (b) ? (a) : (b))
+#define min(x,y) ((x) < (y) ? (x) : (y))
+#define lg(x)    (log(x) / log(2))
+
+using namespace std;
+
+
+// -------------------------------------------------------------------
+//              moving sum over N intervals
+
+struct moving_sum_udaf_str{
+       gs_uint32_t N;
+       gs_uint32_t pos;
+       gs_uint32_t *sums;
+};
+
+void moving_sum_udaf_HFTA_AGGR_INIT_(gs_sp_t buf){
+  struct moving_sum_udaf_str * u = (struct moving_sum_udaf_str *) buf;
+  u->N=0; u->pos=0; u->sums=NULL;
+}
+
+void moving_sum_udaf_HFTA_AGGR_UPDATE_(gs_sp_t buf, gs_uint32_t s, gs_uint32_t N) {
+  struct moving_sum_udaf_str * u = (struct moving_sum_udaf_str *) buf;
+  if(u->sums == NULL){
+       u->sums = (gs_uint32_t *)malloc(N*sizeof(gs_uint32_t));
+       for(gs_int32_t i=0;i<N;i++)
+               u->sums[i] = 0;
+    u->N = N;
+  }
+  u->sums[u->pos] += s;
+}
+
+void super_moving_sum_udaf_HFTA_AGGR_UPDATE_(gs_sp_t  buf, gs_uint64_t sub_sum) {
+  struct moving_sum_udaf_str * u = (struct moving_sum_udaf_str *) buf;
+  gs_uint32_t s = (gs_uint32_t)(sub_sum & 0xffffffff);
+  if(u->sums == NULL){
+    gs_uint32_t N = (gs_uint32_t)((sub_sum & 0xffffffff00000000ull) >> 32);
+       u->sums = (gs_uint32_t *)malloc(N*sizeof(gs_uint32_t));
+       for(gs_int32_t i=0;i<N;i++)
+               u->sums[i] = 0;
+    u->N = N;
+  }
+  u->sums[u->pos] += s;
+}
+
+void moving_sum_udaf_HFTA_AGGR_OUTPUT_(gs_p_t *result, gs_sp_t  buf){
+       *result = (gs_p_t)(buf);
+}
+
+void moving_sum_udaf_HFTA_AGGR_DESTROY_(gs_sp_t  buf){
+  struct moving_sum_udaf_str * u = (struct moving_sum_udaf_str *) buf;
+  if(u->sums != NULL)
+       free(u->sums);
+}
+
+void moving_sum_udaf_HFTA_AGGR_REINIT_( gs_sp_t  buf){
+  struct moving_sum_udaf_str * u = (struct moving_sum_udaf_str *) buf;
+  u->pos++;
+  if(u->pos >= u->N)
+       u->pos = 0;
+  u->sums[u->pos] = 0;
+}
+
+gs_uint32_t moving_sum_extract(gs_p_t result){
+  struct moving_sum_udaf_str * u = (struct moving_sum_udaf_str *) result;
+  gs_uint32_t s=0, i=0;
+  for(i=0; i<u->N;i++){
+    s += u->sums[i];
+  }
+  return s;
+}
+
+gs_float_t moving_sum_extract_exp(gs_p_t result, gs_float_t alpha){
+  struct moving_sum_udaf_str * u = (struct moving_sum_udaf_str *) result;
+  gs_uint32_t p=0, i=0;
+  gs_float_t s=0.0, m=1.0;
+  p=u->pos;
+  for(i=0; i<u->N;i++){
+    s += u->sums[i]*m;
+    if(p==0)
+               p=u->N - 1;
+    else
+               p--;
+       m *= alpha;
+  }
+  return s;
+}
+
+
+// -------------------------------------------------------------------
+//              sum over 3 intervals : test rUDAF
+
+struct sum3_udaf_str{
+  gs_uint32_t s_2;
+  gs_uint32_t s_1;
+  gs_uint32_t s_0;
+};
+
+void sum3_HFTA_AGGR_INIT_(gs_sp_t  buf) {
+  struct sum3_udaf_str * u = (struct sum3_udaf_str *) buf;
+  u->s_0 = 0; u->s_1 = 0; u->s_2 = 0;
+  return;
+}          
+
+void sum3_HFTA_AGGR_UPDATE_(gs_sp_t  buf, gs_uint32_t s) {
+  struct sum3_udaf_str * u = (struct sum3_udaf_str *) buf;
+  u->s_0 += s;
+  return;
+}
+
+void sum3_HFTA_AGGR_OUTPUT_(gs_uint32_t *result, gs_sp_t  buf) {
+  struct sum3_udaf_str * u = (struct sum3_udaf_str *) buf;
+  *result = u->s_0 + u->s_1 + u->s_2;
+  return; 
+}
+
+void sum3_HFTA_AGGR_DESTROY_(gs_sp_t  buf) {
+  return;
+}
+
+void sum3_HFTA_AGGR_REINIT_( gs_sp_t  buf) {
+  struct sum3_udaf_str * u = (struct sum3_udaf_str *) buf;
+  u->s_2 = u->s_1;
+  u->s_1 = u->s_0;
+  u->s_0 = 0;
+  return;
+}
+
+
+#define HISTORY_LENGTH 1024
+
+/////////////////////////////////////////////////////////////////////////
+/////   Calculate the average of all positive gs_float_t numbers
+
+struct posavg_struct{
+  gs_float_t sum;
+  gs_float_t cnt;
+};
+
+void POSAVG_HFTA_AGGR_INIT_(gs_sp_t  buf) {
+  struct posavg_struct * a = (struct posavg_struct *) buf;
+  a->sum=0;
+  a->cnt=0;
+  return;
+}
+
+void POSAVG_HFTA_AGGR_UPDATE_(gs_sp_t  buf, gs_float_t v) {
+  struct posavg_struct * a = (struct posavg_struct *) buf;
+  if (v>=0) {
+    a->sum=a->sum+v;
+    a->cnt=a->cnt+1;
+  }
+  return;
+}
+
+void POSAVG_HFTA_AGGR_OUTPUT_(gs_float_t * v, gs_sp_t  buf) {
+  struct posavg_struct * a = (struct posavg_struct *) buf;
+  if (a->cnt>0) {
+    *v=(a->sum/a->cnt);
+  } else {
+    *v=-1;
+  }
+  return;
+}
+
+void POSAVG_HFTA_AGGR_DESTROY_(gs_sp_t  buf) {
+  return;
+}
+
+/////////////////////////////////////////////////////////////////////////
+/////                   avg_udaf (simple example)
+
+//              struct received from subaggregate
+struct avg_udaf_lfta_struct_t{
+        gs_int64_t  sum;
+        gs_uint32_t cnt;
+};
+
+//              sctarchpad struct
+struct avg_udaf_hfta_struct_t{
+        gs_int64_t sum;
+        gs_uint32_t cnt;
+};
+
+//                      avg_udaf functions
+void avg_udaf_HFTA_AGGR_INIT_(gs_sp_t b){
+        avg_udaf_hfta_struct_t *s = (avg_udaf_hfta_struct_t *) b;
+        s->sum = 0;
+        s->cnt = 0;
+}
+
+void avg_udaf_HFTA_AGGR_UPDATE_(gs_sp_t b, gs_uint32_t v){
+        avg_udaf_hfta_struct_t *s = (avg_udaf_hfta_struct_t *) b;
+        s->sum += v;
+        s->cnt ++;
+}
+
+void avg_udaf_HFTA_AGGR_OUTPUT_(vstring *r,gs_sp_t b){
+        r->length = 12;
+        r->offset = (gs_p_t)(b);
+        r->reserved = SHALLOW_COPY;
+}
+
+void avg_udaf_HFTA_AGGR_DESTROY_(gs_sp_t b){
+        return;
+}
+
+
+//                      avg_udaf superaggregate functions
+void avg_udaf_hfta_HFTA_AGGR_INIT_(gs_sp_t b){
+        avg_udaf_hfta_struct_t *s = (avg_udaf_hfta_struct_t *) b;
+        s->sum = 0;
+        s->cnt = 0;
+}
+
+void avg_udaf_hfta_HFTA_AGGR_UPDATE_(gs_sp_t b, vstring *v){
+        if(v->length != 12) return;
+        avg_udaf_hfta_struct_t *s = (avg_udaf_hfta_struct_t *) b;
+        avg_udaf_lfta_struct_t *vs = (avg_udaf_lfta_struct_t *)(v->offset);
+        s->sum += vs->sum;
+        s->cnt += vs->cnt;
+}
+
+void avg_udaf_hfta_HFTA_AGGR_OUTPUT_(vstring *r,gs_sp_t b){
+        r->length = 12;
+        r->offset = (gs_p_t)(b);
+        r->reserved = SHALLOW_COPY;
+}
+
+void avg_udaf_hfta_HFTA_AGGR_DESTROY_(gs_sp_t b){
+        return;
+}
+
+//              Extraction function
+gs_float_t extr_avg_fcn(vstring *v){
+        if(v->length != 12) return 0;
+        avg_udaf_hfta_struct_t *vs = (avg_udaf_hfta_struct_t *)(v->offset);
+        gs_float_t r = (gs_float_t)(vs->sum) / vs->cnt;
+    return r;
+}
+
+/////////////////////////////////////////////////////////
+//             FIRST aggregate
+
+void FIRST_hfta_HFTA_AGGR_INIT_(gs_uint32_t* scratch) {
+       *scratch = UINT_MAX;            // we will encode uninitialized value of UINT_MAX
+}
+
+void FIRST_hfta_HFTA_AGGR_REINIT_(gs_uint32_t* scratch) { }
+
+void FIRST_hfta_HFTA_AGGR_UPDATE_(gs_uint32_t* scratch, gs_uint32_t val) {
+       if (*scratch == UINT_MAX)
+               *scratch = val;
+}
+
+void FIRST_hfta_HFTA_AGGR_OUTPUT_(gs_uint32_t* res, gs_uint32_t* scratch) {
+       *res = *scratch;
+}
+
+void FIRST_hfta_HFTA_AGGR_DESTROY_(gs_uint32_t* scratch) { }
+
+void FIRST_ULL_hfta_HFTA_AGGR_INIT_(gs_uint64_t* scratch) {
+       *scratch = UINT_MAX;            // we will encode uninitialized value of UINT_MAX
+}
+
+void FIRST_ULL_hfta_HFTA_AGGR_REINIT_(gs_uint64_t* scratch) { }
+
+void FIRST_ULL_hfta_HFTA_AGGR_UPDATE_(gs_uint64_t* scratch, gs_uint64_t val) {
+       if (*scratch == UINT_MAX)
+               *scratch = val;
+}
+
+void FIRST_ULL_hfta_HFTA_AGGR_OUTPUT_(gs_uint64_t* res, gs_uint64_t* scratch) {
+       *res = *scratch;
+}
+
+void FIRST_ULL_hfta_HFTA_AGGR_DESTROY_(gs_uint64_t* scratch) { }
+
+
+void FIRST_STR_hfta_HFTA_AGGR_INIT_(vstring* scratch) {
+       scratch->offset= 0;
+}
+
+void FIRST_STR_hfta_HFTA_AGGR_REINIT_(vstring* scratch) { }
+
+void FIRST_STR_hfta_HFTA_AGGR_UPDATE_(vstring* scratch, vstring* val) {
+       if (!scratch->offset) {
+    scratch->length = val->length;
+    scratch->offset = val->offset;
+    scratch->reserved = SHALLOW_COPY;
+       }
+}
+
+void FIRST_STR_hfta_HFTA_AGGR_OUTPUT_(vstring* res, vstring* scratch) {
+       *res = *scratch;
+}
+
+void FIRST_STR_hfta_HFTA_AGGR_DESTROY_(vstring* scratch) { }
+
+/////////////////////////////////////////////////////////
+//             LAST aggregate
+
+void LAST_hfta_HFTA_AGGR_INIT_(gs_uint32_t* scratch) { }
+
+void LAST_hfta_HFTA_AGGR_REINIT_(gs_uint32_t* scratch) { }
+
+void LAST_hfta_HFTA_AGGR_UPDATE_(gs_uint32_t* scratch, gs_uint32_t val) {
+       *scratch = val;
+}
+
+void LAST_hfta_HFTA_AGGR_OUTPUT_(gs_uint32_t* res, gs_uint32_t* scratch) {
+       *res = *scratch;
+}
+
+void LAST_hfta_HFTA_AGGR_DESTROY_(gs_uint32_t* scratch) { }
+
+void LAST_ULL_hfta_HFTA_AGGR_INIT_(gs_uint64_t* scratch) { }
+
+void LAST_ULL_hfta_HFTA_AGGR_REINIT_(gs_uint64_t* scratch) { }
+
+void LAST_ULL_hfta_HFTA_AGGR_UPDATE_(gs_uint64_t* scratch, gs_uint64_t val) {
+       *scratch = val;
+}
+
+void LAST_ULL_hfta_HFTA_AGGR_OUTPUT_(gs_uint64_t* res, gs_uint64_t* scratch) {
+       *res = *scratch;
+}
+
+void LAST_ULL_hfta_HFTA_AGGR_DESTROY_(gs_uint64_t* scratch) { }
+
+
+void LAST_STR_hfta_HFTA_AGGR_INIT_(vstring* scratch) {
+       scratch->offset= 0;
+}
+
+void LAST_STR_hfta_HFTA_AGGR_REINIT_(vstring* scratch) { }
+
+void LAST_STR_hfta_HFTA_AGGR_UPDATE_(vstring* scratch, vstring* val) {
+       scratch->length = val->length;
+  scratch->offset = val->offset;
+  scratch->reserved = SHALLOW_COPY;
+}
+
+void LAST_STR_hfta_HFTA_AGGR_OUTPUT_(vstring* res, vstring* scratch) {
+       *res = *scratch;
+}
+
+void LAST_STR_hfta_HFTA_AGGR_DESTROY_(vstring* scratch) { }
+
+
+/////////////////////////////////////////////////////////
+//             running_array_aggr aggregate
+
+void running_array_aggr_hfta_HFTA_AGGR_INIT_(vstring* scratch) {
+  scratch->offset = NULL;  
+  scratch->length = 0;
+}
+
+void running_array_aggr_hfta_HFTA_AGGR_REINIT_(vstring* scratch) { }
+
+void running_array_aggr_hfta_HFTA_AGGR_UPDATE_(vstring* scratch, vstring* val) {
+  char buffer[100];
+
+  gs_uint32_t* ints = (gs_uint32_t*)val->offset;
+  switch (val->length / sizeof (gs_uint32_t)) {
+    case 4:
+      sprintf(buffer, "%u,%u,%u,%u", ints[0], ints[1], ints[2], ints[3]);
+      break;
+    case 3:
+      sprintf(buffer, "%u,%u,%u", ints[0], ints[1], ints[2]);
+      break;   
+    case 2:
+      sprintf(buffer, "%u,%u", ints[0], ints[1]);
+      break;        
+    case 1:
+      sprintf(buffer, "%u", ints[0]);
+      break;  
+    case 0:
+      return;        
+  }
+  int buf_len = strlen(buffer);
+
+  // append the content of buffer to scratch
+       if (!scratch->offset) {
+    Vstring_Constructor(scratch, buffer);
+       } else {
+    scratch->offset = (gs_p_t)realloc((void*)scratch->offset, scratch->length + buf_len + 1);
+    *((char*)scratch->offset + scratch->length) = ',';
+    memcpy((void*)(scratch->offset + scratch->length + 1), (void*)buffer, buf_len);
+    scratch->length += buf_len + 1;
+    scratch->reserved = INTERNAL;
+  }
+}
+
+void running_array_aggr_hfta_HFTA_AGGR_OUTPUT_(vstring* res, vstring* scratch) {
+       *res = *scratch;
+  res->reserved = SHALLOW_COPY;
+}
+
+void running_array_aggr_hfta_HFTA_AGGR_DESTROY_(vstring* scratch) {
+  hfta_vstr_destroy(scratch);
+ }
+
diff --git a/src/lib/gscphost/Makefile b/src/lib/gscphost/Makefile
new file mode 100644 (file)
index 0000000..436a386
--- /dev/null
@@ -0,0 +1,52 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+CC=gcc   -O3  -fexpensive-optimizations  -g -I ./include/ -I ../../../include/ -DCLEARINGHOUSE_HEARTBEAT
+
+SOURCE = callbackinterface.c callbackregistries.c lappinterface.c lappregistries.c  lfta.c gscpipc.c 
+
+OBJECTS = $(SOURCE:.c=.o)
+
+all: install
+
+INCDIR=../../../include
+
+libgscphost.a: $(OBJECTS) Makefile 
+       ar  rc libgscphost.a $(OBJECTS) 
+
+libclearinghouse.a: clearinghouseregistries.o
+       ar  rc libclearinghouse.a clearinghouseregistries.o
+
+clearinghouseregistries.o: clearinghouseregistries.c
+
+callbackinterface.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) $(INCDIR/rdtsc.h)
+
+callbackregistries.c : include/callbackregistries.h $(INCDIR/lapp.h) include/gscpipc.h $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+lappinterface.c : include/gscpipc.h $(INCDIR/rdtsc.h) $(INCDIR/lapp.h)
+
+lappregistries.c : include/lappregistries.h
+
+lfta.c :$(INCDIR/gsconfig.h) $(INCDIR/fta.h) $(INCDIR/rdtsc.h) $(INCDIR/packet.h)
+
+gscpipc.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) 
+
+clearinghouseregistries.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) include/gscpipc.h
+
+install: libgscphost.a libclearinghouse.a
+       cp libgscphost.a libclearinghouse.a ../../../lib/ ; ranlib  ../../../lib/libclearinghouse.a ; ranlib  ../../../lib/libgscphost.a
+
+clean:
+       rm -f *.o *.a core
diff --git a/src/lib/gscphost/callbackinterface.c b/src/lib/gscphost/callbackinterface.c
new file mode 100644 (file)
index 0000000..9d21d73
--- /dev/null
@@ -0,0 +1,932 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <gscpipc.h>
+#include <ipcencoding.h>
+#include <callbackregistries.h>
+#include <clearinghouseregistries.h>
+#include <lappregistries.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <lapp.h>
+#include <string.h>
+#include "rdtsc.h"
+
+gs_uint64_t shared_memory_full_warning =0;
+
+static gs_int32_t maxsnaplen = 0;
+
+struct FTAID clearinghouseftaid;
+
+gs_uint64_t intupledrop=0;
+gs_uint64_t outtupledrop=0;
+gs_uint64_t intuple=0;
+gs_uint64_t outtuple=0;
+gs_uint64_t inbytes=0;
+gs_uint64_t outbytes=0;
+gs_uint64_t cycles=0;
+
+
+
+/* following function is internal and defined in lappinterface.c */
+gs_retval_t  ipc_call_and_wait(FTAID f, gs_sp_t msg, gs_sp_t result);
+
+gs_retval_t  gscp_blocking_mode() {
+#ifdef BLOCKRINGBUFFER
+       return 1;
+#else
+       return 0;
+#endif
+}
+
+static void clock_signal_check() {
+    struct FTA * fa;
+    static gs_int32_t  t=0;
+    if (t==0) {
+        t=time(0);
+    } else {
+       if (time(0)>t) {
+            if (ftaexec_start()<0) {
+                gslog(LOG_EMERG,"GSCPRTS::error::could not init check of "
+                        "FTA list\n");
+                return;
+            }
+            while ((fa=ftaexec_next())!=0) {
+                if (fa->clock_fta!=0) {
+                    fa->clock_fta(fa);
+                }
+            }
+            t=time(0);
+               if (t%GSLOGINTERVAL==0) gsstats();// log all the stats
+        }
+    }
+}
+
+static gs_retval_t  send_standard_reply(FTAID f, gs_int32_t  result) {
+    struct standard_result r;
+    r.h.callid=STANDARD_RESULT;
+    r.h.size=sizeof(struct standard_result);
+    r.result=result;
+    if (gscpipc_send(f, FTACALLBACK, (gs_sp_t) &r,r.h.size,1)<0) {
+       gslog(LOG_EMERG,"ERROR:Could not send on message queue\n");
+       return -1;
+    }
+    return 0 ;
+}
+
+static gs_retval_t  send_lookup_reply(FTAID f, gs_int32_t  result,
+                            FTAID * ftaid,
+                            gs_sp_t* schema) {
+    struct ftafind_result r;
+    r.h.callid=FTAFIND_RESULT;
+    r.h.size=sizeof(struct ftafind_result);
+    r.result=result;
+    r.f=*ftaid;
+    if (result >=0) {
+       if (strlen(*schema)>=(MAXSCHEMASZ-1)) {
+           gslog(LOG_EMERG,"ERROR:FTA schema (%s) to large\n",(unsigned char *)schema);
+           r.result=-1;
+       } else {
+           strcpy(r.schema,*schema);
+       }
+    }
+    if (gscpipc_send(f, FTACALLBACK, (gs_sp_t) &r,r.h.size,1)<0) {
+       gslog(LOG_EMERG,"ERROR:Could not send on message queue\n");
+       return -1;
+    }
+    return 0 ;
+}
+
+
+static gs_retval_t  send_fta_result(FTAID f,
+                          FTAID * ftaid, gs_int32_t  result) {
+    struct fta_result r;
+    r.h.callid=FTA_RESULT;
+    r.h.size=sizeof(struct fta_result);
+    r.result=result;
+    if (ftaid!=0) {
+      r.f=*ftaid;
+    }
+    if (gscpipc_send(f, FTACALLBACK,(gs_sp_t)&r,r.h.size,1)<0) {
+       gslog(LOG_EMERG,"ERROR:Could not send on message queue\n");
+       return -1;
+    }
+    return 0 ;
+}
+
+
+// Is also used by the lfta rts enviroment on a post. So make it none
+// static.
+gs_retval_t  send_wakeup(FTAID f)
+{
+    struct wakeup_result a;
+
+    a.h.callid=WAKEUP;
+    a.h.size=sizeof(struct wakeup_result);
+    if (gscpipc_send(f, FTACALLBACK, (gs_sp_t)&a,a.h.size,0)<0) {
+       gslog(LOG_EMERG,"ERROR:Could not send on message queue\n");
+       return -1;
+    }
+    return 0;
+}
+
+static gs_retval_t  fta_register_instance(FTAID subscriber,
+                                FTAID f,gs_uint32_t   reusable,
+                                FTAname name,
+                                gs_csp_t  schema) {
+  gs_int8_t  rb[MAXRES];
+  struct fta_register_arg a;
+  struct standard_result * sr = (struct standard_result *)rb;
+
+  if (curprocess.type != CLEARINGHOUSE) {
+    a.h.callid = FTA_REGISTER;
+    a.h.size = sizeof(struct fta_register_arg);
+    if (strlen(name)>=(MAXFTANAME-1)) {
+      gslog(LOG_EMERG,"ERROR:FTA name (%s) to large\n",name);
+      return -1;
+    }
+    if (strlen(schema)>=(MAXSCHEMASZ-1)) {
+      gslog(LOG_EMERG,"ERROR:FTA schema (%s) to large\n",schema);
+      return -1;
+    }
+    strcpy(a.name,name);
+    strcpy(a.schema,schema);
+    a.f=f;
+    a.subscriber=subscriber; /* consumer is the same as f for an FTA*/
+    a.reusable=reusable;
+    ipc_call_and_wait(clearinghouseftaid,(gs_sp_t )&a,rb);
+    if (sr->h.callid != STANDARD_RESULT) {
+      gslog(LOG_EMERG,"ERROR:Wrong result code received\n");
+      return -1;
+    }
+    if (sr->result != 0) {
+      return -1;
+    }
+  } else {
+    if (ftalookup_register_fta(subscriber,f,name,reusable,schema)<0) {
+      return -1;
+    }
+  }
+  return 0;
+}
+
+static gs_retval_t  fta_unregister_instance(FTAID subscriber,
+                                  FTAID f) {
+  gs_int8_t  rb[MAXRES];
+  struct fta_unregister_arg a;
+  struct standard_result * sr = (struct standard_result *)rb;
+
+  if (curprocess.type != CLEARINGHOUSE) {
+    a.h.callid = FTA_UNREGISTER;
+    a.h.size = sizeof(struct fta_register_arg);
+    a.f=f;
+    a.subscriber=subscriber; /* consumer is the same as f for an FTA*/
+    ipc_call_and_wait(clearinghouseftaid,(gs_sp_t )&a,rb);
+    if (sr->h.callid != STANDARD_RESULT) {
+      gslog(LOG_EMERG,"ERROR:Wrong result code received\n");
+      return -1;
+    }
+    return -1;
+  } else {
+    if (ftalookup_unregister_fta(f,subscriber)<0) {
+      return -1;
+    }
+  }
+  return 0;
+}
+
+gs_retval_t  fta_start_service(gs_int32_t  number)
+{
+    gs_int8_t   buf[MAXMSGSZ];
+    FTAID from;
+    gs_int32_t  length;
+    struct hostcall * h= (struct hostcall *) buf;
+    gs_int32_t  forever=0;
+    gs_int32_t  endtime=0;
+    gs_int32_t  block=1;
+    gs_int32_t  res;
+    struct ringbuf * r;
+    FTAID ftaid;
+    FTAID * ftaidp;
+    struct FTA * fta;
+    gs_int32_t  lopp;
+       gs_int32_t  preemptq;
+       gs_int32_t  endq;
+       gs_uint64_t s1;
+       gs_uint64_t s2;
+
+    if (number == 0) {
+       block=0;
+       forever=1;
+    }
+    if (number < 0) {
+       forever=1;
+    }
+    if (number > 0) {
+        block=1;
+       endtime=time(0)+number;
+    }
+
+    while((forever!=0)||
+          (endtime==0)||(endtime>time(0))) {
+        /* check if we need to give the FTAs there clock signal */
+        if ((curprocess.type == LFTA)
+            ||(curprocess.type == HFTA)) {
+            clock_signal_check();
+        }
+
+#ifdef POLLING
+       poll:
+#endif
+    preemptq=0;
+       /* first empty out sidequeu then read from messagequeue */
+       if (sidequeue_pop(&from,buf,&length)<0) {
+         /* empty out the sidequeue before processing the shared
+            memory */
+         if (curprocess.type == HFTA) {
+           /* process all the shared memory regions and register
+              for callbacks */
+               s1=rdtsc();
+               endq=time(0)+2;
+           streamregistry_getactiveringbuf_reset();
+           while ((r=streamregistry_getactiveringbuf())>0) {
+             while (UNREAD(r)) {
+                       struct FTA * fa;
+                       if (ftaexec_start()<0) {
+                       gslog(LOG_EMERG,"GSCPRTS::error::could not init check of "
+                         "FTA list\n");
+                       return -1;
+                       }
+                       while ((fa=ftaexec_next())!=0) {
+                       gs_int32_t  x;
+                       for(x=0;x<fa->stream_subscribed_cnt;x++) {
+                               if ((fa->stream_subscribed[x].streamid
+                                       ==CURREAD(r)->f.streamid)
+                                       && (fa->stream_subscribed[x].ip
+                                               ==CURREAD(r)->f.ip)
+                                       && (fa->stream_subscribed[x].port
+                                               ==CURREAD(r)->f.port)) {
+                                       fa->accept_packet(fa,&(CURREAD(r)->f),
+                                               &(CURREAD(r)->data[0]),
+                                               CURREAD(r)->sz);
+                               }
+                       }
+                       }
+                       intuple++;
+                       inbytes+=CURREAD(r)->sz;
+                       ADVANCEREAD(r);
+                       if (endq <= time(0)) {
+                               preemptq=1;
+                               goto processmsg;
+                       }
+             }
+           }
+               s2=rdtsc();
+               cycles+=(s2-s1);
+#ifndef POLLING
+           /* register wakeups all arround to make sure we don't sleep
+            * for ever,
+            */
+           streamregistry_getactiveftaid_reset();
+           while ((ftaidp=streamregistry_getactiveftaid())>0) {
+             struct gscp_get_buffer_arg a;
+             a.h.callid = GSCP_GET_BUFFER;
+             a.h.size = sizeof(struct gscp_get_buffer_arg);
+             a.timeout = 0;
+             if (gscpipc_send(*ftaidp,FTACALLBACK,(gs_sp_t )&a,a.h.size,1)<0) {
+               return -1;
+             }
+           }
+#endif
+         }
+         processmsg:
+         do {
+                       /* even if we block we return every 100msec to be able to generate the clock signal to
+                        * the HFTAs
+             */
+            if ((res=gscpipc_read(&from,&lopp,buf,&length,((block==1)&&(preemptq==0))?2:0))<0) {
+                gslog(LOG_EMERG,"GSCPRTS::error::reading from messagequeue\n");
+                return -1;
+            }
+            /* check if we need to give the FTAs there clock signal */
+            if ((curprocess.type == LFTA)
+                ||(curprocess.type == HFTA)) {
+                clock_signal_check();
+            }
+            if ((res==0) && (block==0)) {
+                /* nonblocking and nothing to do so return */
+                return 0;
+            }
+            if ((res==0) && (endtime!=0) && (endtime<time(0))) {
+                /* timeout reached so return */
+                return 0;
+            }
+#ifdef POLLING
+           if ((res==0)&&(curprocess.type == HFTA)) {
+                goto poll;
+           }
+#endif
+         } while (res==0);
+         if ((lopp)!=FTACALLBACK) {
+           gslog(LOG_EMERG,"GSCPRTS::error::unknown lowlevel opp\n");
+           return -1;
+         }
+       }
+
+#ifdef PRINTMSG
+       gslog(LOG_EMERG, "HFTA message from %u of type %u of length %u\n",from,
+       h->callid,h->size);
+#endif
+       switch (h->callid) {
+
+       case FTA_LOOKUP: {
+         if (curprocess.type == CLEARINGHOUSE) {
+           struct fta_find_arg * n;
+           FTAID rf;
+           gs_csp_t  schema;
+           n = (struct fta_find_arg *) buf;
+           /* Note: Side effect of ftalookup_lookup_fta_index is to
+              fill msgid and index */
+                 if (send_lookup_reply(from,
+                                       ftalookup_lookup_fta_index(from,
+                                                                  n->name,
+                                                                  n->reuse,
+                                                                  &rf,
+                                                                  &schema),
+                                       &rf,
+                                       (gs_sp_t *)&schema)<0) {
+                   gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+                   return -1;
+                 }
+         } else {
+           if (send_standard_reply(from,-1)<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+             return -1;
+           }
+           gslog(LOG_EMERG,"GSCPRTS::error: Non clearinghouse proccess got"
+                   "contacted for clearinghouse processing\n");
+         }
+       }
+         break;
+       case FTA_REGISTER: {
+         if (curprocess.type == CLEARINGHOUSE) {
+           struct fta_register_arg * n;
+           n = (struct fta_register_arg *) buf;
+           if (send_standard_reply(from,
+                                   ftalookup_register_fta(n->subscriber,
+                                                          n->f,
+                                                          n->name,
+                                                          n->reusable,
+                                                          n->schema))<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+             return -1;
+           }
+         } else {
+           if (send_standard_reply(from,-1)<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+             return -1;
+           }
+           gslog(LOG_EMERG,"GSCPRTS::error: Non clearinghouse proccess got"
+                   "contacted for clearinghouse processing\n");
+         }
+       }
+         break;
+       case FTA_UNREGISTER: {
+         if (curprocess.type == CLEARINGHOUSE) {
+           struct fta_unregister_arg * n;
+           n = (struct fta_unregister_arg *) buf;
+           if (send_standard_reply(from,
+                                   ftalookup_unregister_fta(n->subscriber,
+                                                            n->f))<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+             return -1;
+           }
+         } else {
+           if (send_standard_reply(from,-1)<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+             return -1;
+           }
+           gslog(LOG_EMERG,"GSCPRTS::error: Non clearinghouse proccess got"
+                   "contacted for clearinghouse processing\n");
+         }
+       }
+         break;
+       case FTA_ALLOC_INSTANCE:
+       case FTA_ALLOC_PRINT_INSTANCE:
+         if ((curprocess.type == LFTA)
+             ||(curprocess.type == HFTA)) {
+           struct ringbuf * r;
+           struct fta_alloc_instance_arg * n;
+           n = (struct fta_alloc_instance_arg *) buf;
+           if ((fta=ftaexec_alloc_instance(n->f.index,
+                                           (struct FTA *)n->f.streamid,
+                                           n->reusable,
+                                           n->command,
+                                           n->sz,
+                                           &(n->data[0])))==0) {
+             gslog(LOG_EMERG,"GSCPRTS::warning::could not allocate"
+                     "FTA\n");
+             if (send_fta_result(from,0,-1)<0) {
+               gslog(LOG_EMERG,"GSCPRTS::error::send standard "
+                       "reply faild\n");
+               return -1;
+             }
+           } else {
+             /* shared memory is only required if data is beeing transfered */
+             if ((h->callid!=FTA_ALLOC_PRINT_INSTANCE)&&
+                 ((r=gscpipc_getshm(from))==0)) {
+                               gslog(LOG_EMERG,"GSCPRTS::warning::could not get"
+                               "shared memory\n");
+                               ftaexec_remove(fta);
+                               if (send_fta_result(from,0,-1)<0) {
+                                       gslog(LOG_EMERG,"GSCPRTS::error::send standard "
+                                       "reply faild\n");
+                                       return -1;
+                               }
+               } else {
+                       /* no callback to register for print function */
+                       if ((h->callid!=FTA_ALLOC_PRINT_INSTANCE)&&(ftacallback_add_streamid(r,fta->ftaid.streamid)!=0)) {
+                               gslog(LOG_EMERG,"GSCPRTS::warning::could not add"
+                                       "streamid to ringbuffer\n");
+                               ftaexec_free_instance(fta,1);
+                               if (send_fta_result(from,0,-1)<0) {
+                                       gslog(LOG_EMERG,"GSCPRTS::error::send standard "
+                                       "reply faild\n");
+                                       return -1;
+                               }
+               } else {
+                 if (ftaexec_insert(0,fta)<0) {
+                   gslog(LOG_EMERG,"GSCPRTS::warning::could not"
+                           "insert FTA\n");
+                   ftacallback_rm_streamid(r,fta->ftaid.streamid);
+                   ftaexec_free_instance(fta,1);
+                   if (send_fta_result(from,0,-1)<0) {
+                     gslog(LOG_EMERG,"GSCPRTS::error::send standard "
+                             "reply faild\n");
+                     return -1;
+                   }
+                 } else {
+                   if (fta_register_instance(n->subscriber,fta->ftaid,
+                                             n->reusable,
+                                             n->name,
+                                             n->schema)!=0) {
+                     gslog(LOG_EMERG,"GSCPRTS::warning::could not register"
+                       " instance\n");
+                     ftaexec_remove(fta);
+                     ftacallback_rm_streamid(r,fta->ftaid.streamid);
+                     ftaexec_free_instance(fta,1);
+                     if (send_fta_result(from,0,-1)<0) {
+                       gslog(LOG_EMERG,"GSCPRTS::error::send standard "
+                               "reply faild\n");
+                       return -1;
+                     }
+                   }  else {
+                     if (h->callid==FTA_ALLOC_PRINT_INSTANCE) {
+                               if (curprocess.type == LFTA) {
+                                       gslog(LOG_EMERG,"GSCPRTS::error:: alloc print instance not "
+                                               "implemented for LFTA.\n");
+                                       ftaexec_remove(fta);
+                                       ftaexec_free_instance(fta,1);
+                                       if (send_fta_result(from,0,-1)<0) {
+                                               gslog(LOG_EMERG,"GSCPRTS::error::send standard "
+                                               "reply faild\n");
+                                               return -1;
+                                       }
+                               } else {
+                                       if (add_printfunction_to_stream(fta, n->schema, n->path, n->basename,
+                                               n->temporal_field, n->split_field, n->delta, n->split) < 0) {
+                                               ftaexec_remove(fta);
+                                               ftaexec_free_instance(fta,1);
+                                               if (send_fta_result(from,0,-1)<0) {
+                                                       gslog(LOG_EMERG,"GSCPRTS::error::send standard "
+                                                       "reply faild\n");
+                                                       return -1;
+                                               }
+                               }
+                         }
+                       }
+                     if (send_fta_result(from,&fta->ftaid,0)<0) {
+                                       gslog(LOG_EMERG,"GSCPRTS::error::send standard "
+                               "reply faild\n");
+                               return -1;
+                     }
+                   }
+                 }
+               }
+             }
+           }
+         } else {
+           if (send_fta_result(from,0,-1)<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard "
+                     "reply faild\n");
+             return -1;
+           }
+         }
+         break;
+       case FTA_FREE_INSTANCE:{
+         if ((curprocess.type == LFTA)
+             ||(curprocess.type == HFTA)) {
+           struct fta_free_instance_arg * n;
+           n = (struct fta_free_instance_arg *) buf;
+           if (((r=gscpipc_getshm(from))!=0)
+               && ( ftaexec_remove((struct FTA *) n->f.streamid)==0)
+               && ( ftacallback_rm_streamid(r,n->f.streamid)==0)
+               && (ftaexec_free_instance((struct FTA *)n->f.streamid,
+                                         n->recursive)
+                   ==0)
+               && (fta_unregister_instance(n->subscriber,n->f)<0)) {
+             if (send_standard_reply(from,0)<0) {
+               gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+               return -1;
+             }
+           } else {
+             if (send_standard_reply(from,-1)<0) {
+               gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+               return -1;
+             }
+           }
+         } else {
+           if (send_standard_reply(from,-1)<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+             return -1;
+           }
+         }
+       }
+          break;
+       case FTA_CONTROL:{
+         if ((curprocess.type == LFTA)
+             ||(curprocess.type == HFTA)) {
+           struct fta_control_arg * n;
+           n = (struct fta_control_arg *) buf;
+           if (send_standard_reply(from,
+                                   ftaexec_control((struct FTA *)
+                                                   n->f.streamid,
+                                                   n->command,
+                                                   n->sz,
+                                                   &(n->data[0])))<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+             return -1;
+           }
+         } else {
+           if (send_standard_reply(from,-1)<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+             return -1;
+           }
+           gslog(LOG_EMERG,"GSCPRTS::error: Non clearinghouse or HFTA proccess got"
+                   "contacted for clearinghouse or HFTA processing\n");
+         }
+       }
+          break;
+       case FTA_PRODUCER_FAILURE: {
+         if (curprocess.type == CLEARINGHOUSE) {
+           struct fta_notify_producer_failure_arg * n;
+           n = (struct fta_notify_producer_failure_arg *) buf;
+           ftalookup_producer_failure(n->sender,n->producer);
+         }
+       }
+         break;
+       case FTA_HEARTBEAT: {
+         if (curprocess.type == CLEARINGHOUSE) {
+           struct fta_heartbeat_arg * n;
+           n = (struct fta_heartbeat_arg *) buf;
+           ftalookup_heartbeat(n->sender,n->trace_id,
+                               n->sz,&(n->data[0]));
+         }
+       }
+         break;
+       case GSCP_GET_BUFFER:{
+         struct sgroup_get_buffer_arg * n;
+         gs_int32_t  res;
+         struct ringbuf * r;
+         n = (struct sgroup_get_buffer_arg *) buf;
+
+         if ((r=gscpipc_getshm(from))==0) {
+           gslog(LOG_EMERG,"GSCPRTS::error::proccess blocked without"
+                   "sharedmemory\n");
+         } else {
+           if (UNREAD(r)) {
+             /* something arrived in the meantime so wakeup
+                right away */
+               if (send_wakeup(from)<0) {
+                 gslog(LOG_EMERG,"ERROR:Could not send wakeup\n");
+                 return -1;
+               }
+           } else {
+#ifndef POLLING
+             if (ftacallback_add_wakeup(from,r)<0) {
+               gslog(LOG_EMERG,"ERROR:Could not add wakeup\n");
+               return -1;
+             }
+#else
+               gslog(LOG_EMERG,"Received wakeup request on polling systems\n");
+#endif
+           }
+         }
+       }
+         break;
+       case PROCESS_CONTROL:{
+         if ((curprocess.type == LFTA)
+             ||(curprocess.type == HFTA)) {
+           struct process_control_arg * n;
+           n = (struct process_control_arg *) buf;
+           if (send_standard_reply(from,
+                                   ftaexec_process_control(n->command,
+                                                           n->sz,
+                                                           &(n->data[0])))<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+             return -1;
+           }
+         } else {
+           if (send_standard_reply(from,-1)<0) {
+             gslog(LOG_EMERG,"GSCPRTS::error::send standard reply faild\n");
+             return -1;
+           }
+           gslog(LOG_EMERG,"GSCPRTS::error: Non clearinghouse or HFTA proccess got"
+                   "contacted for clearinghouse or HFTA processing\n");
+         }
+       }
+          break;
+       case WAKEUP:
+       case TIMEOUT:
+          break;
+       default:
+         gslog(LOG_EMERG,"GSCPRTS::error::illegal message queue type %u\n",h->callid);
+         return -1;
+        }
+       /* use this occation to cleanup the messagequeue we can't afford
+          a backlog in the real message queue since it is limited in
+          size */
+       while (gscpipc_read(&from,&lopp,buf,&length,0)>0) {
+#ifdef PRINTMSG
+         gslog(LOG_EMERG, "request from %u of type %u with length %u\n",from,
+                 h->callid,h->size);
+#endif
+         if ((lopp == FTACALLBACK) && (h->callid < RESULT_OPCODE_IGNORE)) {
+           if (sidequeue_append(from,buf,length)<0) {
+             gslog(LOG_EMERG,"ERROR:: Could not add to sidequeue\n");
+             return -1;
+           }
+         }
+
+       }
+    }
+    return 0;
+}
+
+static gs_retval_t  map_match(gs_csp_t  dev) {
+  gs_int32_t  x;
+  for(x=0;x<curprocess.mapcnt;x++){
+    if (strcmp(dev,curprocess.map[x])==0) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+gs_retval_t  fta_max_snaplen()
+{
+  return maxsnaplen;
+}
+
+FTAID fta_register(FTAname name,gs_uint32_t   reusable, DEVname dev,
+                    alloc_fta fta_alloc_functionptr,
+                    gs_csp_t  schema, gs_int32_t  snaplen, gs_uint64_t prefilter)
+{
+  gs_int8_t  rb[MAXRES];
+  struct fta_register_arg a;
+  struct standard_result * sr = (struct standard_result *)rb;
+  gs_int32_t  index;
+  FTAID res;
+  FTAID reserr;
+  res.ip=0;
+  res.port=0;
+  res.index=0;
+  res.streamid=0;
+  reserr=res;
+
+  /* check if the device matches for the registration */
+  if (((dev==0) && (curprocess.deviceid==0))
+      || ((dev!=0)&&(map_match(dev)==1))) {
+    if (dev!=0) {
+      gslog(LOG_INFO,"Register %s on device %s\n",name,dev);
+    } else {
+      gslog(LOG_INFO,"Register %s on default device\n",name);
+    }
+    if ((index=ftacallback_add_alloc(name,fta_alloc_functionptr,prefilter))<0) {
+      gslog(LOG_EMERG,"ERROR could not register callback\n");
+      return res;
+    }
+
+    if (snaplen<0) {
+      maxsnaplen=-1;
+    } else {
+      if (maxsnaplen!=-1) {
+       maxsnaplen=(snaplen>maxsnaplen)?snaplen:maxsnaplen;
+      }
+    }
+
+    res=gscpipc_getftaid();
+    res.index=index;
+    if (curprocess.type != CLEARINGHOUSE) {
+               a.h.callid = FTA_REGISTER;
+               a.h.size = sizeof(struct fta_register_arg);
+               if (strlen(name)>=(MAXFTANAME-1)) {
+                       gslog(LOG_EMERG,"ERROR:FTA name (%s) to large\n",name);
+                       return reserr;
+               }
+               if (strlen(schema)>=(MAXSCHEMASZ-1)) {
+                       gslog(LOG_EMERG,"ERROR:FTA schema (%s) to large\n",schema);
+                       return reserr;
+               }
+               strcpy(a.name,name);
+               strcpy(a.schema,schema);
+               a.f=res;
+               a.subscriber=res; /* consumer is the same as f for an FTA*/
+               a.reusable=reusable;
+               ipc_call_and_wait(clearinghouseftaid,(gs_sp_t )&a,rb);
+               if (sr->h.callid != STANDARD_RESULT) {
+                       gslog(LOG_EMERG,"ERROR:Wrong result code received\n");
+                       return reserr;
+               }
+               if (sr->result != 0 )  {
+                       gslog(LOG_EMERG,"ERROR:Error in registration\n");
+                       return reserr;
+               }
+    } else {
+      if (ftalookup_register_fta(gscpipc_getftaid(),
+                       res,name,reusable,schema)!=0) {
+                       return res;
+      }
+    }
+  }
+  return res;
+}
+
+gs_retval_t  fta_unregister(FTAID ftaid)
+{
+  gs_int8_t  rb[MAXRES];
+  struct fta_unregister_arg a;
+  struct standard_result * sr = (struct standard_result *)rb;
+  if (ftacallback_rm_alloc(ftaid.index)<0) {
+    gslog(LOG_EMERG,"ERROR could not unregister callback\n");
+    return -1;
+  }
+
+  if (curprocess.type != CLEARINGHOUSE) {
+    a.h.callid = FTA_UNREGISTER;
+    a.h.size = sizeof(struct fta_register_arg);
+    a.f=ftaid;
+    ipc_call_and_wait(clearinghouseftaid,(gs_sp_t) &a,rb);
+    if (sr->h.callid != STANDARD_RESULT) {
+      gslog(LOG_EMERG,"ERROR:Wrong result code received\n");
+      return -1;
+    }
+    return sr->result;
+  } else {
+    return ftalookup_unregister_fta(gscpipc_getftaid(),ftaid);
+  }
+  return 0;
+}
+
+gs_retval_t  hfta_post_tuple(struct FTA * self, gs_int32_t  sz, void *tuple)
+{
+  struct ringbuf * r;
+  gs_uint32_t   msgid;
+  struct wakeup_result a;
+  FTAID * f;
+  gs_int32_t  state;
+
+    if (sz>MAXTUPLESZ) {
+        gslog(LOG_EMERG,"Maximum tuple size is %u\n",MAXTUPLESZ);
+        return -1;
+    }
+
+    if (self->printfunc.in_use==1) {
+               return print_stream(self,sz,tuple);
+       }
+
+    if (ftacallback_start_streamid((gs_p_t  )self)<0) {
+       gslog(LOG_EMERG,"ERROR:Post for unkown streamid\n");
+       return -1;
+    }
+    /* now make sure we have space to write in all atomic ringbuffer */
+    while((r=ftacallback_next_streamid(&state))!=0) {
+        if (state == HFTA_RINGBUF_ATOMIC) {
+#ifdef BLOCKRINGBUFFER
+            while (!SPACETOWRITE(r)) {
+                usleep(100);
+            }
+#endif
+            if (! SPACETOWRITE(r)) {
+                /* atomic ring buffer and no space so post nothing */
+                return -1;
+            }
+        }
+    }
+
+
+    if (ftacallback_start_streamid((gs_p_t  )self)<0) {
+        gslog(LOG_EMERG,"ERROR:Post for unkown streamid\n");
+        return -1;
+    }
+
+    while((r=ftacallback_next_streamid(&state))!=0) {
+        if (state != HFTA_RINGBUF_SUSPEND) {
+            if (!SPACETOWRITE(r)) {
+                //since memory is full we set a warning
+                shared_memory_full_warning++;
+                // give receiver a chance to clean up
+                usleep(0);
+            }
+            if (SPACETOWRITE(r)) {
+                CURWRITE(r)->f=self->ftaid;
+                CURWRITE(r)->sz=sz;
+                memcpy(&(CURWRITE(r)->data[0]),tuple,sz);
+                               outtuple++;
+                               outbytes=outbytes+CURWRITE(r)->sz;
+                ADVANCEWRITE(r);
+#ifdef PRINTMSG
+               gslog(LOG_EMERG,"Wrote in ringpuffer %p [%p:%u]"
+                    "(%u %u) \n",r,&r->start,r->end,r->reader,r->writer);
+                gslog(LOG_EMERG,"\t%u  %u\n",CURREAD(r)->next,
+                    CURREAD(r)->sz);
+#endif
+            } else {
+                outtupledrop++;
+            }
+            if (HOWFULL(r) > 500) {
+      // buffer is at least half full
+                shared_memory_full_warning++;
+#ifdef PRINTMSG
+                gslog(LOG_EMERG,"\t\t buffer full\n");
+#endif
+            }
+        }
+    }
+#ifndef POLLING
+    if (ftacallback_start_wakeup((gs_p_t  ) self)<0) {
+        gslog(LOG_EMERG,"ERROR:Wakeup for unkown streamid\n");
+        return -1;
+    }
+    a.h.callid=WAKEUP;
+    a.h.size=sizeof(struct wakeup_result);
+    while((f=ftacallback_next_wakeup())!=0) {
+        if (send_wakeup(*f)<0) {
+            gslog(LOG_EMERG,"ERROR:Could not send wakeup\n");
+            return -1;
+        }
+    }
+#endif
+    return 0;
+}
+
+gs_retval_t  hfta_get_ringbuf_space(struct FTA * f, FTAID * r, gs_int32_t  * space, gs_int32_t  szr, gs_int32_t  tuplesz)
+{
+    gs_int32_t  x=0;
+    gs_int32_t  state;
+    struct ringbuf * ru;
+
+       if (f->printfunc.in_use==1) {
+       // XXX WHAT TO DO???
+               gslog(LOG_INFO,"Checking space for printfunc");
+               return 0;
+       }
+
+       if (ftacallback_start_streamid(f->ftaid.streamid)<0) {
+        gslog(LOG_EMERG,"ERROR:Space check for unkown streamid in HFTA\n");
+        return -1;
+    }
+
+    while ((ru=ftacallback_next_streamid(&state))!=0) {
+        if (szr > x ) {
+            r[x]=ru->destid;
+            space[x]=TUPLEFIT(ru,tuplesz);
+        }
+        x++;
+    }
+    return x;
+}
+
+
+gs_retval_t  hfta_set_ringbuf_type(struct FTA * f, FTAID process, gs_int32_t  state)
+{
+
+    if (ftacallback_state_streamid(f->ftaid.streamid,process,state)<0) {
+       gslog(LOG_EMERG,"ERROR:state change for unkown streamid\n");
+       return -1;
+    }
+    return 0;
+}
diff --git a/src/lib/gscphost/callbackregistries.c b/src/lib/gscphost/callbackregistries.c
new file mode 100644 (file)
index 0000000..8bd0957
--- /dev/null
@@ -0,0 +1,727 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+#include "callbackregistries.h"
+#include "lapp.h"
+#include "gscpipc.h"
+#include "stdlib.h"
+#include "stdio.h"
+#include "string.h"
+#include <unistd.h>
+#include <signal.h>
+#include <sys/mman.h>
+#include "schemaparser.h"
+#include "errno.h"
+
+#include "gsconfig.h"
+#include "gstypes.h"
+
+struct ftacallbackalloc {
+    gs_int32_t used;
+    gs_sp_t name;
+    alloc_fta fta_alloc_functionptr;
+    gs_uint64_t prefilter;
+};
+
+static struct ftacallbackalloc * falloc =0;
+static gs_int32_t lalloc=0;
+
+struct ftacallbackstreamid {
+    gs_int32_t refcnt;
+    gs_uint32_t streamid;
+    gs_uint32_t state;
+    struct ringbuf * r;
+};
+
+static struct ftacallbackstreamid * fstreamid =0;
+static gs_int32_t lstreamid=0;
+static gs_uint32_t cstreamid;
+static gs_int32_t nstreamid;
+
+struct ftacallbackwakeup {
+    gs_int32_t used;
+    FTAID ftaid;
+    struct ringbuf * r;
+};
+
+static struct ftacallbackwakeup * fwakeup =0;
+static gs_int32_t lwakeup=0;
+static gs_uint32_t swakeup;
+static gs_int32_t nwakeup;
+
+/* XXX memory of fta list has no owner struct */
+
+struct fta_list {
+    struct fta_list * prev;
+    struct fta_list * next;
+    struct FTA * fta;
+};
+
+static struct fta_list * process=0;
+static struct fta_list * created=0;
+
+static struct fta_list * itteration=0;
+
+// Side queue datastructures
+
+struct sq {
+    FTAID from;
+    gs_int8_t buf[MAXMSGSZ];
+    gs_int32_t length;
+    struct sq * next;
+};
+
+static struct sq * sqtop=0;
+static struct sq * sqtail=0;
+
+
+/* HFTA internal print function*/
+
+gs_retval_t add_printfunction_to_stream( struct FTA  * ftaid, gs_sp_t schema, gs_sp_t path, gs_sp_t basename,
+                                        gs_sp_t temporal_field, gs_sp_t split_field, gs_uint32_t delta, gs_uint32_t split) {
+       gs_uint32_t parserversion;
+       gs_int32_t schemaid;
+       gs_uint32_t x;
+       gs_int8_t temp[50000];
+       if (ftaid->printfunc.in_use==1) {
+        gslog(LOG_EMERG,"ERROR:Printfunction::only allow one print function per HFTA instance\n");
+           return -1;
+       }
+       ftaid->printfunc.path=strdup(path);
+       ftaid->printfunc.basename=strdup(basename);
+       ftaid->printfunc.nexttime=0;
+       ftaid->printfunc.split=(split%1000);
+       ftaid->printfunc.itt=(split/1000)%1000;
+       ftaid->printfunc.base=(split/1000000)%1000;
+       ftaid->printfunc.delta=delta;
+       ftaid->printfunc.in_use=1;
+       if (ftaid->printfunc.split > MAXPRINTFILES) {
+        gslog(LOG_EMERG,"ERROR:Printfunction SPLIT to large\n");
+           return -1;
+       }
+       for (x=0;x<ftaid->printfunc.split;x++) ftaid->printfunc.fa[x]=0;
+    
+       if ((ftaid->printfunc.schemaid=ftaschema_parse_string(schema))<0) {
+               gslog(LOG_EMERG,"ERROR:could not parse schema in HFTA print function");
+               return -1;
+       }
+       if ((ftaid->printfunc.temporal_field=ftaschema_get_field_offset_by_name(
+                                                                            ftaid->printfunc.schemaid,temporal_field))<0) {
+               gslog(LOG_EMERG,"ERROR:could not get "
+              "offset for timefield %s in HFTA print function\n",
+              temporal_field);
+               return -1;
+       }
+    
+       if (ftaschema_get_field_type_by_name(
+                                         ftaid->printfunc.schemaid,temporal_field)!=UINT_TYPE) {
+           gslog(LOG_EMERG,"ERROR: illegal type for timefield "
+              "%s in HFTA print function UINT expected\n",
+              temporal_field);
+           return -1;
+       }
+       if ((ftaid->printfunc.split_field=ftaschema_get_field_offset_by_name(
+                                                                         ftaid->printfunc.schemaid,split_field))<0) {
+               gslog(LOG_EMERG,"ERROR:could not get "
+              "offset for splitfield %s in HFTA print function\n",
+              split_field);
+               return -1;
+       }
+    
+       if (ftaschema_get_field_type_by_name(
+                                         ftaid->printfunc.schemaid,split_field)!=UINT_TYPE) {
+           gslog(LOG_EMERG,"ERROR: illegal type for splitfield"
+              "%s in HFTA print function UINT expected\n",
+              split_field);
+           return -1;
+       }
+       parserversion=get_schemaparser_version();
+       sprintf(temp,"GDAT\nVERSION:%u\nSCHEMALENGTH:%lu\n%s",parserversion,strlen(schema)+1,schema);
+       ftaid->printfunc.header=strdup(temp);
+       gslog(LOG_INFO,"Established print function for %s",basename);
+       return 0;
+}
+
+gs_retval_t print_stream(struct FTA * self, gs_int32_t sz, void *tuple)
+{
+       gs_int32_t problem;
+       gs_uint32_t timeval;
+       gs_uint32_t splitval;
+       gs_uint32_t x;
+       gs_uint32_t nsz;
+       timeval=fta_unpack_uint(tuple,sz,self->printfunc.temporal_field,&problem);
+       if (timeval==0) return 0; // ignore heartbeats till we see a real timestamp
+       if (timeval>= self->printfunc.nexttime) {
+               gs_int8_t oldname[1024];
+               gs_int8_t newname[1024];
+               if (self->printfunc.split==0) {
+                       if (self->printfunc.fa[0] != 0) {
+                               sprintf(oldname,"%s/%u%s.tmp",self->printfunc.path,self->printfunc.nexttime-self->printfunc.delta,self->printfunc.basename);
+                               sprintf(newname,"%s/%u%s",self->printfunc.path,self->printfunc.nexttime-self->printfunc.delta,self->printfunc.basename);
+                               fclose(self->printfunc.fa[0]);
+                               rename(oldname,newname);
+                       }
+                       if (self->printfunc.nexttime==0) {
+                               self->printfunc.nexttime=(timeval/self->printfunc.delta)*self->printfunc.delta;
+                       }
+                       sprintf(oldname,"%s/%u%s.tmp",self->printfunc.path,self->printfunc.nexttime,self->printfunc.basename);
+                       if ((self->printfunc.fa[0]=fopen(oldname,"w"))==0) {
+                               gslog(LOG_EMERG,"ERROR:Could not open file in HFTA print function\n");
+                               return -1;
+                       }
+                       if (setvbuf(self->printfunc.fa[0],0,_IOFBF,16000000)!=0) {
+                               gslog(LOG_EMERG,"ERROR:Could not setvbuf\n");
+                       }
+                       if (fwrite(self->printfunc.header,strlen(self->printfunc.header)+1,1,self->printfunc.fa[0])!=1) {
+                               gslog(LOG_EMERG,"ERROR:fwrite:xfgh1:%s:%u",self->printfunc.basename,errno);
+                       }
+                       gslog(LOG_INFO,"Opened file %s",oldname);
+               } else {
+                       for(x=self->printfunc.base;x<self->printfunc.split;x=x+self->printfunc.itt) {
+                               if (self->printfunc.fa[x] != 0) {
+                                       sprintf(oldname,"%s/%u_s%u%s.tmp",self->printfunc.path,self->printfunc.nexttime-self->printfunc.delta,x+1,self->printfunc.basename);
+                                       sprintf(newname,"%s/%u_s%u%s",self->printfunc.path,self->printfunc.nexttime-self->printfunc.delta,x+1,self->printfunc.basename);
+                                       fclose(self->printfunc.fa[x]);
+                                       rename(oldname,newname);
+                               }
+                               if (self->printfunc.nexttime==0) {
+                                       self->printfunc.nexttime=(timeval/self->printfunc.delta)*self->printfunc.delta;
+                               }
+                               sprintf(oldname,"%s/%u_s%u%s.tmp",self->printfunc.path,self->printfunc.nexttime,x+1,self->printfunc.basename);
+                               if ((self->printfunc.fa[x]=fopen(oldname,"w"))==0) {
+                                       gslog(LOG_EMERG,"ERROR:Could not open file in HFTA print function\n");
+                                       return -1;
+                               }
+                if (setvbuf(self->printfunc.fa[x],0,_IOFBF,16000000)!=0) {
+                    gslog(LOG_EMERG,"ERROR:Could not setvbuf\n");
+                }
+                               if (fwrite(self->printfunc.header,strlen(self->printfunc.header)+1,1,self->printfunc.fa[x])!=1)  {
+                    gslog(LOG_EMERG,"ERROR:fwrite:xfgh2:%s:%u",self->printfunc.basename,errno);
+                }
+                gslog(LOG_INFO,"Opened file %s",oldname);
+                       }
+               }
+               self->printfunc.nexttime=self->printfunc.nexttime+self->printfunc.delta;
+       }
+    // don't write temporal tuples to file but use them to advance file name.
+       if (ftaschema_is_temporal_tuple(self->printfunc.schemaid, tuple)) return 0;
+       if (self->printfunc.split!=0) {
+               splitval=fta_unpack_uint(tuple,sz,self->printfunc.split_field,&problem)%(self->printfunc.split);
+               if (self->printfunc.fa[splitval]==0) {
+                       gslog(LOG_EMERG,"Inconsistent rangehash in print %u\n", splitval);
+                       exit(0);
+               }
+       } else {
+               splitval=0;
+       }
+       nsz=htonl(sz);
+       if (fwrite(&nsz,sizeof(gs_uint32_t),1,self->printfunc.fa[splitval])!=1) {
+               gslog(LOG_EMERG,"Could not write to output in HFTA print\"%s\":%u.. EXITING\n",
+              self->printfunc.basename,errno);
+               exit(0);
+       }
+       if (fwrite(tuple,sz,1,self->printfunc.fa[splitval])!=1) {
+               gslog(LOG_EMERG,"Could not write to output in HFTA print\"%s\"%u.. EXITING\n",
+              self->printfunc.basename,errno);
+               exit(0);
+       }
+       return 0;
+}
+
+/* registers an alloc function of an FTA and returns a unique index */
+gs_retval_t ftacallback_add_alloc(FTAname name, alloc_fta fta_alloc_functionptr,gs_uint64_t prefilter)
+{
+    gs_int32_t x;
+    gslog(LOG_INFO,"Register prefilter %llu for %s\n",prefilter,name);
+    if (lalloc == 0) {
+        if ((falloc = malloc(sizeof(struct ftacallbackalloc)*STARTSZ))==0) {
+            gslog(LOG_EMERG,"ERROR:Out of memory ftacallback\n");
+            return -1;
+        }
+        memset(falloc,0,sizeof(struct ftacallbackalloc)*STARTSZ);
+        lalloc = STARTSZ;
+    }
+    for(x=0;(x<lalloc)&&(falloc[x].used!=0);x++);
+    if (x == lalloc) {
+        gs_int32_t y;
+        lalloc = 2*lalloc;
+        if ((falloc = realloc(falloc,lalloc*sizeof(struct ftacallbackalloc)))==0) {
+            gslog(LOG_EMERG,"ERROR:Out of memory ftacallback\n");
+            return -1;
+        }
+        for (y=x;y<lalloc;y++)
+            falloc[y].used=0;
+    }
+    falloc[x].name=strdup(name);
+    falloc[x].fta_alloc_functionptr=fta_alloc_functionptr;
+    falloc[x].prefilter=prefilter;
+    falloc[x].used=1;
+    return x;
+}
+
+/* unregisters an alloc function of an FTA and makes the index available
+ * for reuse
+ */
+
+gs_retval_t ftacallback_rm_alloc(gs_uint32_t index)
+{
+    falloc[index].used=0;
+    free(falloc[index].name);
+    return 0;
+}
+/* returns the prefilter for a given
+ * index
+ */
+
+gs_uint64_t ftacallback_get_prefilter(gs_int32_t index)
+{
+    if ((index<lalloc) && (falloc[index].used!=0)) {
+        return falloc[index].prefilter;
+    }
+    return 0;
+}
+
+/* returns the function pointer of the callback function for a given
+ * index
+ */
+
+alloc_fta ftacallback_get_alloc(gs_int32_t index)
+{
+    if ((index<lalloc) && (falloc[index].used!=0)) {
+        return falloc[index].fta_alloc_functionptr;
+    }
+    return 0;
+}
+
+
+
+
+
+/* associate ringbuffer with streamid (using refcounting) */
+gs_retval_t ftacallback_add_streamid(struct ringbuf * r, gs_uint32_t streamid) {
+    gs_int32_t x;
+    if (lstreamid == 0) {
+        if ((fstreamid = malloc(sizeof(struct ftacallbackstreamid)*STARTSZ))==0) {
+            gslog(LOG_EMERG,"ERROR:Out of memory ftacallback\n");
+            return -1;
+        }
+        memset(fstreamid,0,sizeof(struct ftacallbackstreamid)*STARTSZ);
+        lstreamid = STARTSZ;
+    }
+    /* first try to increment refcnt */
+    for(x=0;(x<lstreamid)&&(
+                            (fstreamid[x].streamid!=streamid)
+                            ||(fstreamid[x].r!=r)
+                            ||(fstreamid[x].refcnt<=0)) ;x++);
+    if (x>=lstreamid) {
+        /* now try to find empty slot */
+        for(x=0;(x<lstreamid)&&(fstreamid[x].refcnt!=0);x++);
+        if (x >= lstreamid) {
+            gs_int32_t y;
+            lstreamid = 2*lstreamid;
+            if ((fstreamid =
+                 realloc(fstreamid,sizeof(struct ftacallbackstreamid)*lstreamid))==0) {
+                gslog(LOG_EMERG,"ERROR:Out of memory ftacallback\n");
+                return -1;
+            }
+            for (y=x;y<lstreamid;y++) {
+                fstreamid[y].refcnt=0;
+                fstreamid[y].streamid=0;
+            }
+        }
+        fstreamid[x].state=HFTA_RINGBUF_ATOMIC;
+       fstreamid[x].streamid=streamid;
+       fstreamid[x].r=r;
+    }
+    fstreamid[x].refcnt+=1;
+    return 0;
+}
+
+
+/* unassosciate a ringbuffer from a streamid */
+
+gs_retval_t ftacallback_rm_streamid(struct ringbuf * r, gs_uint32_t streamid)
+{
+    gs_int32_t x;
+    for(x=0;x<lstreamid;x++) {
+        if ((fstreamid[x].streamid == streamid)
+            && (fstreamid[x].r == r)
+            && (fstreamid[x].refcnt > 0))
+            fstreamid[x].refcnt--;
+    }
+    return 0;
+}
+
+/* set the state for a given streamid and destination process */
+gs_retval_t ftacallback_state_streamid(gs_int32_t streamid,FTAID process, gs_int32_t state)
+{
+    gs_int32_t x;
+    for(x=0;x<lstreamid;x++) {
+        if ((fstreamid[x].streamid == streamid)
+            && (fstreamid[x].r->destid.ip == process.ip )
+            && (fstreamid[x].r->destid.port == process.port )
+            && (fstreamid[x].refcnt > 0))
+            fstreamid[x].state=state;
+        return 0;
+    }
+    return -1;
+}
+
+/* starts an itteration through all ringbuffers for a particular streamid */
+
+gs_retval_t ftacallback_start_streamid(gs_int32_t streamid)
+{
+    cstreamid=streamid;
+    nstreamid=0;
+    return 0;
+}
+
+/* returns all the ringbuffer associated with the streamid passed in
+ * ftacallback_start_streamid
+ */
+struct ringbuf * ftacallback_next_streamid(gs_int32_t* state)
+{
+    for(;(nstreamid<lstreamid)
+           &&(fstreamid[nstreamid].streamid != cstreamid);
+        nstreamid++);
+    if (nstreamid<lstreamid) {
+        nstreamid++;
+        *state=fstreamid[nstreamid-1].state;
+        return fstreamid[nstreamid-1].r;
+    }
+    return 0;
+}
+
+
+/* associate msgid with ringbuf  */
+gs_retval_t ftacallback_add_wakeup(FTAID ftaid, struct ringbuf * r)
+{
+    gs_int32_t x;
+    if (lwakeup == 0) {
+        if ((fwakeup = malloc(sizeof(struct ftacallbackwakeup)*STARTSZ))==0) {
+            gslog(LOG_EMERG,"ERROR:Out of memory ftacallback\n");
+            return -1;
+        }
+        memset(fwakeup,0,sizeof(struct ftacallbackwakeup)*STARTSZ);
+        lwakeup = STARTSZ;
+    }
+    /* first try to find one for the same process */
+    for(x=0;(x<lwakeup)&&(
+                          ((fwakeup[x].ftaid.ip!=ftaid.ip)
+                           || (fwakeup[x].ftaid.port!=ftaid.port))
+                          ||(fwakeup[x].used==0)) ;x++);
+    if (x==lwakeup) {
+        /* now try to find empty slot */
+        for(x=0;(x<lwakeup)&&(fwakeup[x].used!=0);x++);
+        if (x == lwakeup) {
+            gs_int32_t y;
+            lwakeup = 2*lwakeup;
+            if ((fwakeup =
+                 realloc(fwakeup,sizeof(struct ftacallbackwakeup)*lwakeup))==0) {
+                gslog(LOG_EMERG,"ERROR:Out of memory ftacallback\n");
+                return -1;
+            }
+            for (y=x;y<lwakeup;y++)
+                fwakeup[y].used=0;
+        }
+    }
+    fwakeup[x].used=1;
+    fwakeup[x].ftaid=ftaid;
+    fwakeup[x].r=r;
+    return x;
+}
+
+/* starts an itteration through all msgids associated with
+ a streamid. This also uses data kept in the fstreamid
+ registry
+ */
+gs_retval_t ftacallback_start_wakeup(gs_uint32_t streamid)
+{
+    swakeup=streamid;
+    nwakeup=0;
+    return 0;
+}
+
+/* returns all the msgid blocked on the streamid passed in
+ * ftacallback_start_streamid and removes the msgid from
+ * the wakeup list
+ */
+FTAID * ftacallback_next_wakeup()
+{
+    for(;(nwakeup<lstreamid)
+           &&(fstreamid[nwakeup].streamid != swakeup);
+        nwakeup++);
+    if (nwakeup<lstreamid) {
+        gs_int32_t x;
+        for(x=0;x<lwakeup;x++)
+            if ((fwakeup[x].r==fstreamid[nwakeup].r) &&
+                (fwakeup[x].used==1)) {
+                fwakeup[x].used=0;
+                nwakeup++;
+                return & fwakeup[x].ftaid;
+            }
+    }
+    nwakeup ++;
+    return (FTAID *) 0;
+}
+
+
+
+static gs_retval_t fta_list_add(struct fta_list ** root, struct FTA * after,
+                                struct FTA * fta) {
+    struct fta_list * new;
+    struct fta_list * tmp;
+    
+    if ((new=(struct fta_list *)malloc(sizeof(struct fta_list)))==0) {
+        gslog(LOG_EMERG,"fta_list_add:: can't allocate memory\n");
+        return -1;
+    }
+    
+    new->fta=fta;
+    
+    
+    if (after==0) {
+        new->next=*root;
+        new->prev=0;
+        *root=new;
+        if (new->next) {
+            new->next->prev=new;
+        }
+    } else {
+        tmp=*root;
+        while((tmp)&&(tmp->fta!=after)) {
+            tmp=tmp->next;
+        }
+        if (tmp==0) {
+            gslog(LOG_EMERG,"fta_list_add:: can't find after fta\n");
+            return -1;
+        }
+        new->next=tmp->next;
+        new->prev=tmp;
+        tmp->next=new;
+        if (new->next) {
+            new->next->prev=new;
+        }
+    }
+    return 0;
+}
+
+static gs_retval_t fta_list_rm(struct fta_list ** root, struct FTA * fta) {
+    struct fta_list * tmp;
+    tmp=*root;
+    while((tmp)&&(tmp->fta!=fta)) {
+        tmp=tmp->next;
+    }
+    if (tmp==0) {
+        gslog(LOG_EMERG,"fta_list_rm:: can't find fta\n");
+        return -1;
+    }
+    if (tmp == (*root)) {
+        *root=tmp->next;
+        if (tmp->next) {
+            tmp->next->prev=0;
+        }
+    } else {
+        tmp->prev->next=tmp->next;
+        if (tmp->next) {
+            tmp->next->prev=tmp->prev;
+        }
+    }
+    
+    free(tmp);
+    return 0;
+}
+
+
+static gs_retval_t fta_list_check(struct fta_list ** root, struct FTA * fta) {
+    struct fta_list * tmp;
+    tmp=*root;
+    while((tmp)&&(tmp->fta!=fta)) {
+        tmp=tmp->next;
+    }
+    if (tmp==0) {
+        return -1;
+    }
+    return 0;
+}
+
+gs_retval_t ftaexec_insert(struct FTA * after, struct FTA * new)
+{
+    
+    if ((after!=0) && (fta_list_check(&process,after)<0)) {
+        gslog(LOG_EMERG,"fta_insert:: ilegal adapter for after\n");
+        return -1;
+    }
+    
+    if (fta_list_check(&created,new)<0) {
+        gslog(LOG_EMERG,"fta_insert:: ilegal adapter for new\n");
+        return -1;
+    }
+    
+    if (fta_list_check(&process,new)==0) {
+               new->runrefcnt++;
+        gslog(LOG_INFO,"fta_insert:: new already in process list reusing entry with streamid %d\n",new->ftaid.streamid);
+        return 0;
+    }
+    
+    if (fta_list_add(&process,after,new)<0) {
+        gslog(LOG_EMERG,"fta_insert:: new can not be added to process list\n");
+        return -1;
+    }
+    
+    new->runrefcnt++;
+    
+    return 0;
+    
+}
+
+gs_retval_t ftaexec_remove(struct FTA * id){
+    
+    if (fta_list_check(&process,id)<0) {
+        gslog(LOG_EMERG,"fta_remove:: id not in process list\n");
+        return -1;
+    }
+    id->runrefcnt--;
+    if (id->runrefcnt<=0) {
+        if (fta_list_rm(&process,id)<0) {
+            gslog(LOG_EMERG,"fta_remove:: id could not be removed from process list\n");
+            return -1;
+        }
+    }
+    return 0;
+}
+
+
+struct FTA * ftaexec_alloc_instance(gs_uint32_t index, struct FTA * reuse,
+                                    gs_uint32_t reusable,
+                                    gs_int32_t command, gs_int32_t sz, void *  data){
+    struct FTA * f;
+    FTAID ftaid;
+    ftaid=gscpipc_getftaid();
+    ftaid.index=index;
+    ftaid.streamid=0;
+    if (fta_list_check(&created,reuse)==0) {
+        reuse->refcnt++;
+        return reuse;
+    }
+    if (ftacallback_get_alloc(index)==0) return 0;
+    f=ftacallback_get_alloc(index)(ftaid,reusable,command, sz, data);
+    f->prefilter=ftacallback_get_prefilter(index);
+    gslog(LOG_INFO,"Using prefilter %llu for fta %x\n",f->prefilter,f);
+    if (fta_list_add(&created,0,f)<0) {
+        gslog(LOG_EMERG,"fta_alloc_instance:: new fta can not be added to created list\n");
+        return 0;
+    }
+    f->refcnt=1;
+    return f;
+}
+
+
+
+gs_retval_t ftaexec_free_instance(struct FTA * id, gs_uint32_t recursive){
+    id->refcnt --;
+    if (id->refcnt==0) {
+        if (fta_list_rm(&created,id)<0) {
+            gslog(LOG_EMERG,"fta_free_instance:: fta could not be removed from created list\n");
+            return -1;
+        }
+        /* just to make sure remove it form process list too */
+        if (fta_list_check(&process,id)>=0) {
+            fta_list_rm(&process,id);
+        }
+        
+        id->free_fta(id,recursive);
+    }
+    return 0;
+}
+
+gs_retval_t ftaexec_control(struct FTA * id, gs_int32_t command, gs_int32_t sz, void * value){
+    if (fta_list_check(&created,id)<0) {
+        gslog(LOG_EMERG,"fta_control:: id not found in adapter's created list\n");
+        return -1;
+    }
+    return id->control_fta(id,command,sz,value);
+}
+
+gs_retval_t ftaexec_process_control(gs_int32_t command, gs_int32_t sz, void * value){
+    struct FTA * f;
+    ftaexec_start();
+    while((f=ftaexec_next())!=0) {
+        f->control_fta(f,command,sz,value);
+    }
+    return 1;
+}
+
+
+/* Start itteration through list of active FTA */
+
+gs_retval_t ftaexec_start()
+{
+    itteration=process;
+    return 0;
+}
+
+/* get one FTA at a time */
+
+struct FTA * ftaexec_next()
+{
+    struct FTA * fta=0;
+    if (itteration) {
+        fta=itteration->fta;
+        itteration=itteration->next;
+    }
+    return fta;
+}
+
+
+/* adds a buffer to the end of the sidequeue*/
+gs_retval_t sidequeue_append(FTAID from, gs_sp_t buf, gs_int32_t length)
+{
+    struct sq * s;
+    if ((s=malloc(sizeof(struct sq)))==0) {
+        gslog(LOG_EMERG,"Could not allocate memory for sidequeue");
+        return -1;
+    }
+    s->from=from;
+    memcpy(&s->buf[0],buf,MAXMSGSZ);
+    s->length=length;
+    s->next=0;
+    if (sqtail) {
+        sqtail->next=s;
+        sqtail=s;
+    } else {
+        sqtop = s;
+        sqtail = s;
+    }
+    return 0;
+}
+
+/* removes a buffer from the top of the sidequeue*/
+gs_retval_t sidequeue_pop(FTAID * from, gs_sp_t buf, gs_int32_t* length)
+{
+    struct sq * s;
+    
+    if (sqtop) {
+        *from=sqtop->from;
+        memcpy(buf,&sqtop->buf[0],MAXMSGSZ);
+        *length=sqtop->length;
+        s=sqtop;
+        sqtop=sqtop->next;
+        if (sqtop==0) sqtail=0;
+        free(s);
+        return 0;
+    }
+    return -1;
+}
diff --git a/src/lib/gscphost/clearinghouseregistries.c b/src/lib/gscphost/clearinghouseregistries.c
new file mode 100644 (file)
index 0000000..84dd266
--- /dev/null
@@ -0,0 +1,201 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <lapp.h>
+#include <clearinghouseregistries.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "gshub.h"
+
+extern const gs_sp_t fta_names[];
+
+
+/* fta lookup registry in the clearinghouse */
+
+
+struct ftalookup {
+    gs_int32_t used;
+    gs_sp_t name;
+    FTAID ftaid;
+    gs_uint32_t  reusable;
+    gs_sp_t  schema;
+};
+
+struct ftalookup * flookup =0;
+gs_int32_t llookup=0;
+
+
+/* Adds a FTA to the lookup table */
+gs_retval_t ftalookup_register_fta( FTAID subscriber, FTAID f,
+                                   FTAname name, gs_uint32_t  reusable,
+                                   gs_csp_t  schema)
+{
+    gs_int32_t x;
+    static gs_int32_t registered_ftas=0;
+    endpoint gshub;
+    if (get_hub(&gshub)!=0) {
+        gslog(LOG_EMERG,"ERROR:could not find gshub to announce fta/instance");
+        return -1;
+    }
+    if (llookup == 0) {
+        if ((flookup = malloc(sizeof(struct ftalookup)*STARTSZ))==0) {
+            gslog(LOG_EMERG,"ERROR:Out of memory ftalookup\n");
+            return -1;
+        }
+        memset(flookup,0,sizeof(struct ftalookup)*STARTSZ);
+        llookup = STARTSZ;
+    }
+    for(x=0;(x<llookup)&&(flookup[x].used!=0);x++);
+    if (x == llookup) {
+        gs_int32_t y;
+        llookup = 2*llookup;
+        if ((flookup = realloc(flookup,llookup*sizeof(struct ftalookup)))==0) {
+            gslog(LOG_EMERG,"ERROR:Out of memory ftacallback\n");
+            return -1;
+        }
+        for (y=x;y<llookup;y++)
+            flookup[y].used=0;
+    }
+    if (f.streamid==0) {
+        gslog(LOG_INFO,"Basic FTA can not be reusable\n");
+        reusable=0;
+        if (registered_ftas>=0)
+            registered_ftas++; // count them to know when everybody is in
+    } else {
+        // register none basic FTA's with GSHUB
+        if (set_ftainstance(gshub,get_instance_name(),(gs_sp_t)name,&f)!=0) {
+            gslog(LOG_EMERG,"ERROR:could not set_ftainstance");
+            return -1;
+        }
+    }
+    gslog(LOG_INFO,"Adding fta to registry %s reuseable %u\n",name,reusable);
+    flookup[x].name=strdup(name);
+    flookup[x].ftaid=f;
+    flookup[x].reusable=reusable;
+    flookup[x].schema=strdup(schema);
+    flookup[x].used=1;
+
+    if (registered_ftas>=0) {
+        for(x=0; fta_names[x]!=0;x++ );
+        if (x<=registered_ftas) {
+            if (set_initinstance(gshub,get_instance_name())!=0) {
+                gslog(LOG_EMERG,"hostlib::error::could not init instance");
+                return -1;
+            }
+            registered_ftas=-1;
+        }
+    }
+    return 0;
+}
+
+/* Removes the FTA from the lookup table */
+gs_retval_t ftalookup_unregister_fta(FTAID subscriber,FTAID f)
+{
+    gs_int32_t x;
+    for(x=0;x<llookup;x++) {
+        if ((flookup[x].used==1)
+            && (flookup[x].ftaid.streamid)
+            && (flookup[x].ftaid.ip)
+            && (flookup[x].ftaid.port)
+            && (flookup[x].ftaid.index)) {
+            flookup[x].used=0;
+            free(flookup[x].name);
+            free(flookup[x].schema);
+        }
+    }
+    return 0;
+}
+
+/* Looks an FTA up by name */
+gs_retval_t ftalookup_lookup_fta_index(FTAID caller,
+                                       FTAname name, gs_uint32_t  reuse, FTAID * ftaid,
+                                       gs_csp_t  * schema)
+{
+    gs_int32_t x;
+#ifdef PRINTMSG
+    fprintf(stderr,"Name %s reusable %u\n",name,reuse);
+#endif
+    if (reuse==1) {
+        /* grep the firs reusable instance */
+        for(x=0;x<llookup;x++) {
+            if ((flookup[x].used==1)&&(strcmp(flookup[x].name,name)==0)
+                && (flookup[x].reusable>=1)
+                && (flookup[x].ftaid.streamid!=0)) {
+                *ftaid=flookup[x].ftaid;
+                *schema=flookup[x].schema;
+#ifdef PRINTMSG
+                fprintf(stderr,"\tREUSE FTA\n");
+#endif
+                return 0;
+            }
+        }
+    }
+    /* grep the first fta with the name not an instance */
+    for(x=0;x<llookup;x++) {
+        if ((flookup[x].used==1)&&(strcmp(flookup[x].name,name)==0)
+            && (flookup[x].ftaid.streamid==0)) {
+            *ftaid=flookup[x].ftaid;
+            *schema=flookup[x].schema;
+#ifdef PRINTMSG
+            fprintf(stderr,"\tNEW FTA\n");
+#endif
+
+            gslog(LOG_DEBUG,"Lookup of FTA %s with FTAID {ip=%u,port=%u,index=%u,streamid=%u}\n",name,ftaid->ip,ftaid->port,ftaid->index,ftaid->streamid);
+            return 0;
+        }
+    }
+#ifdef PRINTMSG
+    fprintf(stderr,"NO MATCH\n");
+#endif
+    return -1;
+}
+
+gs_retval_t ftalookup_producer_failure(FTAID caller,FTAID producer) {
+    return 0;
+}
+
+gs_retval_t ftalookup_heartbeat(FTAID caller_id, gs_uint64_t trace_id,
+                                gs_uint32_t  sz, fta_stat * trace){
+
+       gs_uint32_t i = 0;
+    endpoint gshub;
+    if (get_hub(&gshub)!=0) {
+        gslog(LOG_EMERG,"ERROR:could not find gshub to announce fta");
+        return -1;
+    }
+
+    // to avoid sending redundant FTA instance stats to GSHUB we will only send statistics that have trace size of 1
+       // for application heartbeats (streamid=0) we will only send last stat in their traces
+    if ((sz == 1) || (trace[sz-1].ftaid.streamid == 0)) {
+        if (set_instancestats(gshub,get_instance_name(),&trace[sz-1])!=0) {
+               gslog(LOG_EMERG,"ERROR:could not set instancestats");
+               return -1;
+               }
+
+    }
+
+    #ifdef PRINTMSG
+       gslog(LOG_DEBUG,"Heartbeat trace from FTA {ip=%u,port=%u,index=%u,streamid=%u}, trace_id=%llu ntrace=%d\n", caller_id.ip,caller_id.port,caller_id.index,caller_id.streamid, trace_id,sz);
+       for (i = 0; i < sz; ++i) {
+               gslog(LOG_DEBUG,"trace_id=%llu, trace[%u].ftaid={ip=%u,port=%u,index=%u,streamid=%u}, fta_stat={in_tuple_cnt=%u,out_tuple_cnt=%u,out_tuple_sz=%u,accepted_tuple_cnt=%u,cycle_cnt=%llu,collision_cnt=%u,eviction_cnt=%u,sampling_rate=%f}\n", trace_id, i,
+              trace[i].ftaid.ip,trace[i].ftaid.port,trace[i].ftaid.index,trace[i].ftaid.streamid,
+              trace[i].in_tuple_cnt, trace[i].out_tuple_cnt, trace[i].out_tuple_sz, trace[i].accepted_tuple_cnt, trace[i].cycle_cnt, trace[i].collision_cnt, trace[i].eviction_cnt, trace[i].sampling_rate);
+       }
+    #endif
+    return 0;
+}
diff --git a/src/lib/gscphost/gscpipc.c b/src/lib/gscphost/gscpipc.c
new file mode 100644 (file)
index 0000000..502c54c
--- /dev/null
@@ -0,0 +1,1344 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "gscpipc.h"
+#include "gshub.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#ifdef __linux__
+#include <sys/ioctl.h>
+#include <netinet/tcp.h>
+#include <linux/sockios.h>
+#endif
+
+#ifndef socklen_t
+#define socklen_t gs_uint32_t
+#endif
+
+
+struct FTAID clearinghouseftaid;
+
+
+
+struct connection {
+    gs_int32_t socket; /* socket for connection */
+    gs_int32_t used;   /* 1 if the entry is in use */
+    FTAID remoteid; /* remoteid of connection */
+};
+
+struct connection connectionhash[SOCKET_HASH_SZ];
+
+gs_int32_t clearinghouse=0;
+
+#define SHMTYPE 's'
+#define SHM_RECV 1
+#define SHM_SEND 2
+
+struct shmlistentry {
+    FTAID msgid;
+    gs_int32_t type;
+    key_t shmtoken;
+    gs_int32_t shmid;
+    struct ringbuf * buf;
+    gs_int32_t buffsize;
+};
+
+gs_int32_t shmlistlen=0;
+struct shmlistentry shmlist[MAX_NUMBER_OF_SHM];
+
+struct sq {
+    gs_int8_t buf[MAXMSGSZ];
+    gs_int32_t length;
+    struct sq * next;
+};
+
+static struct sq * sqtop=0;
+static struct sq * sqtail=0;
+
+/* adds a buffer to the end of the sidequeue*/
+gs_retval_t gscpipc_sidequeue_append(gs_sp_t  buf, gs_int32_t length)
+{
+    struct sq * s;
+    if ((s=malloc(sizeof(struct sq)))==0) {
+        gslog(LOG_EMERG,"Could not allocate memory for sidequeue");
+        return -1;
+    }
+    memcpy(&s->buf[0],buf,MAXMSGSZ);
+    s->length=length;
+    s->next=0;
+    if (sqtail) {
+        sqtail->next=s;
+        sqtail=s;
+    } else {
+        sqtop = s;
+        sqtail = s;
+    }
+    return 0;
+}
+
+/* removes a buffer from the top of the sidequeue*/
+gs_retval_t gscpipc_sidequeue_pop(gs_sp_t  buf, gs_int32_t * length, gs_int32_t buflen)
+{
+    struct sq * s;
+    if (sqtop) {
+        if (sqtop->length > buflen) {
+            return -2;
+        }
+        memcpy(buf,&sqtop->buf[0],sqtop->length);
+        *length=sqtop->length;
+        s=sqtop;
+        sqtop=sqtop->next;
+        if (sqtop==0) sqtail=0;
+        free(s);
+        return 0;
+    }
+    return -1;
+}
+
+struct ipc_message {
+    FTAID receiver;
+    FTAID sender;
+    gs_int32_t operation;
+#ifdef PRINTMSG
+    gs_int32_t pmsgid;
+#endif
+    gs_int32_t  size;
+    gs_int8_t data[4];
+};
+
+#define LOWLEVELOP_ACK 0
+#define LOWLEVELOP_NACK 1
+#define LOWLEVELOP_REGISTER 2
+#define LOWLEVELOP_UNREGISTER 3
+#define LOWLEVELOP_SHM_REGISTER 4
+#define LOWLEVELOP_SHM_FREE 5
+#define LOWLEVELOP_SHM_REMOTE_REGISTER 6
+#define LOWLEVELOP_SHM_REMOTE_FREE 7
+#define LOWLEVELOP_REMOTE_TUPLE 8
+
+struct internal_message{
+    struct ipc_message im;
+    int lowlevelop;
+    key_t shmtoken;
+    int shmsz;
+    int result;
+};
+
+struct internal_remote_tuple{
+    struct ipc_message im;
+    int lowlevelop;
+    int size;
+    gs_int8_t data[4];
+};
+
+FTAID myid;
+int listen_socket;
+
+#ifdef PRINTMSG
+int pmsgid=0;
+#endif
+
+
+struct shmlistentry * shmlist_find(FTAID msgid, int type)
+{
+    int x;
+    for (x=0; x<shmlistlen; x++) {
+        if ((shmlist[x].msgid.ip == msgid.ip)
+            && (shmlist[x].msgid.port == msgid.port)
+            && (shmlist[x].type == type)) {
+            return &(shmlist[x]);
+        }
+    }
+    return 0;
+}
+
+gs_retval_t shmlist_add(FTAID msgid, int type, key_t shmtoken,
+                        int shmid, struct ringbuf * buf, int buffsize)
+{
+    if (shmlist_find(msgid, type) !=0) {
+        return -1;
+    }
+    if (shmlistlen>=MAX_NUMBER_OF_SHM) {
+        gslog(LOG_EMERG,"GSCPTR::error::could not register shm to many"
+              "shm registered\n");
+        return -1;
+    }
+    shmlist[shmlistlen].msgid=msgid;
+    shmlist[shmlistlen].type=type;
+    shmlist[shmlistlen].shmtoken=shmtoken;
+    shmlist[shmlistlen].shmid=shmid;
+    shmlist[shmlistlen].buf=buf;
+    shmlist[shmlistlen].buffsize=buffsize;
+    shmlistlen++;
+    return 0;
+}
+
+static gs_retval_t shmlist_rm(FTAID msgid, gs_int32_t type)
+{
+    gs_int32_t x;
+    gs_int32_t move=0;
+    for (x=0;x<shmlistlen;x++) {
+        if ((shmlist[x].msgid.ip == msgid.ip)
+            && (shmlist[x].msgid.port == msgid.port)
+            &&(shmlist[x].type==type)) {
+            shmlistlen--;
+            move=1;
+        }
+        if ((move==1)&&(x<shmlistlen)) {
+            shmlist[x]=shmlist[x+1];
+        }
+    }
+    return 0;
+}
+
+
+/* starts the listen socket for the current proccess
+ if the listen_port is 0 then a random port is assigned
+ this function also sets myid
+ */
+static gs_retval_t msg_init(gs_uint32_t clearinghouse) {
+    struct sockaddr_in sin;
+    gs_int32_t x;
+    FILE *f;
+    socklen_t sin_sz;
+    
+    /* mark all entries in the connection hash as unused */
+    for(x=0;x<SOCKET_HASH_SZ;x++) {
+        connectionhash[x].used=0;
+    }
+    
+    myid.index=0;
+    myid.streamid=0;
+    
+    bzero(&sin, sizeof(sin));
+    sin.sin_family = AF_INET;
+#ifdef __NetBSD__
+    sin.sin_len = sizeof(sin);
+#endif
+    sin.sin_addr.s_addr = 0;
+    sin.sin_port = 0;
+    
+    if ((listen_socket = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::could not create listen socket\n");
+        return -1;
+    }
+    
+    if (bind(listen_socket, (struct sockaddr *) &sin, sizeof(sin)) < 0 ) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::could not bind to socket for ip %x port %u with error %u \n",
+              ntohl(sin.sin_addr.s_addr), ntohs(sin.sin_port),errno);
+        return -1;
+    }
+    
+    if (listen(listen_socket, 64) < 0) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::could not listen to socket for port %u \n",ntohs(sin.sin_port));
+        close(listen_socket);
+        return -1;
+    }
+    sin_sz=sizeof(sin);
+    if (getsockname(listen_socket, (struct sockaddr *) &sin, &sin_sz) < 0) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::could not get local port number of listen socket\n");
+        return -1;
+    }
+    
+    myid.port=ntohs(sin.sin_port);
+    myid.ip=ntohl(sin.sin_addr.s_addr);
+    
+    return 0;
+}
+
+static void closeconnection(gs_int32_t x) {
+    if (connectionhash[x].used==1)  {
+        close(connectionhash[x].socket);
+        connectionhash[x].used=0;
+    }
+}
+
+static gs_retval_t writeall(gs_int32_t socket, void * b, gs_int32_t sz) {
+    gs_int32_t rv;
+    gs_sp_t  buf = (gs_sp_t )b;
+    gs_int32_t res=sz;
+    while(sz>0) {
+        if ((rv=write(socket,buf,sz))<0) {
+            if (errno == EINTR)
+                continue;
+            else if (rv == EAGAIN || rv == EWOULDBLOCK) // CHECK THIS XXXOS
+                return 0;
+            else
+                return -1;
+        }
+        sz-=rv;
+        buf+=rv;
+    }
+    return res;
+}
+
+static gs_retval_t msg_send(FTAID id, gs_sp_t  buf, gs_uint32_t len, gs_uint32_t block) {
+    struct sockaddr_in sin;
+    gs_int32_t x;
+    gs_int32_t u;
+    gs_int32_t sz;
+    gs_int32_t ret;
+    
+try_send_again:
+    u=-1;
+    for(x=0;x<SOCKET_HASH_SZ;x++) {
+        if (connectionhash[x].used==1) {
+            if ((connectionhash[x].remoteid.ip==id.ip)
+                && (connectionhash[x].remoteid.port==id.port)) {
+                sz=htonl(len);
+                if (block==0) {
+#ifdef __linux__
+                    gs_int32_t datainbuffer;
+                    if (ioctl(connectionhash[x].socket,SIOCOUTQ,&datainbuffer)<1) {
+                        gslog(LOG_EMERG,
+                              "GSCMSGQ::error::could not determin free "
+                              "space in write buffer errno %u\n",errno);
+                        return -1;
+                    }
+                    if ((SOCK_BUF_SZ-datainbuffer) < (len+sizeof(gs_uint32_t))) {
+                        return 1;
+                    }
+                    
+#else
+                    // low water mark in setsockoption is supported
+                    fd_set fs;
+                    gs_int32_t n;
+                    struct timeval tv;
+                    /* since we set the SNDLOWAT to MAXSZ+4 we know that if the write
+                     * select call returns with a 1 for that file descriptor at least that
+                     * much memory is available in the send buffer and we therefore
+                     * won't block sending
+                     */
+                    FD_ZERO(&fs);
+                    FD_SET(connectionhash[x].socket,&fs);
+                    n=connectionhash[x].socket+1;
+                    tv.tv_sec = 0;
+                    tv.tv_usec = 0;
+                    if(select(n,0,&fs,0,&tv)!=1) {
+                        return 1;
+                    }
+#endif
+                }
+#ifdef PRINTMSG
+                gslog(LOG_EMERG,"\twriting %u",ntohl(sz));
+#endif
+                ret = writeall(connectionhash[x].socket,&sz,sizeof(gs_uint32_t));
+                if (!ret)
+                    return 1;
+                else if (ret != sizeof(gs_uint32_t)) {
+                    gslog(LOG_EMERG,"GSCMSGQ::error::could not write length\n");
+                    return -1;
+                }
+                ret = writeall(connectionhash[x].socket,buf,len);
+                if (!ret)
+                    return 1;
+                else if (ret != len) {
+                    gslog(LOG_EMERG,"GSCMSGQ::error::could not write message\n");
+                    return -1;
+                }
+#ifdef PRINTMSG
+                gslog(LOG_EMERG,"...done\n");
+#endif
+                return 0;
+            }
+        } else {
+            if (u==-1) { u=x; }
+        }
+    }
+    /* ok we don't have a connection make one */
+    if ((u>=SOCKET_HASH_SZ) || (u<0)) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::reached the maximum"
+              " TCP connection limit sending %d\n",u);
+        return -1;
+    }
+    connectionhash[u].remoteid=id;
+    connectionhash[u].remoteid.index=0;
+    connectionhash[u].remoteid.streamid=0;
+    sin.sin_family = AF_INET;
+#ifdef __NetBSD__
+    sin.sin_len = sizeof(sin);
+#endif
+    sin.sin_addr.s_addr = htonl(id.ip);
+    sin.sin_port = htons(id.port);
+    if ((connectionhash[u].socket = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::could not create socket\n");
+        return -1;
+    }
+    if (connect(connectionhash[u].socket,(struct sockaddr* )&sin,sizeof(sin)) < 0) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::could not connect\n");
+        return -1;
+    }
+    sz=SOCK_BUF_SZ;
+    if (setsockopt(connectionhash[u].socket, SOL_SOCKET, SO_SNDBUF,
+                   (gs_sp_t )&sz, sizeof(sz)) != 0) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::could not set send buffer size\n");
+        return -1;
+    }
+    sz=SOCK_BUF_SZ;
+    if (setsockopt(connectionhash[u].socket, SOL_SOCKET, SO_RCVBUF,
+                   (gs_sp_t )&sz, sizeof(sz)) != 0) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::could not set receive buffer size\n");
+        return -1;
+    }
+#ifndef __linux__
+    // Linux does not support low watermarks on sockets so we use ioctl SIOCOUTQ instead
+    sz=MAXSZ+4;
+    if (setsockopt(connectionhash[u].socket, SOL_SOCKET, SO_SNDLOWAT,
+                   (gs_sp_t )&sz, sizeof(sz)) != 0) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::could not set send buffer low watermark errorn %u\n",errno);
+        return -1;
+    }
+#endif
+    sz=1;
+    if (setsockopt(connectionhash[u].socket, SOL_SOCKET, SO_KEEPALIVE,
+                   (gs_sp_t )&sz, sizeof(sz)) != 0) {
+        gslog(LOG_EMERG,"GSCMSGQ::error::could not set keepalive\n");
+        return -1;
+    }
+    connectionhash[u].used=1;
+    goto try_send_again;
+    return -1;
+}
+
+static gs_retval_t readall(gs_int32_t socket, void * b, gs_int32_t sz) {
+    gs_int32_t rv;
+    gs_sp_t  buf = (gs_sp_t )b;
+    gs_int32_t res=sz;
+    while(sz>0) {
+        if ((rv=read(socket,buf,sz))<0) {
+            if (errno == EINTR)
+                continue;
+            gslog(LOG_EMERG,"read with error number %u \n",errno);
+            return -1;
+        }
+        if (rv==0) {
+            return 0;
+        }
+        sz-=rv;
+        buf+=rv;
+    }
+    return res;
+}
+
+/* msg_recv return len if data is available -1 for a timeout and -2 for an error */
+static gs_retval_t msg_recv(gs_sp_t  buf, gs_uint32_t buflen, gs_uint32_t block, gs_uint32_t check_sideque) {
+    struct sockaddr_in sin;
+    socklen_t sl;
+    fd_set fs;
+    gs_int32_t x,y;
+    gs_int32_t n;
+    gs_int32_t length;
+    struct timeval tv;
+    gs_int32_t sret;
+    static gs_int32_t last=0;
+    gs_uint32_t sz;
+    
+    if (check_sideque==1) {
+        if ((x=gscpipc_sidequeue_pop(buf, &length,buflen))==0) {
+            return length;
+        }
+        if (x==-2) {
+            gslog(LOG_EMERG,"GSCMSGQ::error::message in side queue to long\n");
+            return -2;
+        }
+    }
+    
+read_again:
+    if (block==0) {
+        tv.tv_sec = 0;
+        tv.tv_usec = 0;
+    } else {
+        tv.tv_sec = 0;
+        tv.tv_usec = 100000;
+    }
+    FD_ZERO(&fs);
+    FD_SET(listen_socket,&fs);
+    n=listen_socket;
+    for(x=0;x<SOCKET_HASH_SZ;x++) {
+        if (connectionhash[x].used==1) {
+            FD_SET(connectionhash[x].socket,&fs);
+            if (n<connectionhash[x].socket) {
+                n=connectionhash[x].socket;
+            }
+        }
+    }
+    n=n+1;
+    // now block
+    sret=select(n,&fs,0,0,&tv);
+    if ((sret<0) && (errno!=EINTR)) {
+        gslog(LOG_EMERG,"Select with error %u\n",errno);
+        return -2;
+    }
+    if (sret<=0) {
+        return -1;
+    }
+    if (FD_ISSET(listen_socket,&fs)) {
+        for (x=0;(x<SOCKET_HASH_SZ) && (connectionhash[x].used !=0) ;x++);
+        if (x>=SOCKET_HASH_SZ) {
+            gslog(LOG_EMERG,"GSCMSGQ::error::reached the maximum"
+                  "TCP connection limit accepting\n");
+            goto read_again;
+        }
+        sl=sizeof(sin);
+        if ((connectionhash[x].socket=accept(listen_socket,(struct sockaddr *)&(sin),&sl))
+                   < 0) {
+            gslog(LOG_EMERG,"GSCMSGQ::error::could not accept new connection\n");
+            goto read_again;
+        }
+        
+        sz=SOCK_BUF_SZ;
+        if (setsockopt(connectionhash[x].socket, SOL_SOCKET, SO_SNDBUF,
+                       (gs_sp_t )&sz, sizeof(sz)) != 0) {
+            fprintf(stderr,"GSCMSGQ::error::could not set send buffer size\n");
+            return -1;
+        }
+        sz=SOCK_BUF_SZ;
+        if (setsockopt(connectionhash[x].socket, SOL_SOCKET, SO_RCVBUF,
+                       (gs_sp_t )&sz, sizeof(sz)) != 0) {
+            fprintf(stderr,"GSCMSGQ::error::could not set receive buffer size\n");
+            return -1;
+        }
+        
+        sl=sizeof(sin);
+        if (getpeername(connectionhash[x].socket,(struct sockaddr *)&(sin),&sl)<0) {
+            gslog(LOG_EMERG,"GSCMSGQ::error::could not get peername on new connection\n");
+            close(connectionhash[x].socket);
+            goto read_again;
+        }
+        connectionhash[x].remoteid.ip=ntohl(sin.sin_addr.s_addr);
+        connectionhash[x].remoteid.port=ntohs(sin.sin_port);
+        connectionhash[x].remoteid.index=0;
+        connectionhash[x].remoteid.streamid=0;
+        connectionhash[x].used=1;
+#ifdef PRINTMSG
+        gslog(LOG_EMERG,"Accepted from %u\n",connectionhash[x].remoteid.port);
+#endif
+        goto read_again;
+    }
+    for(x=0;x<SOCKET_HASH_SZ;x++) {
+               last=(last+1)%SOCKET_HASH_SZ;
+        if ((connectionhash[last].used==1) && (FD_ISSET(connectionhash[last].socket,&fs))){
+            gs_int32_t rsz;
+#ifdef PRINTMSG
+            gslog(LOG_EMERG,"reading sret:%d block:%u...",sret,block);
+#endif
+            if ((rsz=readall(connectionhash[last].socket,&length,sizeof(gs_uint32_t)))!=sizeof(gs_uint32_t)) {
+                closeconnection(last);
+                gslog(LOG_EMERG,"GSCMSGQ::error::connection is closing %u res %d\n",
+                      connectionhash[last].remoteid.port,rsz);
+                continue;
+            }
+            length=ntohl(length);
+            if (buflen<length) {
+                gs_int8_t d;
+                gslog(LOG_EMERG,"GSCMSGQ::error::message to long (%u) for receive buffer (%u)\n",length,
+                      buflen);
+                /* remove the data */
+                for(y=0;y<length;y++)
+                    if (readall(connectionhash[last].socket,&d,1)!=1) {
+                        closeconnection(last);
+                        gslog(LOG_EMERG,"GSCMSGQ::error::connection is closing for receive buffer mismatch\n");
+                        return -2;
+                    }
+                return -2;
+            }
+            if (readall(connectionhash[last].socket,buf,length)!=length) {
+                closeconnection(last);
+                gslog(LOG_EMERG,"GSCMSGQ::error::connection is closing on data read\n");
+                continue;
+            }
+#ifdef PRINTMSG
+            gslog(LOG_EMERG,"reading done\n");
+#endif
+            return length;
+        }
+    }
+    return -1;
+}
+
+static gs_retval_t send_nack(FTAID recid) {
+    struct internal_message i;
+    i.im.receiver = recid;
+    i.im.sender = myid;
+    i.im.operation = RESERVED_FOR_LOW_LEVEL;
+    i.im.size = sizeof(struct internal_message);
+    i.lowlevelop = LOWLEVELOP_NACK;
+    if (msg_send(recid,(gs_sp_t )&i,i.im.size,1) == 0) {
+        return 0;
+    } else {
+        return -1;
+    }
+    return -1;
+}
+
+static gs_retval_t send_ack(FTAID recid) {
+    struct internal_message i;
+    i.im.receiver = recid;
+    i.im.sender = myid;
+    i.im.operation = RESERVED_FOR_LOW_LEVEL;
+    i.im.size = sizeof(struct internal_message);
+    i.lowlevelop = LOWLEVELOP_ACK;
+    if (msg_send(recid,(gs_sp_t )&i,i.im.size,1) == 0) {
+        return 0;
+    } else {
+        return -1;
+    }
+    return -1;
+}
+
+static gs_retval_t wait_for_lowlevel_ack() {
+    gs_int8_t b[MAXMSGSZ];
+    struct internal_message * i;
+    gs_int32_t res;
+    i=(struct internal_message *)b;
+    
+    /* this is bussy waiting if there is another
+     message waiting to be processed so make sure it is only
+     used where bussy waiting is OK. If that becomes
+     a probelm add a local queue
+     */
+    
+    while( 1==1) {
+        if ((res=msg_recv(b, MAXMSGSZ,1,0))>0) {
+            if ((i->im.operation == RESERVED_FOR_LOW_LEVEL)
+                && (( i->lowlevelop ==  LOWLEVELOP_ACK)
+                    || ( i->lowlevelop ==  LOWLEVELOP_NACK))) {
+                    if ( i->lowlevelop ==  LOWLEVELOP_ACK) {
+                        return 0;
+                    } else {
+                        return 1;
+                    }
+                }
+                       if (i->lowlevelop==LOWLEVELOP_REMOTE_TUPLE) {
+                               struct internal_remote_tuple * it;
+                               struct shmlistentry * s;
+                               it=(struct internal_remote_tuple *)b;
+                
+                               if ((s=shmlist_find(it->im.sender, SHM_RECV))!=0) {
+#ifdef PRINTMSG
+                                       gslog(LOG_EMERG,"Received remote ringbuf message "
+                          "for message of size %u\n",
+                          it->size,it->im.size);
+#endif
+#ifdef BLOCKRINGBUFFER
+                                       while (SPACETOWRITE(s->buf)==0) {
+                                               usleep(1000);
+                                               gslog(LOG_ERR,"Dead in the water we can't "
+                              "drain the ringbuffer we wait for.");
+                                       }
+                                       memcpy(CURWRITE(s->buf),&(it->data[0]),it->size);
+                                       ADVANCEWRITE(s->buf);
+#else
+                                       if (SPACETOWRITE(s->buf)) {
+                                               memcpy(CURWRITE(s->buf),&(it->data[0]),it->size);
+                                               ADVANCEWRITE(s->buf);
+                                       } else {
+                        //                                             gslog(LOG_EMERG,"r+");
+                                       }
+#endif
+                               } else {
+                                       gslog(LOG_EMERG,"Received tuple on msq for none existing remote ringbuffer\n");
+                               }
+                       } else {
+                               gscpipc_sidequeue_append(b, res);
+                       }
+        }  else {
+            if (res < -1) {
+                /* got an error here */
+                gslog(LOG_EMERG,"hostlib::error::received error "
+                      "during wait for low level ack\n");
+                return -1;
+            }
+        }
+    }
+    /* never reached */
+    return -1;
+}
+
+void shmlist_drain_remote()
+{
+    gs_int32_t x;
+    gs_int8_t buf[MAXSZ];
+    struct internal_remote_tuple * it;
+    it = (struct internal_remote_tuple *) buf;
+    for (x=0; x<shmlistlen; x++) {
+        if ((shmlist[x].msgid.ip != myid.ip)&& (shmlist[x].type==SHM_SEND)) {
+            while (UNREAD(shmlist[x].buf)) {
+                it->im.receiver = shmlist[x].msgid;
+                it->im.sender = myid;
+                it->im.operation = RESERVED_FOR_LOW_LEVEL;
+                it->lowlevelop = LOWLEVELOP_REMOTE_TUPLE;
+                it->size=UP64(CURREAD(shmlist[x].buf)->sz)+sizeof(struct tuple)-1;
+                it->im.size = sizeof(struct internal_remote_tuple)-4+it->size;
+                memcpy(&(it->data[0]),CURREAD(shmlist[x].buf),it->size);
+#ifdef PRINTMSG
+                gslog(LOG_EMERG,"Sending remote ringbuffer message of size %u %u\n",
+                      it->size, it->im.size);
+#endif
+                if (msg_send(shmlist[x].msgid,(gs_sp_t )it,it->im.size,0)==1) {
+                    break;
+                }
+                ADVANCEREAD(shmlist[x].buf);
+            }
+        }
+    }
+}
+
+/*
+ *used to contact the clearinghouse process returns the MSGID of
+ * the current process
+ */
+gs_retval_t gscpipc_init(gs_int32_t clearinghouse)
+{
+    struct internal_message i;
+    key_t msqtoken=0;
+    gs_int32_t x;
+    endpoint gshub;
+    endpoint tmpclearinghouse;
+    
+    /* make sure priveleges can be set */
+    umask(0);
+    
+    clearinghouseftaid.index=0;
+    clearinghouseftaid.streamid=0;
+    
+    if (get_hub(&gshub)!=0) {
+        gslog(LOG_EMERG,"hostlib::error::could get hub\n");
+        return -1;
+    }
+    
+    if (clearinghouse!=0) {
+        // This is the clearinghouse
+        gs_int8_t buf[MAXMSGSZ];
+        
+        if (msg_init(1)<0) {
+            gslog(LOG_EMERG,"hostlib::error::could not init msgq\n");
+            return -1;
+        }
+        
+        clearinghouseftaid.ip=myid.ip;
+        clearinghouseftaid.port=myid.port;
+        
+        tmpclearinghouse.ip=htonl(clearinghouseftaid.ip);
+        tmpclearinghouse.port=htons(clearinghouseftaid.port);
+        
+        if (set_instance(gshub, get_instance_name(), tmpclearinghouse)!=0) {
+            gslog(LOG_EMERG,"hostlib::error::clearinghouse could not set instance");
+            return -1;
+        }
+        
+        return 0;
+        
+    } else {
+        // This is an lfta/hfta/app
+        gs_int32_t res;
+        
+        if (get_instance(gshub,get_instance_name(),&tmpclearinghouse,1) < 0) {
+            gslog(LOG_EMERG,"hostlib::error::could not find clearinghouse\n");
+            return -1;
+        }
+        
+        clearinghouseftaid.ip=ntohl(tmpclearinghouse.ip);
+        clearinghouseftaid.port=ntohs(tmpclearinghouse.port);
+        
+        
+        if (msg_init(0)<0) {
+            gslog(LOG_EMERG,"hostlib::error::could not init msgq\n");
+            return -1;
+        }
+        
+        i.im.receiver = clearinghouseftaid;
+        i.im.sender = myid;
+        i.im.operation = RESERVED_FOR_LOW_LEVEL;
+        i.im.size = sizeof(struct internal_message);
+        i.lowlevelop = LOWLEVELOP_REGISTER;
+#ifdef PRINTMSG
+        i.im.pmsgid=pmsgid;
+        pmsgid++;
+        gslog(LOG_EMERG,"send a message (%d.%u) to %u with op "
+              "%u with size %u\n",
+              i.im.pmsgid,i.im.receiver.port,i.im.operation,
+              i.im.size);
+#endif
+        if ((res=msg_send(clearinghouseftaid,(gs_sp_t )&i,i.im.size,1)) == 0) {
+            /* we can wait her for an ack since nobody should know
+             about us yet */
+        init_read_again:
+            if ((res=msg_recv((gs_sp_t )&i,
+                              sizeof(struct internal_message),
+                              1,0))>=0) {
+                if (i.lowlevelop == LOWLEVELOP_ACK) {
+                    return 0;
+                } else {
+                    gslog(LOG_EMERG,"hostlib::error::received unexpected message "
+                          "during initalization\n");
+                    return -1;
+                }
+            } else {
+                if (res<-1) {
+                    /* got an error here */
+                    gslog(LOG_EMERG,"hostlib::error::received error message "
+                          "during initalization\n");
+                    return -1;
+                } else {
+                    goto init_read_again;
+                }
+            }
+        }
+        gslog(LOG_EMERG,"hostlib::error::could not send on msgqueue\n");
+        return -1;
+    }
+    return 0;
+}
+
+
+static gs_retval_t gscpdetachshm(FTAID target)
+{
+    struct internal_message i;
+    
+    i.im.receiver = target;
+    i.im.sender = myid;
+    i.im.operation = RESERVED_FOR_LOW_LEVEL;
+    i.im.size = sizeof(struct internal_message);
+    i.lowlevelop = LOWLEVELOP_SHM_FREE;
+    if (msg_send(target,(gs_sp_t )&i,i.im.size,1)<0) {
+        /* no reason to wait here won't be acked anyway */
+        return -1;
+    }
+    return 0;
+}
+
+static gs_retval_t gscpdetachsocket(FTAID target)
+{
+    struct internal_message i;
+    
+    i.im.receiver = target;
+    i.im.sender = myid;
+    i.im.operation = RESERVED_FOR_LOW_LEVEL;
+    i.im.size = sizeof(struct internal_message);
+    i.lowlevelop = LOWLEVELOP_UNREGISTER;
+    if (msg_send(target,(gs_sp_t )&i,i.im.size,1) <0) {
+        /* no reason to wait here won't be acked anyway */
+        return -1;
+    }
+    return -1;
+}
+
+
+/* used to disassociate process from clearinghouse */
+gs_retval_t gscpipc_free()
+{
+    gs_int32_t x;
+    /* XXX OS if this function is called when there are still
+     subscribed FTAs for this process the clearinghouse will
+     crash
+     */
+    
+    if (clearinghouse!=0) {
+        return 0;
+    } else {
+        gs_int32_t x;
+        for (x=0; x<shmlistlen; x++) {
+            if (shmlist[x].type==SHM_RECV) {
+                gscpdetachshm(shmlist[x].msgid);
+                if (shmdt((gs_sp_t )shmlist[x].buf)!=0) {
+                    gslog(LOG_EMERG,"hostlib::error::could not "
+                          "detach shared memory\n");
+                }
+            } else {
+                gslog(LOG_EMERG,"hostlib::error::porccess freed while still "
+                      "attached to sending shared memory\n");
+            }
+        }
+    }
+    /* remove connection */
+    for(x=0;x<SOCKET_HASH_SZ;x++) {
+        if (connectionhash[x].used==1) {
+            //XXX detach does not work due to interleaved messages
+            // gscpdetachsocket(connectionhash[x].remoteid);
+            close(connectionhash[x].socket);
+        }
+    }
+    close(listen_socket);
+    return 0;
+}
+
+/* returns MSGID of current process */
+FTAID gscpipc_getftaid()
+{
+    return myid;
+}
+
+
+/* sends a message to a process */
+gs_retval_t gscpipc_send(FTAID f, gs_int32_t operation, gs_sp_t  buf, gs_int32_t length, gs_int32_t block)
+{
+    gs_int8_t b[MAXMSGSZ];
+    struct ipc_message * i;
+    struct shmlistentry * s;
+    if (length > MAXMSGSZ) {
+        gslog(LOG_EMERG,"hostlib::error::gscpipc_send msg to long\n");
+        return -1;
+    }
+    i = (struct ipc_message *) b;
+    i->receiver=f;
+    i->sender=myid;
+    i->operation=operation;
+    i->size=length+sizeof(struct ipc_message);
+    memcpy(&i->data[0],buf,length);
+#ifdef PRINTMSG
+    i->pmsgid=pmsgid;
+    pmsgid++;
+    gslog(LOG_EMERG,"send a message (%d.%u) to %u with op %u with size %u\n",
+          i->pmsgid,f.ip,i->receiver.ip,i->operation,i->size,length);
+#endif
+    if ((s=shmlist_find(f, SHM_RECV))!=0) {
+        // set the hint in the ringbuffer that there is something on the shared memory queue
+        s->buf->mqhint=1;
+    }
+    if (msg_send(f,(gs_sp_t )i,i->size,block) < 0) {
+        gslog(LOG_EMERG,"hostlib::error::gscpipc_send msgsnd failed errno (%u)\n",errno);
+        return -1;
+    }
+    return 0;
+}
+
+/* retrieve a message buf has to be at least of size MAXMSGSZ*/
+gs_retval_t gscpipc_read(FTAID * f, gs_int32_t * operation, gs_sp_t  buf, gs_int32_t * size, gs_int32_t block)
+{
+    gs_int32_t w;
+    gs_int32_t x;
+    gs_int8_t b[MAXSZ];
+       gs_int32_t y;
+    
+    struct internal_message * i;
+    struct internal_remote_tuple * it;
+    gs_int32_t length;
+    
+    struct shmlistentry * s;
+    
+    i=(struct internal_message *)b;
+    it=(struct internal_remote_tuple *)b;
+    
+    for(y=0;(y < 10) || (block==1);y++) {
+        shmlist_drain_remote();
+               length=msg_recv((gs_sp_t )b, MAXMSGSZ, block,1);
+               if (length < -1) {
+                       /* problem */
+                       return -1;
+               }
+               if (length < 0) {
+                       /* we are nonblocking and have nothing to do */
+            if (block==1) {
+                // we are expected to block for ever if it is 0 or 2 we return
+                continue;
+            }
+                       return 0;
+               }
+#ifdef PRINTMSG
+               gslog(LOG_EMERG,"got a message (%d.%u) from %u with op %u with size %u\n",
+              i->im.pmsgid,  i->im.sender, i->im.sender,i->im.operation,i->im.size);
+#endif
+               if (length <0) {
+                       gslog(LOG_EMERG,"gscpipc::Error receiving message %u\n",errno);
+                       return -1;
+               }
+               if (i->im.operation != RESERVED_FOR_LOW_LEVEL) {
+                       memcpy(buf,&(i->im.data[0]),i->im.size);
+                       *size=i->im.size-sizeof(struct ipc_message);
+                       *operation=i->im.operation;
+                       *f=i->im.sender;
+                       if ((s=shmlist_find(*f, SHM_SEND))!=0) {
+                               // clear the hint in the ringbuffer to indicate we got the message
+                s->buf->mqhint=0;
+                       }
+                       return 1;
+               }
+               switch (i->lowlevelop) {
+            case LOWLEVELOP_REGISTER:
+                /* this should only get called if the process is the clearinghouse */
+#ifdef PRINTMSG
+                gslog(LOG_EMERG,"request to register %u\n",i->im.sender.port);
+#endif
+                send_ack(i->im.sender);
+                break;
+            case LOWLEVELOP_UNREGISTER:
+#ifdef PRINTMSG
+                gslog(LOG_EMERG,"request to unregister %u\n",i->im.sender.port);
+#endif    /* remove connection */
+                for(x=0;x<SOCKET_HASH_SZ;x++) {
+                    if ( (connectionhash[x].used==1)
+                        && (connectionhash[x].remoteid.ip==i->im.sender.ip)
+                        && (connectionhash[x].remoteid.port==i->im.sender.port)) {
+                       gslog(LOG_EMERG,"Close by remote request %u\n",
+                              connectionhash[x].remoteid.port);
+                        // XXX closed when the other process dies
+                        // can't close it yet since we might have
+                        // some more messages
+                        // close(connectionhash[x].socket);
+                        connectionhash[x].used=0;
+                    }
+                }
+                break;
+            case LOWLEVELOP_SHM_REGISTER:
+            {
+                gs_int32_t shmid;
+                struct ringbuf * r;
+                struct shmid_ds sms;
+#ifdef PRINTMSG
+                gslog(LOG_EMERG,"request to get shm %u token 0x%x size %u\n",
+                      i->im.sender.port,
+                      i->shmtoken,i->shmsz);
+#endif
+                if ((shmid = shmget(i->shmtoken,i->shmsz,IPC_RALL|IPC_WALL))!=-1) {
+                    if (((gs_p_t)(r=(struct ringbuf *)shmat(shmid,0,0)))==(gs_p_t)(-1)) {
+                        gslog(LOG_EMERG,"hostlib::error::could not attach send shm errno (%u)\n",errno);
+                        send_nack(i->im.sender);
+                    } else {
+                        // Make sure all the momory gets mapped now
+                                       for(x=0;x<length;x=x+1024) {
+                            ((gs_uint8_t *) r)[x]=0;
+                                       }
+                        
+#ifdef PRINTMSG
+                        gslog(LOG_EMERG,"Got a ring buffer at address %p (%u %u %u %u)\n"
+                              ,(void *)r,r->reader,r->writer,r->length,i->shmtoken);
+#endif
+                        if (shmlist_add(i->im.sender,SHM_SEND,i->shmtoken,
+                                        shmid,r,i->shmsz)<0) {
+                            shmdt((gs_sp_t )r);
+                            shmctl(shmid,IPC_RMID,&sms);
+                            gslog(LOG_EMERG,"hostlib::error::could not add shm internally\n");
+                            send_nack(i->im.sender);
+                        } else {
+                            send_ack(i->im.sender);
+                        }
+                    }
+                } else {
+                    gslog(LOG_EMERG,"hostlib::error::could not access send shm %u\n",errno);
+                    send_nack(i->im.sender);
+                }
+            }
+                break;
+            case LOWLEVELOP_SHM_REMOTE_REGISTER:
+            {
+                gs_int32_t shmid;
+                struct ringbuf * r;
+                struct shmid_ds sms;
+#ifdef PRINTMSG
+                gslog(LOG_EMERG,"request to get remote shm %u  size %u\n",
+                      i->im.sender.port,i->shmsz);
+#endif
+                if ((r=(struct ringbuf *)malloc(i->shmsz))==0) {
+                    gslog(LOG_EMERG,"hostlib::error::could not allocat send remote shm errno (%u)\n",errno);
+                    send_nack(i->im.sender);
+                } else {
+                    // make sure all the memory gets mapped now
+                    for(x=0;x<length;x=x+1024) {
+                        ((gs_uint8_t *) r)[x]=0;
+                    }
+                    r->reader=0;
+                    r->writer=0;
+                    r->length=i->shmsz;
+                    r->end= i->shmsz-MAXTUPLESZ;
+                    r->destid=i->im.receiver;
+                    r->srcid=i->im.sender;
+#ifdef PRINTMSG
+                    gslog(LOG_EMERG,"Got a remote ring buffer at address %p (%u %u %u %u)\n"
+                          ,(void *)r,r->reader,r->writer,r->length,i->shmtoken);
+#endif
+                    if (shmlist_add(i->im.sender,SHM_SEND,0,
+                                    0,r,i->shmsz)<0) {
+                        gslog(LOG_EMERG,"hostlib::error::could not add remote shm internally\n");
+                        send_nack(i->im.sender);
+                    } else {
+                        send_ack(i->im.sender);
+                    }
+                }
+            }
+                break;
+            case LOWLEVELOP_SHM_FREE:
+            {
+                struct shmlistentry * sm;
+                struct shmid_ds sms;
+#ifdef PRINTMSG
+                gslog(LOG_EMERG,"request to free shm %u\n",i->im.sender);
+#endif
+                if ((sm=shmlist_find(i->im.sender,SHM_SEND)) !=0) {
+#ifdef PRINTMSG
+                    gslog(LOG_EMERG,"freeing %u",sm->shmid);
+#endif
+                    shmdt((gs_sp_t )sm->buf);
+                    shmctl(sm->shmid,IPC_RMID,&sms);
+                    shmlist_rm(i->im.sender,SHM_SEND);
+                }
+            }
+                break;
+            case LOWLEVELOP_SHM_REMOTE_FREE:
+            {
+                struct shmlistentry * sm;
+                struct shmid_ds sms;
+#ifdef PRINTMSG
+                gslog(LOG_EMERG,"request to free shm %u\n",i->im.sender);
+#endif
+                if ((sm=shmlist_find(i->im.sender,SHM_SEND)) !=0) {
+#ifdef PRINTMSG
+                    gslog(LOG_EMERG,"freeing %u",sm->shmid);
+#endif
+                    free((gs_sp_t ) sm->buf);
+                    shmlist_rm(i->im.sender,SHM_SEND);
+                }
+            }
+                break;
+            case LOWLEVELOP_REMOTE_TUPLE:
+            {
+                if ((s=shmlist_find(it->im.sender, SHM_RECV))!=0) {
+#ifdef PRINTMSG
+                    gslog(LOG_EMERG,"Received remote ringbuf message "
+                          "for message of size %u\n",
+                          it->size,it->im.size);
+#endif
+#ifdef BLOCKRINGBUFFER
+                    while (SPACETOWRITE(s->buf)==0) {
+                        usleep(1000);
+                        gslog(LOG_EMERG,"Dead in the water we can't drain the ringbuffer we wait for.");
+                    }
+                    memcpy(CURWRITE(s->buf),&(it->data[0]),it->size);
+                    ADVANCEWRITE(s->buf);
+#else
+                    if (SPACETOWRITE(s->buf)) {
+                        memcpy(CURWRITE(s->buf),&(it->data[0]),it->size);
+                        ADVANCEWRITE(s->buf);
+                    } else {
+                        //                   gslog(LOG_EMERG,"r+");
+                    }
+#endif
+                } else {
+                    gslog(LOG_EMERG,"Received tuple on msq for none existing remote ringbuffer\n");
+                }
+            }
+                break;
+            default:
+                gslog(LOG_EMERG,"hostlib::error::unexpected message received\n");
+                return -1;
+               }
+    }
+    return 0;
+}
+
+/* allocate a ringbuffer which allows receiving data from
+ * the other process. returns 0 if didn't succeed and
+ * returns an existing buffer if it exists */
+struct ringbuf * gscpipc_createshm(FTAID f, gs_int32_t length)
+{
+    struct shmid_ds sms;
+    struct shmlistentry * se;
+    gs_int8_t keybuf[1024];
+    key_t shmtoken=0;
+    gs_int32_t shmid=0;
+    struct ringbuf * r;
+    struct internal_message i;
+    gs_int32_t x;
+    
+    se = shmlist_find(f, SHM_RECV);
+    if (se) {
+        return se->buf;
+    }
+    
+    if (length<(4*MAXTUPLESZ)) {
+        gslog(LOG_EMERG,
+              "ERROR:buffersize in gscpipc_createshm  has to be "
+              "at least %u Bytes long\n",
+              4*MAXTUPLESZ);
+        return 0;
+    }
+    
+    if (myid.ip == f.ip) {
+        sprintf(keybuf,"/tmp/gscpapp_%u_%u.pid",myid.port,f.port);
+        if ((x=open(keybuf,O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO)) ==-1)  {
+            gslog(LOG_EMERG,"hostlib::error::could not create shared memory id\n");
+            return 0;
+        }
+        close(x);
+        
+        if ((shmtoken = ftok(keybuf,SHMTYPE))==-1) {
+            gslog(LOG_EMERG,"hostlib::error::could not determin shm receive queue id\n");
+            return 0;
+        }
+        
+        if ((gs_int32_t)(shmid = shmget(shmtoken,length,IPC_RALL|IPC_WALL|
+                                        IPC_CREAT|IPC_EXCL))==-1) {
+            gslog(LOG_EMERG,"hostlib::error::could not access receive shm %u\n",errno);
+            return 0;
+        }
+        if ((gs_p_t)(r=(struct ringbuf *)shmat(shmid,0,0))==(gs_p_t)(-1)) {
+            gslog(LOG_EMERG,"hostlib::error::could not attach receive shm\n");
+            return 0;
+        }
+        /* touch all memory once to map/reserve it now */
+        for(x=0;x<length;x=x+1024) {
+            ((gs_uint8_t *) r)[x]=0;
+        }
+        r->reader=0;
+        r->writer=0;
+        r->length=length;
+        r->end= r->length-MAXTUPLESZ;
+        r->destid=f;
+        r->srcid=myid;
+        i.im.receiver = f;
+        i.im.sender = myid;
+        i.im.operation = RESERVED_FOR_LOW_LEVEL;
+        i.im.size = sizeof(struct internal_message);
+        i.lowlevelop = LOWLEVELOP_SHM_REGISTER;
+        i.shmtoken = shmtoken;
+        i.shmsz=length;
+        if (msg_send(f,(gs_sp_t )&i,i.im.size,1) == 0) {
+            if (wait_for_lowlevel_ack()<0) {
+                shmdt((gs_sp_t )r);
+                shmctl(shmid,IPC_RMID,&sms);
+                return 0;
+            }
+        }
+        shmctl(shmid,IPC_RMID,&sms); /* this will destroy the shm automatically after all processes detach */  
+        if (shmlist_add(f, SHM_RECV, shmtoken, 
+                        shmid, r, length) <0) {
+            shmdt((gs_sp_t )r);
+            shmctl(shmid,IPC_RMID,&sms);
+            i.im.receiver = f;
+            i.im.sender = myid;
+            i.im.operation = RESERVED_FOR_LOW_LEVEL;
+            i.im.size = sizeof(struct internal_message);
+            i.lowlevelop = LOWLEVELOP_SHM_FREE;
+            i.shmtoken = shmtoken;
+            msg_send(f,(gs_sp_t )&i,i.im.size,1);
+            return 0;
+        }
+    } else {
+        /* remote shared memory */
+        if ((r=(struct ringbuf *)malloc(length))==0) {
+            gslog(LOG_EMERG,"hostlib::error::could not malloc local part of remote ringbuffer\n");
+            return 0;
+        }
+        /* touch all memory once to map/reserve it now */
+        for(x=0;x<length;x=x+1024) {
+            ((gs_uint8_t *) r)[x]=0;
+        }
+        r->reader=0;
+        r->writer=0;
+        r->length=length;
+        r->end= r->length-MAXTUPLESZ;
+        r->destid=f;
+        r->srcid=myid;
+        i.im.receiver = f;
+        i.im.sender = myid;
+        i.im.operation = RESERVED_FOR_LOW_LEVEL;
+        i.im.size = sizeof(struct internal_message);
+        i.lowlevelop = LOWLEVELOP_SHM_REMOTE_REGISTER;
+        i.shmtoken = shmtoken;
+        i.shmsz=length;
+        if (msg_send(f,(gs_sp_t )&i,i.im.size,1) == 0) {
+            if (wait_for_lowlevel_ack()<0) {
+                free(r);
+                return 0;
+            }
+        }
+        if (shmlist_add(f, SHM_RECV, 0, 
+                        0, r, length) <0) {
+            free(r);
+            i.im.receiver = f;
+            i.im.sender = myid;
+            i.im.operation = RESERVED_FOR_LOW_LEVEL;
+            i.im.size = sizeof(struct internal_message);
+            i.lowlevelop = LOWLEVELOP_SHM_REMOTE_FREE;
+            msg_send(f,(gs_sp_t )&i,i.im.size,1);
+            return 0;
+        }
+    }
+    return r;
+       
+}
+
+/* finds a ringbuffer to send which was allocated by
+ * gscpipc_creatshm and return 0 on an error */
+
+struct ringbuf * gscpipc_getshm(FTAID f) 
+{
+    struct shmlistentry * se;
+    gs_int32_t recmsgid;
+    se = shmlist_find(f, SHM_SEND);
+    if (se) {
+        return se->buf;
+    }
+    return 0;
+}     
+
+/* frees shared memory to a particular proccess identified
+ * by MSGID
+ */ 
+gs_retval_t gscpipc_freeshm(FTAID f)
+{
+    struct internal_message i;
+    struct shmlistentry * sm;
+    struct shmid_ds sms;
+    if (myid.ip == f.ip) { 
+        if ((sm=shmlist_find(f, SHM_RECV)) <0) {
+            shmdt((gs_sp_t )sm->buf);
+            shmctl(sm->shmid,IPC_RMID,&sms);
+            i.im.receiver = f;
+            i.im.sender = myid;
+            i.im.operation = RESERVED_FOR_LOW_LEVEL;
+            i.im.size = sizeof(struct internal_message);
+            i.lowlevelop = LOWLEVELOP_SHM_FREE;
+            i.shmtoken = sm->shmtoken;
+            msg_send(f,(gs_sp_t )&i,i.im.size,1);
+            shmlist_rm(f, SHM_RECV);
+        }
+    } else {
+        if ((sm=shmlist_find(f, SHM_RECV)) <0) {
+            free((gs_sp_t )sm->buf);
+            i.im.receiver = f;
+            i.im.sender = myid;
+            i.im.operation = RESERVED_FOR_LOW_LEVEL;
+            i.im.size = sizeof(struct internal_message);
+            i.lowlevelop = LOWLEVELOP_SHM_REMOTE_FREE;
+            msg_send(f,(gs_sp_t )&i,i.im.size,1);
+            shmlist_rm(f, SHM_RECV);
+        }
+    }    
+    return 0;
+}
+
+gs_retval_t gscpipc_mqhint()
+{
+    gs_int32_t x;
+    for (x=0; x<shmlistlen; x++) {
+        if (shmlist[x].type == SHM_SEND) {
+            if (shmlist[x].buf->mqhint) {
+                return 1;
+            }
+        }
+    }
+    return 0;
+}
diff --git a/src/lib/gscphost/include/callbackregistries.h b/src/lib/gscphost/include/callbackregistries.h
new file mode 100644 (file)
index 0000000..8f3edc7
--- /dev/null
@@ -0,0 +1,143 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef CALLBACKREGISTRIES_H
+#define CALLBACKREGISTRIES_H
+#include "gsconfig.h"
+#include "gstypes.h"
+
+#include "fta.h"
+#include "gscpipc.h"
+
+
+/* This registry is used to keep track of FTAswithin the current process
+ * they are registerd when they are initiated and unregisterd if
+ * they are freed
+ */
+
+/* registers an alloc function of an FTA and returns a unique index */
+gs_retval_t ftacallback_add_alloc(FTAname name, alloc_fta fta_alloc_functionptr, gs_uint64_t prefilter);
+
+/* unregisters an alloc function of an FTA and makes the index available
+ * for reuse
+ */
+
+gs_retval_t ftacallback_rm_alloc(gs_uint32_t index);
+
+/* returns the function pointer of the callback function for a given
+ * index
+ */
+
+alloc_fta ftacallback_get_alloc(gs_int32_t index);
+
+/* returns the prefilter for a given
+ * index
+ */
+
+gs_uint64_t ftacallback_get_prefilter(gs_int32_t index);
+
+/* The second registry is used to keep track of to which process a particular
+ stream ID should be posted too.
+ */
+
+/* associate ringbuffer with streamid (using refcounting) */
+gs_retval_t ftacallback_add_streamid(struct ringbuf * r, gs_uint32_t streamid);
+
+/* unassosciate a ringbuffer from a streamid */
+
+gs_retval_t ftacallback_rm_streamid(struct ringbuf * r, gs_uint32_t streamid);
+
+/* starts an itteration through all ringbuffers for a particular streamid */
+
+gs_retval_t ftacallback_start_streamid(gs_int32_t streamid);
+
+/* returns all the ringbuffer associated with the streamid passed in
+ * ftacallback_start_streamid
+ */
+struct ringbuf * ftacallback_next_streamid(gs_int32_t * state);
+
+/* set the state for a given streamid and destination process */
+
+gs_retval_t ftacallback_state_streamid(gs_int32_t streamid,FTAID process, gs_int32_t state);
+
+/* The third registry is used to keep track of which process is blocked
+ on which ringbuf
+ */
+
+/* associate msgid with ringbuf  */
+gs_retval_t ftacallback_add_wakeup(FTAID ftaid, struct ringbuf * r);
+
+/* starts an itteration through all msgids associated with
+ a streamid. This also uses data kept in the second
+ registry
+ */
+gs_retval_t ftacallback_start_wakeup(gs_uint32_t streamid);
+
+/* returns all the msgid blocked on the streamid passed in
+ * ftacallback_start_streamid and removes the msgid from
+ * the wakeup list
+ */
+FTAID * ftacallback_next_wakeup();
+
+
+/*
+ * the following two functions insert and remove an  instance
+ * of an FTA from the active list.
+ */
+
+gs_retval_t ftaexec_insert(struct FTA * after, struct FTA * new);
+gs_retval_t ftaexec_remove(struct FTA * id);
+
+/*
+ * FTA's cannot be dynamically installed (since we currently don't
+ * have a run-time linker in the card).  however, new parameterized
+ * instances of previously installed FTAs can be created.  The FTA
+ * template IDs have to defined in an include file.  the following
+ * call will result in a call to the FTA's alloc_fta function.
+ */
+
+struct FTA * ftaexec_alloc_instance(gs_uint32_t index, struct FTA * reuse,
+                                    gs_uint32_t reusable,
+                                    gs_int32_t command, gs_int32_t sz, void *  data);
+
+
+/*
+ * the next two functions result in callouts to the corresponding FTA
+ * functions (fta_free, control_fta).
+ */
+
+gs_retval_t ftaexec_free_instance(struct FTA * FTA_id, gs_uint32_t recursive);
+
+gs_retval_t ftaexec_control(struct FTA * FTA_id, gs_int32_t command, gs_int32_t sz, void * value);
+
+gs_retval_t ftaexec_process_control(gs_int32_t command, gs_int32_t sz, void * value);
+
+/* Start itteration through list of active FTA */
+
+gs_retval_t ftaexec_start();
+
+/* get one FTA at a time */
+
+struct FTA * ftaexec_next();
+
+
+/* HFTA internal print function*/
+
+gs_retval_t add_printfunction_to_stream(struct FTA * ftaid, gs_sp_t schema, gs_sp_t path, gs_sp_t basename,
+                                        gs_sp_t temporal_field, gs_sp_t split_field, gs_uint32_t delta, gs_uint32_t split);
+
+gs_retval_t print_stream(struct FTA * self, gs_int32_t sz, void *tuple);
+
+
+#endif
diff --git a/src/lib/gscphost/include/gscpipc.h b/src/lib/gscphost/include/gscpipc.h
new file mode 100644 (file)
index 0000000..44b79ea
--- /dev/null
@@ -0,0 +1,142 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+/*
+ * gscpipc.h:: defines the interface of the IPC channels used in
+ * the GS-lite framework to communicate tuples between different
+ * processes
+ */
+
+#ifndef GSCPIPC_H
+#define GSCPIPC_H
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "fta.h"
+
+#define RESERVED_FOR_LOW_LEVEL 0
+
+#define FTACALLBACK 1
+
+extern gs_uint64_t intupledrop;
+extern gs_uint64_t outtupledrop;
+extern gs_uint64_t intuple;
+extern gs_uint64_t outtuple;
+extern gs_uint64_t inbytes;
+extern gs_uint64_t outbytes;
+extern gs_uint64_t cycles;
+
+
+/* shared ringbuffer data structure used */
+
+#if defined(__sparc__) && defined(__sun__)
+#define ALIGN64
+#endif
+
+struct tuple {
+    FTAID f;
+    gs_int32_t  sz;
+    gs_uint32_t  next;
+#ifdef ALIGN64
+    gs_uint32_t  alignment;
+#endif
+    gs_int8_t  data[1];
+}__attribute__ ((__packed__));
+
+struct ringbuf {
+    gs_uint32_t   mqhint;
+    gs_uint32_t   writer;
+    gs_uint32_t   reader;
+    gs_uint32_t   end;
+    gs_int32_t  length;
+#ifdef ALIGN64
+    gs_uint32_t  alignment;
+#endif
+    FTAID  srcid;
+    FTAID  destid;
+    gs_int8_t  start[1];
+}__attribute__ ((__packed__));
+
+/* adds a buffer to the end of the sidequeue*/
+gs_retval_t sidequeue_append(FTAID ftaid, gs_sp_t buf, gs_int32_t length);
+
+/* removes a buffer from the top of the sidequeue*/
+gs_retval_t sidequeue_pop(FTAID * ftaid, gs_sp_t buf, gs_int32_t * length);
+
+/*
+ *used to contact the clearinghouse process returns the MSGID of
+ * the current process negative result indicates a problem
+ */
+
+gs_retval_t  gscpipc_init(gs_int32_t  clearinghouse);
+
+/* used to disassociate process from clearinghouse */
+gs_retval_t  gscpipc_free();
+
+/* sends a message to a process */
+gs_retval_t  gscpipc_send(FTAID f, gs_int32_t  operation, gs_sp_t buf, gs_int32_t  length, gs_int32_t  block);
+
+/* retrieve a message buf has to be at least of size MAXMSGSZ returns 0
+ if no message is available -1 on an error and 1 on sucess*/
+gs_retval_t  gscpipc_read(FTAID * f, gs_int32_t  * operation, gs_sp_t buf, gs_int32_t  * lenght, gs_int32_t  block);
+
+/* allocate a ringbuffer which allows receiving data from
+ * the other process returns 0 if didn't succeed.
+ * returns an existing buffer if it exists  and increments the refcnt*/
+
+struct ringbuf * gscpipc_createshm(FTAID f, gs_int32_t  length);
+
+/* finds a ringbuffer to send which was allocated by
+ * gscpipc_creatshm and return 0 on an error */
+
+struct ringbuf * gscpipc_getshm(FTAID f);
+
+/* frees shared memory to a particular proccess identified
+ * by ftaid if reference counter reaches 0
+ */
+gs_retval_t  gscpipc_freeshm(FTAID f);
+
+
+/* returns true if on any sending ringbuffer the mqhint bit is true
+ * can be used in lfta rts to indicate that the message queue should
+ * be checked.
+ */
+
+gs_retval_t  gscpipc_mqhint();
+
+/* Access macros for ringbuffer */
+
+#ifdef ALIGN64
+#define UP64(x) ((((x)+7)/8)*8)
+#else
+#define UP64(x) x
+#endif
+
+#define CURWRITE(buf)  ((struct tuple *)(&((buf)->start[(buf)->writer])))
+#define ADVANCEWRITE(buf)  CURWRITE(buf)->next=\
+((buf)->end > ((buf)->writer+UP64(CURWRITE(buf)->sz))+sizeof(struct tuple)-1)\
+? ((buf)->writer+UP64(CURWRITE(buf)->sz)+sizeof(struct tuple)-1) : 0; \
+(buf)->writer=CURWRITE(buf)->next;
+#define CURREAD(buf)  ((struct tuple *)(&((buf)->start[(buf)->reader])))
+#define ADVANCEREAD(buf) (buf)->reader=\
+CURREAD(buf)->next
+#define UNREAD(buf) ((buf)->reader != (buf)->writer)
+#define SPACETOWRITE(buf)   ((((buf)->reader <= (buf)->writer) \
+&& ((buf)->reader+(buf)->end-(buf)->writer) > MAXTUPLESZ)\
+|| (((buf)->reader > (buf)->writer) && (((buf)->reader-(buf)->writer)>MAXTUPLESZ)))
+#define HOWFULL(buf) (((((buf)->writer)-(buf)->reader)%((buf)->end)*1000)/((buf)->end))
+/* conservative estimate of how many tuples of size tuplesz fit in a ringbuffer */
+#define TUPLEFIT(buf,tuplesz) ((((((buf)->writer)-(buf)->reader)%((buf)->end))-MAXTUPLESZ)/ \
+((UP64(tuplesz))+sizeof(struct tuple)-1))
+#endif
diff --git a/src/lib/gscphost/include/gscpmsgq.h b/src/lib/gscphost/include/gscpmsgq.h
new file mode 100644 (file)
index 0000000..6d2be84
--- /dev/null
@@ -0,0 +1,39 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+/* gscpmsgq.h defines the interface to a socket based message
+ * queue implementation for MacOSX which does not provide
+ * a System V message queueu but shared memory.
+ */
+
+#ifndef GSCPMSGQ_H
+#define GSCPMSGQ_H
+#ifdef NOMSGQ
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+
+struct gscp_msgbuf {
+    long mtype;     /* message type, must be > 0 */
+    char mtext[1];  /* message data */
+};
+
+
+int gscp_msgget(key_t key, int msgflg);
+ssize_t gscp_msgrcv(int msqid, struct gscp_msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);
+int gscp_msgsnd(int msqid, struct gscp_msgbuf *msgp, size_t msgsz, int msgflg);
+
+
+#endif
+#endif
diff --git a/src/lib/gscphost/include/ipcencoding.h b/src/lib/gscphost/include/ipcencoding.h
new file mode 100644 (file)
index 0000000..822097f
--- /dev/null
@@ -0,0 +1,188 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef IPCENCODING_H
+#define IPCENCODING_H
+#include "gsconfig.h"
+#include "gstypes.h"
+
+#include <fta.h>
+#include <systat.h>
+#include <gscpipc.h>
+#include <fta_stat.h>
+
+
+#define FTA_LOOKUP 1
+#define FTA_ALLOC_INSTANCE 2
+#define FTA_ALLOC_PRINT_INSTANCE 3
+#define FTA_FREE_INSTANCE 4
+#define FTA_CONTROL 5
+#define FTA_PRODUCER_FAILURE 6
+#define FTA_HEARTBEAT 7
+
+#define GSCP_GET_BUFFER 8
+
+#define FTA_REGISTER 9
+#define FTA_UNREGISTER 10
+
+#define PROCESS_CONTROL 11
+
+#define RESULT_OPCODE_BASE 128
+#define STANDARD_RESULT 129
+#define FTAFIND_RESULT 130
+#define FTA_RESULT 131
+
+/* the following result codes are ignored in standard
+ * processing they are only used when blocking for them
+ * directly
+ */
+
+#define RESULT_OPCODE_IGNORE 256
+#define WAKEUP  266
+#define TIMEOUT 267
+
+struct processtate {
+    gs_int32_t active;
+    gs_int32_t type;
+    gs_int32_t buffersize;
+    gs_int32_t deviceid;
+    gs_int32_t mapcnt;
+    gs_sp_t *map;
+};
+
+extern struct processtate curprocess;
+
+struct hostcall {
+    gs_int32_t callid;
+    gs_int32_t size;
+};
+
+
+struct fta_find_arg {
+    struct hostcall h;
+    gs_int8_t  name[MAXFTANAME];
+    gs_uint32_t reuse;
+};
+
+struct fta_alloc_instance_arg {
+    struct hostcall h;
+    FTAID subscriber;
+    FTAID f;
+    gs_int8_t  name[MAXFTANAME];
+    gs_int8_t  schema[MAXSCHEMASZ];
+    gs_uint32_t reusable;
+    gs_int32_t command;
+    gs_int32_t sz;
+    gs_int8_t  path[MAXPRINTSTRING];
+    gs_int8_t  basename[MAXPRINTSTRING];
+    gs_int8_t  temporal_field[MAXPRINTSTRING];
+       gs_int8_t  split_field[MAXPRINTSTRING];
+       gs_uint32_t split;
+    gs_uint32_t delta;
+    gs_int8_t  data[1];
+};
+
+struct fta_free_instance_arg {
+    struct hostcall h;
+    FTAID subscriber;
+    FTAID f;
+    gs_uint32_t recursive;
+};
+
+struct fta_control_arg {
+    struct hostcall h;
+    FTAID subscriber;
+    FTAID f;
+    gs_int32_t command;
+    gs_int32_t sz;
+    gs_int8_t  data[1];
+};
+
+
+struct fta_notify_producer_failure_arg {
+    struct hostcall h;
+    FTAID sender;
+    FTAID producer;
+};
+
+struct fta_heartbeat_arg {
+    struct hostcall h;
+    FTAID sender;
+    gs_uint64_t trace_id;
+    gs_int32_t sz;
+    fta_stat data[1];
+};
+
+struct gscp_get_buffer_arg {
+    struct hostcall h;
+    gs_int32_t timeout;
+};
+
+struct fta_register_arg {
+    struct hostcall h;
+    gs_uint32_t reusable;
+    gs_int8_t  name[MAXFTANAME];
+    gs_int8_t  schema[MAXSCHEMASZ];
+    FTAID f;
+    FTAID subscriber;
+};
+
+struct fta_unregister_arg {
+    struct hostcall h;
+    FTAID f;
+    FTAID subscriber;
+};
+
+struct tuple_post_arg {
+    struct hostcall h;
+    gs_int32_t stream_id;
+    gs_int32_t sz;
+    void * tuple;
+};
+
+struct process_control_arg {
+    struct hostcall h;
+    gs_int32_t command;
+    gs_int32_t sz;
+    gs_int8_t  data[1];
+};
+
+struct standard_result {
+    struct hostcall h;
+    gs_int32_t result;
+};
+
+struct wakeup_result {
+    struct hostcall h;
+};
+
+struct timeout_result {
+    struct hostcall h;
+};
+
+
+struct fta_result {
+    struct hostcall h;
+    gs_int32_t result;
+    FTAID f;
+};
+
+struct ftafind_result {
+    struct hostcall h;
+    gs_int32_t result;
+    FTAID f;
+    gs_int8_t  schema[MAXSCHEMASZ];
+};
+
+#endif
diff --git a/src/lib/gscphost/include/lappregistries.h b/src/lib/gscphost/include/lappregistries.h
new file mode 100644 (file)
index 0000000..db258d7
--- /dev/null
@@ -0,0 +1,41 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#ifndef LAPPREGISTRIES_H
+#define LAPPREGISTRIES_H
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <fta.h>
+#include <gscpipc.h>
+
+/* adds the remote streamid with its associated msgid and ringbuf
+ */
+gs_retval_t streamregistry_add(FTAID f,struct ringbuf * r);
+
+/* removes streamid from registry for specific msgid */
+void streamregistry_remove(FTAID f);
+
+/* the following two functions are used to cycle
+ through all ringbuffers
+ */
+gs_retval_t streamregistry_getactiveringbuf_reset();
+struct ringbuf * streamregistry_getactiveringbuf();
+
+/* the following two functions are used to cycle
+ through all msgids
+ */
+gs_retval_t streamregistry_getactiveftaid_reset();
+FTAID * streamregistry_getactiveftaid();
+
+#endif
diff --git a/src/lib/gscphost/lappinterface.c b/src/lib/gscphost/lappinterface.c
new file mode 100644 (file)
index 0000000..99196b8
--- /dev/null
@@ -0,0 +1,608 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include <gscpipc.h>
+#include <ipcencoding.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <lapp.h>
+#include <lappregistries.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/mman.h>
+#include "rdtsc.h"
+// If POLLING is defined applications poll every 100 msec instead of blocking
+#define POLLING
+
+struct processtate curprocess = {0,0,0,255,0};
+struct FTAID clearinghouseftaid = {0,0,0,0};
+
+/*
+ * sends the message passed in buf and waits for a result
+ * if a message returned is not a result it is put in the
+ * request queue. The resultsbuf has to be large enough
+ * for the largest result
+ */
+gs_retval_t ipc_call_and_wait(FTAID f, gs_sp_t  msg, gs_sp_t  result)
+{
+    struct hostcall * h = (struct hostcall *) msg;
+    gs_int8_t  buf[MAXMSGSZ];
+    FTAID from;
+    gs_int32_t length;
+    gs_int32_t lowop;
+#ifdef PRINTMSG
+    fprintf(stderr, "HOST sending to %u.%u.%u.%u:%u of "
+            "type %u with length %u\n",
+            (f.ip>>24)&0xff,
+            (f.ip>>16)&0xff,
+            (f.ip>>8)&0xff,
+            (f.ip)&0xff,
+            f.port,h->callid,h->size);
+#endif
+    if (gscpipc_send(f,FTACALLBACK,msg,h->size,1)<0) {
+        gslog(LOG_EMERG,"ERROR:Could not send on message queue\n");
+        return -1;
+    }
+    h=(struct hostcall *) buf;
+    while (gscpipc_read(&from,&lowop,buf,&length,1)>0) {
+#ifdef PRINTMSG
+        fprintf(stderr, "HOST response from %u.%u.%u.%u:%u"
+                " of type %u with length %u\n",
+                (from.ip>>24)&0xff,
+                (from.ip>>16)&0xff,
+                (from.ip>>8)&0xff,
+                (from.ip)&0xff,
+                from.port,
+                h->callid,h->size);
+#endif
+        if ((lowop == FTACALLBACK) && (h->callid < RESULT_OPCODE_IGNORE)) {
+            h=(struct hostcall *) buf;
+            if (h->callid > RESULT_OPCODE_BASE) {
+                memcpy(result,buf,length);
+                return 0;
+            }
+            if (sidequeue_append(from,buf,length)<0) {
+                gslog(LOG_EMERG,"ERROR:: Could not add to sidequeue\n");
+                return -1;
+            }
+        }
+    }
+    gslog(LOG_EMERG, "ERROR::gscipc_read failed in ipc_call_and_wait\n");
+    return -1;
+}
+
+
+gs_retval_t hostlib_init(gs_int32_t type, gs_int32_t buffersize, gs_int32_t deviceid, gs_int32_t mapcnt, gs_sp_t map[])
+{
+    FILE * f;
+    
+    if (curprocess.active != 0 ) {
+        return -1;
+    }
+    
+    switch (type) {
+        case CLEARINGHOUSE:
+            if (gscpipc_init(1) < 0) {
+                gslog(LOG_EMERG,"ERROR:Could not initalize comm layer for "
+                      "clearinghouse process\n");
+                return -1;
+            }
+            break;
+        case LFTA:
+#ifdef __linux__
+            mlockall(MCL_CURRENT|MCL_FUTURE);
+#endif
+        case APP:
+        case HFTA:
+            if (gscpipc_init(0) < 0) {
+                gslog(LOG_EMERG,"ERROR:Could not initalize comm layer for "
+                      "non clearinghouse process\n");
+                return -1;
+            }
+            break;
+        default:
+            gslog(LOG_EMERG,"ERROR:Unknown process type\n");
+            return -1;
+    }
+    
+    // if the buffersize is zero then allocating shared memory
+    // will fail. So only use it for the clearinghouse and LFTAs
+    if ((buffersize<(4*MAXTUPLESZ)) && (buffersize!=0)) {
+        gslog(LOG_EMERG,
+              "ERROR:buffersize in hostlib_init has to "
+              "be at least %u Bytes long\n",
+              4*MAXTUPLESZ);
+        return -1;
+    }
+    
+    curprocess.type=type;
+    curprocess.buffersize=buffersize;
+    curprocess.active = 1;
+    curprocess.deviceid=deviceid;
+    curprocess.mapcnt=mapcnt;
+    curprocess.map=map;
+    return 0;
+}
+
+void hostlib_free()
+{
+    if (curprocess.active != 1 ) {
+        return;
+    }
+    curprocess.active = 0;
+    gscpipc_free();
+}
+
+
+gs_retval_t fta_find(FTAname name, gs_uint32_t  reuse, FTAID *ftaid,
+                     gs_sp_t  schema, gs_int32_t schemasz)
+{
+    gs_int8_t  rb[MAXRES];
+    struct fta_find_arg a;
+    struct ftafind_result * sr = (struct ftafind_result *)rb;
+    
+    a.h.callid = FTA_LOOKUP;
+    a.h.size = sizeof(struct fta_find_arg);
+    a.reuse=reuse;
+    if (strlen(name)>=(MAXFTANAME-1)) {
+        gslog(LOG_EMERG,"ERROR:FTA name (%s) to large\n",name);
+        return -1;
+    }
+    strcpy(a.name,name);
+    ipc_call_and_wait(clearinghouseftaid,(gs_sp_t )&a,rb);
+    if (sr->h.callid != FTAFIND_RESULT) {
+        gslog(LOG_EMERG,"ERROR:Wrong result code received in fta_find\n");
+        return -1;
+    }
+    if (sr->result >= 0) {
+        if (schema !=0) {
+            if (strlen(sr->schema) >= schemasz) {
+                gslog(LOG_EMERG,"Could not fit schema into schema buffer fta_find\n");
+                return -1;
+            } else {
+                strcpy(schema,sr->schema);
+            }
+        }
+        *ftaid=sr->f;
+    }
+    return sr->result;
+}
+
+gs_retval_t fta_alloc_instance(FTAID subscriber,
+                               FTAID * ftaid, FTAname name, gs_sp_t schema,
+                               gs_uint32_t  reusable,
+                               gs_int32_t command, gs_int32_t sz, void *  data)
+{
+    gs_int8_t  rb[MAXRES];
+    struct fta_alloc_instance_arg * a;
+    struct fta_result * fr = (struct fta_result *)rb;
+    struct ringbuf *r;
+    
+    /* make sure we have the share memory required */
+    if ((r=gscpipc_createshm(*ftaid,curprocess.buffersize))==0) {
+        gslog(LOG_EMERG,"ERROR:could not allocate shared memory"
+              "for FTA %s\n",name);
+        return -1;
+    }
+    
+    if (strlen(name)>=(MAXFTANAME-1)) {
+        gslog(LOG_EMERG,"ERROR:FTA name (%s) to large\n",name);
+        return -1;
+    }
+    
+    if (strlen(schema)>=(MAXSCHEMASZ-1)) {
+        gslog(LOG_EMERG,"ERROR:FTA name (%s) to large\n",name);
+        return -1;
+    }
+    
+    a = alloca(sizeof(struct fta_alloc_instance_arg) + sz);
+    
+    a->h.callid = FTA_ALLOC_INSTANCE;
+    a->h.size = sizeof(struct fta_alloc_instance_arg)+ sz;
+    a->f=*ftaid;
+    a->subscriber=subscriber;
+    a->reusable=reusable;
+    a->command = command;
+    a->sz = sz;
+    memcpy(&a->data[0],data,sz);
+    strcpy(a->name,name);
+    strcpy(a->schema,schema);
+    
+    ipc_call_and_wait(*ftaid,(gs_sp_t )a,rb);
+    
+    if (fr->h.callid != FTA_RESULT) {
+        gslog(LOG_EMERG,"ERROR:Wrong result code received\n");
+        return -1;
+    }
+    
+    *ftaid=fr->f;
+    
+    if (fr->result==0) {
+        gslog(LOG_INFO,"Allocated fta instance %s with FTAID {ip=%u,port=%u,index=%u,streamid=%u}\n",name,ftaid->ip,ftaid->port,ftaid->index,ftaid->streamid);
+        return streamregistry_add(*ftaid,r);
+    }
+    
+    return fr->result;
+}
+
+gs_retval_t fta_alloc_print_instance(FTAID subscriber,
+                                     FTAID * ftaid,
+                                     FTAname name, gs_sp_t schema, gs_uint32_t  reusable,
+                                     gs_int32_t command, gs_int32_t sz, void *  data,
+                                     gs_sp_t  path,gs_sp_t  basename,
+                                     gs_sp_t  temporal_field, gs_sp_t  split_field,
+                                     gs_uint32_t  delta, gs_uint32_t  split)
+{
+    gs_int8_t  rb[MAXRES];
+    struct fta_alloc_instance_arg * a;
+    struct fta_result * fr = (struct fta_result *)rb;
+    
+    if ((strlen(path)>=MAXPRINTSTRING-1)
+        || (strlen(basename)>=MAXPRINTSTRING-1)
+        || (strlen(temporal_field)>=MAXPRINTSTRING-1)) {
+        gslog(LOG_EMERG,"INTERNAL ERROR:fta_alloc_print_instance string"
+              " arguments to long\n");
+        return -1;
+    }
+    if (strlen(name)>=(MAXFTANAME-1)) {
+        gslog(LOG_EMERG,"ERROR:FTA name (%s) to large\n",name);
+        return -1;
+    }
+    
+    if (strlen(schema)>=(MAXSCHEMASZ-1)) {
+        gslog(LOG_EMERG,"ERROR:FTA name (%s) to large\n",name);
+        return -1;
+    }
+    
+    a = alloca(sizeof(struct fta_alloc_instance_arg) + sz);
+    
+    a->h.callid = FTA_ALLOC_PRINT_INSTANCE;
+    a->h.size = sizeof(struct fta_alloc_instance_arg)+ sz;
+    a->f=*ftaid;
+    a->subscriber=subscriber;
+    a->reusable=reusable;
+    a->split=split;
+    strcpy(a->name,name);
+    strcpy(a->schema,schema);
+    a->command = command;
+    a->sz = sz;
+    strcpy(a->path,path);
+    strcpy(a->basename,basename);
+    strcpy(a->temporal_field,temporal_field);
+    strcpy(a->split_field,split_field);
+    a->delta=delta;
+    memcpy(&a->data[0],data,sz);
+    
+    ipc_call_and_wait(*ftaid,(gs_sp_t )a,rb);
+    
+    if (fr->h.callid != FTA_RESULT) {
+        gslog(LOG_EMERG,"ERROR:Wrong result code received\n");
+        return -1;
+    }
+    
+    *ftaid=fr->f;
+    
+    return fr->result;
+}
+
+gs_retval_t fta_free_instance(FTAID subscriber, FTAID ftaid, gs_uint32_t  recursive)
+{
+    gs_int8_t  rb[MAXRES];
+    struct fta_free_instance_arg a;
+    struct standard_result * sr = (struct standard_result *)rb;
+    struct ringbuf *r;
+    
+    a.h.callid = FTA_FREE_INSTANCE;
+    a.h.size = sizeof(struct fta_free_instance_arg);
+    a.subscriber=subscriber;
+    a.f=ftaid;
+    a.recursive=recursive;
+    ipc_call_and_wait(ftaid,(gs_sp_t )&a,rb);
+    if (sr->h.callid != STANDARD_RESULT) {
+        gslog(LOG_EMERG,"ERROR:Wrong result code received\n");
+        return -1;
+    }
+    
+    /* make sure we remove the mapping*/
+    streamregistry_remove(ftaid);
+    
+    return sr->result;
+}
+
+gs_retval_t fta_control(FTAID subscriber,
+                        FTAID ftaid, gs_int32_t command, gs_int32_t sz, void * value)
+{
+    gs_int8_t  rb[MAXRES];
+    struct fta_control_arg * a;
+    struct standard_result * sr = (struct standard_result *)rb;
+    
+    a = alloca(sizeof(struct fta_control_arg) + sz);
+    
+    a->h.callid = FTA_CONTROL;
+    a->h.size = sizeof(struct fta_control_arg)+ sz;
+    a->subscriber=subscriber;
+    a->f=ftaid;
+    a->command = command;
+    a->sz = sz;
+    memcpy(&a->data[0],value,sz);
+    
+    ipc_call_and_wait(ftaid,(gs_sp_t )a,rb);
+    
+    if (sr->h.callid != STANDARD_RESULT) {
+        gslog(LOG_EMERG,"ERROR:Wrong result code received\n");
+        return -1;
+    }
+    
+    return sr->result;
+}
+
+gs_retval_t fta_heartbeat(FTAID self,gs_uint64_t trace_id,
+                          gs_uint32_t  sz, fta_stat * trace){
+#ifdef CLEARINGHOUSE_HEARTBEAT
+    struct fta_heartbeat_arg  * a;
+    a = alloca(sizeof(struct fta_heartbeat_arg) + (sz*sizeof(fta_stat)));
+    a->h.callid = FTA_HEARTBEAT;
+    a->h.size = sizeof(struct fta_heartbeat_arg)+(sz*sizeof(fta_stat));
+    a->sender=self;
+    a->trace_id=trace_id;
+    a->sz=sz;
+    if (sz!=0) {
+        memcpy(&a->data[0],trace,(sz*sizeof(fta_stat)));
+    }
+#ifdef PRINTMSG
+    fprintf(stderr, "HOST sending heartbeat to %u.%u.%u.%u:%u of "
+            "type %u with length %u\n",
+            (clearinghouseftaid.ip>>24)&0xff,
+            (clearinghouseftaid.ip>>16)&0xff,
+            (clearinghouseftaid.ip>>8)&0xff,
+            (clearinghouseftaid.ip)&0xff,
+            clearinghouseftaid.port,a->h.callid,a->h.size);
+#endif
+    if (gscpipc_send(clearinghouseftaid,FTACALLBACK,(gs_sp_t)a,a->h.size,1)<0) {
+        gslog(LOG_EMERG,"ERROR:Could not send on message queue\n");
+        return -1;
+    }
+#endif
+    return 0;
+}
+
+gs_retval_t fta_notify_producer_failure(FTAID self, FTAID producer){
+    struct fta_notify_producer_failure_arg  a;
+    a.h.callid = FTA_PRODUCER_FAILURE;
+    a.h.size = sizeof(struct fta_notify_producer_failure_arg);
+    a.sender=self;
+    a.producer=producer;
+#ifdef PRINTMSG
+    fprintf(stderr, "HOST sending producer failure to %u.%u.%u.%u:%u of "
+            "type %u with length %u\n",
+            (clearinghouseftaid.ip>>24)&0xff,
+            (clearinghouseftaid.ip>>16)&0xff,
+            (clearinghouseftaid.ip>>8)&0xff,
+            (clearinghouseftaid.ip)&0xff,
+            clearinghouseftaid.port,a.h.callid,a.h.size);
+#endif
+    if (gscpipc_send(clearinghouseftaid,FTACALLBACK,(gs_sp_t)&a,a.h.size,1)<0) {
+        gslog(LOG_EMERG,"ERROR:Could not send on message queue\n");
+        return -1;
+    }
+    return 0;
+}
+
+gs_retval_t process_control(FTAID ftaid, gs_int32_t command, gs_int32_t sz, void * value)
+{
+    gs_int8_t  rb[MAXRES];
+    struct process_control_arg * a;
+    struct standard_result * sr = (struct standard_result *)rb;
+    
+    
+    a = alloca(sizeof(struct process_control_arg) + sz);
+    
+    a->h.callid = PROCESS_CONTROL;
+    a->h.size = sizeof(struct process_control_arg)+ sz;
+    a->command = command;
+    a->sz = sz;
+    memcpy(&a->data[0],value,sz);
+    
+    ipc_call_and_wait(ftaid,(gs_sp_t )a,rb);
+    
+    if (sr->h.callid != STANDARD_RESULT) {
+        gslog(LOG_EMERG,"ERROR:Wrong result code received\n");
+        return -1;
+    }
+    
+    return sr->result;
+}
+
+
+static void timeouthandler ()
+{
+    struct timeout_result a;
+    
+    a.h.callid=TIMEOUT;
+    a.h.size=sizeof(struct timeout_result);
+    if (gscpipc_send(gscpipc_getftaid(), FTACALLBACK, (gs_sp_t )&a,a.h.size,1)<0) {
+        gslog(LOG_EMERG,"ERROR:Could not send on message queue\n");
+    }
+}
+
+gs_retval_t gscp_get_buffer(FTAID * ftaid, gs_int32_t * size, void *tbuffer,
+                            gs_int32_t tbuf_size, gs_int32_t timeout)
+{
+    struct ringbuf * r;
+    FTAID from;
+    gs_int32_t length;
+    gs_int8_t  buf[MAXMSGSZ];
+    gs_int32_t lopp;
+    FTAID * f;
+    static     gs_uint64_t s1=0;
+    static     gs_uint64_t s2;
+    if (s1==0) {
+        s1=rdtsc();
+    }
+    s2=rdtsc();
+    cycles+=(s2-s1);
+start:
+#ifdef PRINTMSG
+    fprintf(stderr,"CHECK RINGBUFS\n");
+#endif
+#ifndef POLLING
+    /* use chance to cleanout message queue no reason
+     to keep anything else */
+    while (gscpipc_read(&from,&lopp,buf,&length,0)>0);
+#endif
+    
+    streamregistry_getactiveringbuf_reset();
+    while ((r=streamregistry_getactiveringbuf())>0) {
+#ifdef PRINTMSG
+           fprintf(stderr,"Reading from ringpuffer %p [%p:%u]"
+                "(%u %u %u) \n",r,&r->start,r->end,r->reader,r->writer,
+                r->length);
+           if (UNREAD(r)) {
+            fprintf(stderr,"\t%u %u.%u.%u.%u:%u-%p %u\n",CURREAD(r)->next,
+                    (CURREAD(r)->f.ip>>24)&0xff,
+                    (CURREAD(r)->f.ip>>16)&0xff,
+                    (CURREAD(r)->f.ip>>8)&0xff,
+                    (CURREAD(r)->f.ip)&0xff,
+                    CURREAD(r)->f.port,
+                    CURREAD(r)->f.streamid,
+                    CURREAD(r)->sz);
+           }
+        
+#endif
+        if (UNREAD(r)) {
+            *ftaid=(CURREAD(r)->f);
+            *size=CURREAD(r)->sz;
+            memcpy(tbuffer,&(CURREAD(r)->data[0]),(tbuf_size>(*size))?(*size):tbuf_size);
+            intuple++;
+            inbytes+=CURREAD(r)->sz;
+            ADVANCEREAD(r);
+            s1=rdtsc();
+            return 0;
+        }
+    }
+    if (timeout == -1) {
+        *size=0;
+        s1=rdtsc();
+        return 1;
+    }
+    if (timeout !=0) {
+        signal(SIGALRM, timeouthandler);
+        alarm(timeout);
+    }
+    
+#ifndef POLLING
+#ifdef PRINTMSG
+    fprintf(stderr,"START BLOCKCALLS\n");
+#endif
+    streamregistry_getactiveftaid_reset();
+    while ((f=streamregistry_getactiveftaid())!=0) {
+        struct gscp_get_buffer_arg a;
+        a.h.callid = GSCP_GET_BUFFER;
+        a.h.size = sizeof(struct gscp_get_buffer_arg);
+        a.timeout = timeout;
+#ifdef PRINTMSG
+        fprintf(stderr,"Waiting for  %u.%u.%u.%u:%u\n",
+                (f->ip>>24)&0xff,
+                (f->ip>>16)&0xff,
+                (f->ip>>8)&0xff,
+                (f->ip)&0xff,
+                f->port
+                );
+#endif
+        if (gscpipc_send(*f,FTACALLBACK,(gs_sp_t )&a,a.h.size,1)<0) {
+            s1=rdtsc();
+            return -1;
+        }
+    }
+#ifdef PRINTMSG
+    fprintf(stderr,"BLOCK\n");
+#endif
+    while (gscpipc_read(&from,&lopp,buf,&length,1)>0) {
+#else  // If we poll we return after 100 msec
+    sleepagain:
+        while (gscpipc_read(&from,&lopp,buf,&length,2)>0) {
+#endif
+            struct standard_result * sr = (struct standard_result *) buf;
+#ifdef PRINTMSG
+            fprintf(stderr,"Got return code %u\n",sr->h.callid);
+#endif
+            if (lopp==FTACALLBACK) {
+                if (timeout != 0) {
+                    signal(SIGALRM, SIG_IGN);
+                }
+                if (sr->h.callid == WAKEUP) {
+                    /* use chance to cleanout message queue no reason
+                     to keep anything else */
+                    while (gscpipc_read(&from,&lopp,buf,&length,0)>0);
+                    goto start;
+                }
+                if (sr->h.callid == TIMEOUT) {
+                    /* use chance to cleanout message queue no reason
+                     to keep anything else */
+                    while (gscpipc_read(&from,&lopp,buf,&length,0)>0);
+                    *size=0;
+                    s1=rdtsc();
+                    return 1;
+                }
+                if (sidequeue_append(from,buf,length)<0) {
+                    gslog(LOG_EMERG,"ERROR:: Could not add to sidequeue\n");
+                    s1=rdtsc();
+                    return -1;
+                }
+            }
+        }
+#ifdef POLLING
+        streamregistry_getactiveringbuf_reset();
+        while ((r=streamregistry_getactiveringbuf())>0) {
+#ifdef PRINTMSG
+            fprintf(stderr,"Reading from ringpuffer %p [%p:%u]"
+                    "(%u %u %u) \n",r,&r->start,r->end,r->reader,r->writer,
+                    r->length);
+            if (UNREAD(r)) {
+                fprintf(stderr,"\t%u %u.%u.%u.%u:%u-%p %u\n",CURREAD(r)->next,
+                        (CURREAD(r)->f.ip>>24)&0xff,
+                        (CURREAD(r)->f.ip>>16)&0xff,
+                        (CURREAD(r)->f.ip>>8)&0xff,
+                        (CURREAD(r)->f.ip)&0xff,
+                        CURREAD(r)->f.port,
+                        CURREAD(r)->f.streamid,
+                        CURREAD(r)->sz);
+            }
+            
+#endif
+            if (UNREAD(r)) {
+                *ftaid=(CURREAD(r)->f);
+                *size=CURREAD(r)->sz;
+                memcpy(tbuffer,&(CURREAD(r)->data[0]),(tbuf_size>(*size))?(*size):tbuf_size);
+                intuple++;
+                inbytes+=CURREAD(r)->sz;
+                ADVANCEREAD(r);
+                if (timeout != 0) {
+                    signal(SIGALRM, SIG_IGN);
+                }
+                s1=rdtsc();
+                return 0;
+            }
+        }
+        goto sleepagain; // Try again
+#endif
+        gslog(LOG_EMERG,"Unexpected code reached in: gscp_get_buffer \n");
+        /* we should never get here */
+        s1=rdtsc();
+        return -1;
+    }
+    
+    
+    
diff --git a/src/lib/gscphost/lappregistries.c b/src/lib/gscphost/lappregistries.c
new file mode 100644 (file)
index 0000000..0ef78bd
--- /dev/null
@@ -0,0 +1,159 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+#include <lappregistries.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* datastructure to keep track of streamids used by the lapp */
+struct streamregistry {
+    gs_int32_t used;
+    FTAID ftaid;
+    struct ringbuf * r;
+};
+
+struct streamregistry * sreg =0;
+gs_int32_t lsreg=0;
+
+struct ringbuf ** rbr=0;
+gs_int32_t lrbr=0;
+
+FTAID ** rms=0;
+gs_int32_t lrms=0;
+
+/* adds the remote streamid with its associated msgid and ringbuf
+ */
+gs_retval_t streamregistry_add(FTAID ftaid,struct ringbuf * r)
+{
+    gs_int32_t x;
+    if (lsreg == 0) {
+        if ((sreg = malloc(sizeof(struct streamregistry)*STARTSZ))==0) {
+            gslog(LOG_EMERG,"ERROR:Out of memory streanregistry\n");
+            return -1;
+        }
+        memset(sreg,0,sizeof(struct streamregistry)*STARTSZ);
+        lsreg = STARTSZ;
+    }
+    for(x=0;(x<lsreg)&&(sreg[x].used!=0);x++);
+    if (x == lsreg) {
+        gs_int32_t y;
+        lsreg = 2*lsreg;
+        if ((sreg = realloc(sreg,lsreg*sizeof(struct streamregistry)))==0) {
+            gslog(LOG_EMERG,"ERROR:Out of memory streamregistry\n");
+            return -1;
+        }
+        for (y=x;y<lsreg;y++)
+            sreg[y].used=0;
+    }
+    sreg[x].ftaid=ftaid;
+    sreg[x].r=r;
+    sreg[x].used=1;
+    return 0;
+}
+
+/* removes streamid from registry for specific msgid and ringbuf */
+void streamregistry_remove(FTAID ftaid)
+{
+    gs_int32_t x;
+    for(x=0;x<lsreg;x++) {
+        if ((sreg[x].ftaid.ip==ftaid.ip)
+            && (sreg[x].ftaid.port==ftaid.port)
+            && (sreg[x].ftaid.index==ftaid.index)
+            && (sreg[x].ftaid.streamid==ftaid.streamid)) {
+            sreg[x].used=0;
+        }
+    }
+    return;
+}
+
+
+
+/* the following two functions are used to cycle
+ through all ringbuffers
+ */
+gs_retval_t streamregistry_getactiveringbuf_reset()
+{
+    gs_int32_t x,y;
+    /* XXXOS this is not the most effective way of doing
+     this needs improvment. */
+    /* Build a list of all ringbufs make sure they
+     are unique since multiple entrys could share
+     a ringbuf
+     */
+    if (rbr!=0) (free(rbr));
+    if ((rbr=malloc(sizeof(struct ringbuf *)*lsreg))==0) {
+        gslog(LOG_EMERG,"Can't allocate memory in ftaregistry\n");
+        return -1;
+    }
+    memset(rbr,0,sizeof(struct ringbuf *)*lsreg);
+    lrbr=0;
+    for(x=0;x<lsreg;x++) {
+        if (sreg[x].used) {
+            for(y=0;(y<lrbr)&&(rbr[y]!=sreg[x].r);y++);
+            if (y>=lrbr) {
+                rbr[y]=sreg[x].r;
+                lrbr++;
+            }
+        }
+    }
+    return 0;
+}
+
+struct ringbuf * streamregistry_getactiveringbuf()
+{
+    if (lrbr>0) {
+        lrbr --;
+        return rbr[lrbr];
+    }
+    return 0;
+}
+
+
+gs_retval_t streamregistry_getactiveftaid_reset()
+{
+    gs_int32_t x,y;
+    /* XXXOS this is not the most effective way of doing
+     this needs improvment. */
+    /* Build a list of at least one ftaid per process
+     */
+    if (rms!=0) (free(rms));
+    if ((rms=malloc(sizeof(FTAID *)*lsreg))==0) {
+        gslog(LOG_EMERG,"Can't allocate memory in ftaregistry\n");
+        return -1;
+    }
+    memset(rms,0,sizeof(gs_int32_t *)*lsreg);
+    lrms=0;
+    for(x=0;x<lsreg;x++) {
+        if (sreg[x].used) {
+            for(y=0;(y<lrms)
+                &&(rms[y]->ip!=sreg[x].ftaid.ip)
+                &&(rms[y]->port!=sreg[x].ftaid.port);y++);
+            if (y>=lrms) {
+                rms[y]=&(sreg[x].ftaid);
+                lrms++;
+            }
+        }
+    }
+    return 0;
+}
+
+FTAID * streamregistry_getactiveftaid()
+{
+    if (lrms>0) {
+        lrms --;
+        return rms[lrms];
+    }
+    return 0;    
+}
diff --git a/src/lib/gscphost/lfta.c b/src/lib/gscphost/lfta.c
new file mode 100644 (file)
index 0000000..d32232a
--- /dev/null
@@ -0,0 +1,72 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include <gsconfig.h>
+#include <fta.h>
+#include <callbackregistries.h>
+#include <ipcencoding.h>
+#include <stdio.h>
+#include "rdtsc.h"
+#include "packet.h"
+#include "gscpipc.h"
+
+// new
+//gs_uint64_t lfta_prefilter(struct packet * p);
+extern gs_uint64_t (*lfta_prefilter)(void *pkt);
+
+struct pr_stats {
+       gs_uint64_t process;
+       gs_uint64_t packets;
+};
+
+void rts_fta_process_packet(struct packet * p)
+{
+    struct FTA * f;
+       gs_uint64_t prefilter;
+       static gs_uint32_t t=0;
+       static struct pr_stats s = {0};
+       gs_uint64_t s1;
+       gs_uint64_t s2;
+    prefilter=(*lfta_prefilter)(p);
+    
+    if (ftaexec_start()<0) {
+        gslog(LOG_EMERG,"GSCPRTS::error::could not init "
+              "FTA list itteration\n");
+        return;
+    }
+    s1=rdtsc();
+    while ((f=ftaexec_next())!=0) {
+        //             fprintf(stderr,"%llu %llu %llu\n",f->prefilter,prefilter,~( (prefilter&(f->prefilter)) | (~(f->prefilter)) ));
+               if (~( (prefilter&(f->prefilter)) | (~(f->prefilter)) ) == 0)
+                       f->accept_packet(f,0,p,0);
+    }
+    s2=rdtsc();
+    s.process+=(s2-s1);
+    s.packets++;
+    intuple++;
+    cycles+=(s2-s1);
+}
+
+void rts_fta_done()
+{
+    struct FTA * f;
+    if (ftaexec_start()<0) {
+        gslog(LOG_EMERG,"GSCPRTS::error::could not init "
+              "FTA list itteration\n");
+        return;
+    }
+    while ((f=ftaexec_next())!=0) {
+        f->control_fta(f,FTA_COMMAND_FILE_DONE,0,0);
+    }
+}
diff --git a/src/lib/gscphostaux/Makefile b/src/lib/gscphostaux/Makefile
new file mode 100644 (file)
index 0000000..c2dbc03
--- /dev/null
@@ -0,0 +1,38 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+CC=gcc -O3  -fexpensive-optimizations -I ../../../include
+
+SOURCE =  byteswap.c
+
+OBJECTS = $(SOURCE:.c=.o)
+
+all: install
+
+install: libgscphostaux.a
+       cp libgscphostaux.a ../../../lib ; ranlib ../../../lib/libgscphostaux.a
+
+INCDIR=../../../include
+
+byteswap.c : $(INCDIR/gstypes.h) $(INCDIR/gsconfig.h)
+
+libgscphostaux.a: $(OBJECTS) Makefile 
+       ar  rc libgscphostaux.a $(OBJECTS) 
+
+clean:
+       rm -f *.o *.a core
+
+
+$(OBJECTS): 
diff --git a/src/lib/gscphostaux/byteswap.c b/src/lib/gscphostaux/byteswap.c
new file mode 100644 (file)
index 0000000..af016fc
--- /dev/null
@@ -0,0 +1,40 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include "gsconfig.h"
+#include "gstypes.h"
+
+gs_uint16_t gscpbswap16(gs_uint16_t x){
+    return ((x << 8) & 0xff00) | ((x >> 8) & 0x00ff);
+}
+
+gs_uint32_t gscpbswap32(gs_uint32_t x ) {
+    return     ((x << 24) & 0xff000000 ) |
+       ((x <<  8) & 0x00ff0000 ) |
+       ((x >>  8) & 0x0000ff00 ) |
+       ((x >> 24) & 0x000000ff );
+}
+
+
+gs_uint64_t gscpbswap64(gs_uint64_t x) {
+    gs_uint64_t t1;
+    gs_uint64_t t2;
+    t1=x>>32;
+    t1 = gscpbswap32(t1);
+    t2=x & 0xffffffff;
+    t2 = gscpbswap32(t2);
+    x = t2<<32;
+    x = x|t1;
+    return x;
+}
diff --git a/src/lib/gscplftaaux/Makefile b/src/lib/gscplftaaux/Makefile
new file mode 100644 (file)
index 0000000..3ce94ef
--- /dev/null
@@ -0,0 +1,48 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+CC=gcc -g -O3  -fexpensive-optimizations -I ../gscpaux/acl/ -I ../gscpaux/ -I ../../../include/lfta/ -I ../../../include/
+
+SOURCE =  rts_string.c rts_byteswap.c rts_sample.c rts_udaf.c 
+
+OBJECTS = $(SOURCE:.c=.o)
+
+INCDIR=../../../include
+HFTA_DIR=$(INCDIR/hfta)
+LFTA_DIR=$(INCDIR/lfta)
+
+all: libgscplftaaux.a
+       cp libgscplftaaux.a ../../../lib/ ; ranlib ../../../lib/libgscplftaaux.a
+
+libgscplftaaux.a: $(OBJECTS) Makefile 
+       ar  rc libgscplftaaux.a $(OBJECTS) 
+
+rts_string.c : $(LFTA_DIR/rts_external.h) $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+rts_byteswap.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+rts_sample.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) $(LFTA_DIR/rts_external.h)
+
+rts_udaf.c : $(LFTA_DIR/rts_udaf.h) $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) 
+
+lpm.c : $(LFTA_DIR/rts_external.h) $(INCDIR/fta.h) $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+flip_udaf.c : $(LFTA_DIR/rts_udaf.h) $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+install: all
+
+clean:
+       rm -f *.o *.a core
+
diff --git a/src/lib/gscplftaaux/rts_byteswap.c b/src/lib/gscplftaaux/rts_byteswap.c
new file mode 100644 (file)
index 0000000..cae7ea2
--- /dev/null
@@ -0,0 +1,42 @@
+#include "gsconfig.h"
+#include "gstypes.h"
+
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+gs_int16_t gscpbswap16(gs_int16_t x){
+        return ((x << 8) & 0xff00) | ((x >> 8) & 0x00ff);
+}
+
+gs_int32_t gscpbswap32(gs_int32_t x ) {
+    return     ((x << 24) & 0xff000000 ) |
+       ((x <<  8) & 0x00ff0000 ) |
+       ((x >>  8) & 0x0000ff00 ) |
+       ((x >> 24) & 0x000000ff );
+}
+
+
+gs_int64_t gscpbswap64(gs_int64_t x) {
+    gs_uint64_t t1;
+    gs_uint64_t t2;
+    t1=x>>32;
+    t1 = gscpbswap32(t1);
+    t2=x & 0xffffffff;
+    t2 = gscpbswap32(t2);
+    x = t2<<32;
+    x = x|t1;
+    return x;
+}
diff --git a/src/lib/gscplftaaux/rts_options.c b/src/lib/gscplftaaux/rts_options.c
new file mode 100644 (file)
index 0000000..44a0ed9
--- /dev/null
@@ -0,0 +1,58 @@
+#include "md_stdlib.h"
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "rts_external.h"
+
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+gs_retval_t has_ipv4_option( struct gs_string * s, gs_uint32_t ipoption) {
+    gs_int32_t x=0;
+    gs_int32_t on;
+    gs_int32_t len;
+
+    if (s->length==0) return 0; /* no match */
+
+    while(0==0) {
+       if ((on=s->data[x]&0x1f)==ipoption) return 1; /* got a match */
+       switch (on) {
+         case 0:
+           return 0; /* no match and end of list */
+         case 1:
+           x++; /* one byte options */
+           break;
+         case 2: /* 11 byte security option */
+           x+=11;
+           break;
+         case 8:
+           x+=4; /* stream id option */
+           break;
+         case 3:
+         case 9:
+         case 7:
+         case 4:
+           if (x+1>=s->length) return 0; /* run out of data no match */
+           len=s->data[x+1];
+           x+=len;
+           break;
+         default:
+           return 0; /* don't undestand the option */
+       }
+       if (x>=s->length) return 0; /* run out of data no match */
+    }
+               
+    return 0; /* should never be reached */
+}
diff --git a/src/lib/gscplftaaux/rts_sample.c b/src/lib/gscplftaaux/rts_sample.c
new file mode 100644 (file)
index 0000000..61c051e
--- /dev/null
@@ -0,0 +1,44 @@
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "rts_external.h"
+
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+
+//#define FILTERDEBUG 100000
+#ifdef FILTERDEBUG
+#include "stdio.h"
+#include "stdlib.h"
+#endif
+
+#define OFFSET 17
+#define PRIME 2997913
+
+
+static gs_uint32_t rval;
+
+#define MAX_TRIGGER 16
+
+
+void set_seed(gs_uint32_t s){rval=s;}
+
+gs_uint32_t lc_rand(){
+               rval = (rval+OFFSET)*PRIME;
+                       return(rval & 0xffffffff);
+}
+
+
+
diff --git a/src/lib/gscplftaaux/rts_string.c b/src/lib/gscplftaaux/rts_string.c
new file mode 100644 (file)
index 0000000..8c31657
--- /dev/null
@@ -0,0 +1,367 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include "rts_external.h"
+#include <stdio.h>
+#include <regex.h>
+#include "gsconfig.h"
+#include "gstypes.h"
+
+
+#include "stdlib.h"
+
+
+gs_retval_t str_assign_with_copy(struct FTA * f, struct gs_string * dest, struct gs_string * src)
+{
+    if ((dest->data = fta_alloc(f,src->length))==0) {
+       return -1;
+    }
+    dest->length=src->length;
+    dest->owner=f;    
+    memcpy(dest->data,src->data,src->length);
+    return 0;
+}
+
+gs_retval_t str_assign_with_copy_in_tuple(struct string32 * dest, struct gs_string * src,
+                                 gs_sp_t start, gs_sp_t buf)
+{
+    gs_uint32_t st;
+    st=(unsigned int)(buf-start);
+//    dest->length=htonl(src->length);
+//    dest->reserved=htonl(0);
+//    dest->offset=htonl(st);
+    dest->length=src->length;
+    dest->reserved=0;
+    dest->offset=st;
+    memcpy(buf,src->data,src->length);
+    return 0;
+}
+
+
+
+gs_retval_t str_replace( struct FTA * f, struct gs_string * dest, struct gs_string * src )
+{
+    str_destroy(dest);
+    return str_assign_with_copy(f, dest, src);
+}
+
+/* Searching within a string */
+
+
+gs_retval_t str_exists_substr( struct gs_string * s1, struct gs_string * s2)
+{
+  register gs_uint8_t * st1 = (gs_uint8_t *)(s1->data);
+  register gs_uint8_t * st2 = (gs_uint8_t *)(s2->data);
+  register gs_uint8_t s2f=st2[0];
+  register gs_int32_t len1 = s1->length-s2->length; /* the lates point I have to find
+                                               a match of the first char */
+  register gs_int32_t len2 = s2->length;
+  register gs_int32_t x,y;
+
+
+  for (x=0; x<len1 ; x++)
+  {
+      if (st1[x]==s2f) {
+         for (y=0; y<len2 && st1[x+y]==st2[y];y++);
+         if (y==len2) {
+             return 1;
+         }
+      }
+  }
+  return 0;
+}
+
+
+gs_uint32_t str_match_offset( gs_uint32_t offset, struct gs_string * s1, struct gs_string * s2) {
+  register gs_uint8_t * st1 = (gs_uint8_t *)(s1->data);
+  register gs_uint8_t * st2 = (gs_uint8_t *)(&s2->data[offset]);
+  register gs_int32_t x;
+  register gs_int32_t len2 = s2->length-offset;
+  register gs_int32_t len1 = s1->length;
+  if (len2<len1) return 0;
+  for(x=0; x<len1; x++) {
+    if (st1[x]!=st2[x]) return 0;
+  }
+  return 1;
+}
+
+
+gs_uint32_t byte_match_offset( gs_uint32_t offset, gs_uint32_t val, struct gs_string * s2) {
+  register gs_uint8_t * st2 = (gs_uint8_t *)(s2->data);
+  register gs_uint8_t v = (unsigned char) val;
+//  if ((s2->length <= offset)||(offset<0)) return 0;
+  if (s2->length <= offset) return 0;
+  return (st2[offset]==v)?1:0;
+}
+
+
+gs_retval_t str_compare( struct gs_string * str1, struct gs_string * str2)
+{
+    gs_int32_t len;
+    gs_int32_t x;
+    len = (str1->length>str2->length)?str2->length:str1->length;
+    for(x=0;x<len;x++) {
+       if (str1->data[x]>str2->data[x]) {
+           return 1;
+       }
+       if (str1->data[x]<str2->data[x]) {
+           return -1;
+       }
+    }
+
+    if (str1->length>str2->length) {
+       return 1;
+    }
+    if (str2->length>str1->length) {
+       return -1;
+    }
+    return 0;
+}
+
+gs_retval_t str_constructor(struct gs_string *s, gs_sp_t l){
+    s->data =  l;
+    s->length = 0;
+    while(l[s->length] != '\0') s->length++;
+    s->owner = NULL;    
+    return(0);
+}
+
+
+gs_param_handle_t register_handle_for_str_regex_match_slot_1(struct FTA * f,
+                                       struct gs_string* pattern) {
+    regex_t * reg;
+    if ((reg=(regex_t *) fta_alloc(0,sizeof(regex_t)))==0)  {
+       return 0;
+    }
+    if (regcomp(reg,(gs_sp_t)(pattern->data), REG_NEWLINE|REG_EXTENDED|REG_NOSUB)!=0) {
+       return 0;
+    }
+    return (gs_param_handle_t) reg;
+}
+
+gs_uint32_t str_regex_match(struct gs_string* str, gs_param_handle_t pattern_handle) {
+    regex_t * reg = (regex_t *) pattern_handle ;
+    gs_sp_t source = (gs_sp_t)(str->data);
+    int res;
+    static gs_sp_t d=0;
+    static gs_uint32_t dlen=0;
+    // grow our static buffer to the longest string we ever see
+    if ((str->length+1) >= dlen) {
+        if (d!=0) fta_free(0,(void*)d);
+        dlen=0;
+        d=0;
+        if ((d=(gs_sp_t)fta_alloc(0,str->length+1))==0) return 0;
+        dlen=str->length+1;
+    }
+    
+    if (str->length==0) return 0;
+
+    // copy the string and 0 terminate it
+    memcpy((void *)d,(void *) str->data, str->length);
+    d[str->length]=0;
+    
+    res = REG_NOMATCH;
+    res = regexec(reg, d, 0, NULL, 0);
+    return (res==REG_NOMATCH)?0:1;
+}
+
+
+gs_retval_t deregister_handle_for_str_regex_match_slot_1(gs_param_handle_t handle) {
+    regex_t * x = (regex_t *) handle;
+    regfree(x);
+    if (x!=0) fta_free(0,(void *)x);
+    return 0;
+}
+
+gs_param_handle_t register_handle_for_str_partial_regex_match_slot_1(struct FTA * f,
+                                       struct gs_string* pattern) {
+    regex_t * reg;
+    if ((reg=(regex_t *) fta_alloc(0,sizeof(regex_t)))==0)  {
+       return 0;
+    }
+    if (regcomp(reg,(gs_sp_t)(pattern->data), REG_NEWLINE|REG_EXTENDED|REG_NOSUB)!=0) {
+       return 0;
+    }
+    return (gs_param_handle_t) reg;
+}
+
+gs_uint32_t str_partial_regex_match(struct gs_string* str,
+                            gs_param_handle_t pattern_handle,
+                            gs_uint32_t maxlen) {
+    regex_t * reg = (regex_t *) pattern_handle ;
+    gs_sp_t source = (gs_sp_t)(str->data);
+    gs_int32_t res;
+    gs_int32_t end;
+    static gs_sp_t d=0;
+    static gs_uint32_t dlen=0;
+    // grow our static buffer to the longest string we ever see
+    if ((str->length+1) >= dlen) {
+        if (d!=0) fta_free(0,d);
+        dlen=0;
+        d=0;
+        if ((d=(gs_sp_t)fta_alloc(0,str->length+1))==0) return 0;
+        dlen=str->length+1;
+    }
+    
+    if (str->length==0) return 0;
+    
+    end=(maxlen>(str->length))?(str->length):maxlen;
+    // copy the string and 0 terminate it
+    memcpy((void *)d,(void *) str->data, end);
+    d[str->length]=0;
+     /* HACK ALERT: commented out regnexec invocations to unbreak the build */
+    res = REG_NOMATCH;
+    res = regexec(reg,d, 0, NULL, 0);
+    return (res==REG_NOMATCH)?0:1;
+}
+
+
+gs_retval_t deregister_handle_for_str_partial_regex_match_slot_1(
+                                 gs_param_handle_t handle) {
+    regex_t * x = (regex_t *) handle;
+    regfree(x);
+    if (x!=0) fta_free(0,(void *)x);
+    return 0;
+}
+
+
+
+static gs_uint32_t nextint(struct gs_string *str , gs_uint32_t * offset, gs_uint32_t *res) {
+       gs_uint8_t * s = (gs_uint8_t *)(str->data);
+       gs_int32_t v = 0;
+       *res = 0;
+       while(*offset<str->length) {
+               if ((s[*offset]>='0') && (s[*offset]<='9')) {
+                       v=1;
+                       *res= (*res*10) + (gs_uint32_t) (s[*offset]-'0');
+               } else {
+                       if (v!=0) { // got some valid result
+                               return 1;
+                       } // otherwise skip leading grabage
+               }
+               (*offset)++;
+       }
+       return v;
+}
+
+
+gs_param_handle_t register_handle_for_strtoi_c_slot_0(struct FTA * f, struct gs_string* istr) {
+       gs_uint32_t offset,r;
+       offset=0;
+       if (nextint(istr,&offset,&r)!=0)
+               return (gs_param_handle_t) r;
+       return (gs_param_handle_t) 0;
+}
+gs_retval_t deregister_handle_for_strtoi_c_slot_0(gs_param_handle_t h) {
+       return 0;
+}
+
+gs_param_handle_t register_handle_for_strtoip_c_slot_0(struct FTA * f, struct gs_string* istr) {
+        gs_uint32_t ip1,ip2,ip3,ip4,offset,r;
+        offset=0;
+        if (nextint(istr,&offset,&ip1)==0) return (gs_param_handle_t)0;
+        if (nextint(istr,&offset,&ip2)==0) return (gs_param_handle_t)0;
+        if (nextint(istr,&offset,&ip3)==0) return (gs_param_handle_t)0;
+        if (nextint(istr,&offset,&ip4)==0) return (gs_param_handle_t)0;
+        r=ip1<<24|ip2<<16|ip3<<8|ip4;
+               return (gs_param_handle_t)r;
+}
+gs_retval_t deregister_handle_for_strtoip_c_slot_0(gs_param_handle_t h) {
+       return 0;
+}
+
+
+///////////////////////////////////////////////////
+//     ipv6 procedures
+
+
+
+gs_retval_t ipv6_compare( struct ipv6_str i1, struct ipv6_str i2){
+    if(i1.v[0] > i2.v[0])
+       return 1;
+    if(i1.v[0] < i2.v[0])
+       return -1;
+    if(i1.v[1] > i2.v[1])
+       return 1;
+    if(i1.v[1] < i2.v[1])
+       return -1;
+    if(i1.v[2] > i2.v[2])
+       return 1;
+    if(i1.v[2] < i2.v[2])
+       return -1;
+    if(i1.v[3] > i2.v[3])
+       return 1;
+    if(i1.v[3] < i2.v[3])
+       return -1;
+
+    return 0;
+}
+
+gs_retval_t Ipv6_Constructor(struct ipv6_str *s, gs_sp_t l){
+       gs_uint32_t i0=0,i1=0,i2=0,i3=0,i4=0,i5=0,i6=0,i7=0;
+       sscanf(l,"%x:%x:%x:%x:%x:%x:%x:%x",&i0,&i1,&i2,&i3,&i4,&i5,&i6,&i7);
+       s->v[0] = ((i0 & 0xffff) << 16) | (i1 & 0xffff);
+       s->v[1] = ((i2 & 0xffff) << 16) | (i3 & 0xffff);
+       s->v[2] = ((i4 & 0xffff) << 16) | (i5 & 0xffff);
+       s->v[3] = ((i6 & 0xffff) << 16) | (i7 & 0xffff);
+    return(0);
+}
+
+struct ipv6_str And_Ipv6(const struct ipv6_str i1, const struct ipv6_str i2){
+        struct ipv6_str ret;
+        ret.v[0] = i1.v[0] & i2.v[0];
+        ret.v[1] = i1.v[1] & i2.v[1];
+        ret.v[2] = i1.v[2] & i2.v[2];
+        ret.v[3] = i1.v[3] & i2.v[3];
+        return ret;
+}
+
+struct ipv6_str Or_Ipv6(const struct ipv6_str i1, const struct ipv6_str i2){
+        struct ipv6_str ret;
+        ret.v[0] = i1.v[0] | i2.v[0];
+        ret.v[1] = i1.v[1] | i2.v[1];
+        ret.v[2] = i1.v[2] | i2.v[2];
+        ret.v[3] = i1.v[3] | i2.v[3];
+        return ret;
+}
+struct ipv6_str hton_ipv6(struct ipv6_str s){
+        struct ipv6_str ret;
+//        ret.v[0] = htonl(s.v[0]);
+//        ret.v[1] = htonl(s.v[1]);
+//        ret.v[2] = htonl(s.v[2]);
+//        ret.v[3] = htonl(s.v[3]);
+        ret.v[0] = s.v[0];
+        ret.v[1] = s.v[1];
+        ret.v[2] = s.v[2];
+        ret.v[3] = s.v[3];
+       return ret;
+}
+
+struct ipv6_str ntoh_ipv6(struct ipv6_str s){
+        struct ipv6_str ret;
+//        ret.v[0] = ntohl(s.v[0]);
+//        ret.v[1] = ntohl(s.v[1]);
+//        ret.v[2] = ntohl(s.v[2]);
+//        ret.v[3] = ntohl(s.v[3]);
+        ret.v[0] = s.v[0];
+        ret.v[1] = s.v[1];
+        ret.v[2] = s.v[2];
+        ret.v[3] = s.v[3];
+       return ret;
+}
+
+
diff --git a/src/lib/gscplftaaux/rts_udaf.c b/src/lib/gscplftaaux/rts_udaf.c
new file mode 100644 (file)
index 0000000..7cad1b4
--- /dev/null
@@ -0,0 +1,256 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include "rts_udaf.h"
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <stdio.h>
+#include <limits.h>
+#include <math.h>
+
+
+#define max(a,b) ((a) > (b) ? (a) : (b))
+#define MAX_BUFSIZE     128
+
+
+/****************************************************************/
+/* LFTA functions                                               */
+/****************************************************************/
+
+
+////////////////////////////////////////////////////////////////////////
+////           avg_udaf
+
+typedef struct avg_udaf_lfta_struct_t{
+       gs_int64_t sum;
+       gs_uint32_t cnt;
+} avg_udaf_lfta_struct_t;
+
+void avg_udaf_lfta_LFTA_AGGR_INIT_(gs_sp_t b){
+       avg_udaf_lfta_struct_t *s = (avg_udaf_lfta_struct_t *)b;
+       s->sum = 0;
+       s->cnt = 0;
+}
+
+void avg_udaf_lfta_LFTA_AGGR_UPDATE_(gs_sp_t  b,gs_uint32_t v){
+       avg_udaf_lfta_struct_t *s = (avg_udaf_lfta_struct_t *)b;
+       s->sum += v;
+       s->cnt++;
+}
+
+gs_retval_t avg_udaf_lfta_LFTA_AGGR_FLUSHME_(gs_sp_t b){
+       return 0;
+}
+
+void avg_udaf_lfta_LFTA_AGGR_OUTPUT_(struct gs_string *r,gs_sp_t b){
+       r->length = 12;
+       r->data = b;
+}
+
+void avg_udaf_lfta_LFTA_AGGR_DESTROY_(gs_sp_t b){
+       return;
+}
+
+/////////////////////////////////////////////////////////
+//             Moving sum
+
+typedef struct moving_sum_lfta_struct{
+       gs_uint32_t sum;
+       gs_uint32_t N;
+} moving_sum_lfta_struct;
+
+void moving_sum_lfta_LFTA_AGGR_INIT_(gs_sp_t b){
+       moving_sum_lfta_struct *s = (moving_sum_lfta_struct *)b;
+       s->sum = 0;
+       s->N = 0;
+}
+
+void moving_sum_lfta_LFTA_AGGR_UPDATE_(gs_sp_t b, gs_uint32_t v, gs_uint32_t N){
+       moving_sum_lfta_struct *s = (moving_sum_lfta_struct *)b;
+       s->sum += v;
+       s->N = N;
+}
+       
+gs_retval_t moving_sum_lfta_LFTA_AGGR_FLUSHME_(gs_sp_t b){
+       return 0;
+}
+
+void moving_sum_lfta_LFTA_AGGR_OUTPUT_(gs_uint64_t *r, gs_sp_t b){
+       moving_sum_lfta_struct *s = (moving_sum_lfta_struct *)b;
+       *r = ((gs_uint64_t)(s->N) << 32) | (gs_uint64_t)(s->sum);
+}
+
+gs_retval_t moving_sum_lfta_LFTA_AGGR_DESTROY_(gs_sp_t b){
+       return 0;
+}
+
+/////////////////////////////////////////////////////////
+//             FIRST and LAST aggregates
+
+void FIRST_lfta_LFTA_AGGR_INIT_(gs_uint32_t* scratch) {
+       *scratch = UINT_MAX;            // we will encode uninitialized value of UINT_MAX
+       return;
+}
+
+void FIRST_lfta_LFTA_AGGR_UPDATE_(gs_uint32_t* scratch, gs_uint32_t val) {
+       if (*scratch == UINT_MAX)
+               *scratch = val;
+       return;
+}
+
+gs_retval_t FIRST_lfta_LFTA_AGGR_FLUSHME_( gs_uint32_t* scratch) { return 0; }
+
+void FIRST_lfta_LFTA_AGGR_OUTPUT_(gs_uint32_t* res, gs_uint32_t* scratch) {
+       *res = *scratch;
+}
+
+void FIRST_lfta_LFTA_AGGR_DESTROY_(gs_uint32_t* scratch) { return; }
+
+void FIRST_ULL_lfta_LFTA_AGGR_INIT_(gs_uint64_t* scratch) {
+       *scratch = ULLONG_MAX;          // we will encode uninitialized value of ULLONG_MAX
+       return;
+}
+
+void FIRST_ULL_lfta_LFTA_AGGR_UPDATE_(gs_uint64_t* scratch, gs_uint64_t val) {
+       if (*scratch == ULLONG_MAX)
+               *scratch = val;
+       return;
+}
+
+gs_retval_t FIRST_ULL_lfta_LFTA_AGGR_FLUSHME_( gs_uint64_t* scratch) { return 0; }
+
+void FIRST_ULL_lfta_LFTA_AGGR_OUTPUT_(gs_uint64_t* res, gs_uint64_t* scratch) {
+       *res = *scratch;
+}
+
+void FIRST_ULL_lfta_LFTA_AGGR_DESTROY_(gs_uint64_t* scratch) { return; }
+
+
+
+void FIRST_STR_lfta_LFTA_AGGR_INIT_(struct gs_string* scratch) {
+       scratch->data = NULL;
+       return;
+}
+
+void FIRST_STR_lfta_LFTA_AGGR_UPDATE_(struct gs_string* scratch, struct gs_string* val) {
+       if (!scratch->data) {
+               str_assign_with_copy(NULL, scratch, val);
+       }
+       return;
+}
+
+gs_retval_t FIRST_STR_lfta_LFTA_AGGR_FLUSHME_(struct gs_string* scratch) { return 0; }
+
+void FIRST_STR_lfta_LFTA_AGGR_OUTPUT_(struct gs_string* res, struct gs_string* scratch) {
+       *res = *scratch;
+}
+
+void FIRST_STR_lfta_LFTA_AGGR_DESTROY_(struct gs_string* scratch) { 
+       if (scratch->data) 
+               fta_free(NULL, scratch->data);
+}
+
+void LAST_lfta_LFTA_AGGR_INIT_(gs_uint32_t* scratch) { }
+
+void LAST_lfta_LFTA_AGGR_UPDATE_(gs_uint32_t* scratch, gs_uint32_t val) {
+       *scratch = val;
+       return;
+}
+
+gs_retval_t LAST_lfta_LFTA_AGGR_FLUSHME_( gs_uint32_t* scratch) { return 0; }
+
+void LAST_lfta_LFTA_AGGR_OUTPUT_(gs_uint32_t* res, gs_uint32_t* scratch) {
+       *res = *scratch;
+}
+
+void LAST_lfta_LFTA_AGGR_DESTROY_(gs_uint32_t* scratch) { return; }
+
+void LAST_ULL_lfta_LFTA_AGGR_INIT_(gs_uint64_t* scratch) { }
+
+void LAST_ULL_lfta_LFTA_AGGR_UPDATE_(gs_uint64_t* scratch, gs_uint64_t val) {
+       *scratch = val;
+       return;
+}
+
+gs_retval_t LAST_ULL_lfta_LFTA_AGGR_FLUSHME_( gs_uint64_t* scratch) { return 0; }
+
+void LAST_ULL_lfta_LFTA_AGGR_OUTPUT_(gs_uint64_t* res, gs_uint64_t* scratch) {
+       *res = *scratch;
+}
+
+void LAST_ULL_lfta_LFTA_AGGR_DESTROY_(gs_uint64_t* scratch) { return; }
+
+
+
+void LAST_STR_lfta_LFTA_AGGR_INIT_(struct gs_string* scratch) {
+       scratch->data = NULL;
+       return;
+}
+
+void LAST_STR_lfta_LFTA_AGGR_UPDATE_(struct gs_string* scratch, struct gs_string* val) {
+       if (!scratch->data) {
+               str_assign_with_copy(NULL, scratch, val);
+       } else {
+               if (!str_compare(scratch, val)) {
+                       fta_free(NULL, scratch->data);
+                       str_assign_with_copy(NULL, scratch, val);
+               }
+       }
+       return;
+}
+
+gs_retval_t LAST_STR_lfta_LFTA_AGGR_FLUSHME_(struct gs_string* scratch) { return 0; }
+
+void LAST_STR_lfta_LFTA_AGGR_OUTPUT_(struct gs_string* res, struct gs_string* scratch) {
+       *res = *scratch;
+}
+
+void LAST_STR_lfta_LFTA_AGGR_DESTROY_(struct gs_string* scratch) { 
+       if (scratch->data) 
+               fta_free(NULL, scratch->data);
+}
+
+
+/////////////////////////////////////////////////////////
+//             running_array_aggr aggregate
+
+struct running_array_aggr_str{
+       gs_uint32_t num_list[4];
+       gs_uint8_t n_num;
+};
+
+void running_array_aggr_lfta_LFTA_AGGR_INIT_(char* scratch) {
+       struct running_array_aggr_str* aggr = (struct running_array_aggr_str*)scratch;
+       aggr->n_num = 0;
+}
+
+void running_array_aggr_lfta_LFTA_AGGR_UPDATE_(char* scratch, gs_uint32_t val) {
+       struct running_array_aggr_str* aggr = (struct running_array_aggr_str*)scratch;
+       aggr->num_list[aggr->n_num++] = val;
+}
+
+gs_retval_t running_array_aggr_lfta_LFTA_AGGR_FLUSHME_(char* scratch) {
+       struct running_array_aggr_str* aggr = (struct running_array_aggr_str*)scratch;
+       return (aggr->n_num == 4);
+}
+void running_array_aggr_lfta_LFTA_AGGR_OUTPUT_(struct gs_string* res, char* scratch) {
+       struct running_array_aggr_str* aggr = (struct running_array_aggr_str*)scratch;  
+       res->data = scratch;
+       res->length = aggr->n_num * sizeof(gs_uint32_t);
+       res->owner = NULL;
+}
+
+void running_array_aggr_lfta_LFTA_AGGR_DESTROY_(char* scratch) { }
+
diff --git a/src/lib/gscprts/Makefile b/src/lib/gscprts/Makefile
new file mode 100644 (file)
index 0000000..545db5d
--- /dev/null
@@ -0,0 +1,49 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+CC=gcc  -g -O3 -msse4.2 -fexpensive-optimizations -I libdag/include -I ../../../include/lfta/ -I ../../../include/ -I ./include/ -I ../gscphost/include
+CXX=g++  -g -O3 -msse4.2 -fexpensive-optimizations -I libdag/include -I ../../../include/lfta/ -I ../../../include/ -I ./include/ -I ../gscphost/include
+
+SOURCE_C =   rts_main.c rts_env.c rts_csv.c rts_gdat.c
+SOURCE_CC =   rts_csv2.cc
+SOURCE =   $(SOURCE_C) $(SOURCE_CC) 
+
+
+OBJECTS = $(SOURCE_C:.c=.o) $(SOURCE_CC:.cc=.o)
+
+
+all: libgscprts.a 
+
+INCDIR=../../../include
+LFTA_DIR=$(INCDIR/lfta)
+
+libgscprts.a: $(OBJECTS) Makefile 
+       ar  rc libgscprts.a $(OBJECTS) 
+
+rts_main.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) $(INCDIR/lapp.h) $(INCDIR/fta.h) 
+
+rts_env.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) $(INCDIR/lapp.h) $(INCDIR/fta.h) $(LFTA_DIR/rts.h)
+
+rts_csv.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) $(INCDIR/lapp.h) $(INCDIR/fta.h) $(LFTA_DIR/rts.h) $(INCDIR/packet.h)
+
+rts_csv2.cc : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) $(INCDIR/lapp.h) $(INCDIR/fta.h) $(LFTA_DIR/rts.h) $(INCDIR/packet.h)
+
+rts_gdat.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h) $(INCDIR/lapp.h) $(INCDIR/fta.h) $(LFTA_DIR/rts.h) $(INCDIR/packet.h)
+
+install: all
+       cp libgscprts.a  ../../../lib/ ; ranlib ../../../lib/libgscprts.a
+
+clean:
+       rm -f *.o *.a core
diff --git a/src/lib/gscprts/rts_csv.c b/src/lib/gscprts/rts_csv.c
new file mode 100644 (file)
index 0000000..98c84c1
--- /dev/null
@@ -0,0 +1,404 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include "errno.h"
+
+#include "gsconfig.h"
+#include "gshub.h"
+#include "gstypes.h"
+#include "lapp.h"
+#include "fta.h"
+#include "stdio.h"
+#include "stdlib.h"
+#include "packet.h"
+#include "schemaparser.h"
+#include "lfta/rts.h"
+
+void rts_fta_process_packet(struct packet * p);
+void rts_fta_done();
+void fta_init(gs_sp_t device);
+
+
+#define CSVMAXLINE 1000000
+
+static FILE *pd;
+static int listensockfd=-1;
+static int fd=-1;
+static struct packet cur_packet;
+static gs_sp_t name;
+static gs_uint8_t line[CSVMAXLINE];
+static gs_uint32_t lineend=0;
+static gs_uint8_t csvdel=',';
+static gs_uint32_t verbose=0;
+static gs_uint32_t startupdelay=0;
+static gs_uint32_t singlefile=0;
+static gs_uint32_t gshub=0;
+static int socket_desc=0;
+
+static void csv_replay_check_messages() {
+    if (fta_start_service(0)<0) {
+        print_error("Error:in processing the msg queue for a replay file");
+        exit(9);
+    }
+}
+
+static gs_uint32_t gs_read_line(gs_uint8_t * buffer, gs_uint32_t length){
+    gs_uint32_t used=0;
+    gs_uint32_t cur;
+    fd_set socket_rset;
+    fd_set socket_eset;
+    struct timeval socket_timeout;
+    int retval;
+    
+    FD_ZERO(&socket_rset);
+    FD_SET(socket_desc,&socket_rset);
+    FD_ZERO(&socket_eset);
+    FD_SET(socket_desc,&socket_eset);
+    // timeout in one millisecon
+    socket_timeout.tv_sec=0;
+    socket_timeout.tv_usec=1000;
+    
+    if ((retval=select(socket_desc+1,&socket_rset,0,&socket_eset,&socket_timeout))<=0) {
+        if (retval==0) {
+            // caught a timeout
+            return -1;
+        }
+        return -2;
+    }
+    
+    while((used < (length-1)) && ((used==0)|| (buffer[used-1]!='\n'))) {
+        if ((cur=read(socket_desc,&(buffer[used]),1))<=0) {
+            print_error("ERROR:could not read data from gdat stream");
+            return -2;
+        }
+        used+=cur;
+    }
+       buffer[used]=0;
+       return 0;
+}
+
+static void init_socket() {
+       endpoint gshub;
+       endpoint srcinfo;
+       struct sockaddr_in server;
+    gs_int32_t parserversion;
+    gs_uint32_t schemalen;
+    static char * asciischema=0;
+       gs_int8_t buf[1024];
+       
+       if (get_hub(&gshub)!=0) {
+               print_error("ERROR:could not find gshub for data source");
+               exit(0);
+       }
+    
+       if (get_streamsource(gshub,name,&srcinfo,1) !=0) {
+               print_error("ERROR:could not find data source for stream\n");
+               exit(0);
+       }
+    
+       socket_desc = socket(AF_INET , SOCK_STREAM , 0);
+    if (socket_desc == -1)
+    {
+        print_error("ERROR:could not create socket for data stream");
+               exit(0);
+    }
+       server.sin_addr.s_addr = srcinfo.ip;
+    server.sin_family = AF_INET;
+    server.sin_port = srcinfo.port;
+    
+       if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
+    {
+               print_error("ERROR: could not open connection to data source");
+               exit(0);
+       }
+    
+}
+
+static void next_file() {
+       struct stat s;
+       if (verbose) {
+               fprintf(stderr,"Opening %s\n",name);
+       }
+       if (singlefile==0) {
+               while (lstat(name,&s)!=0) {
+                       if (errno!=ENOENT) {
+                               print_error("csv::lstat unexpected return value");
+                               exit(10);
+                       }
+                       csv_replay_check_messages();
+                       usleep(10000);
+               }
+               if  (pd!=0) {
+                       fclose(pd);
+               }
+       }
+    if ((pd=fopen(name,"r"))==0) {
+        print_error("csv::open failed ");
+        exit(10);
+    }
+       if (singlefile==0) {
+               unlink(name);
+       }
+}
+
+
+static gs_retval_t csv_replay_init(gs_sp_t device)
+{
+    gs_sp_t  verbosetmp;
+    gs_sp_t  delaytmp;
+    gs_sp_t  gshubtmp;
+    gs_sp_t  tempdel;
+    gs_sp_t  singlefiletmp;
+    
+    if ((name=get_iface_properties(device,"filename"))==0) {
+               print_error("csv_init::No CSV \"Filename\" defined");
+               exit(0);
+       }
+    tempdel=get_iface_properties(device,"csvseparator");
+    if (tempdel != 0 ) {
+        csvdel=(gs_uint8_t) tempdel[0];
+    }
+    
+    if ((verbosetmp=get_iface_properties(device,"verbose"))!=0) {
+        if (strncmp(verbosetmp,"TRUE",4)==0) {
+            verbose=1;
+            fprintf(stderr,"VERBOSE ENABLED\n");
+        } else {
+            fprintf(stderr,"VERBOSE DISABLED\n");
+        }
+    }
+    if ((singlefiletmp=get_iface_properties(device,"singlefile"))!=0) {
+        if (strncmp(singlefiletmp,"TRUE",4)==0) {
+            singlefile=1;
+            if (verbose)
+                fprintf(stderr,"SINGLEFILE ENABLED\n");
+        } else {
+            if (verbose)
+                fprintf(stderr,"SINGLEFILE DISABLED\n");
+        }
+    }
+    
+    if ((delaytmp=get_iface_properties(device,"startupdelay"))!=0) {
+        if (verbose) {
+            fprintf(stderr,"Startup delay of %u seconds\n",atoi(get_iface_properties(device,"startupdelay")));
+        }
+        startupdelay=atoi(get_iface_properties(device,"startupdelay"));
+    }
+    if ((gshubtmp=get_iface_properties(device,"gshub"))!=0) {
+        if (verbose) {
+            fprintf(stderr,"GDAT format using gshub\n");
+        }
+        gshub=1;
+    }
+    
+    cur_packet.ptype=PTYPE_CSV;
+    return 0;
+}
+
+static gs_retval_t csv_read_socket()
+{
+    gs_uint32_t i;
+    gs_uint32_t p;
+       gs_uint32_t x;
+       gs_int32_t r;
+       gs_retval_t ret;
+    gs_uint32_t done;
+    
+    if ((ret=gs_read_line(line,CSVMAXLINE-1))<0) { return ret;}
+        cur_packet.systemTime=time(0);
+        p=0;
+        i=0;
+        done=0;
+        while((done==0)&&(i<CSVMAXLINE)&&(line[i]!=0)&&(p<CSVELEMENTS)){
+            cur_packet.record.csv.fields[p]=&line[i];
+            p++;
+            while((line[i] != 0) && (line[i] != csvdel)) {
+                i++;
+            }
+            if (line[i]==0) done=1;
+            line[i]=0;
+            i++;
+        }
+        cur_packet.record.csv.numberfields=p;
+        //fprintf(stderr,"XX,%s,%s,%u,%u\n",cur_packet.record.csv.fields[0],cur_packet.record.csv.fields[1],x,lineend);
+        rts_fta_process_packet(&cur_packet);
+        if (lineend>x+1)  {
+            memcpy(&(line[0]),&(line[x+1]),lineend-x-1);
+            lineend=lineend-x-1;
+        } else {
+            lineend=0;
+        }
+        line[lineend]=0;
+        return 0;
+    }
+    
+    static void csv_read_tuple()
+    {
+        gs_uint32_t i=0;
+        gs_uint32_t p=0;
+        gs_uint32_t flen=0;
+        if (pd==0) next_file();
+        while(fgets((char *)&(line[0]),CSVMAXLINE,pd)==0) {
+            if (singlefile==1) {
+                if(verbose) {
+                    fprintf(stderr,"SINGLEFILE PROCESSING DONE!\n");
+                }
+                rts_fta_done();
+                if (verbose) {
+                    fprintf(stderr,"RTS SAYS BY\n");
+                }
+                while(1==1) sleep(1);
+            } else {
+                next_file();
+            }
+        }
+        cur_packet.systemTime=time(0);
+        while((i<CSVMAXLINE)&&(line[i]!=0)&&(p<CSVELEMENTS)){
+            cur_packet.record.csv.fields[p]=&line[i];
+            p++;
+            while((line[i] != 0) && (line[i] != csvdel)) {
+                i++;
+            }
+            if(line[i] != 0){
+                line[i]=0;
+                i++;
+            }
+        }
+        //                     Get rid of trailing \n and \r.
+        while(i>0 && (line[i-1] == '\n' || line[i-1] == '\r')){
+            i--;
+            line[i] = '\0';
+        }
+        cur_packet.record.csv.numberfields=p;
+        rts_fta_process_packet(&cur_packet);
+    }
+    
+    
+    
+    
+    
+    static gs_retval_t csv_process_file()
+    {
+        unsigned cnt=0;
+        static unsigned totalcnt=0;
+        for(cnt=0;cnt<50000;cnt++) {
+            if (gshub!=0) {
+                gs_retval_t retval;
+                retval=csv_read_socket();
+                if (retval==-1) return 0; // got a timeout so service message queue
+                if ((retval==-2) || (ftaschema_is_eof_tuple(cur_packet.record.gdat.schema,(void *)cur_packet.record.gdat.data))) {
+                    // we signal that everything is done if we either see an EOF tuple OR the socket is closed by the peer
+                    if (verbose)
+                        fprintf(stderr,"Done processing waiting for things to shut down\n");
+                    rts_fta_done();
+                    // now just service message queue until we get killed or loose connectivity
+                    while (0==0) {
+                        fta_start_service(0); // service all waiting messages
+                        usleep(1000); // sleep a millisecond
+                    }
+                }
+            } else {
+                csv_read_tuple();
+            }
+        }
+        totalcnt=totalcnt+cnt;
+        if (verbose) {
+            fprintf(stderr,"Processesd %u tuple\n",totalcnt);
+        }
+        return 0;
+    }
+    
+    gs_retval_t main_csv(gs_int32_t devicenum, gs_sp_t device, gs_int32_t mapcnt, gs_sp_t map[]) {
+        gs_uint32_t cont;
+        endpoint mygshub;
+        
+        csv_replay_init(device);
+        
+        /* initalize host_lib */
+        if (verbose) {
+            fprintf(stderr,"Init LFTAs for %s\n",device);
+        }
+        
+        if (hostlib_init(LFTA,0,devicenum,mapcnt,map)<0) {
+            fprintf(stderr,"%s::error:could not initiate host lib for clearinghouse\n",
+                    device);
+            exit(7);
+        }
+        
+        fta_init(device); /*xxx probably should get error code back put Ted doesn't give me one*/
+        
+        cont=startupdelay+time(0);
+        
+        if (verbose) { fprintf(stderr,"Start startup delay"); }
+        
+        while (cont>time(NULL)) {
+            if (fta_start_service(0)<0) {
+                fprintf(stderr,"%s::error:in processing the msg queue\n",
+                        device);
+                exit(9);
+            }
+            usleep(1000); /* sleep for one millisecond */
+        }
+        
+        if (verbose) { fprintf(stderr,"... Done\n"); }
+        
+        // open the connection to the data source
+        if (gshub!=0) { init_socket();}
+        
+        // wait to process till we get the signal from GSHUB
+        if (get_hub(&mygshub)!=0) {
+            print_error("ERROR:could not find gshub for data source");
+            exit(0);
+        }
+        while(get_startprocessing(mygshub,get_instance_name(),0)!=0) {
+            usleep(100);
+            if (fta_start_service(0)<0) {
+                fprintf(stderr,"%s::error:in processing the msg queue\n",
+                        device);
+                exit(9);
+            }
+        }
+        
+        /* now we enter an endless loop to process data */
+        if (verbose) {
+            fprintf(stderr,"Start processing %s\n",device);
+        }
+        
+        while (1==1) {
+            if (csv_process_file()<0) {
+                fprintf(stderr,"%s::error:in processing packets\n",
+                        device);
+                exit(8);
+            }
+            /* process all messages on the message queue*/
+            if (fta_start_service(0)<0) {
+                fprintf(stderr,"%s::error:in processing the msg queue\n",
+                        device);
+                exit(9);
+            }
+        }
+        return 0;
+    }
+    
+    
diff --git a/src/lib/gscprts/rts_csv2.cc b/src/lib/gscprts/rts_csv2.cc
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/lib/gscprts/rts_env.c b/src/lib/gscprts/rts_env.c
new file mode 100644 (file)
index 0000000..b674ae8
--- /dev/null
@@ -0,0 +1,265 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "lapp.h"
+#include <ipcencoding.h>
+#include <callbackregistries.h>
+#include "fta.h"
+#include "stdio.h"
+#include "stdlib.h"
+#include "rts.h"
+
+#define  POLLING
+
+static struct ringbuf * ru=0;
+
+gs_retval_t print_error(gs_sp_t c) {
+    gslog(LOG_EMERG,"%s",c);
+    return 0;
+}
+
+void *fta_alloc(struct FTA * owner, gs_int32_t size)
+{
+    gs_uint8_t * c;
+    gs_uint32_t x;
+    if ((c=(gs_uint8_t *)malloc(size))==0) return 0;
+    /* touch all memory once to map/reserve it now */
+    for(x=0;x<size;x=x+1024) {
+        c[x]=0;
+    }
+    
+    return (void *) c;
+}
+
+void fta_free(struct FTA * owner , void * mem) {
+    free(mem);
+}
+
+
+void fta_free_all(struct FTA * owner) {
+    gslog(LOG_ERR,"fta_free_all not available ");
+}
+
+/* It is assumed that there is no write activity on all ringbuffers between an alloccate_tuple and
+ * a post_tuple. If there is any the result is unpredictable
+ */
+
+void * allocate_tuple(struct FTA * owner, gs_int32_t size)
+{
+    gs_int32_t state;
+    if (ru!=0) {
+        gslog(LOG_ALERT,"Can't allocate multiple tuples at the same time before posting them");
+        return 0;
+    }
+    
+    if (size>MAXTUPLESZ) {
+        gslog(LOG_ALERT,"Maximum tuple size is %u",MAXTUPLESZ);
+        ru=0;
+        return 0;
+    }
+    
+    if (ftacallback_start_streamid(owner->ftaid.streamid)<0) {
+        gslog(LOG_ALERT,"Post for unkown streamid\n");
+        ru=0;
+        return 0;
+    }
+    
+    /* we grep memory in the first none suspended ringbuffer. Note that if there is no such ringbuffer we might
+     not find any memory*/
+    while ((ru=ftacallback_next_streamid(&state))!=0) {
+#ifdef PRINTMSG
+        fprintf(stderr,"Allocating in ringpuffer %p [%p:%u]"
+                "(%u %u %u) \n",ru,&ru->start,ru->end,ru->reader,ru->writer,
+                ru->length);
+        fprintf(stderr,"Pointer to current writer %p\n",CURWRITE(ru));
+#endif
+        if (state != LFTA_RINGBUF_SUSPEND) {
+#ifdef BLOCKRINGBUFFER
+            if (state == LFTA_RINGBUF_ATOMIC) {
+                while (!SPACETOWRITE(ru)) {
+                    usleep(100);
+                }
+            }
+#endif
+            if (SPACETOWRITE(ru)) {
+                CURWRITE(ru)->f=owner->ftaid;
+                CURWRITE(ru)->sz=size;
+                return &(CURWRITE(ru)->data[0]);
+            } else {
+                shared_memory_full_warning++;
+            }
+        }
+    }
+    ru=0;
+    outtupledrop++;
+       
+    return 0;
+}
+
+void free_tuple(void * data) {
+    ru=0;
+}
+
+gs_retval_t post_tuple(void * tuple) {
+    struct ringbuf * r;
+    FTAID * ftaidp;
+    gs_uint32_t stream_id;
+    struct wakeup_result a;
+    gs_int32_t state;
+    
+    if (ru==0) {
+        gslog(LOG_ALERT,"lfta post tuple posted tupple was never allocated\n");
+        return -1;
+    }
+    
+    
+    if (tuple != ((void*) &(CURWRITE(ru)->data[0]))) {
+        gslog(LOG_ALERT,"lfta post tuple posted tupple which was not allocated"
+              "immediatly before\n");
+        ru=0;
+        return -1;
+    }
+    
+    stream_id=CURWRITE(ru)->f.streamid;
+    
+    if (ftacallback_start_streamid(stream_id)<0) {
+        gslog(LOG_ALERT,"ERROR:Post for unkown streamid\n");
+        ru=0;
+        return -1;
+    }
+    /* now make sure we have space to write in all atomic ringbuffer */
+    while((r=ftacallback_next_streamid(&state))!=0) {
+        if ((state == LFTA_RINGBUF_ATOMIC) && (r!=ru)) {
+#ifdef BLOCKRINGBUFFER
+            while (!SPACETOWRITE(r)) {
+                usleep(10000);
+            }
+#endif
+            if (! SPACETOWRITE(r)) {
+                /* atomic ring buffer and no space so post nothing */
+                               outtupledrop++;
+                               ru=0;
+                               return -1;
+            }
+        }
+    }
+    
+    if (ftacallback_start_streamid(stream_id)<0) {
+        gslog(LOG_ALERT,"Post for unkown streamid\n");
+        ru=0;
+        return -1;
+    }
+    
+    while((r=ftacallback_next_streamid(&state))!=0) {
+#ifdef PRINTMSG
+        fprintf(stderr,"Found additional ring buffer make a copy to rb%p\n",
+                r);
+#endif
+        /* try to post in all none suspended ringbuffer for atomic once
+         * we know we will succeed
+         */
+        if ((r!=ru)&&(state != LFTA_RINGBUF_SUSPEND)) {
+            if (SPACETOWRITE(r)) {
+                CURWRITE(r)->f=CURWRITE(ru)->f;
+                CURWRITE(r)->sz=CURWRITE(ru)->sz;
+                memcpy(&(CURWRITE(r)->data[0]),&(CURWRITE(ru)->data[0]),
+                       CURWRITE(ru)->sz);
+                outtuple++;
+                outbytes=outbytes+CURWRITE(ru)->sz;
+                ADVANCEWRITE(r);
+#ifdef PRINTMSG
+                fprintf(stderr,"Wrote in ringpuffer %p [%p:%u]"
+                        "(%u %u %u) \n",r,&r->start,r->end,r->reader,r->writer,
+                        r->length);
+                fprintf(stderr,"\t%u %u %u\n",CURREAD(r)->next,
+                        CURREAD(r)->f.streamid,CURREAD(r)->sz);
+#endif
+            } else {
+                outtupledrop++;
+            }
+        }
+        if (HOWFULL(r) > 500) {
+            // buffer is at least half full
+            shared_memory_full_warning++;
+#ifdef PRINTMSG
+            fprintf(stderr,"\t\t buffer full\n");
+#endif
+        }
+    }
+    
+    if (HOWFULL(ru) > 500) {
+        // buffer is at least half full
+        shared_memory_full_warning++;
+#ifdef PRINTMSG
+        fprintf(stderr,"\t\t buffer full\n");
+#endif
+    }
+    outtuple++;
+    outbytes=outbytes+CURWRITE(ru)->sz;
+    ADVANCEWRITE(ru);
+    ru=0;
+#ifndef POLLING
+    if (ftacallback_start_wakeup(stream_id)<0) {
+        gslog(LOG_ALERT,"Wakeup for unkown streamid\n");
+        return -1;
+    }
+    a.h.callid=WAKEUP;
+    a.h.size=sizeof(struct wakeup_result);
+    while((ftaidp=ftacallback_next_wakeup())!=0) {
+        if (send_wakeup(*ftaidp)<0) {
+            gslog(LOG_ALERT,"Could not send wakeup\n");
+            return -1;
+        }
+    }
+#endif
+    return 0;
+}
+
+gs_retval_t get_ringbuf_space(struct FTA * f, FTAID * r, gs_int32_t* space, gs_int32_t szr, gs_int32_t tuplesz)
+{
+    gs_int32_t x=0;
+    gs_int32_t state;
+    struct ringbuf * ru;
+    if (ftacallback_start_streamid(f->ftaid.streamid)<0) {
+        gslog(LOG_ALERT,"Space check for unkown streamid\n");
+        return -1;
+    }
+    
+    while ((ru=ftacallback_next_streamid(&state))!=0) {
+        if (szr > x ) {
+            r[x]=ru->destid;
+            space[x]=TUPLEFIT(ru,tuplesz);
+        }
+        x++;
+    }
+    return x;
+}
+
+gs_retval_t set_ringbuf_type(struct FTA * f, FTAID process, gs_int32_t state)
+{
+    
+    if (ftacallback_state_streamid(f->ftaid.streamid,process, state)<0) {
+               gslog(LOG_ALERT,"state change for unkown streamid\n");
+               return -1;
+    }
+    return 0;
+}
+
+
+gs_retval_t tpost_ready() {
+    return 1;
+}
+
diff --git a/src/lib/gscprts/rts_gdat.c b/src/lib/gscprts/rts_gdat.c
new file mode 100644 (file)
index 0000000..7cd4afe
--- /dev/null
@@ -0,0 +1,479 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include "errno.h"
+
+#include "gsconfig.h"
+#include "gshub.h"
+#include "gstypes.h"
+#include "lapp.h"
+#include "fta.h"
+#include "stdio.h"
+#include "stdlib.h"
+#include "packet.h"
+#include "schemaparser.h"
+#include "lfta/rts.h"
+
+
+void rts_fta_process_packet(struct packet * p);
+void rts_fta_done();
+void fta_init(gs_sp_t device);
+
+#define CSVMAXLINE 1000000
+
+static FILE *pd;
+static struct packet cur_packet;
+static gs_sp_t name;
+static gs_uint32_t verbose=0;
+static gs_uint32_t startupdelay=0;
+static gs_uint32_t gshub=0;
+static int socket_desc=0;
+static gs_uint32_t singlefile=0;
+
+static void gdat_replay_check_messages() {
+    if (fta_start_service(0)<0) {
+        print_error("Error:in processing the msg queue for a replay file");
+        exit(9);
+    }
+}
+
+static gs_retval_t gs_read(gs_sp_t buffer, gs_uint32_t length){
+       gs_uint32_t used=0;
+       gs_uint32_t cur;
+    fd_set socket_rset;
+    fd_set socket_eset;
+    struct timeval socket_timeout;
+    int retval;
+    
+    FD_ZERO(&socket_rset);
+    FD_SET(socket_desc,&socket_rset);
+    FD_ZERO(&socket_eset);
+    FD_SET(socket_desc,&socket_eset);
+    // timeout in one millisecon
+    socket_timeout.tv_sec=0;
+    socket_timeout.tv_usec=1000;
+    
+    if ((retval=select(socket_desc+1,&socket_rset,0,&socket_eset,&socket_timeout))<=0) {
+        if (retval==0) {
+            // caught a timeout
+            return -1;
+        }
+        print_error("ERROR:select error in reading data from socket");
+        exit(0);
+    }
+    
+       while(used < length) {
+               if ((cur=read(socket_desc,&(buffer[used]),length-used))<=0) {
+            if (errno==115) return -2; // error code we get if the server closes the connection on us
+                       print_error("ERROR:could not read data from gdat stream");
+                       exit(0);
+               }
+               used+=cur;
+       }
+       return 1;
+}
+
+static gs_uint32_t gs_read_line(gs_sp_t buffer, gs_uint32_t length){
+    gs_uint32_t used=0;
+    gs_uint32_t cur;
+    
+    while((used < (length-1)) && ((used==0)|| (buffer[used-1]!='\n'))) {
+        if ((cur=read(socket_desc,&(buffer[used]),1))<=0) {
+            print_error("ERROR:could not read data from gdat stream");
+            exit(0);
+        }
+        used+=cur;
+    }
+       buffer[used]=0;
+       return 1;
+}
+
+
+static void init_socket() {
+       endpoint gshub;
+       endpoint srcinfo;
+       struct sockaddr_in server;
+    gs_int32_t parserversion;
+    gs_uint32_t schemalen;
+    static char * asciischema=0;
+       gs_int8_t buf[1024];
+       
+       if (get_hub(&gshub)!=0) {
+               print_error("ERROR:could not find gshub for data source");
+               exit(0);
+       }
+    
+       if (get_streamsource(gshub,name,&srcinfo,1) !=0) {
+               print_error("ERROR:could not find data source for stream\n");
+               exit(0);
+       }
+    
+       socket_desc = socket(AF_INET , SOCK_STREAM , 0);
+    if (socket_desc == -1)
+    {
+        print_error("ERROR:could not create socket for data stream");
+               exit(0);
+    }
+       server.sin_addr.s_addr = srcinfo.ip;
+    server.sin_family = AF_INET;
+    server.sin_port = srcinfo.port;
+    
+       if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
+    {
+               print_error("ERROR: could not open connection to data source");
+               exit(0);
+       }
+    
+    
+       gs_read_line(buf,1024);
+       if (strncmp(buf,"GDAT",4)!=0) {
+               print_error("ERROR: not a GDAT stream\n");
+        exit(0);
+    }
+       gs_read_line(buf,1024);
+       if (sscanf(buf,"VERSION:%u\n",&parserversion)!=1) {
+        print_error("ERROR: no GDAT VERSION given\n");
+        exit(0);
+    }
+       gs_read_line(buf,1024);
+    if (sscanf(buf,"SCHEMALENGTH:%u\n",&schemalen)!=1) {
+        print_error("ERROR: no GDAT SCHEMALENGTH given\n");
+        exit(0);
+    }
+    if (schemaparser_accepts_version(parserversion)!=1) {
+        print_error("gdatinput::wrong gdat version\n");
+        exit(0);
+    }
+    if ((asciischema=malloc(schemalen))==0) {
+        print_error("gdatinput::could not allocate memory for schema\n");
+        exit(0);
+    }
+    if (gs_read(asciischema,schemalen)!=1) {
+        print_error("gdatinput::could not read schema from file\n");
+        exit(0);
+    }
+    if ((cur_packet.record.gdat.schema=ftaschema_parse_string(asciischema))<0) {
+        print_error("gdatinput::could not parse schema\n");
+        exit(0);
+    }
+    cur_packet.record.gdat.numfields=ftaschema_tuple_len(cur_packet.record.gdat.schema);
+}
+
+
+static void next_file() {
+    struct stat s;
+    gs_int32_t parserversion;
+    gs_uint32_t schemalen;
+       static char * asciischema=0;
+    
+    if (verbose) {
+        fprintf(stderr,"Opening %s\n",name);
+    }
+    while (lstat(name,&s)!=0) {
+        if (errno!=ENOENT) {
+            print_error("gdat::lstat unexpected return value");
+            exit(10);
+        }
+        gdat_replay_check_messages();
+        usleep(10000);
+    }
+    
+    
+    if (pd!=0) {
+        fclose(pd);
+        if (asciischema!=0) free(asciischema);
+        if (cur_packet.record.gdat.schema>=0) {
+            ftaschema_free(cur_packet.record.gdat.schema);
+        }
+    }
+    
+    if ((pd=fopen(name,"r"))==0) return;
+       if (singlefile==0) {
+               unlink(name);
+       }
+    
+       if (fscanf(pd,"GDAT\nVERSION:%u\nSCHEMALENGTH:%u\n",&parserversion,&schemalen)!=2) {
+               if (verbose) fprintf(stderr,"gdatinput::could not parse GDAT header\n");
+               fclose(pd);
+               pd=0;
+               return;
+    }
+    if (schemaparser_accepts_version(parserversion)!=1) {
+        if (verbose) fprintf(stderr,"gdatinput::wrong gdat version\n");
+        fclose(pd);
+        pd=0;
+               return;
+       }
+       if ((asciischema=malloc(schemalen))==0) {
+        if (verbose) fprintf(stderr,"gdatinput::could not allocate memory for schema\n");
+               fclose(pd);
+               pd=0;
+        return;
+    }
+       if (fread(asciischema,schemalen,1,pd)!=1) {
+        if (verbose) fprintf(stderr,"gdatinput::could not read schema from file\n");
+               fclose(pd);
+               pd=0;
+        return;
+    }
+       if ((cur_packet.record.gdat.schema=ftaschema_parse_string(asciischema))<0) {
+        if (verbose) fprintf(stderr,"gdatinput::could not parse schema\n");
+               fclose(pd);
+               pd=0;
+               return;
+       }
+       cur_packet.record.gdat.numfields=ftaschema_tuple_len(cur_packet.record.gdat.schema);
+}
+
+static gs_retval_t gdat_replay_init(gs_sp_t device)
+{
+    gs_sp_t  verbosetmp;
+    gs_sp_t  delaytmp;
+    gs_sp_t  gshubtmp;
+    gs_sp_t  singlefiletmp;
+
+    if ((name=get_iface_properties(device,"filename"))==0) {
+               print_error("csv_init::No GDAT \"Filename\" defined");
+               exit(0);
+       }
+    
+    if ((verbosetmp=get_iface_properties(device,"verbose"))!=0) {
+        if (strncmp(verbosetmp,"TRUE",4)==0) {
+            verbose=1;
+            fprintf(stderr,"VERBOSE ENABLED\n");
+        } else {
+            fprintf(stderr,"VERBOSE DISABLED\n");
+        }
+    }
+    if ((singlefiletmp=get_iface_properties(device,"singlefile"))!=0) {
+        if (strncmp(singlefiletmp,"TRUE",4)==0) {
+            singlefile=1;
+            if (verbose)
+                fprintf(stderr,"SINGLEFILE ENABLED\n");
+        } else {
+            if (verbose)
+                fprintf(stderr,"SINGLEFILE DISABLED\n");
+        }
+    }
+
+    if ((delaytmp=get_iface_properties(device,"startupdelay"))!=0) {
+        if (verbose) {
+            fprintf(stderr,"Startup delay of %u seconds\n",atoi(get_iface_properties(device,"startupdelay")));
+        }
+        startupdelay=atoi(get_iface_properties(device,"startupdelay"));
+    }
+    if ((gshubtmp=get_iface_properties(device,"gshub"))!=0) {
+        if (verbose) {
+            fprintf(stderr,"GDAT format using gshub\n");
+        }
+        gshub=1;
+    }
+    
+    cur_packet.ptype=PTYPE_GDAT;
+    return 0;
+}
+
+static gs_retval_t gdat_read_socket(){
+    gs_uint32_t nsz,sz;
+    gs_retval_t retval;
+    if ((retval=gs_read((gs_sp_t)&nsz,sizeof(gs_uint32_t)))<0) {
+        return retval;
+    }
+    sz=ntohl(nsz);
+    if (sz>MAXTUPLESZ) {
+        if (verbose) {
+            fprintf(stderr,"INTERNAL ERROR tuple to long for fixed buffer. Tuple sz %u\n",
+                    (sz));
+        }
+        print_error("Error::Illegal tuple received");
+        exit(0);
+    }
+    
+    cur_packet.record.gdat.datasz=sz;
+    
+    if (gs_read((gs_sp_t)cur_packet.record.gdat.data,(sz))!=1) {
+        if (verbose){
+            fprintf(stderr,"UNEXPECTED END OF FILE. Tryed to read tuple of size %u\n",
+                    (sz));
+        }
+        print_error("Error::Illegal tuple received");
+        exit(0);
+    }
+    cur_packet.systemTime=time(0);
+    return 0;
+}
+
+static gs_retval_t  gdat_read_tuple(){
+    gs_uint32_t nsz,sz;
+
+    if (pd==0) next_file();
+again:
+    while((pd==0) || (fread(&nsz,sizeof(gs_uint32_t),1,pd)!=1)) {
+        if (singlefile==1) {
+            if(verbose) {
+                fprintf(stderr,"SINGLEFILE PROCESSING DONE!\n");
+            }
+            rts_fta_done();
+            if (verbose) {
+                fprintf(stderr,"RTS SAYS BY\n");
+            }
+            while(1==1) sleep(1);
+        } else {
+            next_file(); 
+        }
+    }
+    sz=ntohl(nsz);
+    if (sz>MAXTUPLESZ) {
+        if (verbose) {
+               fprintf(stderr,"INTERNAL ERROR tuple to long for fixed buffer. Tuple sz %u\n",
+                    (sz));
+        }
+        fclose(pd);
+        pd=0;
+        goto again;
+    }
+    
+    cur_packet.record.gdat.datasz=sz;
+       
+    if (fread(cur_packet.record.gdat.data,(sz),1,pd)!=1) {
+       if (verbose){
+            fprintf(stderr,"UNEXPECTED END OF FILE. Tryed to read tuple of size %u\n",
+                    (sz));
+        }
+        fclose(pd);
+        pd=0;
+        goto again;
+    }
+    cur_packet.systemTime=time(0);
+    return 0;
+}
+
+static gs_retval_t gdat_process_file()
+{
+       unsigned cnt=0;
+       static unsigned totalcnt=0;
+       for(cnt=0;cnt<50000;cnt++) {
+               if (gshub!=0) {
+            gs_retval_t retval;
+            retval=gdat_read_socket();
+                       if (retval==-1) return 0; // got a timeout so service message queue
+            if ((retval==-2) || (ftaschema_is_eof_tuple(cur_packet.record.gdat.schema,(void *)cur_packet.record.gdat.data))) {
+                // we signal that everything is done if we either see an EOF tuple OR the socket is closed by the peer
+                if (verbose)
+                    fprintf(stderr,"Done processing waiting for things to shut down\n");
+                rts_fta_done();
+                // now just service message queue until we get killed or loose connectivity
+                while (0==0) {
+                    fta_start_service(0); // service all waiting messages
+                    usleep(1000); // sleep a millisecond
+                }
+            }
+               } else {
+                       gdat_read_tuple();
+               }
+               rts_fta_process_packet(&cur_packet);
+       }
+       totalcnt=totalcnt+cnt;
+       if (verbose) {
+               fprintf(stderr,"Processesd %u tuple\n",totalcnt);
+       }
+       return 0;
+}
+
+gs_retval_t main_gdat(gs_int32_t devicenum, gs_sp_t device, gs_int32_t mapcnt, gs_sp_t map[]) {
+    gs_uint32_t cont;
+    endpoint mygshub;
+    
+    gdat_replay_init(device);
+    
+    /* initalize host_lib */
+    if (verbose) {
+        fprintf(stderr,"Init LFTAs for %s\n",device);
+    }
+    
+    if (hostlib_init(LFTA,0,devicenum,mapcnt,map)<0) {
+        fprintf(stderr,"%s::error:could not initiate host lib for clearinghouse\n",
+                device);
+        exit(7);
+    }
+    
+    fta_init(device);
+    
+    cont=startupdelay+time(0);
+    
+    if (verbose) { fprintf(stderr,"Start startup delay"); }
+    
+    while (cont>time(NULL)) {
+        if (fta_start_service(0)<0) {
+            fprintf(stderr,"%s::error:in processing the msg queue\n",
+                    device);
+            exit(9);
+        }
+        usleep(1); /* sleep for one millisecond */
+    }
+    
+    if (verbose) { fprintf(stderr,"... Done\n"); }
+    
+    // open the connection to the data source
+    
+    if (gshub!=0) { init_socket();}
+    
+    // wait to process till we get the signal from GSHUB
+       if (get_hub(&mygshub)!=0) {
+               print_error("ERROR:could not find gshub for data source");
+               exit(0);
+       }
+    while(get_startprocessing(mygshub,get_instance_name(),0)!=0) {
+        usleep(100);
+        if (fta_start_service(0)<0) {
+            fprintf(stderr,"%s::error:in processing the msg queue\n",
+                    device);
+            exit(9);
+        }
+    }
+
+    /* now we enter an endless loop to process data */
+    if (verbose) {
+       fprintf(stderr,"Start processing %s\n",device);
+    }
+    
+    while (1==1) {
+        /* proess packets data stream*/
+        if (gdat_process_file()<0) {
+            fprintf(stderr,"%s::error:in processing packets\n",
+                    device);
+            exit(8);
+        }
+        /* process all messages on the message queue*/
+        if (fta_start_service(0)<0) {
+            fprintf(stderr,"%s::error:in processing the msg queue\n",
+                    device);
+            exit(9);
+        }
+    }
+    return 0;
+}
+
+
+
diff --git a/src/lib/gscprts/rts_main.c b/src/lib/gscprts/rts_main.c
new file mode 100644 (file)
index 0000000..97126c7
--- /dev/null
@@ -0,0 +1,192 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "gshub.h"
+
+#include "lapp.h"
+#include "fta.h"
+#include "lfta/rts.h"
+
+#include "stdio.h"
+#include "stdlib.h"
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/socket.h>
+
+gs_retval_t main_csv(gs_int32_t devicenum, gs_sp_t device, gs_int32_t mapcnt, gs_sp_t map[]);
+gs_retval_t main_csv2(gs_int32_t devicenum, gs_sp_t device, gs_int32_t mapcnt, gs_sp_t map[]);
+gs_retval_t main_gdat(gs_int32_t devicenum, gs_sp_t device, gs_int32_t mapcnt, gs_sp_t map[]);
+
+int main (int argc, char* argv[]) {
+    gs_int32_t pid;
+    gs_int32_t x;
+    gs_int32_t y;
+    gs_sp_t* device;
+    gs_int32_t devcnt=0;
+    gs_sp_t* mappings;
+    gs_int32_t mapcnt=0;
+    gs_sp_t* lmap;
+    gs_int32_t lmapcnt=0;
+    FILE * cfg_file;
+    gs_int32_t tip1,tip2,tip3,tip4;
+    endpoint gshub;
+    gs_sp_t instance_name;
+    
+    
+       gsopenlog(argv[0]);
+    
+    if (setpgid(0,0)<0) {
+        gslog(LOG_EMERG,"Could not set process group id of rts");
+        exit(1);
+    }
+       
+    if (argc<4) {
+               gslog(LOG_EMERG,"Wrong arguments at startup");
+        exit(1);
+    }
+    
+    /* allocate more than enough for each array */
+    if ((device=(gs_sp_t*)malloc(sizeof(gs_sp_t*) * argc))==0) {
+        gslog(LOG_EMERG,"malloc error");
+        exit(1);
+    }
+    if ((mappings=(gs_sp_t*)malloc(sizeof(gs_sp_t*) * argc))==0) {
+        gslog(LOG_EMERG,"malloc error");
+        exit(1);
+    }
+    if ((lmap=(gs_sp_t*)malloc(sizeof(gs_sp_t*) * argc))==0) {
+        gslog(LOG_EMERG,"malloc error");
+        exit(1);
+    }
+    
+    /* parse the arguments */
+    
+    if ((sscanf(argv[1],"%u.%u.%u.%u:%hu",&tip1,&tip2,&tip3,&tip4,&(gshub.port))!=5)) {
+        gslog(LOG_EMERG,"HUB IP NOT DEFINED");
+        exit(1);
+    }
+    gshub.ip=htonl(tip1<<24|tip2<<16|tip3<<8|tip4);
+    gshub.port=htons(gshub.port);
+    instance_name=strdup(argv[2]);
+    if (set_hub(gshub)!=0) {
+        gslog(LOG_EMERG,"Could not set hub");
+        exit(1);
+    }
+    if (set_instance_name(instance_name)!=0) {
+        gslog(LOG_EMERG,"Could not set instance name");
+        exit(1);
+    }
+    
+    for(x=3;x<argc;x++) {
+        if (strncmp("-D",argv[x],2)==0) {
+            /* macro definition */
+            y=2;
+            while((y<(strlen(argv[x])-1))&&(argv[x][y]!='=')) y++;
+            
+            
+            if (y<(strlen(argv[x])-1)) {
+                /* if that is not true the define is empty and
+                 we ignore it otherwise we set the = to 0 to
+                 make two strings out of it*/
+                argv[x][y]=0;
+                mappings[mapcnt]=&(argv[x][2]);
+                mapcnt++;
+            }
+        } else {
+            /* device definition */
+            device[devcnt]=argv[x];
+            devcnt++;
+        }
+    }
+    
+    if (devcnt==0) {
+        gslog(LOG_EMERG,"at least one device has to be specified");
+        exit(1);
+    }
+       
+    
+    /* now startup all the device dependend processes. */
+    
+    for (x=0;x<devcnt;x++) {
+        if ((pid=fork())==-1) {
+            gslog(LOG_EMERG,"fork error");
+            exit(1);
+        }
+        
+        if (pid==0) {
+            gs_sp_t interfacetype;
+            /* wait for clearinghouse to finish startup */
+            sleep(2);
+            for(y=0;y<mapcnt;y++) {
+                if (strcmp(device[x],&mappings[y][strlen(mappings[y])+1])==0) {
+                    /* point to the second string */
+                    lmap[lmapcnt]=mappings[y];
+                    lmapcnt++;
+                }
+            }
+            /* the devicename always matches */
+            lmap[lmapcnt]=device[x];
+            lmapcnt++;
+            
+            if ((interfacetype=get_iface_properties(device[x],(gs_sp_t)"interfacetype"))==0) {
+                gslog(LOG_EMERG,"Interface Type not configured but required");
+                exit(1);
+            }
+            
+            if (strcmp(interfacetype,"CSV")==0) {
+                main_csv(x,device[x],lmapcnt,lmap);           
+            } else {
+                       if (strncmp(interfacetype,"GDAT",4)==0) {
+                    main_gdat(x,device[x],lmapcnt,lmap);
+                } else {
+                    gslog(LOG_ERR,"UNKNOWN InterfaceType\n");
+                    exit(0);
+                }
+            }
+            
+            /* should never return */
+            gslog(LOG_EMERG,"lfta init returned");
+            exit(1);       
+        }
+    }
+    
+    /* initalize host_lib */
+    
+    gslog(LOG_INFO,"Init host lib in clearinghouse");
+    
+    if (hostlib_init(CLEARINGHOUSE,0,DEFAULTDEV,0,0)<0) {
+        gslog(LOG_EMERG,"%s::error:could not initiate host lib for clearinghouse\n",
+              argv[0]);
+        exit(7);
+    }
+    
+    
+    
+    /* start processing messages should never return*/
+    if (fta_start_service(-1)<0) {
+        gslog(LOG_EMERG,"error in processing the msg queue");
+        exit(9);
+    }
+    gslog(LOG_EMERG,"%s::error:start service returned");
+    return 0;
+}
+
diff --git a/src/tools/Makefile b/src/tools/Makefile
new file mode 100644 (file)
index 0000000..500e0b2
--- /dev/null
@@ -0,0 +1,110 @@
+# ------------------------------------------------
+#   Copyright 2014 AT&T Intellectual Property
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+# -------------------------------------------
+
+CC= gcc -O4 -g   -I ../../include -D_FILE_OFFSET_BITS=64 
+
+INCDIR=../../include
+
+# we need to suppress writable strings warnings on Mac for flex/bison generated C++ code
+OS= $(shell uname -s)
+ifeq ($(OS),Darwin)
+       WARN=-Wno-deprecated-writable-strings
+endif
+ifeq ($(OS),Linux)
+       WARN=-Wno-write-strings
+endif
+
+all:   gdatcat gsprintconsole gsprintconsole_ves gsgdatprint  gdat2ascii gsexit gssinksim process_logs ascii2gdat
+
+install: all
+       cp gsprintconsole gsprintconsole_ves  gsgdatprint  gdat2ascii  process_logs gsexit ascii2gdat ../../bin/ 
+
+gsgdatprint: gsgdatprint.o ../../lib/libgscphostaux.a ../../lib/libgscphost.a ../../lib/libgscpinterface.a ../../lib/libgscpapp.a
+       g++ -g -o gsgdatprint gsgdatprint.o -L../../lib  -lgscpapp  -lgscphostaux -lgscphost -lgscpinterface -lgscplftaaux -lclearinghouse -lgscpaux 
+
+gsgdatprint.o: gsgdatprint.c
+
+
+gsexit: gsexit.o ../../lib/libgscphostaux.a ../../lib/libgscphost.a ../../lib/libgscpinterface.a ../../lib/libgscpapp.a
+       g++ -g -o gsexit gsexit.o -L../../lib  -lgscpapp  -lgscphostaux -lgscphost -lgscpinterface -lgscplftaaux -lclearinghouse -lgscpaux 
+
+gsexit.o: gsexit.c
+
+
+gsgdatprint.c: $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+gdat2ascii: gdat2ascii.o ../../lib/libgscphostaux.a  ../../lib/libgscpinterface.a 
+       g++ -g -o gdat2ascii gdat2ascii.o -L../../lib   -lgscphostaux  -lgscpinterface -lgscpaux 
+
+gdat2ascii.o: gdat2ascii.c
+
+gdat2ascii.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+gsprintconsole: gsprintconsole.o ../../lib/libgscphostaux.a ../../lib/libgscphost.a ../../lib/libgscpinterface.a ../../lib/libgscpapp.a
+       g++ -g -o gsprintconsole gsprintconsole.o -L../../lib -lgscpapp  -lgscphostaux -lgscphost -lgscpinterface -lgscplftaaux -lclearinghouse -lgscpaux  
+
+gsprintconsole_ves: gsprintconsole_ves.o ../../lib/libgscphostaux.a ../../lib/libgscphost.a ../../lib/libgscpinterface.a ../../lib/libgscpapp.a
+       g++ -g -o gsprintconsole_ves gsprintconsole_ves.o -L../../lib -lgscpapp  -lgscphostaux -lgscphost -lgscpinterface -lgscplftaaux -lclearinghouse -lgscpaux  
+
+gsprintconsole.o: gsprintconsole.c
+
+gsprintconsole.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+gsprintconsole_ves.o: gsprintconsole_ves.c
+
+gsprintconsole_ves.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+gssinksim: gssinksim.o ../../lib/libgscphostaux.a ../../lib/libgscphost.a ../../lib/libgscpinterface.a ../../lib/libgscpapp.a
+       g++ -g -o gssinksim gssinksim.o -L../../lib -lgscpapp  -lgscphostaux -lgscphost -lgscpinterface -lgscplftaaux -lclearinghouse -lgscpaux 
+
+gssinksim.o: gssinksim.c
+
+gssource: gssource.o
+       g++ -g -o gssource gssource.o -L../../lib   -lgscpaux 
+
+gssource.o: gssource.c
+
+gdatcat: gdatcat.o
+       $(CC) -o gdatcat gdatcat.o
+
+process_logs: process_logs.o xml.tab.o xmllexer.o xml_t.o
+       g++ -g -o process_logs process_logs.o xml.tab.o xmllexer.o xml_t.o
+
+xml.tab.o: xml.tab.cc
+       g++ $(WARN) -g -o xml.tab.o -c xml.tab.cc
+
+xmllexer.o: xmllexer.cc
+       g++ $(WARN) -g -o xmllexer.o -c xmllexer.cc
+
+xml_t.o: xml_t.cc
+       g++ -g -o xml_t.o -c xml_t.cc
+
+process_logs.o: process_logs.cc
+       g++ -g -o process_logs.o -c process_logs.cc
+
+ascii2gdat: ascii2gdat.o ../../lib/libgscpinterface.a
+       g++ -g -o ascii2gdat ascii2gdat.o -L../../lib   -lgscphostaux  -lgscpinterface -lgscpaux
+
+ascii2gdat.o: ascii2gdat.c
+
+ascii2gdat.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+gdatcat.o: gdatcat.c
+
+gdatcat.c : $(INCDIR/gsconfig.h) $(INCDIR/gstypes.h)
+
+clean:
+       rm -ff ../../bin/gsprintconsole ../../bin/gsprintconsole_ves  ../../bin/gsgdatprint  ../../bin/gdat2ascii  ../../bin/process_logs ../../bin/gsexit ../../bin/ascii2gdat gsprintconsole gsprintconsole_ves  gsgdatprint  gdat2ascii gdat2hex process_logs gsexit gssinksim gdatcat ascii2gdat *.o
+
diff --git a/src/tools/ascii2gdat.c b/src/tools/ascii2gdat.c
new file mode 100644 (file)
index 0000000..367c652
--- /dev/null
@@ -0,0 +1,268 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <schemaparser.h>
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <math.h>
+
+
+FILE * ifd;
+FILE * ofd;
+FILE * sfd;
+
+#define MAX_GDAT_HEADER 10000
+
+gs_int8_t buf[2*MAXTUPLESZ];
+gs_int8_t schema_buf[MAX_GDAT_HEADER];
+gs_int8_t header_buf[MAX_GDAT_HEADER];
+
+
+gs_retval_t read_tuple(gs_uint32_t * sz, gs_sp_t data, gs_int32_t maxlen) {
+    gs_uint32_t nsz;
+    static gs_uint32_t read=0;
+again:
+    if (fread(&nsz,sizeof(gs_uint32_t),1,ifd)!=1) {
+        
+        exit(0);
+    }
+    read=read+sizeof(gs_uint32_t);
+    *sz=ntohl(nsz);
+    if ((*sz)>maxlen) {
+        fprintf(stderr,"INTERNAL ERROR tuple to long for fixed buffer. Tuple sz %u\n",
+                (*sz));
+        *sz=0;
+        return 0;
+    }
+    if (*sz==0) goto again;
+    if (fread(data,(*sz),1,ifd)!=1) {
+        fprintf(stderr,"UNEXPECTED END OF FILE. Tried to read tuple of size %u\n",
+                (*sz));
+        exit(0);
+    }
+    read=read+*sz;
+    return 0;
+}
+
+int main(int argc, char** argv) {
+    gs_schemahandle_t schema;
+    
+    gs_uint32_t rsize;
+    gs_int8_t rbuf[2*MAXTUPLESZ];
+    gs_int8_t wbuf[2*MAXTUPLESZ];
+    
+    gs_int32_t numberoffields;
+    gs_int32_t verbose=0;
+    gs_int32_t y;
+    gs_int32_t parserversion;
+    gs_uint32_t schemalen;
+    gs_sp_t me;
+    gs_int32_t ch;
+    
+    me=argv[0];
+    
+    if (argc<2) {
+        fprintf(stderr,
+                "%s::usage: %s -v -x <schema_file_name> <input_file_name> <output_file_name>\n",
+                me,me);
+        exit(1);
+    }
+    
+    while ((ch = getopt(argc, argv, "vx")) != -1) {
+        switch(ch) {
+            case 'v':
+                verbose=1;
+                break;
+            case 'x':
+                verbose=2;
+        }
+    }
+    argc -= optind;
+    if (argc < 1) {
+        fprintf(stderr,"%s::usage: %s -v -x <schema_file_name> <input_file_name> <output_file_name>\n",
+                me,me);
+        exit(1);
+    }
+    argv += optind;
+
+    if ((sfd=fopen(argv[0],"r"))==0) {
+        fprintf(stderr,"%s::error:could not open schema file %s\n",
+                me,argv[0]);
+        exit(1);
+    }
+
+    schemalen = fread(schema_buf, 1, MAX_GDAT_HEADER, sfd);
+    schema_buf[schemalen] = 0;
+    schema = ftaschema_parse_string_prot(schema_buf);
+    if (schema < 0) {
+        fprintf(stderr,"%s::error:unable to parse schema file %s\n",
+                me,argv[0]);
+        exit(1);        
+    }
+    fclose(sfd);
+    
+    argv++;
+    
+    if ((strcmp(argv[0],"-")!=0)&&(strcmp(argv[0],"stdin")!=0)) {
+        if ((ifd=fopen(argv[0],"r"))==0) {
+            fprintf(stderr,"%s::error:could not open input file %s\n",
+                    me,argv[0]);
+            exit(1);
+        }
+    } else {
+        ifd = stdin;
+    }
+
+    argv++;
+
+    if ((ofd=fopen(argv[0],"wb"))==0) {
+        fprintf(stderr,"%s::error:could not open output file %s\n",
+                me,argv[0]);
+        exit(1);
+    }
+    
+    parserversion = get_schemaparser_version();
+
+    // write GDAT header
+       sprintf(header_buf,"GDAT\nVERSION:%u\nSCHEMALENGTH:%lu\n",
+                       parserversion,schemalen+1);
+    // need to get ASCII version of schema
+       fwrite(header_buf,strlen(header_buf),1,ofd);
+       fwrite(schema_buf,schemalen+1,1,ofd);
+
+    /////////////////////////////////////////////
+
+    
+    if ((numberoffields=ftaschema_tuple_len(schema))<0) {
+        fprintf(stderr,"%s::error:could not get number of fields in schema\n",
+                me);
+        exit(1);
+    }
+    if (verbose==1) {
+        for(y=0; y<numberoffields;y++) {
+            printf("%s",ftaschema_field_name(schema,y));
+            if (y<numberoffields-1) printf("|");
+        }
+        printf("\n");
+    }
+
+    unsigned long long tup_cnt = 0;
+
+    while(!feof(ifd)) {
+        fgets(rbuf,2*MAXTUPLESZ,ifd);
+        
+        gs_uint32_t tuple_pos = ftaschema_get_tuple_metadata_offset(schema) + 1;     // position to copy string payload
+
+        char* field = strtok(rbuf, ","); 
+        y = 0;
+        do {
+            gs_int32_t field_type = ftaschema_get_field_type_by_index(schema, y);
+            gs_int32_t field_offset = ftaschema_get_field_offset_by_index(schema, y);
+
+            gs_int32_t i;
+            gs_uint32_t ui;      
+            gs_uint64_t ul;   
+            gs_uint64_t l; 
+            gs_float_t f,intpart,fractpart;     
+            struct timeval t;  
+            struct vstring32 vs;           
+            struct hfta_ipv6_str ip6;       
+            gs_uint32_t v[8];     
+               unsigned ip1,ip2,ip3,ip4;
+
+            switch (field_type) {
+                case BOOL_TYPE:    
+                    ui=(strncasecmp("TRUE",field,4)==0);
+                    memcpy(wbuf+field_offset,&ui,sizeof(ui));                                    
+                    break;
+                case INT_TYPE:
+                    sscanf(field,"%d",&i);
+                    memcpy(wbuf+field_offset,&i,sizeof(i));
+                    break;
+                case UINT_TYPE:
+                case USHORT_TYPE:                            
+                    sscanf(field,"%u",&ui);
+                    memcpy(wbuf+field_offset,&ui,sizeof(ui));                                    
+                    break;
+                case ULLONG_TYPE:
+                    sscanf(field,"%llu",&ul);
+                    memcpy(wbuf+field_offset,&ul,sizeof(ul));                    
+                    break;
+                case LLONG_TYPE:
+                    sscanf(field,"%ldu",&l);
+                    memcpy(wbuf+field_offset,&l,sizeof(l));                        
+                    break;
+                case FLOAT_TYPE:
+                    sscanf(field,"%f",&f);
+                    memcpy(wbuf+field_offset,&f,sizeof(f));                        
+                    break;
+                case VSTR_TYPE:
+                {
+                    if (!strcmp(field, " "))
+                        field[0] = 0;
+                    vs.length = strlen(field);
+                    vs.offset = tuple_pos;
+                    vs.reserved = 0;      
+                    memcpy(wbuf+vs.offset, field, vs.length);
+                    memcpy(wbuf+field_offset,&vs,sizeof(vs));  
+                    tuple_pos += vs.length;
+                }
+                    break;   
+                case IP_TYPE:
+                    sscanf(field,"%u.%u.%u.%u",&ip1,&ip2,&ip3,&ip4);
+                       ui=(ip1<<24)|(ip2<<16)|(ip3<<8)|ip4;
+                    memcpy(wbuf+field_offset,&ui,sizeof(ui));                        
+                    break;  
+                case IPV6_TYPE:
+                    sscanf(field,"%x:%x:%x:%x:%x:%x:%x:%x",&v[0],&v[1],&v[2],&v[3],&v[4],&v[5],&v[6],&v[7]);
+                       ip6.v[0]=htonl(v[0]<<16|v[1]);
+                       ip6.v[1]=htonl(v[2]<<16|v[3]);
+                       ip6.v[2]=htonl(v[4]<<16|v[5]);
+                       ip6.v[3]=htonl(v[6]<<16|v[7]);
+                    memcpy(wbuf+field_offset,&ip6,sizeof(ip6));                        
+                    break;                                                        
+                case TIMEVAL_TYPE:
+                    sscanf(field,"%lf sec",&f);  
+                    fractpart=modf(f,&intpart);                  
+                    t.tv_sec = intpart;
+                    t.tv_usec = fractpart * 1000000;
+                    memcpy(wbuf+field_offset,&t,sizeof(t));                        
+                    break; 
+                default:
+                    break;
+            }
+            y++;
+            field = strtok(NULL, ",");            
+        } while (y < numberoffields);
+        gs_uint32_t tup_len = htonl(tuple_pos);
+        fwrite(&tup_len,sizeof(gs_uint32_t),1,ofd);
+        fwrite(wbuf,tuple_pos,1,ofd);
+        tup_cnt++;
+
+        if (tup_cnt % 1000000 == 0)
+            printf("dumped %llu tuples\n", tup_cnt);
+    }
+
+    fclose(ifd);
+    fclose(ofd);
+    if (verbose!=0) fflush(stdout);
+
+    exit(0);
+}
+
diff --git a/src/tools/gdat2ascii.c b/src/tools/gdat2ascii.c
new file mode 100644 (file)
index 0000000..8381ed0
--- /dev/null
@@ -0,0 +1,275 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <schemaparser.h>
+#include "gsconfig.h"
+#include "gstypes.h"
+
+FILE * ifd;
+
+gs_retval_t read_tuple(gs_uint32_t * sz, gs_sp_t data, gs_int32_t maxlen) {
+    gs_uint32_t nsz;
+    static gs_uint32_t read=0;
+again:
+    if (fread(&nsz,sizeof(gs_uint32_t),1,ifd)!=1) {
+        
+        exit(0);
+    }
+    read=read+sizeof(gs_uint32_t);
+    *sz=ntohl(nsz);
+    if ((*sz)>maxlen) {
+        fprintf(stderr,"INTERNAL ERROR tuple to long for fixed buffer. Tuple sz %u\n",
+                (*sz));
+        *sz=0;
+        return 0;
+    }
+    if (*sz==0) goto again;
+    if (fread(data,(*sz),1,ifd)!=1) {
+        fprintf(stderr,"UNEXPECTED END OF FILE. Tryed to read tuple of size %u\n",
+                (*sz));
+        exit(0);
+    }
+    read=read+*sz;
+    return 0;
+}
+
+int main(int argc, char** argv) {
+    gs_uint32_t streamid;
+    gs_schemahandle_t schema;
+    
+    gs_uint32_t rstreamid;
+    gs_uint32_t rsize;
+    gs_int8_t rbuf[2*MAXTUPLESZ];
+    
+    gs_int32_t numberoffields;
+    gs_int32_t verbose=0;
+    gs_int32_t truncate=-1;
+    gs_int32_t y;
+    gs_int32_t parserversion;
+    gs_uint32_t schemalen;
+    gs_sp_t asciischema;
+    gs_sp_t me;
+    gs_int32_t ch;
+    gs_uint32_t scramble =0;
+    gs_uint32_t schema_only =0;
+    
+    /* initialize host library and the sgroup  */
+    
+    me=argv[0];
+    
+    if (argc<2) {
+        fprintf(stderr,
+                "%s::usage: %s -v -x -t <int> -s <int> <uncompressed_file_name>\n",
+                me,me);
+        exit(1);
+    }
+    
+    while ((ch = getopt(argc, argv, "ps:t:vx")) != -1) {
+        switch(ch) {
+            case 'p':
+                schema_only=1;
+                break;
+            case 'v':
+                verbose=1;
+                break;
+            case 'x':
+                verbose=2;
+                break;
+            case 't':
+                truncate=atoi(optarg);
+                break;
+            case 's':
+                sscanf(optarg,"%u",&scramble);
+        }
+    }
+    argc -= optind;
+    if (argc < 1) {
+        fprintf(stderr,"%s::usage: %s -v -x -t <int> <uncompressed_file_name>\n",
+                me,me);
+        exit(1);
+    }
+    argv += optind;
+    
+    if ((strcmp(argv[0],"-")!=0)&&(strcmp(argv[0],"stdin")!=0)) {
+        if ((ifd=fopen(argv[0],"r"))==0) {
+            fprintf(stderr,"%s::error:could not open input file %s\n",
+                    me,argv[0]);
+            exit(1);
+        }
+    } else {
+        ifd = stdin;
+    }
+    
+    if (fscanf(ifd,"GDAT\nVERSION:%u\nSCHEMALENGTH:%u\n",&parserversion,&schemalen)!=2) {
+        fprintf(stderr,"%s::error:unknown file type for file %s\n",
+                me,argv[0]);
+        exit(1);
+    }
+    
+    if (schemaparser_accepts_version(parserversion)!=1) {
+        fprintf(stderr,"%s::error: wrong parser version %u for file %s\n",
+                me,parserversion,argv[0]);
+        exit(1);
+    }
+    
+    if ((asciischema=malloc(schemalen))==0) {
+        fprintf(stderr,"%s::error: could not allocate schema buffer of sz %u "
+                "for file %s\n",
+                me,schemalen,argv[0]);
+        exit(1);
+    }
+    
+    if (fread(asciischema,schemalen,1,ifd)!=1) {
+        fprintf(stderr,"%s::error: could not read schema buffer of sz %u "
+                "for file %s\n",
+                me,schemalen,argv[0]);
+        exit(1);
+    }
+    if (schema_only==1) {
+        fprintf(stdout,"%s\n",asciischema);
+    }
+    if (verbose==2) {
+        fprintf(stderr,"%s\n",asciischema);
+    }
+    if ((schema=ftaschema_parse_string(asciischema))<0) {
+        fprintf(stderr,"%s::error: could not parse schema  "
+                "for file %s\n",
+                me,argv[0]);
+        exit(1);
+    }
+    
+    if ((numberoffields=ftaschema_tuple_len(schema))<0) {
+        fprintf(stderr,"%s::error:could not get number of fields in schema\n",
+                me);
+        exit(1);
+    }
+    if (verbose==1) {
+        for(y=0; y<numberoffields;y++) {
+            printf("%s",ftaschema_field_name(schema,y));
+            if (y<numberoffields-1) printf("|");
+        }
+        printf("\n");
+    }
+    while(read_tuple(&rsize,rbuf,2*MAXTUPLESZ)==0) {
+        if ((!rsize) || (schema_only==1))
+            continue;
+        for(y=0; y<numberoffields;y++) {
+            struct access_result ar;
+            if (verbose==2)
+                printf("%s->",ftaschema_field_name(schema,y));
+            ar=ftaschema_get_field_by_index(schema,y,rbuf,rsize);
+            switch (ar.field_data_type) {
+                case INT_TYPE:
+                    printf("%d",ar.r.i);
+                    break;
+                case UINT_TYPE:
+                    printf("%u",ar.r.ui);
+                    break;
+                case IP_TYPE:
+                    if (scramble!=0) {
+                        ar.r.ui=gscpbswap32(ar.r.ui^scramble);
+                    }
+                    printf("%u.%u.%u.%u",ar.r.ui>>24&0xff,
+                           ar.r.ui>>16&0xff,
+                           ar.r.ui>>8&0xff,
+                           ar.r.ui&0xff);
+                    break;
+                case IPV6_TYPE:
+                {
+                    unsigned x;
+                    unsigned zc=0;
+                    for(x=0;x<4;x++) { if (ar.r.ip6.v[x]==0) zc++;}
+                    if (zc!=4) {
+                        for(x=0;x<8;x++) {
+                            unsigned char * a = (unsigned char *)  &(ar.r.ip6.v[0]);
+                            unsigned y;
+                            y=((unsigned)a[2*x])<<8|((unsigned) a[2*x+1]);
+                            printf("%04x",y);
+                            if (x<7) printf(":");
+                        }
+                    } else {
+                        printf("::");
+                    }
+                }
+                    break;
+                case USHORT_TYPE:
+                    printf("%u",ar.r.ui);
+                    break;
+                case BOOL_TYPE:
+                    if (ar.r.ui==0) {
+                        printf("FALSE");
+                    } else {
+                        printf("TRUE");
+                    }
+                    break;
+                case ULLONG_TYPE:
+                {
+                    gs_uint64_t ul;
+                    gs_uint64_t t1;
+                    gs_uint64_t t2;
+                    ul=ar.r.ul;
+                    printf("%llu",ul);
+                }
+                    break;
+                case LLONG_TYPE:
+                    printf("%lld",ar.r.l);
+                    break;
+                case FLOAT_TYPE:
+                    printf("%f",ar.r.f);
+                    break;
+                case TIMEVAL_TYPE:
+                {
+                    gs_float_t t;
+                    t= ar.r.t.tv_usec;
+                    t=t/1000000;
+                    t=t+ar.r.t.tv_sec;
+                    printf("%lf sec",t);
+                }
+                    break;
+                case VSTR_TYPE:
+                {
+                    int x;
+                    int c;
+                    char * src;
+                    src=(gs_sp_t)ar.r.vs.offset;
+                    if ((truncate>=0) && (ar.r.vs.length>truncate)) {
+                        ar.r.vs.length=truncate;
+                    }
+                    if ((ar.r.vs.length>0) && (src[ar.r.vs.length-1]==0)) {
+                        ar.r.vs.length = ar.r.vs.length-1;
+                    }
+                    for(x=0;x<ar.r.vs.length;x++) {
+                        c=src[x];
+                        if (((c<='~') && (c>=' '))&&(c!='|')) {
+                            printf("%c",c);
+                        } else {
+                            printf("(0x%x)",(gs_uint8_t)c);
+                        }
+                    }
+                }
+                    break;
+                default:
+                    break;
+            }
+            if (y<numberoffields-1) printf("|");
+        }
+        printf("\n");
+        if (verbose!=0) fflush(stdout);
+    }
+    exit(0);
+}
+
diff --git a/src/tools/gdatcat.c b/src/tools/gdatcat.c
new file mode 100644 (file)
index 0000000..83e626c
--- /dev/null
@@ -0,0 +1,143 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+#include "gsconfig.h"
+#include "gstypes.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+
+
+
+gs_sp_t me = 0;
+gs_sp_t schematext = 0;
+gs_int32_t schematextlen = 0;
+gs_sp_t schematmp = 0;
+
+static void do_file(gs_sp_t filename, gs_int32_t fnlen);
+
+int main(int argc, char** argv) {
+    gs_int32_t x;
+    gs_int32_t s=1;
+    gs_int32_t debug=0;
+    if (strcmp(argv[s],"-d")==0) {
+        debug=1;
+        s++;
+    }
+    for(x=s;x<argc;x++) {
+        if (debug) {
+            fprintf(stderr,"%s\n",argv[x]);
+        }
+        do_file(argv[x], strlen(argv[x]));
+    }
+    return 0;
+}
+
+
+/*
+ * do_file: dump the file out
+ */
+
+static void do_file(gs_sp_t filename, gs_int32_t fnlen) {
+    gs_int32_t pipe, parserversion, schemalen;
+    FILE *input;
+    gs_int8_t cmd2[4096 + 128];
+    static gs_int8_t *dbuf;
+    size_t sz;
+    
+    if (fnlen > 3 && filename[fnlen - 3] == '.' &&
+        filename[fnlen - 2] == 'g' &&
+        filename[fnlen - 1] == 'z') {
+        pipe = 1;
+        snprintf(cmd2, sizeof(cmd2), "gzcat %s", filename);
+        input = popen(cmd2, "r");
+    } else {
+        if (fnlen > 3 && filename[fnlen - 3] == 'b' &&
+            filename[fnlen - 2] == 'z' &&
+            filename[fnlen - 1] == '2') {
+            pipe = 1;
+            snprintf(cmd2, sizeof(cmd2), "bzcat %s", filename);
+            input = popen(cmd2, "r");
+        } else {
+            input = fopen(filename, "r");
+        }
+    }
+    
+    if (!input) {
+        perror("stream open");
+        fprintf(stderr, "%s: cannot open %s\n", me, filename);
+        return;
+    }
+    
+    if (fscanf(input, "GDAT\nVERSION:%u\nSCHEMALENGTH:%u\n",
+               &parserversion,&schemalen) != 2) {
+        fprintf(stderr,"%s: cannot parse GDAT file header in '%s'\n",
+                me, filename);
+        exit(1);
+    }
+    
+    /* first time ? */
+    if (schematext == 0) {
+        schematextlen = schemalen;
+        schematext = malloc(schemalen);
+        dbuf = malloc(CATBLOCKSZ);
+        if (!schematext  || !dbuf) {
+            fprintf(stderr,"%s: malloc error reading GDAT file header in '%s'\n",
+                    me, filename);
+            exit(1);
+        }
+        if (fread(schematext, schemalen, 1, input) != 1) {
+            fprintf(stderr,"%s: cannot parse-read GDAT file header in '%s'\n",
+                    me, filename);
+            exit(1);
+        }
+        printf("GDAT\nVERSION:%u\nSCHEMALENGTH:%u\n", parserversion, schemalen);
+        fwrite(schematext, schemalen, 1, stdout);
+    } else {
+        schematmp = malloc(schemalen);
+        if (!schematmp ) {
+            fprintf(stderr,"%s: malloc error reading GDAT file header in '%s'\n",
+                    me, filename);
+            exit(1);
+        }
+        if (fread(schematmp, schemalen, 1, input) != 1) {
+            fprintf(stderr,"%s: cannot parse-read GDAT file header in '%s'\n",
+                    me, filename);
+            exit(1);
+        }
+        free(schematmp);
+        //   if (memcmp(schematext, schematmp, schematextlen)) {
+        //     fprintf(stderr,"%s: GDAT schema mis-match in file '%s'\n",
+        //             me, filename);
+        //     exit(1);
+        //   }
+    }
+    
+    while ((sz = fread(dbuf, 1, CATBLOCKSZ, input)) > 0) {
+        fwrite(dbuf, 1, sz, stdout);
+    }
+    
+    if (pipe) {
+        pclose(input);
+    } else {
+        fclose(input);
+    }
+    
+}
diff --git a/src/tools/gsexit.c b/src/tools/gsexit.c
new file mode 100644 (file)
index 0000000..d5ec24c
--- /dev/null
@@ -0,0 +1,285 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include <app.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include "errno.h"
+
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "gshub.h"
+#include <schemaparser.h>
+
+
+
+#define MAXSTRLEN 256
+#define MAXNUMFIELDS 64
+#define BUFSIZE 16*1024*1024
+
+
+gs_sp_t me;            /* saved copy argv[0] */
+
+gs_uint32_t socket_desc;
+gs_uint32_t verbose=0;
+gs_uint32_t parserversion;
+gs_uint32_t withtrace=0;
+
+struct FTA_state {
+    FTAID fta_id;
+    gs_schemahandle_t schema;
+    gs_sp_t asciischema;
+    gs_int32_t numfields;
+};
+
+struct FTA_state fs;
+
+void hand(int iv) {
+    ftaapp_exit();
+    gslog(LOG_NOTICE, "exiting via signal handler %d...\n", iv);
+    exit(0);
+}
+
+void timeouthand(int iv) {
+    ftaapp_exit();
+    //  if (s->verbose!=0) fprintf(stderr, "exiting because of timeout...\n");
+    exit(0);
+}
+
+
+static void gs_write(gs_sp_t buffer, gs_uint32_t len)
+{
+    if (send(socket_desc,buffer,len,0) != len) {
+        gslog(LOG_EMERG,"could not write on stream socket");
+        exit(0);
+    }
+}
+
+static void print_usage_exit(gs_sp_t reason) {
+    fprintf(stderr,
+            "%s::error: %s\n"
+            "%s::usage: %s -v -t -h <gshub-hostname>:<gshub-port> <gsinstance_name>  <query_name>  <data_sink_name>\n"
+            , me, reason, me, me);
+    exit(1);
+}
+
+
+
+
+static void init(gs_int32_t argc, gs_sp_t argv[]) {
+    void *pblk;
+    gs_int32_t x, y, schema, pblklen, lcv;
+    gs_sp_t c;
+    gs_int8_t name[1024];
+    gs_sp_t instance_name;
+    gs_sp_t data_sink_name;
+    gs_sp_t query_name;
+    endpoint gshub;
+    endpoint data_sink;
+    endpoint dummyep;
+    gs_uint32_t tip1,tip2,tip3,tip4;
+    struct sockaddr_in server;
+    
+    if( (argc!=4) ) {
+        print_usage_exit("Wrong number of paramters");
+    }
+    sprintf(name,"gsexit: %s %s %s %s ",argv[0],argv[1],argv[2],argv[3]);
+    
+    gsopenlog(name);
+    
+    
+    if (sscanf(argv[0],"%u.%u.%u.%u:%hu",&tip1,&tip2,&tip3,&tip4,&(gshub.port))!= 5 ) {
+        gslog(LOG_EMERG,"HUB IP NOT DEFINED");
+        exit(1);
+    }
+    
+    gshub.ip=htonl(tip1<<24|tip2<<16|tip3<<8|tip4);
+    gshub.port=htons(gshub.port);
+    instance_name=strdup(argv[1]);
+    query_name=strdup(argv[2]);
+    data_sink_name=strdup(argv[3]);
+    
+    if (set_hub(gshub)!=0) {
+        gslog(LOG_EMERG,"Could not set hub");
+        exit(1);
+    }
+    if (set_instance_name(instance_name)!=0) {
+        gslog(LOG_EMERG,"Could not set instance name");
+        exit(1);
+    }
+    
+    if (get_initinstance(gshub,instance_name,&dummyep,1)!=0) {
+        gslog(LOG_EMERG,"Did not receive signal that GS is initiated\n");
+    }
+    
+    if (get_streamsink(gshub,data_sink_name,&data_sink,1) !=0 ) {
+        gslog(LOG_EMERG,"Could not find data sink");
+        exit(0);
+    }
+    
+    if (ftaapp_init(BUFSIZE)!=0) {
+        gslog(LOG_EMERG,"%s::error:could not initialize gscp\n", me);
+        exit(1);
+    }
+    
+    signal(SIGTERM, hand);
+    signal(SIGINT, hand);
+    signal(SIGPIPE, hand);
+    
+    if (verbose!=0) gslog(LOG_DEBUG,"Initializing FTAs\n");
+    
+    pblk = 0;
+    pblklen = 0;
+    
+    fs.fta_id=ftaapp_add_fta(query_name,pblk?0:1,pblk?0:1,0,pblklen,pblk);
+    if (fs.fta_id.streamid==0){
+        gslog(LOG_EMERG,"%s::error:could not initialize fta %s\n",
+              me,query_name);
+        exit(1);
+    }
+    
+    if ((c=ftaapp_get_fta_ascii_schema_by_name(query_name))==0){
+        gslog(LOG_EMERG,"%s::error:could not get ascii schema for %s\n",
+              me,query_name);
+        exit(1);
+    }
+    
+    //ftaapp_get_fta_ascii_schema_by_name uses static buffer so make a copy
+    fs.asciischema=strdup(c);
+    
+    
+    // Set parser version here
+    parserversion=get_schemaparser_version();
+    
+    if ((fs.schema=ftaapp_get_fta_schema(fs.fta_id))<0) {
+        gslog(LOG_EMERG,"%s::error:could not get schema for query\n",
+              me,query_name);
+        exit(1);
+    }
+    
+    // Use all available fields
+    if ((fs.numfields=ftaschema_tuple_len(fs.schema))<0) {
+        gslog(LOG_EMERG,"%s::error:could not get number of fields for query %s\n",
+              me,query_name);
+        exit(1);
+    }
+    
+    // Important that we only open the socket to the data sink AFTER we have subscribed to the output query as it uses it as a signal
+    
+    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
+    if (socket_desc == -1)
+    {
+        gslog(LOG_EMERG,"ERROR:could not create socket for data stream");
+        exit(0);
+    }
+    server.sin_addr.s_addr = data_sink.ip;
+    server.sin_family = AF_INET;
+    server.sin_port = data_sink.port;
+    
+    if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
+    {
+        gslog(LOG_EMERG,"ERROR: could not open connection to data source");
+        exit(0);
+    }
+    if (set_streamsubscription(gshub,instance_name,data_sink_name) !=0 ) {
+        gslog(LOG_EMERG,"Could not announce streamsubscription for exit process");
+        exit(0);
+    }
+  
+    
+}
+
+
+static void process_data()
+{
+    gs_uint32_t nsz;
+    FTAID rfta_id;
+    gs_uint32_t rsize;
+    gs_int32_t code;
+    gs_int8_t rbuf[2*MAXTUPLESZ];
+       gs_int8_t topb[1024];
+    
+    
+    if (verbose!=0) gslog(LOG_INFO,"Getting Data");
+    
+       sprintf(&topb[0],"GDAT\nVERSION:%u\nSCHEMALENGTH:%u\n",
+                       parserversion,(unsigned int)strlen(fs.asciischema)+1);
+    gs_write(&topb[0],strlen(topb));
+    gs_write(fs.asciischema,strlen(fs.asciischema)+1);
+    
+    
+    
+    while((code=ftaapp_get_tuple(&rfta_id,&rsize,rbuf,2*MAXTUPLESZ,0))>=0) {
+        nsz=htonl(rsize);
+        if ((withtrace==0)&&(code==2)) continue;
+        if (verbose) {
+            if (ftaschema_is_eof_tuple(fs.schema, rbuf)) {
+                /* initiate shutdown or something of that nature */
+                gslog(LOG_INFO,"gsexit::All data proccessed\n");
+            }
+        }
+        gs_write((gs_sp_t)&nsz,sizeof(gs_uint32_t));
+        gs_write(rbuf,rsize);
+       }
+}
+
+
+
+int main(int argc, char** argv) {
+    gs_int32_t ch;
+    me = argv[0];
+    
+    while ((ch = getopt(argc, argv, "hvt")) != -1) {
+        switch(ch) {
+            case 'h':
+                print_usage_exit("help");
+                break;
+            case 'v':
+                verbose=1;
+                break;
+            case 't':
+                withtrace=1;
+                break;
+            default:
+                break;
+        }
+    }
+    
+    argc -= optind;
+    argv += optind;
+    
+    /* initialize host library and the sgroup  */
+    
+    if (argc<=1) {
+        print_usage_exit("Not enough arguments");
+    }
+    
+    init(argc, argv);
+    
+    process_data();
+    
+    gslog(LOG_EMERG,"%s::internal error reached unexpected end", me);
+}
+
diff --git a/src/tools/gsgdatprint.c b/src/tools/gsgdatprint.c
new file mode 100644 (file)
index 0000000..baf64ac
--- /dev/null
@@ -0,0 +1,580 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include <app.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include <schemaparser.h>
+#include <gshub.h>
+
+#define MAXSTRLEN 256
+#define MAXNUMFIELDS 64
+
+//#define GSBZIP2
+
+#ifdef GSBZIP2
+#include "bzlib.h"
+#endif
+
+#ifdef ZLIB
+#include "zlib.h"
+#endif
+
+gs_sp_t me;            /* saved copy argv[0] */
+
+struct FTA_state {
+    FTAID fta_id;
+    gs_schemahandle_t schema;
+    gs_sp_t asciischema;
+    gs_int32_t numfields;
+    gs_int32_t timefieldoffset;
+};
+
+struct gsasciiprint_state {
+    // configuration state
+    gs_uint32_t bufsz;
+    gs_int32_t stream;
+    gs_int32_t flush;
+    gs_int32_t parserversion;
+    gs_int32_t compressed;
+    gs_int32_t verbose;
+    gs_int32_t notemp;
+    gs_sp_t timefield;
+    gs_int32_t  interval;
+    gs_int32_t  quitcnt;
+    gs_int32_t  quittime;
+    gs_int32_t  numfields;
+    gs_sp_t extension;
+    gs_sp_t query;
+    gs_int32_t remote_print;
+    
+    
+    // runtime state
+    struct FTA_state fs;
+};
+
+
+void hand(int iv) {
+    ftaapp_exit();
+    gslog(LOG_NOTICE, "exiting via signal handler %d...\n", iv);
+    exit(0);
+}
+
+void timeouthand(int iv) {
+    ftaapp_exit();
+    //  if (s->verbose!=0) fprintf(stderr, "exiting because of timeout...\n");
+    exit(0);
+}
+
+
+static void print_usage_exit(gs_sp_t reason) {
+    fprintf(stderr,
+            "%s::error: %s\n"
+            "%s::usage: %s -r <int> -v -f -s -z -c <int> -q <int> -b <field> -t <int> -e <string> <gshub-hostname>:<gshub-port> <gsinstance_name>   <query_name> <parameters>\n"
+            "\t-v makes output verbose\n"
+            "\t-f flushes each tuple individually\n"
+            "\t-h <int> print within the hfta int identifies how many output streams based on the SubInterface field\n"
+            "\t-r sets the ringbuffer size default is 8MB\n"
+            "\t-s uses %s in streaming mode cannot be used with -v -z -b -t -e\n"
+            "\t-c <int> indicates that %s should terminate after <int> tuples.\n"
+            "\t-q <int> indicates that %s should terminate after <int> seconds.\n"
+            "\t-z the output is compressed with gzip \n"
+            "\t-b <field> identifies the field which is increasing and is used to\n"
+            "\t\tbin output files. Field has to be of type uint.\n"
+            "\t\tThe default is the UNIX system time\n"
+            "\t-t <int> specifies the number the <field> specified with -b\n"
+            "\t\thas to increase before a new output file is used\n"
+            "\t\tthe default is 60 for 1 minute if the default UNIX time is used\n"
+            "\t-e <string> identifies the file string extension used for the \n"
+            "\t\toutput file. The output file always starts with the current value\n"
+            "\t\tof the b field (or UNIX time) the default extension is .txt \n"
+            "\t\twithout the -z option and .txt.gz with the -z option\n"
+            "\t<query_name> specifies the query which will be\n"
+            "\t\t instanciated.\n"
+            "\t<parameters> sets the parameters for the query\n"
+            , me, reason, me, me, me,me,me);
+    exit(1);
+}
+
+
+
+
+static void init(gs_int32_t argc, gs_sp_t argv[], struct gsasciiprint_state *s) {
+    void *pblk;
+    gs_int32_t x, y, schema, pblklen, lcv;
+       gs_int32_t n_actual_param;
+       gs_int32_t n_expected_param;
+    gs_sp_t c;
+    gs_int8_t name[1024];
+    
+    sprintf(name,"gsgdatprint:%s",argv[0]);
+    
+    gsopenlog(name);
+    
+    
+    if (s->verbose!=0) gslog(LOG_DEBUG,"Initializing gscp\n");
+    if (ftaapp_init(s->bufsz)!=0) {
+        gslog(LOG_EMERG,"%s::error:could not initialize gscp\n", me);
+        exit(1);
+    }
+    
+    signal(SIGTERM, hand);
+    signal(SIGINT, hand);
+    signal(SIGPIPE, hand);
+    
+    if (s->verbose!=0) gslog(LOG_DEBUG,"Initializing FTAs\n");
+    
+    schema = ftaapp_get_fta_schema_by_name(argv[0]);
+    if (schema < 0) {
+        gslog(LOG_EMERG,"%s::error:can't get fta '%s' schema\n", me ,argv[0]);
+        exit(1);
+    }
+       n_expected_param = ftaschema_parameter_len(schema);
+    if (n_expected_param == 0) {
+        pblk = 0;
+        pblklen = 0;
+        if (s->verbose) gslog(LOG_DEBUG,"[query does not have any params]\n");
+    } else {
+               n_actual_param = argc-1;
+               if(n_actual_param < n_expected_param){
+                       gslog(LOG_EMERG,"Error, %d query parameters expected, %d provided.\n",n_expected_param, n_actual_param);
+                       exit(1);
+               }
+        /* parse the params */
+        for (lcv = 1 ; lcv < argc ; lcv++) {
+            char *k, *e;
+            int rv;
+            k = argv[lcv];
+            e = k;
+            while (*e && *e != '=') e++;
+            if (*e == 0) {
+                gslog(LOG_EMERG,"param parse error '%s' (fmt 'key=val')\n",
+                      argv[lcv]);
+                exit(1);
+            }
+            *e = 0;
+            rv = ftaschema_setparam_by_name(schema, k, e+1, strlen(e+1));
+            *e = '=';
+            if (rv < 0) {
+                gslog(LOG_EMERG,"param setparam error '%s' (fmt 'key=val')\n",
+                      argv[lcv]);
+                exit(1);
+            }
+        }
+        if (ftaschema_create_param_block(schema, &pblk, &pblklen) < 0) {
+            gslog(LOG_EMERG, "ftaschema_create_param_block failed!\n");
+            exit(1);
+        }
+    }
+    ftaschema_free(schema); /* XXXCDC */
+    
+    
+       if (s->remote_print>=0) {
+               s->fs.fta_id=ftaapp_add_fta_print(s->query,pblk?0:1,pblk?0:1,0,pblklen,pblk,"./data",s->extension,s->timefield,"SubInterface",s->interval,s->remote_print);
+               if (s->fs.fta_id.streamid==0){
+            gslog(LOG_EMERG,"%s::error:could not initialize fta_print %s\n",
+                  me,s->query);
+            exit(1);
+               }
+    again:
+        // wait forever
+        sleep(60);
+        goto again;
+       }
+    
+    
+    s->fs.fta_id=ftaapp_add_fta(s->query,pblk?0:1,pblk?0:1,0,pblklen,pblk);
+    if (s->fs.fta_id.streamid==0){
+        gslog(LOG_EMERG,"%s::error:could not initialize fta %s\n",
+              me,s->query);
+        exit(1);
+    }
+    /* XXXCDC: pblk is malloc'd, should we free it? */
+    
+    if ((c=ftaapp_get_fta_ascii_schema_by_name(s->query))==0){
+        gslog(LOG_EMERG,"%s::error:could not get ascii schema for %s\n",
+              me,s->query);
+        exit(1);
+    }
+    
+    //ftaapp_get_fta_ascii_schema_by_name uses static buffer so make a copy
+    s->fs.asciischema=strdup(c);
+    
+    
+    // Set parser version here
+    s->parserversion=get_schemaparser_version();
+    
+    if ((s->fs.schema=ftaapp_get_fta_schema(s->fs.fta_id))<0) {
+        gslog(LOG_EMERG,"%s::error:could not get schema for query\n",
+              me,s->query);
+        exit(1);
+    }
+    
+    // Use all available fields
+    if ((s->fs.numfields=ftaschema_tuple_len(s->fs.schema))<0) {
+        gslog(LOG_EMERG,"%s::error:could not get number of fields for query %s\n",
+              me,s->query);
+        exit(1);
+    }
+    if (s->timefield!=0) {
+        if ((s->fs.timefieldoffset=ftaschema_get_field_offset_by_name(
+                                                                      s->fs.schema,s->timefield))<0) {
+            gslog(LOG_EMERG,"%s::error:could not get "
+                  "offset for timefield %s in query %s\n",
+                  me,s->timefield,s->query);
+            exit(1);
+        }
+        
+        if (ftaschema_get_field_type_by_name(
+                                             s->fs.schema,s->timefield)!=UINT_TYPE) {
+            gslog(LOG_EMERG,"%s::error: illegal type for timefield "
+                  "%s in query %s UINT expected\n",
+                  me,s->timefield,s->query);
+            exit(1);
+        }
+    }
+}
+
+
+static void process_data(struct gsasciiprint_state *s)
+{
+       gs_int32_t x;
+    gs_int32_t y;
+    gs_int32_t z;
+    gs_int32_t tb;
+    gs_uint32_t nsz;
+    FTAID rfta_id;
+    gs_uint32_t rsize;
+    gs_int8_t rbuf[2*MAXTUPLESZ];
+    gs_int32_t problem;
+    
+    gs_int32_t ctb=0;
+    gs_int8_t fname[1024];
+    gs_int8_t tmpname[1024];
+    gs_int8_t command[1024];
+       gs_int8_t topb[1024];
+    gs_int32_t rcnt=0;
+    gs_retval_t code;
+#ifdef GSBZIP2
+       int bzerror;
+       BZFILE * b;
+       int abandon=0;
+       unsigned int bytes_in;
+       unsigned int bytes_out;
+#endif
+#ifdef ZLIB
+       gzFile of=0;
+#else
+       FILE * of=0;
+#endif
+    
+    
+    tmpname[0]=0;
+    
+    if (s->verbose!=0) gslog(LOG_INFO,"Getting Data for %s",s->query);
+    
+       sprintf(&topb[0],"GDAT\nVERSION:%u\nSCHEMALENGTH:%lu\n",
+                       s->parserversion,strlen(s->fs.asciischema)+1);
+    if (s->stream!=0) {
+               of=stdout;
+               // need to get ASCII version of schema
+               fwrite(&topb[0],strlen(topb),1,of);
+               fwrite(s->fs.asciischema,strlen(s->fs.asciischema)+1,1,of);
+    }
+    
+    if (s->quittime !=0 ) {
+               signal(SIGALRM,timeouthand);
+               alarm(s->quittime);
+    }
+    
+    
+    while((code=ftaapp_get_tuple(&rfta_id,&rsize,rbuf,2*MAXTUPLESZ,0))>=0) {
+               rcnt++;
+               if ((s->notemp==1) && (code==2)) continue;
+               if (((s->quitcnt>0) && (rcnt>s->quitcnt))||ftaschema_is_eof_tuple(s->fs.schema, rbuf)) {
+                       if (s->verbose!=0)
+                               gslog(LOG_EMERG, "exiting reached tuple limit or all data has been proccessed\n");
+                       if (of!=0) {
+                               fclose(of);
+                
+                               if (s->compressed) {
+                                       system(command);
+                               }
+                               rename(tmpname,fname);
+                       }
+                       exit(0);
+               }
+               if (((code==0) || (code==2))&&(s->fs.fta_id.streamid==rfta_id.streamid)) {
+                       if (s->stream==0) {
+                               if (s->timefield!=0) {
+                                       tb=fta_unpack_uint(rbuf,
+                                       rsize,
+                                       s->fs.timefieldoffset,
+                                       &problem);
+                               } else {
+                                       tb=time(0);
+                               }
+                               if ((ctb+s->interval)<=tb) {
+                                       gsstats();
+                                       if (of!=0) {
+#ifdef GSBZIP2
+                                               BZ2_bzWriteClose(&bzerror, b, abandon, &bytes_in, &bytes_out );
+                                               if (bzerror!=BZ_OK) {
+                                                       gslog(LOG_EMERG,"Could not bz close file .. EXITING\n");
+                                                       exit(0);
+                                               }
+#endif
+#ifdef ZLIB
+                                               gzclose(of);
+#else
+                                               fclose(of);
+#endif
+#ifndef GSBZIP2
+                                               if (s->compressed) {
+                                                       system(command);
+                                               }
+#endif
+                                               rename(tmpname,fname);
+                                       }
+                                       while((ctb+s->interval)<=tb) {
+                                               if (ctb==0) {
+                                                       ctb=(tb/s->interval)*s->interval;
+                                               } else {
+                                                       ctb=ctb+s->interval;
+                                               }
+                                       }
+#ifdef ZLIB
+                                       sprintf(tmpname,"%u%s.gz.tmp",ctb,s->extension);
+                                       sprintf(fname,"%u%s.gz",ctb,s->extension);
+#else
+                    sprintf(tmpname,"%u%s.tmp",ctb,s->extension);
+                    sprintf(fname,"%u%s",ctb,s->extension);
+#endif
+#ifndef GSBZIP2
+                                       if (s->compressed) {
+                                               sprintf(command,"gzip -S .tmpgz %s ; mv %s.tmpgz %s",tmpname,tmpname,tmpname);
+                                       }
+#endif
+#ifdef ZLIB
+                                       if ((of=gzopen(tmpname,"wb"))==0) {
+                                               gslog(LOG_EMERG,"Could not open file \"%s\".. EXITING\n",
+                              tmpname);
+                                               exit(0);
+                                       }
+#else
+                                       if ((of=fopen(tmpname,"w"))==0) {
+                                               gslog(LOG_EMERG,"Could not open file \"%s\".. EXITING\n",
+                              tmpname);
+                                               exit(0);
+                                       }
+#endif
+#ifdef GSBZIP2
+                                       if (s->compressed) {
+                                               b=BZ2_bzWriteOpen(&bzerror,of,5,0,30);
+                                               if (bzerror!=BZ_OK) {
+                                                       gslog(LOG_EMERG,"Could not bz open file \"%s\".. EXITING\n",
+                                  tmpname);
+                                                       exit(0);
+                                               }
+                                       }
+#endif
+                    
+                                       if (s->compressed) {
+#ifdef GSBZIP2
+                                               BZ2_bzWrite ( &bzerror, b, &topb[0],strlen(topb));
+                                               BZ2_bzWrite ( &bzerror, b, s->fs.asciischema,strlen(s->fs.asciischema)+1);
+#endif
+                                       } else {
+                                               // need to get ASCII version of schema
+#ifdef ZLIB
+                                               gzwrite(of,&topb[0],strlen(topb));
+                                               gzwrite(of,s->fs.asciischema,strlen(s->fs.asciischema)+1);
+#else
+                                               fwrite(&topb[0],strlen(topb),1,of);
+                                               fwrite(s->fs.asciischema,strlen(s->fs.asciischema)+1,1,of);
+#endif
+                                       }
+                               }
+                       }
+                       if (code==0) {
+                               nsz=htonl(rsize);
+                               if (s->compressed) {
+#ifdef GSBZIP2
+                                       BZ2_bzWrite ( &bzerror, b,&nsz,sizeof(gs_uint32_t) );
+                                       BZ2_bzWrite ( &bzerror, b,rbuf,rsize);
+#endif
+                               } else {
+#ifdef ZLIB
+                                       gzwrite(of,&nsz,sizeof(gs_uint32_t));
+                                       gzwrite(of,rbuf,rsize);
+                               }
+#else
+                if (fwrite(&nsz,sizeof(gs_uint32_t),1,of)!=1) {
+                    ftaapp_exit();
+                    if (s->verbose!=0)
+                        gslog(LOG_EMERG,"Could not write to output\"%s\".. EXITING\n",
+                              tmpname);
+                    exit(0);
+                }
+                
+                if (fwrite(rbuf,rsize,1,of)!=1) {
+                    ftaapp_exit();
+                    if (s->verbose!=0)
+                        gslog(LOG_EMERG,"Could not write to output\"%s\".. EXITING\n",
+                              tmpname);
+                    exit(0);
+                }
+                if ((s->stream!=0) || (s->flush!=0)) {
+                    fflush(of);
+                }
+            }
+#endif
+        }
+    }
+}
+}
+
+
+
+int main(int argc, char** argv) {
+    
+    struct gsasciiprint_state s;
+    gs_retval_t ch;
+    endpoint gshub;
+    endpoint dummyep;
+    gs_uint32_t tip1,tip2,tip3,tip4;
+    gs_sp_t instance_name;
+    
+    me = argv[0];
+    
+    /* initialize host library and the sgroup  */
+    
+    if (argc<=1) {
+        print_usage_exit("Not enough arguments");
+    }
+    
+    /* parse args */
+    bzero(&s, sizeof(s));
+    s.interval = 60;   /* default */
+    s.quittime=0;
+    s.quitcnt=-1;
+    s.remote_print=-1;
+    s.bufsz=8*1024*1024;
+    
+    while ((ch = getopt(argc, argv, "nr:b:e:t:c:q:sfvzmh:")) != -1) {
+        switch(ch) {
+            case 'r':
+                s.bufsz=atoi(optarg);
+                break;
+            case 'c':
+                s.quitcnt = atoi(optarg);
+                break;
+            case 'q':
+                s.quittime = atoi(optarg);
+                break;
+            case 'b':
+                s.timefield = optarg;
+                break;
+            case 'e':
+                s.extension = optarg;
+                break;
+            case 'n':
+                s.notemp=1;
+                break;
+            case 't':
+                s.interval = atoi(optarg);
+                if (s.interval < 1) {
+                    goto usage;
+                }
+                break;
+            case 's':
+                s.stream++;
+                break;
+            case 'f':
+                s.flush++;
+                break;
+            case 'v':
+                s.verbose++;
+                break;
+            case 'z':
+                s.compressed++;
+                break;
+            case 'h':
+                s.remote_print=atoi(optarg);
+                break;
+            default:
+            usage:
+                print_usage_exit("invalid args");
+        }
+    }
+    
+    if ((s.stream!=0) & (s.compressed!=0 | s.verbose!=0 |
+                         s.timefield!=0 | s.extension!=0)) {
+        print_usage_exit("illegal argument combination with -s");
+    }
+    
+    if (!s.extension) {
+        s.extension = (s.compressed) ? ".txt.gz" : ".txt";
+    }
+    
+    argc -= optind;
+    argv += optind;
+    if (argc<3) print_usage_exit("must specify hub info and query");
+    
+    if (sscanf(argv[0],"%u.%u.%u.%u:%hu",&tip1,&tip2,&tip3,&tip4,&(gshub.port))!= 5 ) {
+        gslog(LOG_EMERG,"HUB IP NOT DEFINED");
+        exit(1);
+    }
+    gshub.ip=htonl(tip1<<24|tip2<<16|tip3<<8|tip4);
+    gshub.port=htons(gshub.port);
+    instance_name=strdup(argv[1]);
+    if (set_hub(gshub)!=0) {
+        gslog(LOG_EMERG,"Could not set hub");
+        exit(1);
+    }
+    if (set_instance_name(instance_name)!=0) {
+        gslog(LOG_EMERG,"Could not set instance name");
+        exit(1);
+    }
+    
+    if (get_initinstance(gshub,instance_name,&dummyep,1)!=0) {
+        gslog(LOG_EMERG,"Did not receive signal that GS is initiated\n");
+    }
+    
+    
+    argc -=2;
+    argv +=2;
+    
+    s.query = argv[0];
+    
+    init(argc, argv, &s);
+    
+    process_data(&s);
+    
+    gslog(LOG_EMERG,"%s::internal error reached unexpected end", me);
+}
+
diff --git a/src/tools/gsprintconsole.c b/src/tools/gsprintconsole.c
new file mode 100644 (file)
index 0000000..4b18ab5
--- /dev/null
@@ -0,0 +1,454 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include <app.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "gshub.h"
+
+#include <schemaparser.h>
+
+#define MAXLINE 100000
+static unsigned tcpport=0;
+static char linebuf[MAXLINE];
+int listensockfd=0;
+int fd=0;
+
+
+// Not all systems have timersub defined so make sure its ther
+#ifndef timersub
+
+#define timersub(tvp, uvp, vvp)                                         \
+do {                                                            \
+(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;          \
+(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;       \
+if ((vvp)->tv_usec < 0) {                               \
+(vvp)->tv_sec--;                                \
+(vvp)->tv_usec += 1000000;                      \
+}                                                       \
+} while (0)
+
+#endif
+
+void hand(int iv) {
+    ftaapp_exit();
+    fprintf(stderr, "exiting via signal handler %d...\n", iv);
+    exit(1);
+}
+
+static void wait_for_client() {
+    struct sockaddr_in serv_addr,cli_addr;
+    socklen_t clilen;
+    if (listensockfd==0) {
+               gs_int32_t on = 1;
+               listensockfd=socket(AF_INET, SOCK_STREAM, 0);
+        if (listensockfd < 0) {
+                       gslog(LOG_EMERG,"Error:Could not create socket for tcp data stream");
+                       exit(1);
+               }
+               bzero((char *) &serv_addr, sizeof(serv_addr));
+               serv_addr.sin_family = AF_INET;
+               serv_addr.sin_addr.s_addr = INADDR_ANY;
+               serv_addr.sin_port = htons(tcpport);
+#ifndef __linux__
+        /* make sure we can reuse the common port rapidly */
+        if (setsockopt(listensockfd, SOL_SOCKET, SO_REUSEPORT,
+                       (gs_sp_t )&on, sizeof(on)) != 0) {
+            gslog(LOG_EMERG,"Error::could not set socket option\n");
+            exit(1);
+        }
+#endif
+        if (setsockopt(listensockfd, SOL_SOCKET, SO_REUSEADDR,
+                       (gs_sp_t )&on, sizeof(on)) != 0) {
+            gslog(LOG_EMERG,"Error::could not set socket option\n");
+            exit(1);
+               }
+        
+               if (bind(listensockfd, (struct sockaddr *) &serv_addr,
+                 sizeof(serv_addr)) < 0) {
+                       gslog(LOG_EMERG,"Error:Could not bind socket for tcp data stream");
+            exit(1);
+        }
+       }
+    
+       do {
+               listen(listensockfd,5);
+               clilen = sizeof(cli_addr);
+               fd=accept(listensockfd, (struct sockaddr *) &cli_addr, &clilen);
+               if (fd<0) {
+            gslog(LOG_EMERG,"Error:Could not accept connection on tcp socket");
+               }
+       } while (fd==0);
+}
+
+
+static void emit_socket() {
+       unsigned o,w,l;
+       o=0;
+       w=0;
+       l=strlen(linebuf);
+       do {
+               if((w=write(fd,&linebuf[o],l))==0) {
+                       close(fd);
+                       wait_for_client();
+               }
+               o=o+w;
+       } while (o<l);
+}
+
+static void emit_line() {
+    
+    if (tcpport==0) {
+        printf("%s",linebuf);
+    } else {
+        emit_socket();
+    }
+    
+}
+
+int main(int argc, char* argv[]) {
+    gs_sp_t me = argv[0];
+    FTAID fta_id;
+    gs_int32_t schema, ch;
+    
+    FTAID rfta_id;
+    gs_uint32_t rsize;
+    gs_uint32_t bufsz=8*1024*1024;
+    gs_int8_t rbuf[2*MAXTUPLESZ];
+    
+    gs_int32_t numberoffields;
+    gs_int32_t verbose=0;
+    gs_int32_t y, lcv;
+    
+    void *pblk;
+    gs_int32_t pblklen;
+       gs_int32_t n_actual_param;
+       gs_int32_t n_expected_param;
+    gs_int32_t xit = 0;
+    gs_int32_t dump = 0;
+    struct timeval tvs, tve, tvd;
+    gs_retval_t code;
+    endpoint gshub;
+    endpoint dummyep;
+    gs_uint32_t tip1,tip2,tip3,tip4;
+    gs_sp_t instance_name;
+
+    gs_uint32_t tlimit = 0;     // time limit in seconds
+    time_t start_time, curr_time;
+    
+       gsopenlog(argv[0]);
+    
+    
+    while ((ch = getopt(argc, argv, "l:p:r:vXD")) != -1) {
+        switch (ch) {
+            case 'r':
+                bufsz=atoi(optarg);
+                break;
+            case 'p':
+                tcpport=atoi(optarg);
+                break;
+            case 'v':
+                verbose++;
+                break;
+            case 'X':
+                xit++;
+                break;
+            case 'D':
+                dump++;
+                break;
+            case 'l':
+                tlimit = atoi(optarg);
+                break;
+            default:
+            usage:
+                fprintf(stderr, "usage: %s [-r <bufsz>] [-p <port>] [-l <time_limit>] [-v] [-X] [-D] <gshub-hostname>:<gshub-port> <gsinstance_name>  query param1 param2...\n",
+                        *argv);
+                exit(1);
+        }
+    }
+    argc -= optind;
+    argv += optind;
+    if (argc<3) goto usage;
+    
+    if (sscanf(argv[0],"%u.%u.%u.%u:%hu",&tip1,&tip2,&tip3,&tip4,&(gshub.port))!= 5 ) {
+        gslog(LOG_EMERG,"HUB IP NOT DEFINED");
+        exit(1);
+    }
+    gshub.ip=htonl(tip1<<24|tip2<<16|tip3<<8|tip4);
+    gshub.port=htons(gshub.port);
+    instance_name=strdup(argv[1]);
+    if (set_hub(gshub)!=0) {
+        gslog(LOG_EMERG,"Could not set hub");
+        exit(1);
+    }
+    if (set_instance_name(instance_name)!=0) {
+        gslog(LOG_EMERG,"Could not set instance name");
+        exit(1);
+    }
+    
+    if (get_initinstance(gshub,instance_name,&dummyep,1)!=0) {
+        gslog(LOG_EMERG,"Did not receive signal that GS is initiated\n");
+    }
+    
+    gettimeofday(&tvs, 0);
+    argc -=2;
+    argv +=2;
+    if (argc < 1)
+        goto usage;
+    
+    /* initialize host library and the sgroup  */
+    
+    if (verbose>=2) fprintf(stderr,"Inializin gscp\n");
+    
+    if (ftaapp_init(bufsz)!=0) {
+        fprintf(stderr,"%s::error:could not initialize gscp\n", me);
+        exit(1);
+    }
+    
+    signal(SIGTERM, hand);
+    signal(SIGINT, hand);
+    
+    schema = ftaapp_get_fta_schema_by_name(argv[0]);
+    if (schema < 0) {
+        fprintf(stderr,"%s::error:could not get fta '%s' schema\n",
+                me ,argv[0]);
+        exit(1);
+    }
+       n_expected_param = ftaschema_parameter_len(schema);
+    if (n_expected_param == 0) {
+        pblk = 0;
+        pblklen = 0;
+    } else {
+        /* parse the params */
+               n_actual_param = argc-1;
+               if(n_actual_param < n_expected_param){
+                       fprintf(stderr,"Error, %d query parameters expected, %d provided.\n",n_expected_param, n_actual_param);
+                       exit(1);
+               }
+        for (lcv = 1 ; lcv < argc ; lcv++) {
+            char *k, *e;
+            int rv;
+            k = argv[lcv];
+            e = k;
+            while (*e && *e != '=') e++;
+            if (*e == 0) {
+                fprintf(stderr,"param parse error '%s' (fmt 'key=val')\n",
+                        argv[lcv]);
+                exit(1);
+            }
+            *e = 0;
+            rv = ftaschema_setparam_by_name(schema, k, e+1, strlen(e+1));
+            *e = '=';
+            if (rv < 0) {
+                fprintf(stderr,"param setparam error '%s' (fmt 'key=val')\n",
+                        argv[lcv]);
+                exit(1);
+            }
+        }
+        if (ftaschema_create_param_block(schema, &pblk, &pblklen) < 0) {
+            fprintf(stderr, "ftaschema_create_param_block failed!\n");
+            exit(1);
+        }
+    }
+    ftaschema_free(schema); /* XXXCDC */
+    
+    
+    if (verbose>=2) fprintf(stderr,"Initalice FTA\n");
+    
+    fta_id=ftaapp_add_fta(argv[0],0,0,0,pblklen,pblk);
+    if (fta_id.streamid==0) {
+        fprintf(stderr,"%s::error:could not initialize fta %s\n",
+                me, argv[0]);
+        exit(1);
+    }
+    /* XXXCDC: pblk is malloc'd, should we free it? */
+    
+    if (verbose>=2) fprintf(stderr,"Get schema handle\n");
+    
+    if ((schema=ftaapp_get_fta_schema(fta_id))<0) {
+        fprintf(stderr,"%s::error:could not get schema\n", me);
+        exit(1);
+    }
+    
+    if ((numberoffields=ftaschema_tuple_len(schema))<0) {
+        fprintf(stderr,"%s::error:could not get number of fields in schema\n",
+                me);
+        exit(1);
+    }
+    
+    if (verbose>=1) {
+        for(y=0; y<numberoffields;y++) {
+            printf("%s",ftaschema_field_name(schema,y));
+            if (y<numberoffields-1) printf("|");
+        }
+        printf("\n");
+    }
+    if (xit) {
+        gettimeofday(&tve, 0);
+        timersub(&tve, &tvs, &tvd);
+        printf("TIME= %ld.%06d sec\n", tvd.tv_sec, tvd.tv_usec);
+        hand(0);
+    }
+    if (tcpport!=0) {
+       wait_for_client();
+    }
+
+    start_time = time(NULL);
+
+    while((code=ftaapp_get_tuple(&rfta_id,&rsize,rbuf,2*MAXTUPLESZ,0))>=0) {
+        if (dump)
+            continue;
+        if (ftaschema_is_eof_tuple(schema, rbuf)) {
+            /* initiate shutdown or something of that nature */
+            printf("#All data proccessed\n");
+            exit(0);
+        }
+        if (!rsize)
+            continue;
+        if (verbose >=2) {
+            snprintf(linebuf,MAXLINE,"RESULT CODE => %u\n",code);
+            emit_line();
+        }
+        if ((code==0)&&(rfta_id.streamid == fta_id.streamid)) {
+            for(y=0; y<numberoffields;y++) {
+                struct access_result ar;
+                if (verbose>=2)
+                    printf("%s->",ftaschema_field_name(schema,y));
+                ar=ftaschema_get_field_by_index(schema,y,rbuf,rsize);
+                switch (ar.field_data_type) {
+                    case INT_TYPE:
+                        snprintf(linebuf,MAXLINE,"%d",ar.r.i);
+                        break;
+                    case UINT_TYPE:
+                        snprintf(linebuf,MAXLINE,"%u",ar.r.ui);
+                        break;
+                    case IP_TYPE:
+                        snprintf(linebuf,MAXLINE,"%u.%u.%u.%u",ar.r.ui>>24&0xff,
+                                 ar.r.ui>>16&0xff,
+                                 ar.r.ui>>8&0xff,
+                                 ar.r.ui&0xff);
+                        break;
+                    case IPV6_TYPE:
+                    {
+                        unsigned x;
+                        unsigned zc=0;
+                        for(x=0;x<4;x++) { if (ar.r.ip6.v[x]==0) zc++;}
+                        if (zc!=4) {
+                            snprintf(linebuf,MAXLINE,"");
+                            for(x=0;x<8;x++) {
+                                unsigned char * a = (unsigned char *)  &(ar.r.ip6.v[0]);
+                                unsigned y;
+                                y=((unsigned)a[2*x])<<8|((unsigned) a[2*x+1]);
+                                snprintf(&linebuf[strlen(linebuf)],MAXLINE,"%04x",y);
+                                if (x<7) snprintf(&linebuf[strlen(linebuf)],MAXLINE,":");
+                            }
+                        } else {
+                            snprintf(linebuf,MAXLINE,"::");
+                        }
+                    }
+                        break;
+                        
+                    case USHORT_TYPE:
+                        snprintf(linebuf,MAXLINE,"%u",ar.r.ui);
+                        break;
+                    case BOOL_TYPE:
+                        if (ar.r.ui==0) {
+                            snprintf(linebuf,MAXLINE,"FALSE");
+                        } else {
+                            snprintf(linebuf,MAXLINE,"TRUE");
+                        }
+                        break;
+                    case ULLONG_TYPE:
+                        snprintf(linebuf,MAXLINE,"%llu",ar.r.ul);
+                        break;
+                    case LLONG_TYPE:
+                        snprintf(linebuf,MAXLINE,"%lld",ar.r.l);
+                        break;
+                    case FLOAT_TYPE:
+                        snprintf(linebuf,MAXLINE,"%f",ar.r.f);
+                        break;
+                    case TIMEVAL_TYPE:
+                    {
+                        gs_float_t t;
+                        t= ar.r.t.tv_usec;
+                        t=t/1000000;
+                        t=t+ar.r.t.tv_sec;
+                        snprintf(linebuf,MAXLINE,"%f sec",t);
+                    }
+                        break;
+                    case VSTR_TYPE:
+                    {
+                        int x;
+                        int c;
+                        int d=0;
+                        char * src;
+                        src=(char*)ar.r.vs.offset;
+                        if(d<MAXLINE){
+                            linebuf[d] = '\0';
+                        }
+                        for(x=0;x<ar.r.vs.length;x++) {
+                            c=src[x];
+                            if ((c<='~') && (c>=' ')) {
+                                if (d<MAXLINE-1) {
+                                    linebuf[d]=c;
+                                    linebuf[d+1]=0;
+                                    d++;
+                                }
+                            } else {
+                                if (d<MAXLINE-1) {
+                                    linebuf[d]='.';
+                                    linebuf[d+1]=0;
+                                    d++;
+                                }
+                            }
+                        }
+                    }
+                        break;
+                    default:
+                        linebuf[0]=0;
+                        break;
+                }
+                if (y<numberoffields-1) snprintf(&linebuf[strlen(linebuf)],MAXLINE,"|");
+                emit_line();
+            }
+            snprintf(linebuf,MAXLINE,"\n");
+            emit_line();
+            if (verbose!=0) fflush(stdout);
+        } else {
+            if (rfta_id.streamid != fta_id.streamid)
+                fprintf(stderr,"Got unkown streamid %llu \n",rfta_id.streamid);
+        }
+
+        // whenever we receive a temp tuple check if we reached time limit
+        if ((code==2)  && tlimit && (time(NULL)-start_time)>=tlimit) {
+            fprintf(stderr,"Reached time limit of %d seconds\n",tlimit);    
+            ftaapp_exit();
+            exit(0);
+        }        
+    }
+}
+
diff --git a/src/tools/gsprintconsole_ves.c b/src/tools/gsprintconsole_ves.c
new file mode 100644 (file)
index 0000000..bdaa277
--- /dev/null
@@ -0,0 +1,643 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+
+
+/*
+ * Print ves formatted records to the console.
+ * Each line is a json record.
+ * Based on gsprintconsole.c, just differences in formatting.
+*/
+
+
+#include <app.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "gshub.h"
+#include "simple_http.h"
+
+#include <schemaparser.h>
+
+#define MAXLINE 100000
+static unsigned tcpport=0;
+static char linebuf[MAXLINE];
+int listensockfd=0;
+int fd=0;
+
+
+// Not all systems have timersub defined so make sure its ther
+#ifndef timersub
+
+#define timersub(tvp, uvp, vvp)                                         \
+do {                                                            \
+(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;          \
+(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;       \
+if ((vvp)->tv_usec < 0) {                               \
+(vvp)->tv_sec--;                                \
+(vvp)->tv_usec += 1000000;                      \
+}                                                       \
+} while (0)
+
+#endif
+
+void hand(int iv) {
+    ftaapp_exit();
+    fprintf(stderr, "exiting via signal handler %d...\n", iv);
+    exit(1);
+}
+
+static void wait_for_client() {
+    struct sockaddr_in serv_addr,cli_addr;
+    socklen_t clilen;
+    if (listensockfd==0) {
+               gs_int32_t on = 1;
+               listensockfd=socket(AF_INET, SOCK_STREAM, 0);
+        if (listensockfd < 0) {
+                       gslog(LOG_EMERG,"Error:Could not create socket for tcp data stream");
+                       exit(1);
+               }
+               bzero((char *) &serv_addr, sizeof(serv_addr));
+               serv_addr.sin_family = AF_INET;
+               serv_addr.sin_addr.s_addr = INADDR_ANY;
+               serv_addr.sin_port = htons(tcpport);
+#ifndef __linux__
+        /* make sure we can reuse the common port rapidly */
+        if (setsockopt(listensockfd, SOL_SOCKET, SO_REUSEPORT,
+                       (gs_sp_t )&on, sizeof(on)) != 0) {
+            gslog(LOG_EMERG,"Error::could not set socket option\n");
+            exit(1);
+        }
+#endif
+        if (setsockopt(listensockfd, SOL_SOCKET, SO_REUSEADDR,
+                       (gs_sp_t )&on, sizeof(on)) != 0) {
+            gslog(LOG_EMERG,"Error::could not set socket option\n");
+            exit(1);
+               }
+        
+               if (bind(listensockfd, (struct sockaddr *) &serv_addr,
+                 sizeof(serv_addr)) < 0) {
+                       gslog(LOG_EMERG,"Error:Could not bind socket for tcp data stream");
+            exit(1);
+        }
+       }
+    
+       do {
+               listen(listensockfd,5);
+               clilen = sizeof(cli_addr);
+               fd=accept(listensockfd, (struct sockaddr *) &cli_addr, &clilen);
+               if (fd<0) {
+            gslog(LOG_EMERG,"Error:Could not accept connection on tcp socket");
+               }
+       } while (fd==0);
+}
+
+
+static void emit_socket() {
+       unsigned o,w,l;
+       o=0;
+       w=0;
+       l=strlen(linebuf);
+       do {
+               if((w=write(fd,&linebuf[o],l))==0) {
+                       close(fd);
+                       wait_for_client();
+               }
+               o=o+w;
+       } while (o<l);
+}
+
+static void emit_line() {
+    
+    if (tcpport==0) {
+        printf("%s",linebuf);
+    } else {
+        emit_socket();
+    }
+    
+}
+
+int main(int argc, char* argv[]) {
+    gs_sp_t me = argv[0];
+    FTAID fta_id;
+    gs_int32_t schema, ch;
+    
+    FTAID rfta_id;
+    gs_uint32_t rsize;
+    gs_uint32_t bufsz=8*1024*1024;
+    gs_int8_t rbuf[2*MAXTUPLESZ];
+    
+    gs_int32_t numberoffields;
+    gs_int32_t verbose=0;
+    gs_int32_t y, lcv;
+    
+    void *pblk;
+    gs_int32_t pblklen;
+       gs_int32_t n_actual_param;
+       gs_int32_t n_expected_param;
+    gs_int32_t xit = 0;
+    gs_int32_t dump = 0;
+    struct timeval tvs, tve, tvd;
+    gs_retval_t code;
+    endpoint gshub;
+    endpoint dummyep;
+    gs_uint32_t tip1,tip2,tip3,tip4;
+    gs_sp_t instance_name;
+
+       gs_sp_t curl_address = NULL;
+       endpoint curl_endpoint;
+       gs_sp_t curl_url = NULL;
+       gs_sp_t curl_auth = NULL;
+       gs_uint32_t http_code;
+
+       gs_uint32_t ves_version=5;
+
+
+    gs_uint32_t tlimit = 0;     // time limit in seconds
+    time_t start_time, curr_time;
+    
+       gsopenlog(argv[0]);
+    
+    
+    while ((ch = getopt(argc, argv, "l:p:r:vXDC:U:A:V:")) != -1) {
+        switch (ch) {
+            case 'r':
+                bufsz=atoi(optarg);
+                break;
+            case 'p':
+                tcpport=atoi(optarg);
+                break;
+            case 'v':
+                verbose++;
+                break;
+            case 'X':
+                xit++;
+                break;
+            case 'D':
+                dump++;
+                break;
+            case 'l':
+                tlimit = atoi(optarg);
+                break;
+            case 'V':
+                ves_version = atoi(optarg);
+                break;
+                       case 'C':
+                               curl_address = strdup(optarg);
+                       if (sscanf(curl_address,"%u.%u.%u.%u:%hu",&tip1,&tip2,&tip3,&tip4,&(curl_endpoint.port))!= 5 ) {
+                               gslog(LOG_EMERG,"Curl IP NOT DEFINED");
+                               exit(1);
+                       }
+                       curl_endpoint.ip=htonl(tip1<<24|tip2<<16|tip3<<8|tip4);
+                       curl_endpoint.port=htons(curl_endpoint.port);
+                               break;
+            case 'U':
+                               curl_url = strdup(optarg);
+                break;
+            case 'A':
+                               curl_auth = strdup(optarg);
+                break;
+            default:
+            usage:
+                fprintf(stderr, "usage: %s [-r <bufsz>] [-p <port>] [-l <time_limit>] [-v] [-X] [-D] [-C <curl_dest>:<curl_port>] [-U <curl_url>] [-A <authentication_string>] [-V <ves_version>] <gshub-hostname>:<gshub-port> <gsinstance_name>  query param1 param2...\n",
+                        *argv);
+                exit(1);
+        }
+    }
+    argc -= optind;
+    argv += optind;
+    if (argc<3) goto usage;
+    
+    if (sscanf(argv[0],"%u.%u.%u.%u:%hu",&tip1,&tip2,&tip3,&tip4,&(gshub.port))!= 5 ) {
+        gslog(LOG_EMERG,"HUB IP NOT DEFINED");
+        exit(1);
+    }
+    gshub.ip=htonl(tip1<<24|tip2<<16|tip3<<8|tip4);
+    gshub.port=htons(gshub.port);
+    instance_name=strdup(argv[1]);
+    if (set_hub(gshub)!=0) {
+        gslog(LOG_EMERG,"Could not set hub");
+        exit(1);
+    }
+    if (set_instance_name(instance_name)!=0) {
+        gslog(LOG_EMERG,"Could not set instance name");
+        exit(1);
+    }
+    
+    if (get_initinstance(gshub,instance_name,&dummyep,1)!=0) {
+        gslog(LOG_EMERG,"Did not receive signal that GS is initiated\n");
+    }
+
+
+//     If this uses curl output, ensure consistency in the curl args
+       if(curl_address != NULL){
+               if(curl_url == NULL){
+                       gslog(LOG_EMERG,"Curl IP defined, but there is no url (e.g. /foo/bar");
+                       exit(1);
+               }
+               if(curl_auth==NULL){
+                       curl_auth = "";
+               } 
+       }
+    
+    gettimeofday(&tvs, 0);
+    argc -=2;
+    argv +=2;
+    if (argc < 1)
+        goto usage;
+    
+    /* initialize host library and the sgroup  */
+    
+    if (verbose>=2) fprintf(stderr,"Initializing gscp\n");
+    
+    if (ftaapp_init(bufsz)!=0) {
+        fprintf(stderr,"%s::error:could not initialize gscp\n", me);
+        exit(1);
+    }
+    
+    signal(SIGTERM, hand);
+    signal(SIGINT, hand);
+    
+    schema = ftaapp_get_fta_schema_by_name(argv[0]);
+    if (schema < 0) {
+        fprintf(stderr,"%s::error:could not get fta '%s' schema\n",
+                me ,argv[0]);
+        exit(1);
+    }
+       n_expected_param = ftaschema_parameter_len(schema);
+    if (n_expected_param == 0) {
+        pblk = 0;
+        pblklen = 0;
+    } else {
+               n_actual_param = argc-1;
+               if(n_actual_param < n_expected_param){
+                       fprintf(stderr,"Error, %d query parameters expected, %d provided.\n",n_expected_param, n_actual_param);
+                       exit(1);
+               }
+        /* parse the params */
+        for (lcv = 1 ; lcv < argc ; lcv++) {
+            char *k, *e;
+            int rv;
+            k = argv[lcv];
+            e = k;
+            while (*e && *e != '=') e++;
+            if (*e == 0) {
+                fprintf(stderr,"param parse error '%s' (fmt 'key=val')\n",
+                        argv[lcv]);
+                exit(1);
+            }
+            *e = 0;
+            rv = ftaschema_setparam_by_name(schema, k, e+1, strlen(e+1));
+            *e = '=';
+            if (rv < 0) {
+                fprintf(stderr,"param setparam error '%s' (fmt 'key=val')\n",
+                        argv[lcv]);
+                exit(1);
+            }
+        }
+        if (ftaschema_create_param_block(schema, &pblk, &pblklen) < 0) {
+            fprintf(stderr, "ftaschema_create_param_block failed!\n");
+            exit(1);
+        }
+    }
+//    ftaschema_free(schema); /* XXXCDC */ // the schema continues to be used
+    
+    
+    if (verbose>=2) fprintf(stderr,"Initalized FTA\n");
+    
+    fta_id=ftaapp_add_fta(argv[0],0,0,0,pblklen,pblk);
+    if (fta_id.streamid==0) {
+        fprintf(stderr,"%s::error:could not initialize fta %s\n",
+                me, argv[0]);
+        exit(1);
+    }
+    /* XXXCDC: pblk is malloc'd, should we free it? */
+    
+    if (verbose>=2) fprintf(stderr,"Get schema handle\n");
+    
+    if ((schema=ftaapp_get_fta_schema(fta_id))<0) {
+        fprintf(stderr,"%s::error:could not get schema\n", me);
+        exit(1);
+    }
+    
+    if ((numberoffields=ftaschema_tuple_len(schema))<0) {
+        fprintf(stderr,"%s::error:could not get number of fields in schema\n",
+                me);
+        exit(1);
+    }
+    
+    if (verbose>=1) {
+        for(y=0; y<numberoffields;y++) {
+            printf("%s",ftaschema_field_name(schema,y));
+            if (y<numberoffields-1) printf("|");
+        }
+        printf("\n");
+    }
+    if (xit) { // -X in command line
+        gettimeofday(&tve, 0);
+        timersub(&tve, &tvs, &tvd);
+        printf("TIME= %ld%06d sec\n", tvd.tv_sec, tvd.tv_usec);
+        hand(0);       // effectively an exit
+    }
+    if (tcpport!=0) {
+       wait_for_client();
+    }
+
+    start_time = time(NULL);
+
+       int measurement_interval_pos = -1; // extract measurementInterval if present
+       char *field_names[numberoffields];
+    for(y=0; y<numberoffields;y++) {
+               field_names[y] = strdup(ftaschema_field_name(schema,y));
+               if(strcmp(field_names[y], "measurementInterval")==0)
+                       measurement_interval_pos = y;
+       }
+
+
+       struct timeval tsample;
+       gettimeofday(&tsample, 0);
+       char start_ts[100], curr_ts[100];
+       sprintf(start_ts,"%ld%06d", tsample.tv_sec, tsample.tv_usec);
+
+       long unsigned int lineno=0;
+       long unsigned int seqno=0;
+       unsigned int measurement_interval;
+    while((code=ftaapp_get_tuple(&rfta_id,&rsize,rbuf,2*MAXTUPLESZ,0))>=0) {
+               lineno++;
+        if (dump)      // -D in command line
+            continue;
+        if (ftaschema_is_eof_tuple(schema, rbuf)) {
+            /* initiate shutdown or something of that nature */
+            printf("#All data proccessed\n");
+            exit(0);
+        }
+        if (!rsize)
+            continue;
+        if (verbose >=2) {
+            snprintf(linebuf,MAXLINE,"RESULT CODE => %u\n",code);
+            emit_line();
+        }
+        if ((code==0)&&(rfta_id.streamid == fta_id.streamid)) {
+                       seqno++;
+                       gettimeofday(&tsample, 0);
+                       sprintf(curr_ts,"%ld%06d", tsample.tv_sec, tsample.tv_usec);
+                       int pos;
+                       if(ves_version < 7){
+                               pos = snprintf(linebuf, MAXLINE,
+  "{\"event\": { \"commonEventHeader\": { "
+        "\"domain\": \"measurementsForVfScaling\", "
+        "\"eventId\": \"%s%u\", "
+        "\"eventType\": \"%s\", "
+        "\"eventName\": \"Measurement_MC_%s\", "
+        "\"lastEpochMicrosec\": %s, "
+        "\"priority\": \"Normal\", "
+        "\"reportingEntityName\": \"gs-lite MC\", "
+        "\"sequence\": %u, "
+        "\"sourceName\": \"meas_cmpgn_xapp\", "
+        "\"startEpochMicrosec\": %s, "
+        "\"version\": 5 "
+      "}, "
+      "\"measurementsForVfScalingFields\": { "
+               "\"additionalFields\": ["
+                               ,argv[0],lineno, argv[0], argv[0], curr_ts, seqno, start_ts
+                               );
+                       }else{
+                               pos = snprintf(linebuf, MAXLINE,
+  "{\"event\": { \"commonEventHeader\": { "
+        "\"domain\": \"measurement\", "
+        "\"eventId\": \"%s%u\", "
+        "\"eventType\": \"%s\", "
+        "\"eventName\": \"Measurement_MC_%s\", "
+        "\"lastEpochMicrosec\": %s, "
+        "\"priority\": \"Normal\", "
+        "\"reportingEntityName\": \"gs-lite MC\", "
+        "\"sequence\": %u, "
+        "\"sourceName\": \"meas_cmpgn_xapp\", "
+        "\"startEpochMicrosec\": %s, "
+        "\"version\": \"4.0.1\", "
+        "\"vesEventListenerVersion\": \"7.0.1\" "
+      "}, "
+      "\"measurementFields\": { "
+               "\"additionalFields\": {"
+                               ,argv[0],lineno, argv[0], argv[0], curr_ts, seqno, start_ts
+                               );
+                       }
+
+                       measurement_interval = 0;
+            for(y=0; y<numberoffields;y++) {
+                struct access_result ar;
+//                if (verbose>=2)
+//                    printf("%s->",ftaschema_field_name(schema,y));
+               if(y>0){
+                                       linebuf[pos]=',';
+                                       pos++;
+                               }
+                ar=ftaschema_get_field_by_index(schema,y,rbuf,rsize);
+                switch (ar.field_data_type) {
+                    case INT_TYPE:
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"%d\"}",field_names[y], ar.r.i);
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos," \"%s\": \"%d\"",field_names[y], ar.r.i);
+                                               if(y==measurement_interval_pos)
+                                                       measurement_interval = (unsigned int)ar.r.i;
+                        break;
+                    case UINT_TYPE:
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"%u\"}",field_names[y], ar.r.ui);
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos," \"%s\": \"%u\"",field_names[y], ar.r.ui);
+                                               if(y==measurement_interval_pos)
+                                                       measurement_interval = (unsigned int)ar.r.ui;
+                        break;
+                    case IP_TYPE:
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"%u.%u.%u.%u\"}",field_names[y], ar.r.ui>>24&0xff,
+                                 ar.r.ui>>16&0xff,
+                                 ar.r.ui>>8&0xff,
+                                 ar.r.ui&0xff);
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"\"%s\": \"%u.%u.%u.%u\"",field_names[y], ar.r.ui>>24&0xff,
+                                 ar.r.ui>>16&0xff,
+                                 ar.r.ui>>8&0xff,
+                                 ar.r.ui&0xff);
+                        break;
+                    case IPV6_TYPE:
+                    {
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"",field_names[y]);
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos," \"%s\": \"",field_names[y]);
+                        unsigned x;
+                        unsigned zc=0;
+                        for(x=0;x<4;x++) { if (ar.r.ip6.v[x]==0) zc++;}
+                        if (zc!=4) {
+                            snprintf(linebuf,MAXLINE,"");
+                            for(x=0;x<8;x++) {
+                                unsigned char * a = (unsigned char *)  &(ar.r.ip6.v[0]);
+                                unsigned y;
+                                y=((unsigned)a[2*x])<<8|((unsigned) a[2*x+1]);
+                                pos += snprintf(linebuf+pos,MAXLINE-pos,"%04x",y);
+                                if (x<7){
+                                                                       pos += snprintf(linebuf+pos,MAXLINE-pos,":");
+                                                               }
+                            }
+                        } else {
+                            pos+=snprintf(linebuf+pos,MAXLINE-pos,"::");
+                        }
+                                               if(ves_version < 7)
+                                                       pos += snprintf(linebuf+pos, MAXLINE-pos,"\"}");
+                                               else
+                                                       pos += snprintf(linebuf+pos, MAXLINE-pos,"\"");
+                    }
+                        break;
+                        
+                    case USHORT_TYPE:
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"%u\"}",field_names[y], ar.r.ui);
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"\"%s\":  \"%u\"}",field_names[y], ar.r.ui);
+                                               if(y==measurement_interval_pos)
+                                                       measurement_interval = (unsigned int)ar.r.ui;
+                        break;
+                    case BOOL_TYPE:
+                                               if(ves_version < 7){
+                               if (ar.r.ui==0) {
+                                       pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"FALSE\"}",field_names[y]);
+                                    } else {
+                                       pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"TRUE\"}",field_names[y]);
+                               }
+                                               }else{
+                               if (ar.r.ui==0) {
+                                       pos += snprintf(linebuf+pos,MAXLINE-pos,"\"%s\": \"FALSE\"",field_names[y]);
+                                    } else {
+                                       pos += snprintf(linebuf+pos,MAXLINE-pos,"\"%s\": \"TRUE\"",field_names[y]);
+                               }
+                                               }
+                        break;
+                    case ULLONG_TYPE:
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"%llu\"}",field_names[y], ar.r.ul);
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"\"%s\": \"%llu\"",field_names[y], ar.r.ul);
+                                               if(y==measurement_interval_pos)
+                                                       measurement_interval = (unsigned int)ar.r.ul;
+                        break;
+                    case LLONG_TYPE:
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"%lld\"}",field_names[y], ar.r.l);
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"\"%s\": \"%lld\"",field_names[y], ar.r.l);
+                                               if(y==measurement_interval_pos)
+                                                       measurement_interval = (unsigned int)ar.r.l;
+                        break;
+                    case FLOAT_TYPE:
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"%f\"}",field_names[y], ar.r.f);
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"\"%s\": \"%f\"",field_names[y], ar.r.f);
+                        break;
+                    case TIMEVAL_TYPE:
+                    {
+                        gs_float_t t;
+                        t= ar.r.t.tv_usec;
+                        t=t/1000000;
+                        t=t+ar.r.t.tv_sec;
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"%f\"}",field_names[y], t);
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"\"%s\": \"%f\"",field_names[y], t);
+                    }
+                        break;
+                    case VSTR_TYPE:
+                    {
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"{\"name\": \"%s\", \"value\": \"",field_names[y]);
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"\"%s\": \"",field_names[y]);
+                        int x;
+                        int c;
+                        char * src;
+                        src=(char*)ar.r.vs.offset;
+                                               for(x=0;x<ar.r.vs.length;x++){
+                            c=src[x];
+                            if ((c<='~') && (c>=' ')) {
+                                if (pos<MAXLINE-1) {
+                                    linebuf[pos]=c;
+                                    pos++;
+                                }
+                            } else {
+                                if (pos<MAXLINE-1) {
+                                    linebuf[pos]='.';
+                                    pos++;
+                                }
+                            }
+                                               }
+                                               if(ves_version < 7)
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"\"}");
+                                               else
+                               pos += snprintf(linebuf+pos,MAXLINE-pos,"\"");
+                    }
+                        break;
+                    default:
+                        linebuf[0]=0;
+                        break;
+                }
+                       }
+                       if(ves_version < 7){
+                               snprintf(linebuf+pos, MAXLINE-pos,
+               "], \"measurementInterval\": %u, \"measurementsForVfScalingVersion\": 1"
+               "}}}\n", measurement_interval
+                               );
+                       }else{
+                               snprintf(linebuf+pos, MAXLINE-pos,
+               "}, \"measurementInterval\": %u, \"measurementFieldsVersion\": \"4.0\""
+               "}}}\n", measurement_interval
+                               );
+                       }
+                       if(curl_address==NULL){
+               emit_line();
+                       }else{
+                               http_post_request_hdr(curl_endpoint, curl_url, linebuf, &http_code, curl_auth);
+                               if(http_code != 200 && http_code != 202){
+                                       gslog(LOG_WARNING, "http return code is %d\n",http_code);
+                               }
+                       }
+            if (verbose!=0) fflush(stdout);
+        } else {
+            if (rfta_id.streamid != fta_id.streamid)
+                fprintf(stderr,"Got unkown streamid %llu \n",rfta_id.streamid);
+        }
+
+        // whenever we receive a temp tuple check if we reached time limit
+        if ((code==2)  && tlimit && (time(NULL)-start_time)>=tlimit) {
+            fprintf(stderr,"Reached time limit of %d seconds\n",tlimit);    
+            ftaapp_exit();
+            exit(0);
+        }        
+    }
+}
+
diff --git a/src/tools/gssinksim.c b/src/tools/gssinksim.c
new file mode 100644 (file)
index 0000000..9334ee8
--- /dev/null
@@ -0,0 +1,404 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include <schemaparser.h>
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "gshub.h"
+
+#define MAXLINE 100000
+static unsigned tcpport=0;
+static char linebuf[MAXLINE];
+int listensockfd=0;
+int fd=0;
+gs_int32_t verbose=0;
+endpoint hub;
+endpoint ds;
+gs_sp_t sink_name;
+
+
+static void wait_for_feed() {
+    struct sockaddr_in serv_addr,cli_addr;
+    socklen_t clilen;
+    struct sockaddr_in sin;
+    socklen_t sin_sz;
+    if (listensockfd==0) {
+               gs_int32_t on = 1;
+        
+        if (verbose==2) {
+            fprintf(stderr,"Create listen socket for port %u\n",tcpport);
+        }
+               listensockfd=socket(AF_INET, SOCK_STREAM, 0);
+        if (listensockfd < 0) {
+                       gslog(LOG_EMERG,"Error:Could not create socket for tcp data stream");
+                       exit(1);
+               }
+               bzero((char *) &serv_addr, sizeof(serv_addr));
+               serv_addr.sin_family = AF_INET;
+               serv_addr.sin_addr.s_addr = INADDR_ANY;
+               serv_addr.sin_port = htons(tcpport);
+#ifndef __linux__
+        /* make sure we can reuse the common port rapidly */
+        if (setsockopt(listensockfd, SOL_SOCKET, SO_REUSEPORT,
+                       (gs_sp_t )&on, sizeof(on)) != 0) {
+            gslog(LOG_EMERG,"Error::could not set socket option\n");
+            exit(1);
+        }
+#endif
+        if (setsockopt(listensockfd, SOL_SOCKET, SO_REUSEADDR,
+                       (gs_sp_t )&on, sizeof(on)) != 0) {
+            gslog(LOG_EMERG,"Error::could not set socket option\n");
+            exit(1);
+               }
+        
+               if (bind(listensockfd, (struct sockaddr *) &serv_addr,
+                 sizeof(serv_addr)) < 0) {
+                       gslog(LOG_EMERG,"Error:Could not bind socket for tcp data stream");
+            exit(1);
+        }
+       }
+    
+    if (verbose==2) {
+        fprintf(stderr,"Socket created waiting for data producer\n");
+    }
+    if (listen(listensockfd,5)< 0) {
+        fprintf(stderr,"Error::could not listen to socket for port %u \n",ntohs(serv_addr.sin_port));
+        close(listensockfd);
+        exit(1);
+    }
+    sin_sz=sizeof(sin);
+    if (getsockname(listensockfd, (struct sockaddr *) &sin, &sin_sz) < 0) {
+        fprintf(stderr,"Error::could not get local port number of listen socket\n");
+        exit(1);
+    }
+    ds.ip=htonl(127<<24|1);
+    ds.port=sin.sin_port;
+    if (set_streamsink(hub,sink_name,ds)!=0) {
+        fprintf(stderr,"Error::could not set sink in GSHUB for %s source name\n",sink_name);
+        exit(1);
+    }
+    
+       do {
+               clilen = sizeof(cli_addr);
+               fd=accept(listensockfd, (struct sockaddr *) &cli_addr, &clilen);
+               if (fd<0) {
+            gslog(LOG_EMERG,"Error:Could not accept connection on tcp socket");
+               }
+       } while (fd==0);
+    if (verbose) {
+        fprintf(stderr,"Producer found ready to rock!\n");
+    }
+    
+}
+
+
+static void gs_read(gs_sp_t buffer, gs_uint32_t length){
+       gs_uint32_t used=0;
+       gs_uint32_t cur;
+    
+       while(used < length) {
+        if (verbose==2) {
+            fprintf(stderr,"\tread %u out of %u\n",used,length);
+        }
+               if ((cur=read(fd,&(buffer[used]),length-used))<=0) {
+                       gslog(LOG_EMERG,"ERROR:could not read data from gdat stream");
+                       exit(0);
+               }
+               used+=cur;
+       }
+}
+
+static void gs_read_line(gs_sp_t buffer, gs_uint32_t length){
+    gs_uint32_t used=0;
+    gs_uint32_t cur;
+    
+    while((used < (length-1)) && ((used==0)|| (buffer[used-1]!='\n'))) {
+        if ((cur=read(fd,&(buffer[used]),1))<=0) {
+            gslog(LOG_EMERG,"ERROR:could not read data from gdat stream");
+            exit(0);
+        }
+        used+=cur;
+    }
+       buffer[used]=0;
+}
+
+static gs_uint32_t get_stream_tuple(gs_uint32_t * rsize,gs_sp_t rbuf,gs_uint32_t bufsz){
+    
+    gs_uint32_t nsz,sz;
+    gs_read((gs_sp_t)&nsz,sizeof(gs_uint32_t));
+    sz=ntohl(nsz);
+    if (sz>MAXTUPLESZ) {
+        gslog(LOG_EMERG,"Error::Illegal tuple received");
+        exit(0);
+    }
+    
+    if (sz>bufsz) {
+        gslog(LOG_EMERG,"Error::Illegal tuple size received -- to long");
+        exit(0);
+    }
+    *rsize=sz;
+    
+    gs_read(rbuf,(sz));
+    return 0;
+}
+
+int main(int argc, char** argv) {
+    gs_uint32_t streamid;
+    gs_schemahandle_t schema;
+    
+    gs_uint32_t rstreamid;
+    gs_uint32_t rsize;
+    gs_int8_t rbuf[2*MAXTUPLESZ];
+    
+    gs_int32_t numberoffields;
+    gs_int32_t y;
+    gs_int32_t parserversion;
+    gs_uint32_t schemalen;
+    gs_sp_t asciischema;
+    gs_sp_t me;
+    gs_int32_t ch;
+    
+    gs_int8_t buf[1024];
+    gs_uint32_t tip1,tip2,tip3,tip4;
+    
+    /* initialize host library and the sgroup  */
+    
+    me=argv[0];
+    
+    while ((ch = getopt(argc, argv, "hvxp:")) != -1) {
+        switch(ch) {
+            case 'h':
+                fprintf(stderr,"%s::usage: %s -v -x -p <port>  <IP>:<port> <source_name> \n",argv[0],argv[0]);
+                exit(0);
+                break;
+            case 'p':
+                tcpport=atoi(optarg);;
+                break;
+            case 'v':
+                verbose=1;
+                break;
+            case 'x':
+                verbose=2;
+                break;
+            default:
+                break;
+        }
+    }
+    if (optind+2>argc) {
+        fprintf(stderr,"Could not find hub and stream source name on command line\n");
+        exit(1);
+    }
+    if (sscanf(argv[optind],"%u.%u.%u.%u:%hu",&tip1,&tip2,&tip3,&tip4,&(hub.port))!= 5 ) {
+        fprintf(stderr,"Could not parse hub endpoint\n");
+        exit(1);
+    }
+    hub.ip=htonl(tip1<<24|tip2<<16|tip3<<8|tip4);
+    hub.port=htons(hub.port);
+    sink_name=strdup(argv[optind+1]);
+    
+    wait_for_feed();
+    
+    gs_read_line(buf,1024);
+    if (strncmp(buf,"GDAT",4)!=0) {
+        gslog(LOG_EMERG,"ERROR: not a GDAT stream\n");
+        exit(0);
+    }
+    gs_read_line(buf,1024);
+    if (sscanf(buf,"VERSION:%u\n",&parserversion)!=1) {
+        gslog(LOG_EMERG,"ERROR: no GDAT VERSION given\n");
+        exit(0);
+    }
+    gs_read_line(buf,1024);
+    if (sscanf(buf,"SCHEMALENGTH:%u\n",&schemalen)!=1) {
+        gslog(LOG_EMERG,"ERROR: no GDAT SCHEMALENGTH given\n");
+        exit(0);
+    }
+    
+    if(verbose==2) {
+        fprintf (stderr,"GDAT version %u schemalength %u\n",parserversion,schemalen);
+    }
+       
+    if (schemaparser_accepts_version(parserversion)!=1) {
+        fprintf(stderr,"%s::error: wrong parser version %u for file %s\n",
+                me,parserversion,argv[0]);
+        exit(1);
+    }
+    
+    if ((asciischema=malloc(schemalen))==0) {
+        fprintf(stderr,"%s::error: could not allocate schema buffer of sz %u "
+                "for file %s\n",
+                me,schemalen,argv[0]);
+        exit(1);
+    }
+    
+    if(verbose==2) {
+        fprintf (stderr,"Reading schema from scocket\n");
+    }
+    
+    gs_read(asciischema,schemalen);
+    
+    if(verbose==2) {
+        fprintf (stderr,"Received schema\n");
+    }
+    
+    if (verbose==2) {
+        fprintf(stderr,"%s\n",asciischema);
+    }
+    if ((schema=ftaschema_parse_string(asciischema))<0) {
+        fprintf(stderr,"%s::error: could not parse schema  \n",
+                me);
+        exit(1);
+    }
+    
+    if ((numberoffields=ftaschema_tuple_len(schema))<0) {
+        fprintf(stderr,"%s::error:could not get number of fields in schema\n",
+                me);
+        exit(1);
+    }
+    if (verbose==1) {
+        for(y=0; y<numberoffields;y++) {
+            printf("%s",ftaschema_field_name(schema,y));
+            if (y<numberoffields-1) printf("|");
+        }
+        printf("\n");
+    }
+    while(get_stream_tuple(&rsize,rbuf,2*MAXTUPLESZ)==0) {
+        if (verbose) {
+            if (ftaschema_is_eof_tuple(schema, rbuf)) {
+                /* initiate shutdown or something of that nature */
+                fprintf(stderr,"%s::All data proccessed\n",me);
+            } else {
+                if (ftaschema_is_temporal_tuple(schema, rbuf)) {
+                    /* initiate shutdown or something of that nature */
+                    fprintf(stderr,"%s:: temporal tuple\n",me);
+                } else {
+                    fprintf(stderr,"%s:: regular tuple\n",me);
+                }
+            }
+        }
+        
+        if ((!rsize) )
+            continue;
+        for(y=0; y<numberoffields;y++) {
+            struct access_result ar;
+            if (verbose==2)
+                printf("%s->",ftaschema_field_name(schema,y));
+            ar=ftaschema_get_field_by_index(schema,y,rbuf,rsize);
+            switch (ar.field_data_type) {
+                case INT_TYPE:
+                    printf("%d",ar.r.i);
+                    break;
+                case UINT_TYPE:
+                    printf("%u",ar.r.ui);
+                    break;
+                case IP_TYPE:
+                    printf("%u.%u.%u.%u",ar.r.ui>>24&0xff,
+                           ar.r.ui>>16&0xff,
+                           ar.r.ui>>8&0xff,
+                           ar.r.ui&0xff);
+                    break;
+                case IPV6_TYPE:
+                {
+                    unsigned x;
+                    unsigned zc=0;
+                    for(x=0;x<4;x++) { if (ar.r.ip6.v[x]==0) zc++;}
+                    if (zc!=4) {
+                        for(x=0;x<8;x++) {
+                            unsigned char * a = (unsigned char *)  &(ar.r.ip6.v[0]);
+                            unsigned y;
+                            y=((unsigned)a[2*x])<<8|((unsigned) a[2*x+1]);
+                            printf("%04x",y);
+                            if (x<7) printf(":");
+                        }
+                    } else {
+                        printf("::");
+                    }
+                }
+                    break;
+                case USHORT_TYPE:
+                    printf("%hu",(unsigned short)ar.r.ui);
+                    break;
+                case BOOL_TYPE:
+                    if (ar.r.ui==0) {
+                        printf("FALSE");
+                    } else {
+                        printf("TRUE");
+                    }
+                    break;
+                case ULLONG_TYPE:
+                {
+                    gs_uint64_t ul;
+                    gs_uint64_t t1;
+                    gs_uint64_t t2;
+                    ul=ar.r.ul;
+                    printf("%llu",ul);
+                }
+                    break;
+                case LLONG_TYPE:
+                    printf("%lld",ar.r.l);
+                    break;
+                case FLOAT_TYPE:
+                    printf("%f",ar.r.f);
+                    break;
+                case TIMEVAL_TYPE:
+                { 
+                    gs_float_t t;
+                    t= ar.r.t.tv_usec;
+                    t=t/1000000;
+                    t=t+ar.r.t.tv_sec;
+                    printf("%lf sec",t);
+                }
+                    break;
+                case VSTR_TYPE:
+                {
+                    int x;
+                    int c;
+                    char * src;
+                    src=(gs_sp_t)ar.r.vs.offset;
+                    if ((ar.r.vs.length>0) && (src[ar.r.vs.length-1]==0)) {
+                        ar.r.vs.length = ar.r.vs.length-1;
+                    }
+                    for(x=0;x<ar.r.vs.length;x++) {
+                        c=src[x];
+                        if (((c<='~') && (c>=' '))&&(c!='|')) {
+                            printf("%c",c);
+                        } else {
+                            printf("(0x%x)",(gs_uint8_t)c);
+                        }
+                    }
+                }
+                    break;
+                default:
+                    break;
+            }
+            if (y<numberoffields-1) printf("|");
+        }
+        printf("\n");
+        if (verbose!=0) fflush(stdout);
+    }
+    exit(0);
+}
+
diff --git a/src/tools/gssource.c b/src/tools/gssource.c
new file mode 100644 (file)
index 0000000..e7adf8f
--- /dev/null
@@ -0,0 +1,280 @@
+/* ------------------------------------------------
+ Copyright 2014 AT&T Intellectual Property
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+ http://www.apache.org/licenses/LICENSE-2.0
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ ------------------------------------------- */
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <signal.h>
+#include <time.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include "gsconfig.h"
+#include "gstypes.h"
+#include "gshub.h"
+
+
+
+
+gs_sp_t me = 0;
+gs_sp_t schematext = 0;
+gs_int32_t schematextlen = 0;
+gs_sp_t schematmp = 0;
+gs_int32_t verbose=0;
+gs_uint32_t tcpport=0;
+int listensockfd=0;
+int fd=0;
+endpoint hub;
+endpoint ds;
+gs_sp_t source_name;
+
+static void gs_write(gs_sp_t buffer, gs_uint32_t len)
+{
+    if (send(fd,buffer,len,0) != len) {
+        fprintf(stderr,"could not write on stream socket");
+        exit(0);
+    }
+}
+
+static void wait_for_feed() {
+    struct sockaddr_in serv_addr,cli_addr;
+    struct sockaddr_in sin;
+    socklen_t clilen;
+    socklen_t sin_sz;
+    if (listensockfd==0) {
+               gs_int32_t on = 1;
+        
+        if (verbose) {
+            fprintf(stderr,"Create listen socket for port %u\n",tcpport);
+        }
+               listensockfd=socket(AF_INET, SOCK_STREAM, 0);
+        if (listensockfd < 0) {
+                       fprintf(stderr,"Error:Could not create socket for tcp data stream");
+                       exit(1);
+               }
+               bzero((char *) &serv_addr, sizeof(serv_addr));
+               serv_addr.sin_family = AF_INET;
+               serv_addr.sin_addr.s_addr = INADDR_ANY;
+               serv_addr.sin_port = htons(tcpport);
+#ifndef __linux__
+        /* make sure we can reuse the common port rapidly */
+        if (setsockopt(listensockfd, SOL_SOCKET, SO_REUSEPORT,
+                       (gs_sp_t )&on, sizeof(on)) != 0) {
+            fprintf(stderr,"Error::could not set socket option\n");
+            exit(1);
+        }
+#endif
+        if (setsockopt(listensockfd, SOL_SOCKET, SO_REUSEADDR,
+                       (gs_sp_t )&on, sizeof(on)) != 0) {
+            fprintf(stderr,"Error::could not set socket option\n");
+            exit(1);
+               }
+        
+               if (bind(listensockfd, (struct sockaddr *) &serv_addr,
+                 sizeof(serv_addr)) < 0) {
+                       fprintf(stderr,"Error:Could not bind socket for tcp data stream");
+            exit(1);
+        }
+       }
+    
+    if (verbose) {
+        fprintf(stderr,"Socket created waiting for data producer\n");
+    }
+    if (listen(listensockfd,5)< 0) {
+        fprintf(stderr,"Error::could not listen to socket for port %u \n",ntohs(serv_addr.sin_port));
+        close(listensockfd);
+        exit(1);
+    }
+    sin_sz=sizeof(sin);
+    if (getsockname(listensockfd, (struct sockaddr *) &sin, &sin_sz) < 0) {
+        fprintf(stderr,"Error::could not get local port number of listen socket\n");
+        exit(1);
+    }
+    ds.ip=htonl(127<<24|1);
+    ds.port=sin.sin_port;
+    if (set_streamsource(hub,source_name,ds)!=0) {
+        fprintf(stderr,"Error::could not set source in GSHUB for %s source name\n",source_name);
+        exit(1);
+    }
+    
+       do {
+               clilen = sizeof(cli_addr);
+               fd=accept(listensockfd, (struct sockaddr *) &cli_addr, &clilen);
+               if (fd<0) {
+            fprintf(stderr,"Error:Could not accept connection on tcp socket\n");
+               }
+       } while (fd==0);
+    if (verbose) {
+        fprintf(stderr,"Sink found ready to rock!\n");
+    }
+    
+}
+
+
+static void do_file(gs_sp_t filename, gs_int32_t fnlen);
+
+int main(int argc, char** argv) {
+    gs_int32_t x;
+    gs_int32_t s=0;
+    gs_int32_t ch;
+    gs_int32_t endless=0; // repeats files forever
+    gs_uint32_t tip1,tip2,tip3,tip4;
+    while ((ch = getopt(argc, argv, "hxep:")) != -1) {
+        switch(ch) {
+            case 'h':
+                fprintf(stderr,"%s::usage: %s -x -v -e -p <portnumber> <IP>:<port> <source_name> <gdatfiles...>\n",argv[0],argv[0]);
+                exit(0);
+                break;
+            case 'p':
+                tcpport=atoi(optarg);;
+                break;
+            case 'v':
+                verbose=1;
+                break;
+            case 'x':
+                verbose=2;
+                break;
+            case 'e':
+                endless=1;
+                break;
+            default:
+                break;
+        }
+    }
+    s+=optind;
+    if (s+2>argc) {
+        fprintf(stderr,"Could not find hub and stream source name on command line\n");
+        fprintf(stderr,"%s::usage: %s -x -v -e -p <portnumber> <IP>:<port> <source_name> <gdatfiles...>\n",argv[0],argv[0]);
+        exit(1);
+    }
+    if (sscanf(argv[s],"%u.%u.%u.%u:%hu",&tip1,&tip2,&tip3,&tip4,&(hub.port))!= 5 ) {
+        fprintf(stderr,"Could not parse hub endpoint\n");
+        fprintf(stderr,"%s::usage: %s -x -v -e -p <portnumber> <IP>:<port> <source_name> <gdatfiles...>\n",argv[0],argv[0]);
+        exit(1);
+    }
+    hub.ip=htonl(tip1<<24|tip2<<16|tip3<<8|tip4);
+    hub.port=htons(hub.port);
+    source_name=strdup(argv[s+1]);
+    s+=2;
+    wait_for_feed();
+    do {
+        for(x=s;x<argc;x++) {
+            if (verbose) {
+                fprintf(stderr,"%s\n",argv[x]);
+            }
+            do_file(argv[x], strlen(argv[x]));
+        }
+    } while (endless !=0); // will run forever if endless option is set
+    close(fd); // make sure we wait till buffers are empty
+    return 0;
+}
+
+
+/*
+ * do_file: dump the file out
+ */
+
+static void do_file(gs_sp_t filename, gs_int32_t fnlen) {
+    gs_int32_t pipe, parserversion, schemalen;
+    FILE *input;
+    gs_int8_t cmd2[4096 + 128];
+    static gs_int8_t *dbuf;
+    size_t sz;
+    
+    if (fnlen > 3 && filename[fnlen - 3] == '.' &&
+        filename[fnlen - 2] == 'g' &&
+        filename[fnlen - 1] == 'z') {
+        pipe = 1;
+        snprintf(cmd2, sizeof(cmd2), "gzcat %s", filename);
+        input = popen(cmd2, "r");
+    } else {
+        if (fnlen > 3 && filename[fnlen - 3] == 'b' &&
+            filename[fnlen - 2] == 'z' &&
+            filename[fnlen - 1] == '2') {
+            pipe = 1;
+            snprintf(cmd2, sizeof(cmd2), "bzcat %s", filename);
+            input = popen(cmd2, "r");
+        } else {
+            pipe=0;
+            input = fopen(filename, "r");
+        }
+    }
+    
+    if (!input) {
+        perror("stream open");
+        fprintf(stderr, "%s: cannot open %s\n", me, filename);
+        return;
+    }
+    
+    if (fscanf(input, "GDAT\nVERSION:%u\nSCHEMALENGTH:%u\n",
+               &parserversion,&schemalen) != 2) {
+        fprintf(stderr,"%s: cannot parse GDAT file header in '%s'\n",
+                me, filename);
+        exit(1);
+    }
+    
+    /* first time ? */
+    if (schematext == 0) {
+        gs_uint8_t buf[1024];
+        schematextlen = schemalen;
+        schematext = malloc(schemalen);
+        dbuf = malloc(CATBLOCKSZ);
+        if (!schematext  || !dbuf) {
+            fprintf(stderr,"%s: malloc error reading GDAT file header in '%s'\n",
+                    me, filename);
+            exit(1);
+        }
+        if (fread(schematext, schemalen, 1, input) != 1) {
+            fprintf(stderr,"%s: cannot parse-read GDAT file header in '%s'\n",
+                    me, filename);
+            exit(1);
+        }
+        sprintf((char *)buf,"GDAT\nVERSION:%u\nSCHEMALENGTH:%u\n", parserversion, schemalen);
+        gs_write((gs_sp_t)buf,strlen((const char*)buf));
+        gs_write(schematext, schemalen);
+    } else {
+        schematmp = malloc(schemalen);
+        if (!schematmp ) {
+            fprintf(stderr,"%s: malloc error reading GDAT file header in '%s'\n",
+                    me, filename);
+            exit(1);
+        }
+        if (fread(schematmp, schemalen, 1, input) != 1) {
+            fprintf(stderr,"%s: cannot parse-read GDAT file header in '%s'\n",
+                    me, filename);
+            exit(1);
+        }
+        free(schematmp);
+        //   if (memcmp(schematext, schematmp, schematextlen)) {
+        //     fprintf(stderr,"%s: GDAT schema mis-match in file '%s'\n",
+        //             me, filename);
+        //     exit(1);
+        //   }
+    }
+    
+    while ((sz = fread(dbuf, 1, CATBLOCKSZ, input)) > 0) {
+        gs_write(dbuf,sz);
+    }
+    
+    if (pipe) {
+        pclose(input);
+    } else {
+        fclose(input);
+    }
+    
+}
diff --git a/src/tools/process_logs.cc b/src/tools/process_logs.cc
new file mode 100644 (file)
index 0000000..2481813
--- /dev/null
@@ -0,0 +1,1512 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include<stdio.h>
+#include<stdlib.h>
+
+#include<string.h>
+#include<string>
+#include<vector>
+#include<map>
+#include<set>
+#include<list>
+#include<time.h>
+#include <unistd.h>
+
+#include"xml_t.h"
+
+#include"qnode.h"
+
+using namespace std;
+
+extern int xmlParserparse(void);
+extern FILE *xmlParserin;
+extern int xmlParserdebug;
+xml_t *xml_result;
+
+int init_discard = 12;
+
+int rts_load_history_len = 3;
+double hist_multiplier = 0.8;
+bool uniform_rts_alloc = true;
+
+#define LINEBUF 1000
+#define SPLITBUF 20
+
+double min_hfta_insz = 1000000.0;
+double min_hfta_cpu = 0.2;
+
+double cpu_util_threshold = 0.9;
+double crate_hi=.01;   // upper bound on collision rate
+double crate_lo=.002;  // lower bound, increase HT size
+double erate_hi=.01;   // upper bound on eviction ratemsvii
+int htmax = 1000;
+double xfer_costs[4] = {.1, .1, .3, 1.0};
+
+
+int split_string(char *instr,char sep, char **words,int max_words){
+   char *loc;
+   char *str;
+   int nwords = 0;
+
+   str = instr;
+   words[nwords++] = str;
+   while( (loc = strchr(str,sep)) != NULL){
+        *loc = '\0';
+        str = loc+1;
+        if(nwords >= max_words){
+                fprintf(stderr,"Error in split_string, too many words discovered (max is %d)\n",max_words);
+                nwords = max_words-1;
+        }
+        words[nwords++] = str;
+   }
+
+   return(nwords);
+}
+
+string int_to_string(int i){
+    string ret;
+    char tmpstr[100];
+    sprintf(tmpstr,"%d",i);
+    ret=tmpstr;
+    return(ret);
+}
+
+
+
+
+
+struct fta_addr{
+       int ip;
+       int port;
+       int streamid;
+
+       fta_addr(int i, int p, int s){
+               ip=i;
+               port=p;
+               streamid=s;
+       }
+};
+
+struct cmpr_fta_addr{
+       bool operator()(fta_addr const &a, fta_addr const &b) const{
+               if(a.ip < b.ip)
+                       return true;
+               if(a.ip > b.ip)
+                       return false;
+               if(a.port < b.port)
+                       return true;
+               if(a.port > b.port)
+                       return false;
+               if(a.streamid < b.streamid)
+                       return true;
+               return false;
+       }
+};
+
+bool cmpr_parallel_idx(const qnode *a, const qnode *b){
+       return a->par_index < b->par_index;
+}
+
+struct cpu_info_str{
+       int processor_id;
+       int socket_id;
+       int core_id;
+
+       double assigned_load;
+
+       cpu_info_str(int p, int s, int c){
+               processor_id=p;
+               socket_id=s;
+               core_id=c;
+               assigned_load = 0.0;
+       }
+
+       string to_csv(){
+               char buf[200];
+               sprintf(buf,"%d,%d,%d",processor_id,socket_id,core_id);
+               return string(buf);
+       }
+
+       int distance_from(cpu_info_str *other){
+               if(socket_id != other->socket_id)
+                       return 3;
+               if(core_id != other->core_id)
+                       return 2;
+               if(processor_id != other->processor_id)
+                       return 1;
+               return 0;
+       }
+};
+
+bool cmpr_cpu_info(cpu_info_str const *a, cpu_info_str const *b){
+       if(a->socket_id < b->socket_id)
+               return true;
+       if(a->socket_id > b->socket_id)
+               return false;
+       if(a->core_id < b->core_id)
+               return true;
+       if(a->core_id > b->core_id)
+               return false;
+       if(a->processor_id < b->processor_id)
+               return true;
+       return false;
+}
+
+
+
+
+int main(int argc, char **argv){
+       int i,j,s;
+
+       time_t now = time(NULL);
+       tm *now_tm = localtime(&now);
+       int year=now_tm->tm_year;
+
+
+//             Options
+       string src_dir="";
+       string trace_file="";
+       string resource_log_file = "resource_log.csv";
+
+       const char *optstr = "d:r:i:l:m:UNu:s:C:c:E:0:1:2:";
+       const char *usage_str =
+"Usage: %s [options]  trace_file\n"
+"\t-d source_directory\n"
+"\t-r resource_log_file\n"
+"\t-i initial discard from the resource log\n"
+"\t-s default interface hash table length.\n"
+"\t-l rts load history length\n"
+"\t-m rts load history multiplier\n"
+"\t-U All rts interface hashes are the same.\n"
+"\t-N rts interface hashes are processed independently.\n"
+"\t-u max cpu utilization threshold\n"
+"\t-C upper bound on collision rate.\n"
+"\t-c lower bound on collision rate.\n"
+"\t-E upper bound on the eviction rate.\n"
+"\t-0 communication cost multiplier for 0-distance processes.\n"
+"\t-1 communication cost multiplier for 1-distance processes.\n"
+"\t-2 communication cost multiplier for 2-distance processes.\n"
+;
+
+   char chopt;
+   while((chopt = getopt(argc,argv,optstr)) != -1){
+               switch(chopt){
+               case '0':
+                       xfer_costs[0] = atof(optarg);
+                       if(xfer_costs[0] < 0 || xfer_costs[0] > 1){
+                               fprintf(stderr,"ERROR, 0-distance xfer costs (%f) must be in [0,1].\n",xfer_costs[0]);
+                               exit(1);
+                       }
+               break;
+               case '1':
+                       xfer_costs[1] = atof(optarg);
+                       if(xfer_costs[1] < 0 || xfer_costs[1] > 1){
+                               fprintf(stderr,"ERROR, 1-distance xfer costs (%f) must be in [0,1].\n",xfer_costs[1]);
+                               exit(1);
+                       }
+               break;
+               case '2':
+                       xfer_costs[2] = atof(optarg);
+                       if(xfer_costs[2] < 0 || xfer_costs[2] > 1){
+                               fprintf(stderr,"ERROR, 2-distance xfer costs (%f) must be in [0,1].\n",xfer_costs[2]);
+                               exit(1);
+                       }
+               break;
+               case 'C':
+                       crate_hi = atof(optarg);
+                       if(crate_hi < 0 || crate_hi>1){
+                               fprintf(stderr,"ERROR, request to set crate_hi to %f\n must be in [0,1].\n",hist_multiplier);
+                               exit(1);
+                       }
+               break;
+               case 'c':
+                       crate_lo = atof(optarg);
+                       if(crate_lo < 0 || crate_lo>1){
+                               fprintf(stderr,"ERROR, request to set crate_lo to %f\n must be in [0,1].\n",hist_multiplier);
+                               exit(1);
+                       }
+               break;
+               case 'E':
+                       erate_hi = atof(optarg);
+                       if(erate_hi < 0 || erate_hi>1){
+                               fprintf(stderr,"ERROR, request to set erate_hi to %f\n must be in [0,1].\n",hist_multiplier);
+                               exit(1);
+                       }
+               break;
+               case 's':
+                       htmax = atoi(optarg);
+                       if(htmax <= 0){
+                               fprintf(stderr,"ERROPR, htmax set to %d, must be positive nonzero.\n",htmax);
+                               exit(1);
+                       }
+               break;
+               case 'm':
+                       hist_multiplier = atof(optarg);
+                       if(hist_multiplier <= 0){
+                               fprintf(stderr,"ERROR, request to set hist_multiplier to %f\n must be positive nonzero.\n",hist_multiplier);
+                               exit(1);
+                       }
+               break;
+               case 'u':
+                       cpu_util_threshold = atof(optarg);
+                       if(cpu_util_threshold<=0 || cpu_util_threshold>1){
+                               fprintf(stderr,"ERROR, cpu_threshold set to %f, must be in (0,1].\n",cpu_util_threshold);
+                               exit(1);
+                       }
+                       break;
+               case 'U':
+                       uniform_rts_alloc=true;
+               break;
+               case 'N':
+                       uniform_rts_alloc=false;
+               break;
+               case 'd':
+                       src_dir = optarg;
+               break;
+               case 'r':
+                       resource_log_file = optarg;
+               break;
+               case 'i':
+                       init_discard = atoi(optarg);
+                       if(init_discard < 0){
+                               init_discard=0;
+                               fprintf(stderr,"ERROR, atttempting to set init_discard to a negative value (%d), setting to zero.\n",init_discard);
+                       }
+               break;
+               case 'l':
+                       rts_load_history_len = atoi(optarg);
+                       if(rts_load_history_len < 0){
+                               rts_load_history_len=0;
+                               fprintf(stderr,"ERROR, atttempting to set rts_load_history_len to a negative value (%d), setting to zero.\n",rts_load_history_len);
+                       }
+               break;
+               case '?':
+                       fprintf(stderr,"Error, argument %c not recognized.\n",optopt);
+                       fprintf(stderr,"%s\n", usage_str);
+                       exit(1);
+               default:
+                       fprintf(stderr,"Invalid arguments\n");
+                       fprintf(stderr,"%s\n", usage_str);
+                       exit(1);
+               }
+       }
+       argc -= optind;
+       argv += optind;
+       if (argc > 0)
+               trace_file = argv[0];
+
+       if(trace_file == ""){
+               fprintf(stderr, usage_str, argv[0]);
+               exit(1);
+       }
+
+//                     for month string-to-int conversion
+       const char *months_str[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
+       map<string, int> month_str_to_int;
+       for(i=0;i<12;++i)
+               month_str_to_int[months_str[i]] = i;
+
+
+       FILE *qtree_fl = NULL;
+       string qtree_flname = src_dir + "/" + "qtree.xml";
+       string actual_qtree_flname;
+       if(src_dir != ""){
+               qtree_fl = fopen(qtree_flname.c_str(),"r");
+               actual_qtree_flname = qtree_flname;
+       }
+       if(qtree_fl == NULL){
+               qtree_fl = fopen("qtree.xml","r");
+               actual_qtree_flname = "qtree.xml";
+       }
+       if(qtree_fl == NULL){
+               fprintf(stderr,"ERROR, can't open ");
+               if(src_dir != ""){
+                       fprintf(stderr,"%s or ",qtree_flname.c_str());
+               }
+               fprintf(stderr,"qtree.xml, exiting.\n");
+               exit(1);
+       }
+
+
+//             Parse the qtree.xml file
+       xmlParser_setfileinput(qtree_fl);
+       if(xmlParserparse()){
+               fprintf(stderr,"ERROR, could not parse query tree file %s\n",actual_qtree_flname.c_str());
+       }
+
+//             Get the lfta, hfta nodes
+       xml_t *xroot = xml_result;
+       vector<xml_t *> xqnodes;
+       xroot->get_roots("HFTA",xqnodes);
+       xroot->get_roots("LFTA",xqnodes);
+
+       map<string,int> qname_to_idx;
+       map<string,int> exe_to_idx;
+       vector<qnode *> qnode_list;
+
+//             Build the qnodes
+       for(i=0;i<xqnodes.size();++i){
+               string qname;
+               if(xqnodes[i]->get_attrib_val("name",qname)){
+//printf("node type = %s, name=%s\n",xqnodes[i]->name.c_str(),qname.c_str());
+                       qnode *qn = new qnode(xqnodes[i]->name,qname,init_discard);
+                       for(s=0;s<xqnodes[i]->subtrees.size();++s){
+                               xml_t *xsub = xqnodes[i]->subtrees[s];
+                               if(xsub->name == "Field"){
+                                       string fname;
+                                       bool nret = xsub->get_attrib_val("name",fname);
+                                       string fpos;
+                                       bool pret = xsub->get_attrib_val("pos",fpos);
+                                       string ftype;
+                                       bool tret = xsub->get_attrib_val("type",ftype);
+                                       string fmods;
+                                       bool mret = xsub->get_attrib_val("mods",fmods);
+                                       if(nret && pret && tret){
+                                               field_str *fld = new field_str(fname,atoi(fpos.c_str()),ftype,fmods);
+                                               qn->add_field(fld);
+                                       }else{
+                                               fprintf(stderr,"---> subtree %d of FTA %s has an malformed field.\n",s,qname.c_str());
+                                       }
+                               }
+                               if(xsub->name == "HtSize"){
+                                       string src;
+                                       bool sret = xsub->get_attrib_val("value",src);
+                                       if(sret){
+                                               int htsize = atoi(src.c_str());
+                                               if(htsize > 0){
+                                                       unsigned int naggrs = 1;                // make it power of 2
+                                                       unsigned int nones = 0;
+                                                       while(htsize){
+                                                               if(htsize&1)
+                                                                       nones++;
+                                                               naggrs = naggrs << 1;
+                                                               htsize = htsize >> 1;
+                                                       }
+                                                       if(nones==1)            // in case it was already a power of 2.
+                                                               naggrs/=2;
+                                                       qn->aggr_tbl_size = naggrs;
+                                               }else{
+                                                       fprintf(stderr,"---> subtree %d of FTA %s has an invalid HtSize (%s).\n",s,qname.c_str(),src.c_str());
+                                               }
+                                       }else{
+                                               fprintf(stderr,"---> subtree %d of FTA %s has an malformed HtSize.\n",s,qname.c_str());
+                                       }
+                               }
+                               if(xsub->name == "ReadsFrom"){
+                                       string src;
+                                       bool sret = xsub->get_attrib_val("value",src);
+                                       if(sret){
+                                               qn->add_source(src);
+                                       }else{
+                                               fprintf(stderr,"---> subtree %d of FTA %s has an malformed ReadsFrom.\n",s,qname.c_str());
+                                       }
+                               }
+                               if(xsub->name == "Interface"){
+                                       string iface;
+                                       bool sret = xsub->get_attrib_val("value",iface);
+                                       if(sret){
+                                               qn->src_interface = iface;
+                                       }
+                               }
+                               if(xsub->name == "FileName"){
+                                       string full_fname;
+                                       bool sret = xsub->get_attrib_val("value",full_fname);
+                                       if(sret){
+                                               size_t dotpos = full_fname.find_first_of('.');
+                                               if(dotpos != string::npos){
+                                                       qn->executable_name = full_fname.substr(0,dotpos);
+                                               }
+                                       }
+                               }
+                       }
+                       qname_to_idx[qname] = qnode_list.size();
+                       if(qn->executable_name != "" && qn->executable_name != "rts")
+                               exe_to_idx[qn->executable_name] = qnode_list.size();
+                       qnode_list.push_back(qn);
+               }else{
+                       fprintf(stderr,"---> node type %s, no name.\n",xqnodes[i]->name.c_str());
+               }
+       }
+
+
+       bool error = false;
+       for(i=0;i<qnode_list.size();++i){
+               if(qnode_list[i]->qnode_type == "HFTA"){
+                       for(s=0;s<qnode_list[i]->reads_from.size();++s){
+                               if(qname_to_idx.count(qnode_list[i]->reads_from[s])>0){
+                                       int src_id = qname_to_idx[qnode_list[i]->reads_from[s]];
+                                       qnode_list[i]->reads_from_idx.push_back(src_id);
+                                       qnode_list[src_id]->sources_to_idx.push_back(i);
+                               }else{
+                                       fprintf(stderr,"ERROR, hfta %s reads_from %s, but its not in qtree.xml.\n",qnode_list[i]->name.c_str(),qnode_list[i]->reads_from[s].c_str());
+                                       error = true;
+                               }
+                       }
+               }
+       }
+
+       if(error)
+               exit(1);
+
+/*
+       for(i=0;i<qnode_list.size();++i){
+               printf("node %s reads_from:",qnode_list[i]->name.c_str());
+               for(s=0;s<qnode_list[i]->reads_from.size();++s){
+                       printf(" %s",qnode_list[i]->reads_from[s].c_str());
+               }
+               printf("\nand sources to:\n");
+               for(s=0;s<qnode_list[i]->sources_to_idx.size();++s){
+                       printf(" %s",qnode_list[qnode_list[i]->sources_to_idx[s]]->name.c_str());
+               }
+               printf("\n\n");
+       }
+*/
+
+       string tracefilename = trace_file;
+       if(src_dir != ""){
+               tracefilename = src_dir + "/" + trace_file;
+       }
+       FILE *trace_fl = NULL;
+       if((trace_fl = fopen(tracefilename.c_str(),"r"))==NULL){
+               fprintf(stderr,"ERROR, can't open trace file %s\n",tracefilename.c_str());
+               exit(1);
+       }
+
+       map<fta_addr,string, cmpr_fta_addr> qnode_map;
+       map<int, perf_struct *> rts_perf_map;
+       map<int, string> rts_iface_map;
+       map<string, int> pid_iface_map;
+
+       tm time_str;
+       char inp[LINEBUF],line[LINEBUF],*saveptr;
+       unsigned int hbeat_ip, hbeat_port, hbeat_index, hbeat_streamid, hbeat_trace_id,hbeat_ntraces;
+       while(fgets(inp,LINEBUF,trace_fl)){
+
+//                     Try to grab the timestamp
+               time_t tick;
+               int pid;
+               strncpy(line,inp,LINEBUF);
+               char mon_str[4];
+               int mon=0,day,hr,mn,sec;
+               int nret = sscanf(line,"%c%c%c %d %d:%d:%d",mon_str,mon_str+1,mon_str+2,&day,&hr,&mn,&sec);
+               if(nret >= 7){
+                       mon_str[3] = '\0';
+                       if(month_str_to_int.count(mon_str)>0){
+                               mon = month_str_to_int[mon_str];
+                       }else{
+                               fprintf(stderr,"Warning, %s not recognized as a month string.\n",mon_str);
+                       }
+                       time_str.tm_sec = sec;
+                       time_str.tm_min = mn;
+                       time_str.tm_hour = hr;
+                       time_str.tm_mday = day;
+                       time_str.tm_mon = mon;
+                       time_str.tm_year = year;
+                       tick = mktime(&time_str);
+//printf("mon=%d, day=%d, hr=%d, mn=%d, sec=%d, tick=%d\n",mon,day,hr,mn,sec,tick);
+               }
+
+//                     Grab the process ID
+               strncpy(line,inp,LINEBUF);
+               int tmp_pid;
+               pid = -1;
+               char *segment = strtok_r(line,"[",&saveptr);
+               if(segment!=NULL){
+                       segment = strtok_r(NULL,"[",&saveptr);
+                       nret = sscanf(segment,"%d]",&tmp_pid);
+                       if(nret>=1){
+                               pid=tmp_pid;
+                       }
+               }
+
+//                     Grab address-to-hfta mappings
+               strncpy(line,inp,LINEBUF);
+               segment = strtok_r(line,"]",&saveptr);
+               if(segment != NULL){
+                       segment = strtok_r(NULL," ",&saveptr);
+                       segment = strtok_r(NULL," ",&saveptr);
+               }
+//printf("segmetn=<%s>, comparison=%d\n",segment,strcmp(segment,"Lookup"));
+               if(segment!=NULL && strcmp(segment,"Lookup")==0){
+                       int pos=0;
+                       char fta_name[LINEBUF];
+                       int ip;
+                       int port;
+                       int index;
+                       int streamid;
+                       int nret = 0;
+                       while(segment != NULL){
+//printf("pos=%d, segment = %s\n",pos, segment);
+
+                               if(pos==3){
+                                       strncpy(fta_name,segment,LINEBUF);
+                               }
+
+                               if(pos==6)
+                                       nret = sscanf(segment,"{ip=%d,port=%d,index=%d,streamid=%d}",&ip,&port,&index,&streamid);
+
+                               pos++;
+                               segment = strtok_r(NULL," ",&saveptr);
+                       }
+                       if(nret>0){
+//printf("nret=%d, fta_name=%s,ip=%d,port=%d,index=%d,streamid=%d\n",nret,fta_name,ip,port,index,streamid);
+                               fta_addr addr(ip,port,streamid);
+                               qnode_map[addr] = fta_name;
+//printf("Adding fta %s, (%d %d %d) to qnode_map\n",fta_name,addr.ip,addr.port,addr.streamid);
+                               continue;
+                       }
+               }
+               if(segment!=NULL && strcmp(segment,"Lfta")==0){
+                       int pos=0;
+                       char fta_name[LINEBUF];
+                       int ip;
+                       int port;
+                       int index;
+                       int streamid;
+                       int nret = 0;
+                       while(segment != NULL){
+//printf("pos=%d, segment = %s\n",pos, segment);
+
+                               if(pos==1){
+                                       strncpy(fta_name,segment,LINEBUF);
+                               }
+
+                               if(pos==4)
+                                       nret = sscanf(segment,"{ip=%d,port=%d,index=%d,streamid=%d}",&ip,&port,&index,&streamid);
+
+                               pos++;
+                               segment = strtok_r(NULL," ",&saveptr);
+                       }
+                       if(nret>0){
+//printf("nret=%d, fta_name=%s,ip=%d,port=%d,index=%d,streamid=%d\n",nret,fta_name,ip,port,index,streamid);
+                               fta_addr addr(ip,port,streamid);
+                               qnode_map[addr] = fta_name;
+//printf("Adding lfta %s, (%d %d %d) to qnode_map\n",fta_name,addr.ip,addr.port,addr.streamid);
+                               continue;
+                       }
+               }
+               if(segment!=NULL && strcmp(segment,"Init")==0){
+                       int pos=0;
+                       string iface = "";
+                       string keywd = "";
+                       while(segment != NULL){
+                               if(pos==1)
+                                       keywd = segment;
+                               if(pos==3){
+                                       char *cc;
+                                       for(cc=segment;*cc!='\0';++cc){
+                                               if(*cc == '\n'){
+                                                       *cc = '\0';
+                                                       break;
+                                               }
+                                       }
+                                       iface = segment;
+                               }
+                               pos++;
+                               segment = strtok_r(NULL," ",&saveptr);
+                       }
+                       if(iface!="" && keywd == "LFTAs"){
+                               rts_perf_map[pid] = new perf_struct(init_discard);
+                               rts_iface_map[pid] = iface;
+                               pid_iface_map[iface] = pid;
+                       }
+               }
+               if(segment!=NULL && strcmp(segment,"Heartbeat")==0){
+                       int pos=0;
+                       int nret=0,nret2=0,nret3=0;
+                       unsigned int tmp_hbeat_ip, tmp_hbeat_port, tmp_hbeat_index, tmp_hbeat_streamid, tmp_hbeat_trace_id,tmp_hbeat_ntraces;
+                       while(segment != NULL){
+//printf("pos=%d, segment = %s\n",pos, segment);
+                               if(pos==4)
+                                       nret = sscanf(segment,"{ip=%d,port=%d,index=%d,streamid=%d}",&tmp_hbeat_ip,&tmp_hbeat_port,&tmp_hbeat_index,&tmp_hbeat_streamid);
+                               if(pos==5)
+                                       nret2 = sscanf(segment,"trace_id=%d",&tmp_hbeat_trace_id);
+                               if(pos==6)
+                                       nret3 = sscanf(segment,"ntrace=%d",&tmp_hbeat_ntraces);
+                               pos++;
+                               segment = strtok_r(NULL," ",&saveptr);
+                       }
+                       if(nret>=4 && nret2 >= 1 && nret3 == 1){
+                               hbeat_ip = tmp_hbeat_ip;
+                               hbeat_port = tmp_hbeat_port;
+                               hbeat_index = tmp_hbeat_index;
+                               hbeat_streamid = tmp_hbeat_streamid;
+                               hbeat_trace_id = tmp_hbeat_trace_id;
+                               hbeat_ntraces = tmp_hbeat_ntraces;
+//                             printf("ip=%d, port=%d, index=%d, streamid=%d hbeat_trace_id=%d\n",hbeat_ip,hbeat_port,hbeat_index,hbeat_streamid,hbeat_trace_id);
+                               fta_addr hb_addr(hbeat_ip,hbeat_port,tmp_hbeat_streamid);
+                               if(qnode_map.count(hb_addr) == 0){
+                                       hb_addr.streamid = 0;   // maybe an hfta?
+                                       if(qnode_map.count(hb_addr) == 0){
+                                               hbeat_port = 0;
+//printf("Hbeat streamid=%d no match (%d,%d), hbeat_trace_id=%d\n",hbeat_streamid,hbeat_ip,hbeat_port,hbeat_trace_id);
+                                       }
+                               } else{
+//printf("Hbeat streamid=%d matches %s, hbeat_trace_id=%d\n",hbeat_streamid,qnode_map[hb_addr].c_str(),hbeat_trace_id);
+                               }
+                       }else{
+                               printf("Couldn't parse as hearbeat %s\n",inp);
+                       }
+               }
+               if(segment!=NULL && strncmp(segment,"trace_id=",8)==0){
+                       int pos=0;
+                       int nret=0,nret2=0,nret3=0;
+                       unsigned long long int trace_id;
+                       unsigned int tr_pos,tr_ip,tr_port,tr_index,tr_streamid;
+                       unsigned int tr_intup,tr_outtup,tr_outsz,tr_acctup,tr_cycles;
+                       unsigned int tr_evictions,tr_collisions;
+                       double tr_sample;
+                       nret = sscanf(segment,"trace_id=%llu",&trace_id);
+                       while(segment != NULL){
+//printf("pos=%d, segment = %s\n",pos, segment);
+                               if(pos==0)
+                                       nret = sscanf(segment,"trace_id=%llu",&trace_id);
+                               if(pos==1)
+                                       nret2 = sscanf(segment,"trace[%d].ftaid={ip=%u,port=%u,index=%u,streamid=%u}",&tr_pos,&tr_ip,&tr_port,&tr_index,&tr_streamid);
+                               if(pos==2)
+                                       nret3 = sscanf(segment,"fta_stat={in_tuple_cnt=%u,out_tuple_cnt=%u,out_tuple_sz=%u,accepted_tuple_cnt=%u,cycle_cnt=%u,collision_cnt=%u,eviction_cnt=%u,sampling_rate=%lf}",
+               &tr_intup, &tr_outtup, &tr_outsz, &tr_acctup,&tr_cycles,
+               &tr_collisions,&tr_evictions,&tr_sample);
+                               pos++;
+                               segment = strtok_r(NULL," ",&saveptr);
+                       }
+                       if(nret>=1 && nret2>=5 && nret3>=7){
+                               fta_addr tr_addr(tr_ip,tr_port,tr_streamid);
+                               if(qnode_map.count(tr_addr)==0)
+                                       tr_addr.streamid = 0;           // maybe an hfta?
+                               if(qnode_map.count(tr_addr)>0){
+//printf("Trace idx=%d streamid=%d matches %s, trace_id=%d, hbeat_trace_id=%d\n",tr_pos,tr_streamid,qnode_map[tr_addr].c_str(),trace_id,hbeat_trace_id);
+                                       if(tr_pos+1 == hbeat_ntraces){
+                                               string qname = qnode_map[tr_addr];
+                                               int qidx = qname_to_idx[qname];
+                                               if(qnode_list[qidx]->start_tick < 0)
+                                                       qnode_list[qidx]->start_tick = tick;
+                                               if(qnode_list[qidx]->end_tick < tick)
+                                                       qnode_list[qidx]->end_tick = tick;
+                                               qnode_list[qidx]->in_tup += tr_intup;
+                                               qnode_list[qidx]->out_tup += tr_outtup;
+                                               qnode_list[qidx]->out_sz += tr_outsz;
+                                               qnode_list[qidx]->accepted_tup += tr_acctup;
+                                               qnode_list[qidx]->cycles += tr_cycles;
+                                               qnode_list[qidx]->collisions += tr_collisions;
+                                               qnode_list[qidx]->evictions += tr_evictions;
+                                       }
+                               }
+//else{
+//printf("Trace idx=%d streamid=%d no match (%d,%d), trace_id=%d, hbeat_trace_id=%d\n",tr_pos,tr_streamid,tr_ip,tr_port,trace_id,hbeat_trace_id);
+//}
+                       }
+               }
+       }
+
+//printf("qnode_map has %d entries\n",qnode_map.size());
+
+//                     Open and process performance log info, if any.
+       if(src_dir != ""){
+               resource_log_file = src_dir + "/" + resource_log_file;
+       }
+       FILE *res_fl = NULL;
+       if((res_fl = fopen(resource_log_file.c_str(),"r"))==NULL){
+               fprintf(stderr,"ERROR, can't open trace file %s\n",resource_log_file.c_str());
+               exit(1);
+       }
+
+       char *flds[SPLITBUF];
+       int lineno = 0;
+       while(fgets(inp,LINEBUF,res_fl)){
+               int nflds = split_string(inp,',',flds,SPLITBUF);
+               lineno++;
+               if(nflds >= 8){
+                       int ts = atoi(flds[0]);
+                       string procname = flds[1];
+                       int pid = atoi(flds[2]);
+                       unsigned long long int utime = atoll(flds[3]);
+                       unsigned long long int stime = atoll(flds[4]);
+                       unsigned long long int vm_size = atoll(flds[5]);
+                       unsigned long long int rss_size = atoll(flds[6]);
+                       int pagesize = atoi(flds[7]);
+
+                       if(procname == "rts"){
+                               if(rts_perf_map.count(pid)>0){
+                                       if(rts_perf_map[pid]->update(ts,utime,stime,vm_size,rss_size)){
+                                               fprintf(stderr,"Resource log file is corrupted, line %d\n",lineno);
+                                               exit(1);
+                                       }
+                               }
+                       }else{
+                               if(exe_to_idx.count(procname)>0){
+                                       perf_struct *p = qnode_list[exe_to_idx[procname]]->perf;
+                                       if(p->update(ts,utime,stime,vm_size,rss_size)){
+                                               fprintf(stderr,"Resource log file is corrupted, line %d\n",lineno);
+                                               exit(1);
+                                       }
+                               }
+                       }
+               }
+       }
+
+
+
+       FILE *rpt_fl = fopen("performance_report.csv","w");
+       if(rpt_fl == NULL){
+               fprintf(stderr,"Warning, can't open performance_report.csv, can't save the performance report.\n");
+       }
+
+       char tmpstr[10000];
+       printf("Performance report:\n");
+       if(rpt_fl) fprintf(rpt_fl,"query_name,process_name,in_tup,out_tup,out_sz,accepted_tup,cycles,collisions,evictions,in_tup_rate,out_tup_rate,out_bytes_rate,cycle_consumption_rate");
+       if(rpt_fl) fprintf(rpt_fl,",%s",perf_struct::to_csv_hdr().c_str());
+       if(rpt_fl) fprintf(rpt_fl,",packets_sent_to_query,fraction_intup_lost,inferred_read_rate");
+       if(rpt_fl) fprintf(rpt_fl,"\n");
+
+       map<fta_addr,string>::iterator mpiisi;
+       int n_output = 0;
+       set<string> found_names;
+       for(mpiisi=qnode_map.begin();mpiisi!=qnode_map.end();++mpiisi){
+               string qname = (*mpiisi).second;
+               if(found_names.count(qname)==0){
+                       found_names.insert(qname);
+                       int qidx = qname_to_idx[qname];
+                       string executable = qnode_list[qidx]->executable_name;
+                       if(executable == "")
+                               executable="rts";
+//                     printf("(%d,%d,%d) -> %s, %d reads-from\n",(*mpiisi).first.ip,(*mpiisi).first.port,(*mpiisi).first.streamid,qname.c_str(),qnode_list[qidx]->reads_from_idx.size());
+                       printf("query=%s, executable=%s\tintup=%llu, out_tup=%llu, out_sz=%llu, accepted_tup=%llu, cycles=%llu, collisions=%llu, evictions=%llu\n",
+                                               qname.c_str(),qnode_list[qidx]->executable_name.c_str(),
+                                               qnode_list[qidx]->in_tup,
+                                               qnode_list[qidx]->out_tup,
+                                               qnode_list[qidx]->out_sz,
+                                               qnode_list[qidx]->accepted_tup,
+                                               qnode_list[qidx]->cycles,
+                                               qnode_list[qidx]->collisions,
+                                               qnode_list[qidx]->evictions
+                       );
+                       if(rpt_fl) fprintf(rpt_fl,"%s,%s,%llu,%llu,%llu,%llu,%llu,%llu,%llu",
+                                               qname.c_str(),qnode_list[qidx]->executable_name.c_str(),
+                                               qnode_list[qidx]->in_tup,
+                                               qnode_list[qidx]->out_tup,
+                                               qnode_list[qidx]->out_sz,
+                                               qnode_list[qidx]->accepted_tup,
+                                               qnode_list[qidx]->cycles,
+                                               qnode_list[qidx]->collisions,
+                                               qnode_list[qidx]->evictions
+                       );
+                       double duration = 1.0*(qnode_list[qidx]->end_tick - qnode_list[qidx]->start_tick);
+
+                       printf("\tin_tup_rate=%f, out_tup_rate=%f, out_byte_rate=%f, cycle_rate=%f\n",qnode_list[qidx]->in_tup/duration,qnode_list[qidx]->out_tup/duration,qnode_list[qidx]->out_sz/duration,qnode_list[qidx]->cycles/duration);
+                       if(rpt_fl) fprintf(rpt_fl,",%f,%f,%f,%f",qnode_list[qidx]->in_tup/duration,qnode_list[qidx]->out_tup/duration,qnode_list[qidx]->out_sz/duration,qnode_list[qidx]->cycles/duration);
+                       printf("\t%s\n",qnode_list[qidx]->perf->to_string().c_str());
+                       if(rpt_fl) fprintf(rpt_fl,",%s",qnode_list[qidx]->perf->to_csv().c_str());
+//if(qnode_list[qidx]->aggr_tbl_size>0){
+//printf("\taggregate table size is %d\n",qnode_list[qidx]->aggr_tbl_size);
+//}
+//if(qnode_list[qidx]->src_interface != ""){
+//printf("\tSource interface is %s\n",qnode_list[qidx]->src_interface.c_str());
+//}
+                       if(qnode_list[qidx]->reads_from_idx.size()>0){
+                               unsigned long long int total_sent = 0;
+                               for(i=0;i<qnode_list[qidx]->reads_from_idx.size();++i){
+                                       total_sent += qnode_list[qnode_list[qidx]->reads_from_idx[i]]->out_tup;
+                                       qnode_list[qidx]->inferred_in_sz += qnode_list[qnode_list[qidx]->reads_from_idx[i]]->out_sz / (qnode_list[qnode_list[qidx]->reads_from_idx[i]]->end_tick-qnode_list[qnode_list[qidx]->reads_from_idx[i]]->start_tick);
+                               }
+                               printf("\t%llu packets sent, %f lost, inferred read rate is %f\n",total_sent,(1.0*total_sent-qnode_list[qidx]->in_tup)/total_sent, qnode_list[qidx]->inferred_in_sz);
+                               if(rpt_fl) fprintf(rpt_fl,",%llu,%f,%f",total_sent,(1.0*total_sent-qnode_list[qidx]->in_tup)/total_sent, qnode_list[qidx]->inferred_in_sz);
+                       }
+                       else{
+                               if(rpt_fl) fprintf(rpt_fl,",,,");
+                       }
+
+                       if(rpt_fl) fprintf(rpt_fl,"\n");
+                       n_output++;
+               }
+       }
+
+
+
+//             Collect performance info about RTSs and determine a better hash partitioning.
+
+//             First, grab any existing balancing information
+       map<string, vector<int> > prev_rts_loads;
+       FILE *rload_fl = NULL;
+       rload_fl = fopen("rts_load.cfg","r");
+       lineno = 0;
+       if(rload_fl != NULL){
+               while(fgets(line,LINEBUF,rload_fl)){
+                       lineno++;
+                       int nflds = split_string(line,',',flds,SPLITBUF);
+                       if(nflds>1){
+                               vector<int> hbounds;
+                               bool invalid_line=false;
+                               int prev_val = 0;
+                               for(i=1;i<nflds;++i){
+                                       int new_val = atoi(flds[i]);
+                                       if(new_val < prev_val)
+                                               invalid_line = true;
+                                       hbounds.push_back(new_val);
+                               }
+                               if(! invalid_line){
+                                       prev_rts_loads[flds[0]] = hbounds;
+                               }else{
+                                       printf("Warning, rts_load.cfg has an invalid entry on line %d, skipping\n",lineno);
+                               }
+                       }else{
+                               printf("Warning, rts_load.cfg has an invalid entry on line %d, skipping\n",lineno);
+                       }
+               }
+       }else{
+               fprintf(rload_fl,"Warning, can't open rts_load.cfg, skipping and using defualt allocation estimate.\n");
+       }
+       map<string, vector<int> > new_rts_loads = prev_rts_loads;
+       fclose(rload_fl);
+
+//             Next, try to grab a history of allocations and resulting cpu loads
+       FILE *rtrace_fl = NULL;
+       rtrace_fl = fopen("rts_load.trace.txt","r");
+       lineno = 0;
+       map<string, vector< vector<int> > > iface_alloc_history;
+       map<string, vector< vector<double> > > iface_load_history;
+       if(rtrace_fl != NULL){
+               vector<int> curr_allocation;
+               vector<double> curr_load;
+               while(fgets(line,LINEBUF,rtrace_fl)){
+                       int nflds = split_string(line,',',flds,SPLITBUF);
+                       if(nflds > 2){
+                               string iface = flds[0];
+                               string entry = flds[1];
+                               if(entry == "Previous allocation"){
+                                       curr_allocation.clear();
+                                       for(i=2;i<nflds;++i){
+                                               curr_allocation.push_back(atoi(flds[i]));
+                                       }
+                               }
+                               if(entry == "Previous cpu loads"){
+                                       curr_load.clear();
+                                       for(i=2;i<nflds;++i){
+                                               curr_load.push_back(atof(flds[i]));
+                                       }
+                                       if(curr_allocation.size() == curr_load.size()){
+                                               iface_alloc_history[iface].push_back(curr_allocation);
+                                               iface_load_history[iface].push_back(curr_load);
+                                       }
+                               }
+                       }
+               }
+       }
+
+/*
+map<string, vector< vector<int> > >::iterator msvvi;
+for(msvvi=iface_alloc_history.begin();msvvi!=iface_alloc_history.end();++msvvi){
+string iface = (*msvvi).first;
+printf("iface %s past allocations:\n",iface.c_str());
+vector<vector<int> > &alloc = iface_alloc_history[iface];
+printf("alloc size is %d\n",alloc.size());
+for(i=0;i<alloc.size();++i){
+for(j=0;j<alloc[i].size();++j){
+printf("%d ",alloc[i][j]);
+}
+printf("\n");
+}
+printf("\niface %s past loads:\n",iface.c_str());
+vector<vector<double> > &load = iface_load_history[iface];
+printf("load size is %d\n",load.size());
+for(i=0;i<load.size();++i){
+for(j=0;j<load[i].size();++j){
+printf("%f ",load[i][j]);
+}
+printf("\n");
+}
+printf("\n");
+}
+*/
+
+
+       map<int, string>::iterator misi;
+       map<string, vector<int> > rts_iface_indices;
+       map<string, vector<double> > rts_iface_cpu_load;
+       for(misi=rts_iface_map.begin();misi!=rts_iface_map.end();++misi){
+               int rpid = (*misi).first;
+               string riface = (*misi).second;
+               size_t Xpos = riface.find_last_of("X");
+               if(Xpos!=string::npos){
+                       string iface = riface.substr(0,Xpos);
+//                     ifaces_found.insert(iface);
+                       string ifcopy = riface.substr(Xpos+1);
+                       int ifidx = atoi(ifcopy.c_str());
+                       rts_iface_indices[iface].push_back(ifidx);
+               }
+               printf("pid=%d, rts %s, %s\n",rpid,riface.c_str(),rts_perf_map[rpid]->to_string().c_str());
+               if(rpt_fl){
+                       fprintf(rpt_fl,",rts %s,,,,,,,,,,,,%s,,,,\n",riface.c_str(),rts_perf_map[rpid]->to_csv().c_str());
+
+               }
+       }
+       map<string, vector<int> >::iterator msvi;
+       set<string> ifaces_found;
+       map<string, vector<double> > ht_cpu_allocs;
+       map<string, int> total_ht_sizes;
+       for(msvi=rts_iface_indices.begin();msvi!=rts_iface_indices.end();++msvi){
+               string iface = (*msvi).first;
+               vector<int> &ifindices = (*msvi).second;
+               sort(ifindices.begin(),ifindices.end());
+
+               double total_cpu = 0.0;
+               vector<double> if_cpu;
+               for(i=0;i<ifindices.size();++i){
+                       string full_iface = iface + "X" + int_to_string(ifindices[i]);
+                       int pid = pid_iface_map[full_iface];
+                       total_cpu += rts_perf_map[pid]->avg_cpu_time();
+                       if_cpu.push_back(rts_perf_map[pid]->avg_cpu_time());
+               }
+               rts_iface_cpu_load[iface] = if_cpu;
+
+               vector<int> current_allocation;
+               if(new_rts_loads.count(iface) == 0 || new_rts_loads[iface].size() != ifindices.size()){
+                       int cumm_cpu = 0;
+                       for(i=0;i<ifindices.size();++i){
+                               int new_cumm = ((i+1)*htmax)/ifindices.size();
+                               current_allocation.push_back(new_cumm-cumm_cpu);
+                               cumm_cpu=new_cumm;
+                       }
+               }else{
+                       current_allocation = new_rts_loads[iface];
+               }
+               int total_ht_allocation = 0;
+//printf("Current allocation is:");
+               for(i=0;i<current_allocation.size();++i){
+                       total_ht_allocation += current_allocation[i];
+//printf(" %d",current_allocation[i]);
+               }
+
+               vector<double> local_alloc(total_ht_allocation,0.0); // estimated cpu per HT slot.
+               int ht_ptr = 0;
+               for(i=0;i<if_cpu.size();++i){
+                       double rate = if_cpu[i]/(current_allocation[i]*total_cpu);
+                       for(j=0;j<current_allocation[i];++j){
+                               local_alloc[ht_ptr++] = rate;
+                       }
+               }
+
+               if(iface_alloc_history.count(iface)>0){
+                       vector<vector<int> > &alloc = iface_alloc_history[iface];
+                       vector<vector<double> > &load = iface_load_history[iface];
+                       int n_remaining = rts_load_history_len;
+                       double multiplier = hist_multiplier;
+                       double normalizer = 1.0;
+                       for(i=alloc.size()-1;i>=0 && n_remaining>0;i--){
+                               int hist_ht_size = 0;
+                               for(j=0;j<alloc[i].size();++j)
+                                       hist_ht_size+=alloc[i][j];
+                               double hist_cpu = 0.0;
+                               for(j=0;j<load[i].size();++j)
+                                       hist_cpu += load[i][j];
+                               if(hist_ht_size == total_ht_allocation){
+                                       int ht_ptr = 0;
+                                       for(j=0;j<alloc[i].size();++j){
+                                               double rate = (multiplier*load[i][j])/(alloc[i][j]*hist_cpu);
+                                               int k;
+                                               for(k=0;k<alloc[i][j];k++){
+                                                       local_alloc[ht_ptr++] += rate;
+                                               }
+                                       }
+                                       normalizer += multiplier;
+                                       multiplier *= hist_multiplier;
+                                       n_remaining--;
+                               }
+                       }
+                       for(i=0;i<total_ht_allocation;i++){
+                               local_alloc[i] /= normalizer;
+                       }
+               }
+
+
+               total_ht_sizes[iface] = total_ht_allocation;
+               ht_cpu_allocs[iface] = local_alloc;
+       }
+
+       if(uniform_rts_alloc){
+//                     I will require that if this option is true, all HTs
+//                     the same size.
+               bool same_sizes = true;
+               int total_alloc = -1;
+               map<string, int >::iterator msi;
+               for(msi=total_ht_sizes.begin();msi!=total_ht_sizes.end();++msi){
+                       if(total_alloc<0){
+                               total_alloc=(*msi).second;
+                       }else{
+                               if(total_alloc != (*msi).second){
+                                       same_sizes = false;
+                               }
+                       }
+               }
+               if(same_sizes){
+                       vector<double> local_alloc(total_alloc,0.0);
+                       double normalizer = 0.0;
+                       map<string, vector<double> >::iterator msvdi;
+                       for(msvdi=ht_cpu_allocs.begin();msvdi!=ht_cpu_allocs.end();++msvdi){
+                               string iface = (*msvdi).first;
+                               for(i=0;i<total_alloc;++i){
+                                       local_alloc[i] += ht_cpu_allocs[iface][i];
+                               }
+                               normalizer += 1.0;
+                       }
+                       for(i=0;i<total_alloc;++i)
+                               local_alloc[i] /= normalizer;
+                       for(msvdi=ht_cpu_allocs.begin();msvdi!=ht_cpu_allocs.end();++msvdi){
+                               (*msvdi).second = local_alloc;
+                       }
+               }
+       }
+
+       for(msvi=rts_iface_indices.begin();msvi!=rts_iface_indices.end();++msvi){
+               string iface = (*msvi).first;
+               vector<int> &ifindices = (*msvi).second;
+               sort(ifindices.begin(),ifindices.end());
+
+               int cumm_ht_alloc = 0;          // ht allocated thus far
+               int current_pos = 0;    // idx to the current_allocation, if_cpu arrays
+               vector<int> new_allocation;
+               for(i=0;i<ifindices.size()-1;++i){
+                       double slot_cpu = 1.0/ifindices.size(); // amount of cpu to allocate
+                       int current_alloc = 0;  // ht allocated in the curr_pos slot
+                       while(slot_cpu > 0.0){
+                               slot_cpu -= ht_cpu_allocs[iface][current_pos];
+                               current_pos++;
+                               current_alloc++;
+                       }
+       //                              try to make the allocations even
+                       if(current_alloc>1 && (-slot_cpu) > (ht_cpu_allocs[iface][current_pos-1]/2.0)){
+                               current_pos--;
+                               current_alloc--;
+                       }
+                       new_allocation.push_back(current_alloc);
+               }
+               new_allocation.push_back(total_ht_sizes[iface]-current_pos);
+
+/*
+               int cumm_ht_alloc = 0;          // ht allocated thus far
+               int current_pos = 0;    // idx to the current_allocation, if_cpu arrays
+               int current_alloc = 0;  // ht allocated in the curr_pos slot
+               vector<int> new_allocation;
+               for(i=0;i<ifindices.size()-1;++i){
+                       double slot_cpu = total_cpu/ifindices.size(); // amount of cpu to allocate
+                       int slot_ht = 0;
+                       while(slot_cpu > 0.0){
+                               double cpu_rate = if_cpu[current_pos] / current_allocation[current_pos];
+                               double cpu_remaining = cpu_rate*(current_allocation[current_pos] - current_alloc);
+                               if(slot_cpu <= cpu_remaining){
+                                       double this_cpu_alloc = slot_cpu;
+                                       int this_ht_alloc = (int)(this_cpu_alloc / cpu_rate);
+                                       slot_ht += this_ht_alloc;
+                                       slot_cpu = 0.0;
+                                       cumm_ht_alloc += this_ht_alloc;
+                                       current_alloc += this_ht_alloc;
+                                       if(current_alloc >= current_allocation[current_pos]){
+                                               current_pos++;
+                                               current_alloc = 0;
+                                       }
+                               }else{
+                                       slot_cpu -= cpu_remaining;
+                                       slot_ht += current_allocation[current_pos] - current_alloc;
+                                       cumm_ht_alloc += current_allocation[current_pos] - current_alloc;
+                                       current_pos++;
+                                       current_alloc = 0;
+                               }
+                       }
+                       new_allocation.push_back(slot_ht);
+               }
+               new_allocation.push_back(total_ht_allocation - cumm_ht_alloc);
+*/
+
+               new_rts_loads[iface] = new_allocation;
+
+
+/*
+printf("Interface %s:",iface.c_str());
+for(i=0;i<ifindices.size();++i){
+string full_iface = iface + "X" + int_to_string(ifindices[i]);
+int pid = pid_iface_map[full_iface];
+printf(" %f",rts_perf_map[pid]->avg_cpu_time()/total_cpu);
+}
+printf("\n\t");
+for(i=0;i<ifindices.size();++i){
+printf(" %d",prev_rts_loads[iface][i]);
+}
+printf("\n");
+*/
+       }
+
+
+       FILE *rrec_fl = fopen("rts_load.cfg.recommended","w");
+       if(rrec_fl == NULL){
+               fprintf(stderr,"Warning, can't open rts_load.cfg.recommended for write, skipping.\n");
+       }
+
+       printf("Recommended virtual interface hash allocation:\n");
+       map<string, vector<int> >::iterator msvii;
+       for(msvii=new_rts_loads.begin();msvii!=new_rts_loads.end();++msvii){
+               string iface_name = (*msvii).first;
+               vector<int> iface_alloc = (*msvii).second;
+               printf("%s",iface_name.c_str());
+               if(rrec_fl!=NULL) fprintf(rrec_fl,"%s",iface_name.c_str());
+               for(i=0;i<iface_alloc.size();++i){
+                       printf(",%d",iface_alloc[i]);
+                       if(rrec_fl!=NULL) fprintf(rrec_fl,",%d",iface_alloc[i]);
+               }
+               printf("\n");
+               if(rrec_fl!=NULL) fprintf(rrec_fl,"\n");
+       }
+       fclose(rrec_fl);
+
+
+       rrec_fl = fopen("rts_load.trace.txt","a");
+       if(rrec_fl != NULL){
+               fprintf(rrec_fl,"\n");
+               for(msvii=new_rts_loads.begin();msvii!=new_rts_loads.end();++msvii){
+                       string iface_name = (*msvii).first;
+                       vector<int> iface_alloc = (*msvii).second;
+                       vector<double> iface_cpu_loads = rts_iface_cpu_load[iface_name];
+                       vector<int> prev_iface_alloc = prev_rts_loads[iface_name];
+
+                       fprintf(rrec_fl,"Interface %s:\n",iface_name.c_str());
+                       fprintf(rrec_fl,"%s,Previous allocation,",iface_name.c_str());
+                       for(i=0;i<prev_iface_alloc.size();++i){
+                               if(i>0) fprintf(rrec_fl,",");
+                               fprintf(rrec_fl,"%d",prev_iface_alloc[i]);
+                       }
+                       fprintf(rrec_fl,"\n%s,Previous cpu loads,",iface_name.c_str());
+                       for(i=0;i<iface_cpu_loads.size();++i){
+                               if(i>0) fprintf(rrec_fl,",");
+                               fprintf(rrec_fl,"%f",iface_cpu_loads[i]);
+                       }
+                       fprintf(rrec_fl,"\n%s,New allocation,",iface_name.c_str());
+                       for(i=0;i<iface_alloc.size();++i){
+                               if(i>0) fprintf(rrec_fl,",");
+                               fprintf(rrec_fl,"%d",iface_alloc[i]);
+                       }
+                       fprintf(rrec_fl,"\n\n");
+               }
+       }
+       fclose(rrec_fl);
+
+
+//     ----------------------------------------------------------------
+//             Make an hfta parallelism analysis.  Start by collecting hftas and grouping
+//             them by their copies.  Count on the __copy%d name mangling.
+
+       set<string>::iterator ssi;
+       map<string, vector<int> > par_hfta_map;
+       for(ssi=found_names.begin();ssi!=found_names.end();++ssi){
+               string base = (*ssi);
+               int qidx = qname_to_idx[base];
+               if(qnode_list[qidx]->qnode_type == "HFTA"){
+                       size_t cpos = (*ssi).find("__copy");
+                       if(cpos!=string::npos){
+                               base = (*ssi).substr(0,cpos);
+                               string idx_str = (*ssi).substr(cpos+6);
+                               int pidx = atoi(idx_str.c_str());
+                               qnode_list[qidx]->par_index = pidx;
+                       }
+                       par_hfta_map[base].push_back(qidx);
+               }
+       }
+
+//             Coalesce or split hftas.  Reduce parallelism until the max cpu utilization
+//             is in [cpu_util_threshold/2, cpu_util_threshold].  Double parallelism
+//             if max cpu utilization is > cpu_util_threshold.
+//             Only recommend parallelism if a resource utilization file was found.
+  if(res_fl!=NULL){
+       map<string, int> recommended_parallelism;
+       map<string, vector<int> >::iterator msvii;
+       for(msvii=par_hfta_map.begin();msvii!=par_hfta_map.end();++msvii){
+               vector<int> buddy_indices = (*msvii).second;
+               vector<qnode *> buddies;
+               int n_valid = 0;
+               for(i=0;i<buddy_indices.size();i++){
+                       buddies.push_back(qnode_list[buddy_indices[i]]);
+                       if(qnode_list[buddy_indices[i]]->perf->is_valid())
+                               n_valid++;
+               }
+
+               if(n_valid>0){
+                       sort(buddies.begin(),buddies.end(),cmpr_parallel_idx);
+
+                       int level=1;
+                       double max_util = 0.0;
+                       while(level<=buddies.size()){
+                               for(i=0;i<buddies.size();i+=level){
+                                       double this_util = 0.0;
+                                       for(j=0;j<level;j++){
+                                               this_util += buddies[i+j]->perf->avg_cpu_time();
+                                       }
+                                       if(this_util > max_util)
+                                               max_util = this_util;
+                               }
+                               if(max_util >= cpu_util_threshold/2)
+                                       break;
+                               level *= 2;
+                       }
+                       int npar = buddies.size();
+                       if(max_util > cpu_util_threshold)
+                               level/=2;
+                       if(level>buddies.size())
+                               level/=2;
+                       if(level==0)
+                               npar *= 2;
+                       else
+                               npar /= level;
+
+                       recommended_parallelism[(*msvii).first] = npar;
+               }else{
+                       printf("Warning, no resource usage information for %s, skipping.\n",(*msvii).first.c_str());
+               }
+       }
+
+       FILE *hpar_fl = NULL;
+       hpar_fl=fopen("hfta_parallelism.cfg","r");
+       if(hpar_fl==NULL){
+               fprintf(stderr,"Warning, can't open hfta_parallelism.cfg, ignoring.\n");
+       }else{
+               while(fgets(line,LINEBUF,hpar_fl)){
+                       int nflds = split_string(line,',',flds,SPLITBUF);
+                       if(nflds==2){
+                               int npar = atoi(flds[1]);
+                               if(npar>0 && recommended_parallelism.count(flds[0])==0){
+                                       recommended_parallelism[flds[0]] = npar;
+                               }
+                       }
+               }
+               fclose(hpar_fl);
+       }
+
+       FILE *recpar_fl = NULL;
+       recpar_fl=fopen("hfta_parallelism.cfg.recommended","w");
+       if(recpar_fl==NULL){
+               fprintf(stderr,"Warning, can't open hfta_parallelism.cfg.recommended, can't write the file.\n");
+       }
+       printf("Recommended parallelism:\n");
+       map<string, int>::iterator msii;
+       for(msii=recommended_parallelism.begin();msii!=recommended_parallelism.end();++msii){
+               if(recpar_fl!=NULL)
+                       fprintf(recpar_fl,"%s,%d\n",(*msii).first.c_str(),(*msii).second);
+               printf("%s,%d\n",(*msii).first.c_str(),(*msii).second);
+       }
+       fclose(recpar_fl);
+  }else{
+       printf("Can't recommend hfta parallelism, no resource utilization file found.\n");
+  }
+
+       FILE *rec_ht_fl = NULL;
+       rec_ht_fl=fopen("lfta_htsize.cfg.recommended","w");
+       if(rec_ht_fl==NULL){
+               fprintf(stderr,"Warning, can't open lfta_htsize.cfg.recommended, can't write the file.\n");
+       }
+       printf("Recommended LFTA hash table sizes:\n");
+       for(i=0;i<qnode_list.size();++i){
+               qnode *this_qn = qnode_list[i];
+               if(this_qn->qnode_type=="LFTA" && this_qn->aggr_tbl_size>0 && this_qn->accepted_tup>0){
+                       int ht_size = this_qn->aggr_tbl_size;
+                       double collision_rate = ((double)this_qn->collisions)/this_qn->accepted_tup;
+                       double eviction_rate = ((double)this_qn->evictions)/this_qn->accepted_tup;
+                       printf("%s htsize=%d collision=%f evictions=%f",this_qn->name.c_str(),ht_size,collision_rate,eviction_rate);
+//printf("%d,%f,%f\n",ht_size,collision_rate,eviction_rate);
+                       if(eviction_rate >= erate_hi){
+                               ht_size /= 2;
+                       }else if(collision_rate >= crate_hi){
+                               ht_size *= 2;
+                       }else if(collision_rate < crate_lo){
+                               ht_size /= 2;
+                       }
+
+                       printf(" rec ht_size=%d\n",ht_size);
+                       fprintf(rec_ht_fl,"%s,%u\n",this_qn->name.c_str(),ht_size);
+
+               }
+       }
+       fclose(rec_ht_fl);
+
+
+//             Try to load the cpu configuration info
+
+       vector <cpu_info_str *> cpu_info_list;
+       FILE *cinfo_fl = NULL;
+       cinfo_fl=fopen("cpu_info.csv","r");
+       if(cinfo_fl==NULL){
+               fprintf(stderr,"Warning, can't open cpu_info.csv, skipping process pinning optimization.  Run gscpv3/bin/parse_cpuinfo.pl to generate a cpu_info.csv file.\n");
+       }else{
+               int lineno = 0;
+               while(fgets(inp,LINEBUF,cinfo_fl)){
+                       int nflds = split_string(inp,',',flds,SPLITBUF);
+                       lineno++;
+                       if(nflds >= 3){
+                               cpu_info_list.push_back(new cpu_info_str(atoi(flds[0]),atoi(flds[1]),atoi(flds[2])));
+                       }
+               }
+
+               sort(cpu_info_list.begin(),cpu_info_list.end(),cmpr_cpu_info);
+
+//                     Spread the LFTAs among the cores.
+               vector<string> iface_names;
+               for(msvi=rts_iface_indices.begin();msvi!=rts_iface_indices.end();++msvi){
+                       string iface = (*msvi).first;
+                       vector<int> ifindices = (*msvi).second;
+                       sort(ifindices.begin(),ifindices.end());
+
+                       for(i=0;i<ifindices.size();++i){
+                               string full_iface = iface + "X" + int_to_string(ifindices[i]);
+                               iface_names.push_back(full_iface);
+                       }
+               }
+
+
+               map<string, int> rts_assignment;
+               double stride = ((double)(cpu_info_list.size()))/((double)(iface_names.size()));
+               double rtspos_f = 0.0;
+               for(i=0;i<iface_names.size();++i){
+                       int rtspos = (int)rtspos_f;
+                       rts_assignment[iface_names[i]] = rtspos;
+                       cpu_info_list[rtspos]->assigned_load += rts_perf_map[pid_iface_map[iface_names[i]]]->avg_cpu_time();
+                       rtspos_f += stride;
+               }
+
+//for(i=0;i<iface_names.size();++i){
+//printf("Placing %s at %d\n",iface_names[i].c_str(), rts_assignment[iface_names[i]]);
+//}
+
+               set<string> eligible_hftas;
+               map<string, int> hfta_assignment;
+               set<string>::iterator ssi;
+               for(ssi = found_names.begin();ssi!=found_names.end();++ssi){
+                       int qidx = qname_to_idx[(*ssi)];
+//printf("Considering %s (%d), sz=%f, cpu=%f\n",(*ssi).c_str(),qidx,qnode_list[qidx]->inferred_in_sz,qnode_list[qidx]->perf->avg_cpu_time());
+                       if(qnode_list[qidx]->inferred_in_sz >= min_hfta_insz || qnode_list[qidx]->perf->avg_cpu_time() > min_hfta_cpu){
+//printf("\tAdding to eligible list\n");
+                               eligible_hftas.insert((*ssi));
+                       }
+               }
+
+               while(eligible_hftas.size()>0){
+                       int chosen_hfta = -1;
+                       double max_assigned_rate = 0.0;
+                       for(ssi=eligible_hftas.begin();ssi!=eligible_hftas.end();++ssi){
+                               double assigned_rate = 0.0;
+                               string qname = (*ssi);
+                               int qidx = qname_to_idx[qname];
+                               vector<int> reads_from = qnode_list[qidx]->reads_from_idx;
+                               for(i=0;i<reads_from.size();++i){
+                                       if(qnode_list[reads_from[i]]->qnode_type == "LFTA" || (qnode_list[reads_from[i]]->qnode_type == "HFTA" && hfta_assignment.count(qnode_list[reads_from[i]]->name) > 0))
+                                               assigned_rate += qnode_list[reads_from[i]]->output_rate();
+                               }
+//printf("hfta %s, assigned rate=%f\n",qname.c_str(),assigned_rate);
+                               if(assigned_rate >= max_assigned_rate){
+//printf("\t picking %s\n",qname.c_str());
+                                       max_assigned_rate = assigned_rate;
+                                       chosen_hfta = qidx;
+                               }
+                       }
+                       if(chosen_hfta >= 0){
+                               vector<int> reads_from = qnode_list[chosen_hfta]->reads_from_idx;
+                               vector<int> src_location;
+                               vector<double> src_volume;
+                               for(i=0;i<reads_from.size();++i){
+                                       int qidx = reads_from[i];
+                                       if(qnode_list[qidx]->qnode_type == "HFTA"){
+                                               if(hfta_assignment.count(qnode_list[qidx]->name)>0){
+                                                       src_location.push_back(hfta_assignment[qnode_list[qidx]->name]);
+                                                       src_volume.push_back(qnode_list[qidx]->output_rate());
+                                               }
+                                       }
+                                       if(qnode_list[qidx]->qnode_type == "LFTA"){
+                                               if(rts_assignment.count(qnode_list[qidx]->src_interface)>0){
+                                                       src_location.push_back(rts_assignment[qnode_list[qidx]->src_interface]);
+                                                       src_volume.push_back(qnode_list[qidx]->output_rate());
+                                               }
+                                       }
+                               }
+//printf("chosen hfta is %d (%s), sources are:\n",chosen_hfta,qnode_list[chosen_hfta]->name.c_str());
+//for(i=0;i<src_location.size();++i){
+//printf("\tloc=%d, (%s) volume=%f\n",src_location[i],cpu_info_list[src_location[i]]->to_csv().c_str(),src_volume[i]);
+//}
+
+                               double hfta_cpu_usage = qnode_list[chosen_hfta]->perf->avg_cpu_time();
+                               if(hfta_cpu_usage > cpu_util_threshold) // hack for overloaded hftas.
+                                       hfta_cpu_usage = cpu_util_threshold * .9999;
+printf("hfta %d (%s) has cpu usage %f\n",chosen_hfta,qnode_list[chosen_hfta]->name.c_str(),hfta_cpu_usage);
+                               int best_cpu = -1;
+                               double lowest_cost = 0.0;
+                               for(i=0;i<cpu_info_list.size();++i){
+                                       double curr_cost = 0.0;
+                                       for(j=0;j<src_location.size();++j){
+                                               int dist = cpu_info_list[i]->distance_from(cpu_info_list[src_location[j]]);
+                                               curr_cost += src_volume[j]*xfer_costs[dist];
+                                       }
+//printf("Cpu %s, cost=%f\n",cpu_info_list[i]->to_csv().c_str(),curr_cost);
+                                       if((cpu_info_list[i]->assigned_load+hfta_cpu_usage < cpu_util_threshold) && (best_cpu<0 || curr_cost <= lowest_cost)){
+                                               best_cpu = i;
+                                               lowest_cost = curr_cost;
+//printf("\tpicking %s\n",cpu_info_list[i]->to_csv().c_str());
+                                       }
+                               }
+
+                               if(best_cpu>=0)
+                                       cpu_info_list[best_cpu]->assigned_load += hfta_cpu_usage;
+                               hfta_assignment[qnode_list[chosen_hfta]->name] = best_cpu;
+                               eligible_hftas.erase(qnode_list[chosen_hfta]->name);
+
+                       }else{
+                               fprintf(stderr,"ERROR, chosen_hfta=-1, bailing out.\n");
+                               exit(1);
+                       }
+               }
+
+               FILE *pin_fl = fopen("pinning_info.csv","w");
+               if(pin_fl==NULL){
+                       fprintf(stderr,"Warning, can't open pinning_info.csv, can't write the file.\n");
+               }
+               printf("RTS assignments:\n");
+               for(i=0;i<iface_names.size();++i){
+                       int assigned_cpu = rts_assignment[iface_names[i]];
+                       if(assigned_cpu>=0){
+                               printf("Place %s at %d (%s)\n",iface_names[i].c_str(), assigned_cpu, cpu_info_list[assigned_cpu]->to_csv().c_str());
+                               if(pin_fl != NULL){
+                                       fprintf(pin_fl,"rts %s,%d\n",iface_names[i].c_str(), assigned_cpu);
+                               }
+                       }
+               }
+
+               printf("HFTA assignments:\n");
+               map<string, int>::iterator msii;
+               for(msii=hfta_assignment.begin();msii!=hfta_assignment.end();++msii){
+                       int assigned_cpu = (*msii).second;
+                       string qname = (*msii).first;
+                       if(assigned_cpu>=0){
+                               printf("Place %s (%s) at %d (%s)\n",qname.c_str(),qnode_list[qname_to_idx[qname]]->executable_name.c_str(),assigned_cpu,cpu_info_list[assigned_cpu]->to_csv().c_str());
+                               if(pin_fl != NULL){
+                                       fprintf(pin_fl,"%s,%d\n",qnode_list[qname_to_idx[qname]]->executable_name.c_str(), assigned_cpu);
+                               }
+                       }
+               }
+
+       }
+
+//for(i=0;i<cpu_info_list.size();++i){
+//printf("Cpu %d assigned load %f\n",i,cpu_info_list[i]->assigned_load);
+//}
+
+return 0;
+}
+
+
+
diff --git a/src/tools/qnode.h b/src/tools/qnode.h
new file mode 100644 (file)
index 0000000..6e2c7cb
--- /dev/null
@@ -0,0 +1,231 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef __QNODE_H_DEFINED_
+#define __QNODE_H_DEFINED_
+
+#include<string>
+
+struct perf_struct{
+       int n_samples;
+       int init_discard;
+       int init_time;
+       int last_update;
+       unsigned long long int init_stime;
+       unsigned long long int init_utime;
+       unsigned long long int total_stime;
+       unsigned long long int total_utime;
+       double max_stime;
+       double max_utime;
+       double max_time;
+       unsigned long long int max_vm_size;
+       unsigned long long int max_rss;
+
+       void init(){
+               n_samples = 0;
+               init_time = 0;
+               init_stime = 0;
+               init_utime = 0;
+               total_stime = 0;
+               total_utime = 0;
+               max_stime = 0.0;
+               max_utime = 0.0;
+               max_time = 0.0;
+               max_vm_size = 0;
+               max_rss = 0;
+               last_update = -1;
+       }
+
+       perf_struct(){
+               init();
+       }
+       perf_struct(int d){
+               init();
+               init_discard = d;
+       }
+
+       bool update(int t, unsigned long long int u, unsigned long long int s,
+         unsigned long long int v, unsigned long long int r){
+               if(init_discard>0){
+                       init_discard--;
+                       return false;;
+               }
+
+
+               if(v>max_vm_size)
+                       max_vm_size = v;
+               if(r>max_rss)
+                       max_rss = r;
+               if(last_update<0){
+                       init_time = t;
+                       init_stime = s;
+                       init_utime = u;
+               }else{
+                       if(t<=last_update || u<total_utime || s<total_stime){
+                               return true;
+                       }
+
+                       double tmps,tmpu,tmpt;
+                       tmps = (double)((s-total_stime))/(t-last_update);
+                       tmpu = (double)((u-total_utime))/(t-last_update);
+                       tmpt = tmps+tmpu;
+                       if(tmps>max_stime)
+                               max_stime = tmps;
+                       if(tmpu>max_utime)
+                               max_utime = tmpu;
+                       if(tmpt>max_time)
+                               max_time = tmpt;
+               }
+               total_stime = s;
+               total_utime = u;
+               last_update = t;
+
+               return false;
+       }
+
+       std::string to_string(){
+               char ret[1000];
+               if(last_update - init_time>0){
+                       sprintf(ret,"stime=%lf, utime=%lf, time=%lf max_stime=%lf, max_utime=%lf, max_time=%lf, max_vmsize=%lld, max_rss = %lld",
+                         (double)(total_stime-init_stime)/(last_update - init_time),
+                         (double)(total_utime-init_utime)/(last_update - init_time),
+                         (double)(total_stime-init_stime)/(last_update - init_time) + (double)(total_utime-init_utime)/(last_update - init_time),
+                               max_stime,max_utime,max_time,
+                               max_vm_size,max_rss
+                       );
+                       return ret;
+               }
+               return("(no perf results)");
+       }
+
+       static std::string to_csv_hdr(){
+               return "avg_system_time,avg_user_time,avg_cpu_time,max_sys_time,max_user_time,max_total_time,max_vm_size,max_rss";
+       }
+
+       std::string to_csv(){
+               char ret[1000];
+               if(last_update - init_time>0){
+                       sprintf(ret,"%lf,%lf,%lf,%lf,%lf,%lf,%lld,%lld",
+                         (double)(total_stime-init_stime)/(last_update - init_time),
+                         (double)(total_utime-init_utime)/(last_update - init_time),
+                         (double)(total_stime-init_stime)/(last_update - init_time) + (double)(total_utime-init_utime)/(last_update - init_time),
+                               max_stime,max_utime,max_time,
+                               max_vm_size,max_rss
+                       );
+                       return ret;
+               }
+               return(",,,,,,");
+       }
+
+       double avg_cpu_time(){
+               return ((double)((total_stime-init_stime)+(total_utime-init_utime))/(last_update - init_time))/100.0;
+       }
+
+       bool is_valid(){
+               return last_update > 0;
+       }
+};
+
+
+
+
+struct field_str{
+       std::string name;
+       int pos;
+       std::string type;
+       std::string mods;
+
+       field_str(){};
+       field_str(std::string n, int p, std::string t, std::string m){
+               name=n;
+               pos=p;
+               type=t;
+               mods=m;
+       }
+};
+
+
+struct qnode{
+       std::string name;
+       std::string executable_name;
+       std::string qnode_type;
+       int aggr_tbl_size;
+       std::vector<field_str *> fields;
+       std::vector<std::string> reads_from;
+       std::vector<int> reads_from_idx;
+       std::vector<int> sources_to_idx;
+       std::string src_interface;
+       int par_index;
+       int start_tick, end_tick;
+
+       unsigned long long int in_tup,out_tup,out_sz;
+       unsigned long long int accepted_tup,cycles,collisions,evictions;
+       double inferred_in_sz;
+       perf_struct *perf;
+
+       qnode(int d){
+               aggr_tbl_size = 0;
+               in_tup = 0;
+               out_tup = 0;
+               accepted_tup = 0;
+               cycles = 0;
+               collisions = 0;
+               evictions = 0;
+               inferred_in_sz = 0.0;
+               par_index = 0;
+               start_tick = end_tick = -1;
+               perf = new perf_struct(d);
+       };
+
+       qnode(std::string type, std::string n,int d){
+               qnode_type=type;
+               name=n;
+               aggr_tbl_size = 0;
+
+               in_tup = 0;
+               out_tup = 0;
+               out_sz = 0;
+               accepted_tup = 0;
+               cycles = 0;
+               collisions = 0;
+               evictions = 0;
+               inferred_in_sz = 0.0;
+               par_index = 0;
+               start_tick = end_tick = -1;
+               perf = new perf_struct(d);
+       }
+
+       double output_rate(){
+               if(end_tick == start_tick){
+                       return 0.0;
+               }
+               return( ((double)out_sz)/(end_tick-start_tick) );
+       }
+
+       void add_field(field_str *fld){
+               fields.push_back(fld);
+       }
+
+       void add_source(std::string src){
+               reads_from.push_back(src);
+       }
+
+};
+
+
+
+
+
+#endif
diff --git a/src/tools/xml.l b/src/tools/xml.l
new file mode 100644 (file)
index 0000000..82dd205
--- /dev/null
@@ -0,0 +1,223 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+/*
+       MUST COMPILE WITH
+               flex -PxmlParser -oxmllexer.cc xml.l
+       (or equivalent).
+*/     
+
+%{
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ // #include "parse_fta.h"
+ #include <string.h>
+
+
+
+#include "xml.tab.hh"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int xmlParserwrap(){return(1);}
+
+extern int xmlParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_xml_lineno : the line currently being parsed when the error occurs.
+               flex_xml_ch : the character on the line where the error occurs
+               flex_xml_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_xml_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_xml_lineno = 1;
+int flex_xml_ch = 0;
+char flex_xml_linebuf[20000];
+
+char *flex_xml_stringinput = NULL;
+int flex_xml_stringinput_ptr = 0;
+FILE *flex_xml_fileinput = NULL;
+int my_xmlParser_yyinput(char *buf, int max_size);
+
+
+
+void xmlParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_xml_lineno, flex_xml_ch, s, xmlParsertext, flex_xml_linebuf );
+    for(i=0;i<flex_xml_ch;i++){
+               if(flex_xml_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_xml_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_xmlParser_yyinput(b,ms))
+
+%}
+       /* MKS needs the next line to increase the NFA table */
+%e 1200
+%option noyywrap
+
+%%
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+
+
+
+[<>=/] { flex_xml_ch+=xmlParserleng; return yytext[0]; }
+
+       /* names */
+
+[A-Za-z_][A-Za-z0-9_:\-]*      { flex_xml_ch+=xmlParserleng; xmlParserlval.strval = strdup(yytext); return NAME; }
+
+
+       /* strings */
+
+\'[^\'\n]*\'   {
+               
+               int c;
+               
+               xmlParserlval.strval = strdup(xmlParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_xml_ch+=xmlParserleng; 
+                       xmlParserlval.strval[xmlParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+               
+\'[^\'\n]*$    { flex_xml_ch+=xmlParserleng; xmlParsererror("Unterminated string"); }
+
+ /*                                                                                                                    */
+ /*            Newline : advance the error reporting line number       */
+ /*            and grab the next line into flex_xml_linebuf                    */
+ /*                                                                                                                    */
+
+\n.*           {flex_xml_ch=0; flex_xml_lineno++;
+                          strcpy(flex_xml_linebuf,xmlParsertext+1);
+                          yyless(1);
+                          }
+
+[ \t\r]+       {flex_xml_ch+=xmlParserleng; }  /* white space */
+
+"--".*$                {flex_xml_ch+=xmlParserleng; }; /* comment */
+"//".*$                {flex_xml_ch+=xmlParserleng; }; /* comment */
+"<?xml".*$      {flex_xml_ch+=xmlParserleng; }; /* comment */
+
+.|\n            {flex_xml_ch+=xmlParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  xmlParsererror(yytext);}
+
+%%
+
+int my_xmlParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_xml_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_xml_stringinput[flex_xml_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_xml_stringinput[flex_xml_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_xml_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_xml_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void xmlParser_setfileinput(FILE *f){
+       xmlParserrestart(NULL);
+
+       flex_xml_fileinput = f;
+       flex_xml_stringinput = NULL;
+       flex_xml_lineno = 1;
+       flex_xml_ch = 0;
+}
+
+void xmlParser_setstringinput(char *s){
+       xmlParserrestart(NULL);
+
+       flex_xml_fileinput = NULL;
+       flex_xml_stringinput = s;
+       flex_xml_stringinput_ptr = 0;
+       flex_xml_lineno = 1;
+       flex_xml_ch = 0;
+}
+       
+               
+
+
+
diff --git a/src/tools/xml.tab.cc b/src/tools/xml.tab.cc
new file mode 100644 (file)
index 0000000..c589368
--- /dev/null
@@ -0,0 +1,1645 @@
+/* A Bison parser, made by GNU Bison 2.3.  */
+
+/* Skeleton implementation for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   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., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+   simplifying the original so-called "semantic" parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Bison version.  */
+#define YYBISON_VERSION "2.3"
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* Substitute the variable and function names.  */
+#define yyparse xmlParserparse
+#define yylex   xmlParserlex
+#define yyerror xmlParsererror
+#define yylval  xmlParserlval
+#define yychar  xmlParserchar
+#define yydebug xmlParserdebug
+#define yynerrs xmlParsernerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259
+   };
+#endif
+/* Tokens.  */
+#define NAME 258
+#define STRING_TOKEN 259
+
+
+
+
+/* Copy the first part of user declarations.  */
+#line 8 "xml.y"
+
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "xml_t.h"
+
+
+extern xml_t *xml_result;
+
+extern int xmlParserdebug;
+extern void xmlParsererror(char *s);
+extern int xmlParserlex();
+
+
+#define YYDEBUG 1
+
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+/* Enabling the token table.  */
+#ifndef YYTOKEN_TABLE
+# define YYTOKEN_TABLE 0
+#endif
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+#line 39 "xml.y"
+{
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+       struct name_val_pair_t *nvpt;
+       struct name_val_list_t *nvpl;
+       struct tag_t *tg_t;
+       struct xml_list_t *xlist_t;
+       struct xml_t *x_t;
+}
+/* Line 193 of yacc.c.  */
+#line 152 "xml.tab.cc"
+       YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations.  */
+
+
+/* Line 216 of yacc.c.  */
+#line 165 "xml.tab.cc"
+
+#ifdef short
+# undef short
+#endif
+
+#ifdef YYTYPE_UINT8
+typedef YYTYPE_UINT8 yytype_uint8;
+#else
+typedef unsigned char yytype_uint8;
+#endif
+
+#ifdef YYTYPE_INT8
+typedef YYTYPE_INT8 yytype_int8;
+#elif (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+typedef signed char yytype_int8;
+#else
+typedef short int yytype_int8;
+#endif
+
+#ifdef YYTYPE_UINT16
+typedef YYTYPE_UINT16 yytype_uint16;
+#else
+typedef unsigned short int yytype_uint16;
+#endif
+
+#ifdef YYTYPE_INT16
+typedef YYTYPE_INT16 yytype_int16;
+#else
+typedef short int yytype_int16;
+#endif
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+#  define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+#  define YYSIZE_T size_t
+# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# else
+#  define YYSIZE_T unsigned int
+# endif
+#endif
+
+#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
+
+#ifndef YY_
+# if YYENABLE_NLS
+#  if ENABLE_NLS
+#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
+#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#  endif
+# endif
+# ifndef YY_
+#  define YY_(msgid) msgid
+# endif
+#endif
+
+/* Suppress unused-variable warnings by "using" E.  */
+#if ! defined lint || defined __GNUC__
+# define YYUSE(e) ((void) (e))
+#else
+# define YYUSE(e) /* empty */
+#endif
+
+/* Identity function, used to suppress warnings about constant conditions.  */
+#ifndef lint
+# define YYID(n) (n)
+#else
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static int
+YYID (int i)
+#else
+static int
+YYID (i)
+    int i;
+#endif
+{
+  return i;
+}
+#endif
+
+#if ! defined yyoverflow || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
+#   elif defined __BUILTIN_VA_ARG_INCR
+#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
+#   elif defined _AIX
+#    define YYSTACK_ALLOC __alloca
+#   elif defined _MSC_VER
+#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
+#    define alloca _alloca
+#   else
+#    define YYSTACK_ALLOC alloca
+#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#     ifndef _STDLIB_H
+#      define _STDLIB_H 1
+#     endif
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+    /* The OS might guarantee only one guard page at the bottom of the stack,
+       and a page size can be as small as 4096 bytes.  So we cannot safely
+       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
+       to allow for a few compiler-allocated temporary stack slots.  */
+#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+#  endif
+# else
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
+#  ifndef YYSTACK_ALLOC_MAXIMUM
+#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+#  endif
+#  if (defined __cplusplus && ! defined _STDLIB_H \
+       && ! ((defined YYMALLOC || defined malloc) \
+            && (defined YYFREE || defined free)))
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   ifndef _STDLIB_H
+#    define _STDLIB_H 1
+#   endif
+#  endif
+#  ifndef YYMALLOC
+#   define YYMALLOC malloc
+#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+#  ifndef YYFREE
+#   define YYFREE free
+#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+#   endif
+#  endif
+# endif
+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
+
+
+#if (! defined yyoverflow \
+     && (! defined __cplusplus \
+        || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  yytype_int16 yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if defined __GNUC__ && 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)             \
+      do                                       \
+       {                                       \
+         YYSIZE_T yyi;                         \
+         for (yyi = 0; yyi < (Count); yyi++)   \
+           (To)[yyi] = (From)[yyi];            \
+       }                                       \
+      while (YYID (0))
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)                                       \
+    do                                                                 \
+      {                                                                        \
+       YYSIZE_T yynewbytes;                                            \
+       YYCOPY (&yyptr->Stack, Stack, yysize);                          \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        \
+    while (YYID (0))
+
+#endif
+
+/* YYFINAL -- State number of the termination state.  */
+#define YYFINAL  6
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   25
+
+/* YYNTOKENS -- Number of terminals.  */
+#define YYNTOKENS  9
+/* YYNNTS -- Number of nonterminals.  */
+#define YYNNTS  9
+/* YYNRULES -- Number of rules.  */
+#define YYNRULES  14
+/* YYNRULES -- Number of states.  */
+#define YYNSTATES  26
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   259
+
+#define YYTRANSLATE(YYX)                                               \
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const yytype_uint8 yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     6,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       5,     8,     7,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const yytype_uint8 yyprhs[] =
+{
+       0,     0,     3,     5,     9,    12,    18,    23,    28,    30,
+      33,    35,    36,    38,    41
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+static const yytype_int8 yyrhs[] =
+{
+      10,     0,    -1,    11,    -1,    12,    14,    13,    -1,    12,
+      13,    -1,     5,     3,    15,     6,     7,    -1,     5,     3,
+      15,     7,    -1,     5,     6,     3,     7,    -1,    11,    -1,
+      14,    11,    -1,    16,    -1,    -1,    17,    -1,    16,    17,
+      -1,     3,     8,     4,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const yytype_uint8 yyrline[] =
+{
+       0,    65,    65,    69,    70,    71,    75,    79,    84,    85,
+      89,    90,    94,    95,    99
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "NAME", "STRING_TOKEN", "'<'", "'/'",
+  "'>'", "'='", "$accept", "parse_result", "resource", "start_tag",
+  "end_tag", "xml_list", "opt_val_list", "val_list", "val", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const yytype_uint16 yytoknum[] =
+{
+       0,   256,   257,   258,   259,    60,    47,    62,    61
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,     9,    10,    11,    11,    11,    12,    13,    14,    14,
+      15,    15,    16,    16,    17
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     1,     3,     2,     5,     4,     4,     1,     2,
+       1,     0,     1,     2,     3
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const yytype_uint8 yydefact[] =
+{
+       0,     0,     0,     2,     0,    11,     1,     0,     8,     4,
+       0,     0,     0,    10,    12,     0,     9,     3,     0,     0,
+       6,    13,     0,    14,     5,     7
+};
+
+/* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int8 yydefgoto[] =
+{
+      -1,     2,     3,     4,     9,    10,    12,    13,    14
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -5
+static const yytype_int8 yypact[] =
+{
+      -3,     0,     5,    -5,     4,     7,    -5,    -2,    -5,    -5,
+       4,     3,     1,     7,    -5,     9,    -5,    -5,    10,     6,
+      -5,    -5,     8,    -5,    -5,    -5
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const yytype_int8 yypgoto[] =
+{
+      -5,    -5,    -4,    -5,    11,    -5,    -5,    -5,    12
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -1
+static const yytype_uint8 yytable[] =
+{
+       8,     5,     1,     5,    15,     6,    16,    19,    20,     7,
+      11,    18,    22,    24,    23,    25,     0,     0,     0,     0,
+       0,    17,     0,     0,     0,    21
+};
+
+static const yytype_int8 yycheck[] =
+{
+       4,     3,     5,     3,     6,     0,    10,     6,     7,     5,
+       3,     8,     3,     7,     4,     7,    -1,    -1,    -1,    -1,
+      -1,    10,    -1,    -1,    -1,    13
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const yytype_uint8 yystos[] =
+{
+       0,     5,    10,    11,    12,     3,     0,     5,    11,    13,
+      14,     3,    15,    16,    17,     6,    11,    13,     8,     6,
+       7,    17,     3,     4,     7,     7
+};
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                (-2)
+#define YYEOF          0
+
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT                goto yyabortlab
+#define YYERROR                goto yyerrorlab
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL         goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yytoken = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK (1);                                          \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror (YY_("syntax error: cannot back up")); \
+      YYERROR;                                                 \
+    }                                                          \
+while (YYID (0))
+
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+
+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
+   If N is 0, then set CURRENT to the empty location which ends
+   the previous symbol: RHS[0] (always defined).  */
+
+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)                               \
+    do                                                                 \
+      if (YYID (N))                                                    \
+       {                                                               \
+         (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
+         (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
+         (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
+         (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
+       }                                                               \
+      else                                                             \
+       {                                                               \
+         (Current).first_line   = (Current).last_line   =              \
+           YYRHSLOC (Rhs, 0).last_line;                                \
+         (Current).first_column = (Current).last_column =              \
+           YYRHSLOC (Rhs, 0).last_column;                              \
+       }                                                               \
+    while (YYID (0))
+#endif
+
+
+/* YY_LOCATION_PRINT -- Print the location on the stream.
+   This macro was not mandated originally: define only if we know
+   we won't break user code: when these are the locations we know.  */
+
+#ifndef YY_LOCATION_PRINT
+# if YYLTYPE_IS_TRIVIAL
+#  define YY_LOCATION_PRINT(File, Loc)                 \
+     fprintf (File, "%d.%d-%d.%d",                     \
+             (Loc).first_line, (Loc).first_column,     \
+             (Loc).last_line,  (Loc).last_column)
+# else
+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+# endif
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (YYID (0))
+
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                   \
+do {                                                                     \
+  if (yydebug)                                                           \
+    {                                                                    \
+      YYFPRINTF (stderr, "%s ", Title);                                          \
+      yy_symbol_print (stderr,                                           \
+                 Type, Value); \
+      YYFPRINTF (stderr, "\n");                                                  \
+    }                                                                    \
+} while (YYID (0))
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_value_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (!yyvaluep)
+    return;
+# ifdef YYPRINT
+  if (yytype < YYNTOKENS)
+    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# else
+  YYUSE (yyoutput);
+# endif
+  switch (yytype)
+    {
+      default:
+       break;
+    }
+}
+
+
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
+#else
+static void
+yy_symbol_print (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE const * const yyvaluep;
+#endif
+{
+  if (yytype < YYNTOKENS)
+    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
+  YYFPRINTF (yyoutput, ")");
+}
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    yytype_int16 *bottom;
+    yytype_int16 *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)                           \
+do {                                                           \
+  if (yydebug)                                                 \
+    yy_stack_print ((Bottom), (Top));                          \
+} while (YYID (0))
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
+#else
+static void
+yy_reduce_print (yyvsp, yyrule)
+    YYSTYPE *yyvsp;
+    int yyrule;
+#endif
+{
+  int yynrhs = yyr2[yyrule];
+  int yyi;
+  unsigned long int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
+            yyrule - 1, yylno);
+  /* The symbols being reduced.  */
+  for (yyi = 0; yyi < yynrhs; yyi++)
+    {
+      fprintf (stderr, "   $%d = ", yyi + 1);
+      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
+                      &(yyvsp[(yyi + 1) - (yynrhs)])
+                                      );
+      fprintf (stderr, "\n");
+    }
+}
+
+# define YY_REDUCE_PRINT(Rule)         \
+do {                                   \
+  if (yydebug)                         \
+    yy_reduce_print (yyvsp, Rule); \
+} while (YYID (0))
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+\f
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined __GLIBC__ && defined _STRING_H
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static YYSIZE_T
+yystrlen (const char *yystr)
+#else
+static YYSIZE_T
+yystrlen (yystr)
+    const char *yystr;
+#endif
+{
+  YYSIZE_T yylen;
+  for (yylen = 0; yystr[yylen]; yylen++)
+    continue;
+  return yylen;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static char *
+yystpcpy (char *yydest, const char *yysrc)
+#else
+static char *
+yystpcpy (yydest, yysrc)
+    char *yydest;
+    const char *yysrc;
+#endif
+{
+  char *yyd = yydest;
+  const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+# ifndef yytnamerr
+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
+   quotes and backslashes, so that it's suitable for yyerror.  The
+   heuristic is that double-quoting is unnecessary unless the string
+   contains an apostrophe, a comma, or backslash (other than
+   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
+   null, do not copy; instead, return the length of what the result
+   would have been.  */
+static YYSIZE_T
+yytnamerr (char *yyres, const char *yystr)
+{
+  if (*yystr == '"')
+    {
+      YYSIZE_T yyn = 0;
+      char const *yyp = yystr;
+
+      for (;;)
+       switch (*++yyp)
+         {
+         case '\'':
+         case ',':
+           goto do_not_strip_quotes;
+
+         case '\\':
+           if (*++yyp != '\\')
+             goto do_not_strip_quotes;
+           /* Fall through.  */
+         default:
+           if (yyres)
+             yyres[yyn] = *yyp;
+           yyn++;
+           break;
+
+         case '"':
+           if (yyres)
+             yyres[yyn] = '\0';
+           return yyn;
+         }
+    do_not_strip_quotes: ;
+    }
+
+  if (! yyres)
+    return yystrlen (yystr);
+
+  return yystpcpy (yyres, yystr) - yyres;
+}
+# endif
+
+/* Copy into YYRESULT an error message about the unexpected token
+   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
+   including the terminating null byte.  If YYRESULT is null, do not
+   copy anything; just return the number of bytes that would be
+   copied.  As a special case, return 0 if an ordinary "syntax error"
+   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
+   size calculation.  */
+static YYSIZE_T
+yysyntax_error (char *yyresult, int yystate, int yychar)
+{
+  int yyn = yypact[yystate];
+
+  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
+    return 0;
+  else
+    {
+      int yytype = YYTRANSLATE (yychar);
+      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
+      YYSIZE_T yysize = yysize0;
+      YYSIZE_T yysize1;
+      int yysize_overflow = 0;
+      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
+      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
+      int yyx;
+
+# if 0
+      /* This is so xgettext sees the translatable formats that are
+        constructed on the fly.  */
+      YY_("syntax error, unexpected %s");
+      YY_("syntax error, unexpected %s, expecting %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
+      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
+# endif
+      char *yyfmt;
+      char const *yyf;
+      static char const yyunexpected[] = "syntax error, unexpected %s";
+      static char const yyexpecting[] = ", expecting %s";
+      static char const yyor[] = " or %s";
+      char yyformat[sizeof yyunexpected
+                   + sizeof yyexpecting - 1
+                   + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
+                      * (sizeof yyor - 1))];
+      char const *yyprefix = yyexpecting;
+
+      /* Start YYX at -YYN if negative to avoid negative indexes in
+        YYCHECK.  */
+      int yyxbegin = yyn < 0 ? -yyn : 0;
+
+      /* Stay within bounds of both yycheck and yytname.  */
+      int yychecklim = YYLAST - yyn + 1;
+      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+      int yycount = 1;
+
+      yyarg[0] = yytname[yytype];
+      yyfmt = yystpcpy (yyformat, yyunexpected);
+
+      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
+       if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+         {
+           if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
+             {
+               yycount = 1;
+               yysize = yysize0;
+               yyformat[sizeof yyunexpected - 1] = '\0';
+               break;
+             }
+           yyarg[yycount++] = yytname[yyx];
+           yysize1 = yysize + yytnamerr (0, yytname[yyx]);
+           yysize_overflow |= (yysize1 < yysize);
+           yysize = yysize1;
+           yyfmt = yystpcpy (yyfmt, yyprefix);
+           yyprefix = yyor;
+         }
+
+      yyf = YY_(yyformat);
+      yysize1 = yysize + yystrlen (yyf);
+      yysize_overflow |= (yysize1 < yysize);
+      yysize = yysize1;
+
+      if (yysize_overflow)
+       return YYSIZE_MAXIMUM;
+
+      if (yyresult)
+       {
+         /* Avoid sprintf, as that infringes on the user's name space.
+            Don't have undefined behavior even if the translation
+            produced a string with the wrong number of "%s"s.  */
+         char *yyp = yyresult;
+         int yyi = 0;
+         while ((*yyp = *yyf) != '\0')
+           {
+             if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
+               {
+                 yyp += yytnamerr (yyp, yyarg[yyi++]);
+                 yyf += 2;
+               }
+             else
+               {
+                 yyp++;
+                 yyf++;
+               }
+           }
+       }
+      return yysize;
+    }
+}
+#endif /* YYERROR_VERBOSE */
+\f
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+/*ARGSUSED*/
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+static void
+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yymsg, yytype, yyvaluep)
+    const char *yymsg;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  YYUSE (yyvaluep);
+
+  if (!yymsg)
+    yymsg = "Deleting";
+  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
+
+  switch (yytype)
+    {
+
+      default:
+       break;
+    }
+}
+\f
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+
+#ifdef YYPARSE_PARAM
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void *YYPARSE_PARAM);
+#else
+int yyparse ();
+#endif
+#else /* ! YYPARSE_PARAM */
+#if defined __STDC__ || defined __cplusplus
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The look-ahead symbol.  */
+int yychar;
+
+/* The semantic value of the look-ahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void *YYPARSE_PARAM)
+#else
+int
+yyparse (YYPARSE_PARAM)
+    void *YYPARSE_PARAM;
+#endif
+#else /* ! YYPARSE_PARAM */
+#if (defined __STDC__ || defined __C99__FUNC__ \
+     || defined __cplusplus || defined _MSC_VER)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+  
+  int yystate;
+  int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Look-ahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+#if YYERROR_VERBOSE
+  /* Buffer for error messages, and its allocated size.  */
+  char yymsgbuf[128];
+  char *yymsg = yymsgbuf;
+  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
+#endif
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  yytype_int16 yyssa[YYINITDEPTH];
+  yytype_int16 *yyss = yyssa;
+  yytype_int16 *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* The number of symbols on the RHS of the reduced rule.
+     Keep to zero when no symbol should be popped.  */
+  int yylen = 0;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed.  So pushing a state here evens the stacks.  */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack.  Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       yytype_int16 *yyss1 = yyss;
+
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  This used to be a
+          conditional around just the two extra args, but that might
+          be undefined if yyoverflow is a macro.  */
+       yyoverflow (YY_("memory exhausted"),
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+
+                   &yystacksize);
+
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyexhaustedlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+       goto yyexhaustedlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       yytype_int16 *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyexhaustedlab;
+       YYSTACK_RELOCATE (yyss);
+       YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+  /* Do appropriate processing given the current state.  Read a
+     look-ahead token if we need one and don't already have one.  */
+
+  /* First try to decide what to do without reference to look-ahead token.  */
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a look-ahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  /* Shift the look-ahead token.  */
+  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+
+  /* Discard the shifted token unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  yystate = yyn;
+  *++yyvsp = yylval;
+
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 2:
+#line 65 "xml.y"
+    {xml_result = (yyvsp[(1) - (1)].x_t);;}
+    break;
+
+  case 3:
+#line 69 "xml.y"
+    {(yyval.x_t) = new xml_t((yyvsp[(1) - (3)].tg_t),(yyvsp[(2) - (3)].xlist_t),(yyvsp[(3) - (3)].strval));;}
+    break;
+
+  case 4:
+#line 70 "xml.y"
+    {(yyval.x_t)=new xml_t((yyvsp[(1) - (2)].tg_t),(yyvsp[(2) - (2)].strval));;}
+    break;
+
+  case 5:
+#line 71 "xml.y"
+    {(yyval.x_t)=new xml_t((yyvsp[(2) - (5)].strval),(yyvsp[(3) - (5)].nvpl));;}
+    break;
+
+  case 6:
+#line 75 "xml.y"
+    {(yyval.tg_t) = new tag_t((yyvsp[(2) - (4)].strval), (yyvsp[(3) - (4)].nvpl));;}
+    break;
+
+  case 7:
+#line 79 "xml.y"
+    {(yyval.strval)=(yyvsp[(3) - (4)].strval);;}
+    break;
+
+  case 8:
+#line 84 "xml.y"
+    {(yyval.xlist_t)=new xml_list_t((yyvsp[(1) - (1)].x_t));;}
+    break;
+
+  case 9:
+#line 85 "xml.y"
+    {(yyval.xlist_t)=(yyvsp[(1) - (2)].xlist_t)->append((yyvsp[(2) - (2)].x_t));;}
+    break;
+
+  case 10:
+#line 89 "xml.y"
+    {(yyval.nvpl)=(yyvsp[(1) - (1)].nvpl);;}
+    break;
+
+  case 11:
+#line 90 "xml.y"
+    {(yyval.nvpl)=new name_val_list_t();;}
+    break;
+
+  case 12:
+#line 94 "xml.y"
+    {(yyval.nvpl) = new name_val_list_t((yyvsp[(1) - (1)].nvpt));;}
+    break;
+
+  case 13:
+#line 95 "xml.y"
+    {(yyval.nvpl) = (yyvsp[(1) - (2)].nvpl)->append((yyvsp[(2) - (2)].nvpt));;}
+    break;
+
+  case 14:
+#line 99 "xml.y"
+    {(yyval.nvpt) = new name_val_pair_t((yyvsp[(1) - (3)].strval),(yyvsp[(3) - (3)].strval));;}
+    break;
+
+
+/* Line 1267 of yacc.c.  */
+#line 1428 "xml.tab.cc"
+      default: break;
+    }
+  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
+
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if ! YYERROR_VERBOSE
+      yyerror (YY_("syntax error"));
+#else
+      {
+       YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
+       if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
+         {
+           YYSIZE_T yyalloc = 2 * yysize;
+           if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
+             yyalloc = YYSTACK_ALLOC_MAXIMUM;
+           if (yymsg != yymsgbuf)
+             YYSTACK_FREE (yymsg);
+           yymsg = (char *) YYSTACK_ALLOC (yyalloc);
+           if (yymsg)
+             yymsg_alloc = yyalloc;
+           else
+             {
+               yymsg = yymsgbuf;
+               yymsg_alloc = sizeof yymsgbuf;
+             }
+         }
+
+       if (0 < yysize && yysize <= yymsg_alloc)
+         {
+           (void) yysyntax_error (yymsg, yystate, yychar);
+           yyerror (yymsg);
+         }
+       else
+         {
+           yyerror (YY_("syntax error"));
+           if (yysize != 0)
+             goto yyexhaustedlab;
+         }
+      }
+#endif
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse look-ahead token after an
+        error, discard it.  */
+
+      if (yychar <= YYEOF)
+       {
+         /* Return failure if at end of input.  */
+         if (yychar == YYEOF)
+           YYABORT;
+       }
+      else
+       {
+         yydestruct ("Error: discarding",
+                     yytoken, &yylval);
+         yychar = YYEMPTY;
+       }
+    }
+
+  /* Else will try to reuse look-ahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+  /* Pacify compilers like GCC when the user code never invokes
+     YYERROR and the label yyerrorlab therefore never appears in user
+     code.  */
+  if (/*CONSTCOND*/ 0)
+     goto yyerrorlab;
+
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYERROR.  */
+  YYPOPSTACK (yylen);
+  yylen = 0;
+  YY_STACK_PRINT (yyss, yyssp);
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;     /* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+       {
+         yyn += YYTERROR;
+         if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+           {
+             yyn = yytable[yyn];
+             if (0 < yyn)
+               break;
+           }
+       }
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+       YYABORT;
+
+
+      yydestruct ("Error: popping",
+                 yystos[yystate], yyvsp);
+      YYPOPSTACK (1);
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  *++yyvsp = yylval;
+
+
+  /* Shift the error token.  */
+  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*-------------------------------------------------.
+| yyexhaustedlab -- memory exhaustion comes here.  |
+`-------------------------------------------------*/
+yyexhaustedlab:
+  yyerror (YY_("memory exhausted"));
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+  if (yychar != YYEOF && yychar != YYEMPTY)
+     yydestruct ("Cleanup: discarding lookahead",
+                yytoken, &yylval);
+  /* Do not reclaim the symbols of the rule which action triggered
+     this YYABORT or YYACCEPT.  */
+  YYPOPSTACK (yylen);
+  YY_STACK_PRINT (yyss, yyssp);
+  while (yyssp != yyss)
+    {
+      yydestruct ("Cleanup: popping",
+                 yystos[*yyssp], yyvsp);
+      YYPOPSTACK (1);
+    }
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+#if YYERROR_VERBOSE
+  if (yymsg != yymsgbuf)
+    YYSTACK_FREE (yymsg);
+#endif
+  /* Make sure YYID is used.  */
+  return YYID (yyresult);
+}
+
+
+#line 106 "xml.y"
+
+
+
+
diff --git a/src/tools/xml.tab.hh b/src/tools/xml.tab.hh
new file mode 100644 (file)
index 0000000..b100c6a
--- /dev/null
@@ -0,0 +1,76 @@
+/* A Bison parser, made by GNU Bison 2.3.  */
+
+/* Skeleton interface for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   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., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, you may create a larger work that contains
+   part or all of the Bison parser skeleton and distribute that work
+   under terms of your choice, so long as that work isn't itself a
+   parser generator using the skeleton or a modified version thereof
+   as a parser skeleton.  Alternatively, if you modify or redistribute
+   the parser skeleton itself, you may (at your option) remove this
+   special exception, which will cause the skeleton and the resulting
+   Bison output files to be licensed under the GNU General Public
+   License without this special exception.
+
+   This special exception was added by the Free Software Foundation in
+   version 2.2 of Bison.  */
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     NAME = 258,
+     STRING_TOKEN = 259
+   };
+#endif
+/* Tokens.  */
+#define NAME 258
+#define STRING_TOKEN 259
+
+
+
+
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+typedef union YYSTYPE
+#line 39 "xml.y"
+{
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+       struct name_val_pair_t *nvpt;
+       struct name_val_list_t *nvpl;
+       struct tag_t *tg_t;
+       struct xml_list_t *xlist_t;
+       struct xml_t *x_t;
+}
+/* Line 1529 of yacc.c.  */
+#line 69 "xml.tab.hh"
+       YYSTYPE;
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+extern YYSTYPE xmlParserlval;
+
diff --git a/src/tools/xml.y b/src/tools/xml.y
new file mode 100644 (file)
index 0000000..01f4c46
--- /dev/null
@@ -0,0 +1,123 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+ /*
+       MUST COMPILE WITH
+       bison --verbose -d -p xmlParser  -o xml.tab.cc xml.y
+
+        (or equivalent).
+*/
+
+%{
+
+
+#include <stdio.h>
+
+/*             Some addn'l includes, necessary but not included by the
+               bison generated code.
+*/
+
+#include <stdlib.h>
+
+/*             prototypes for the parser callbacks.
+*/
+
+#include "xml_t.h"
+
+
+extern xml_t *xml_result;
+
+extern int xmlParserdebug;
+extern void xmlParsererror(char *s);
+extern int xmlParserlex();
+
+
+#define YYDEBUG 1
+
+%}
+
+
+       /* symbolic tokens */
+
+%union {
+       int intval;
+       double floatval;
+       char *strval;
+       int subtok;
+       struct name_val_pair_t *nvpt;
+       struct name_val_list_t *nvpl;
+       struct tag_t *tg_t;
+       struct xml_list_t *xlist_t;
+       struct xml_t *x_t;
+}
+
+%token <strval> NAME
+%token <strval> STRING_TOKEN
+
+%type <nvpt> val
+%type <nvpl> val_list
+%type <nvpl> opt_val_list
+%type <strval> end_tag
+%type <tg_t> start_tag
+%type <xlist_t> xml_list
+%type<x_t> resource
+
+
+%%
+
+parse_result:  resource        {xml_result = $1;}
+       ;
+
+resource:
+       start_tag xml_list end_tag {$$ = new xml_t($1,$2,$3);}
+       | start_tag end_tag     {$$=new xml_t($1,$2);}
+       | '<' NAME opt_val_list '/' '>' {$$=new xml_t($2,$3);}
+       ;
+
+start_tag:
+       '<' NAME opt_val_list '>'       {$$ = new tag_t($2, $3);}
+       ;
+
+end_tag:
+       '<' '/' NAME '>'        {$$=$3;}
+       ;
+
+
+xml_list:
+       resource        {$$=new xml_list_t($1);}
+       | xml_list resource     {$$=$1->append($2);}
+       ;
+
+opt_val_list:
+       val_list        {$$=$1;}
+       |               {$$=new name_val_list_t();}
+       ;
+
+val_list:
+       val             {$$ = new name_val_list_t($1);}
+       | val_list val {$$ = $1->append($2);}
+       ;
+
+val:
+       NAME '=' STRING_TOKEN   {$$ = new name_val_pair_t($1,$3);}
+       ;
+       
+
+
+
+
+%%
+
+
diff --git a/src/tools/xml_t.cc b/src/tools/xml_t.cc
new file mode 100644 (file)
index 0000000..68941ab
--- /dev/null
@@ -0,0 +1,47 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include "xml_t.h"
+
+using namespace std;
+
+xml_t::xml_t(tag_t *s, xml_list_t *xl,const char *e){
+       name=s->name;
+       attribs = s->nvp_list;
+       subtrees = xl->xlist;
+       end_tag_name = e;
+}
+
+void xml_t::get_roots(string type, vector<xml_t *> &ret){
+       if(name==type){
+               ret.push_back(this);
+       }else{
+               int i;
+               for(i=0;i<subtrees.size();++i){
+                       subtrees[i]->get_roots(type,ret);
+               }
+       }
+}
+
+void xml_t::get_roots(set<string> type, vector<xml_t *> &ret){
+       if(type.count(name)>0){
+               ret.push_back(this);
+       }else{
+               int i;
+               for(i=0;i<subtrees.size();++i){
+                       subtrees[i]->get_roots(type,ret);
+               }
+       }
+}
diff --git a/src/tools/xml_t.h b/src/tools/xml_t.h
new file mode 100644 (file)
index 0000000..c17ad68
--- /dev/null
@@ -0,0 +1,148 @@
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#ifndef __XML_T_DEFINED_
+#define __XML_T_DEFINED_
+
+#include <stdio.h>
+#include<vector>
+#include<string>
+#include<map>
+#include<set>
+#include<algorithm>
+
+
+void xmlParser_setfileinput(FILE *f);
+void xmlParser_setstringinput(char *s);
+
+
+
+struct name_val_pair_t{
+       std::string name;
+       std::string val;
+
+       name_val_pair_t(const char *n, const char *v){
+               name = n;
+               val = v;
+       }
+};
+
+struct name_val_list_t{
+       std::vector<name_val_pair_t *> nvp_list;
+
+       name_val_list_t(){
+       }
+
+       name_val_list_t(name_val_pair_t *nvp){
+               nvp_list.push_back(nvp);
+       }
+
+       name_val_list_t *append(name_val_pair_t *nvp){
+               nvp_list.push_back(nvp);
+               return this;
+       }
+};
+
+struct tag_t{
+       std::string name;
+       std::vector<name_val_pair_t *> nvp_list;
+
+       tag_t(const char *n, name_val_list_t *nvl){
+               name=n;
+               nvp_list = nvl->nvp_list;
+       }
+};
+
+
+struct xml_list_t;
+
+struct xml_t{
+       std::string name;
+       std::string end_tag_name;
+       std::vector<name_val_pair_t *> attribs;
+
+       std::vector<xml_t *> subtrees;
+
+       xml_t(){}
+
+       xml_t(tag_t *s, xml_list_t *xl,const char *e);
+
+       xml_t(tag_t *s, char *e){
+               name=s->name;
+               attribs = s->nvp_list;
+               end_tag_name = e;
+       }
+
+       xml_t(const char *n, name_val_list_t *nvl){
+               name=n;
+               attribs=nvl->nvp_list;
+       }
+
+       std::string to_string(){
+               return to_string("");
+       }
+       std::string to_string(std::string indent){
+               std::string ret;
+               std::string whitespace;
+               int i;
+
+               ret += indent+"<"+name;
+               for(i=0;i<attribs.size();++i)
+                       ret += " "+attribs[i]->name+"="+attribs[i]->val;
+
+               if(subtrees.size()>0){
+                       ret+=">\n";
+                       for(i=0;i<subtrees.size();++i){
+                               ret += subtrees[i]->to_string(indent+"  ");
+                       }
+                       ret += indent + "</"+name+">\n";
+               }else{
+                       ret+=">\n";
+               }
+               return ret;
+       }
+
+       void get_roots(std::string type, std::vector<xml_t *> &ret);
+       void get_roots(std::set<std::string> type, std::vector<xml_t *> &ret);
+
+       bool get_attrib_val(std::string name, std::string &val){
+               val="";
+               int i;
+               for(i=0;i<attribs.size();++i){
+                       if(attribs[i]->name == name){
+                               val = attribs[i]->val;
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+};
+
+struct xml_list_t{
+       std::vector<xml_t *> xlist;
+
+       xml_list_t(xml_t *x){
+               xlist.push_back(x);
+       }
+
+       xml_list_t *append(xml_t *x){
+               xlist.push_back(x);
+               return this;
+       }
+};
+
+#endif
+
diff --git a/src/tools/xmllexer.cc b/src/tools/xmllexer.cc
new file mode 100644 (file)
index 0000000..deee69e
--- /dev/null
@@ -0,0 +1,1788 @@
+#define yy_create_buffer xmlParser_create_buffer
+#define yy_delete_buffer xmlParser_delete_buffer
+#define yy_scan_buffer xmlParser_scan_buffer
+#define yy_scan_string xmlParser_scan_string
+#define yy_scan_bytes xmlParser_scan_bytes
+#define yy_flex_debug xmlParser_flex_debug
+#define yy_init_buffer xmlParser_init_buffer
+#define yy_flush_buffer xmlParser_flush_buffer
+#define yy_load_buffer_state xmlParser_load_buffer_state
+#define yy_switch_to_buffer xmlParser_switch_to_buffer
+#define yyin xmlParserin
+#define yyleng xmlParserleng
+#define yylex xmlParserlex
+#define yyout xmlParserout
+#define yyrestart xmlParserrestart
+#define yytext xmlParsertext
+
+#line 19 "xmllexer.cc"
+/* A lexical scanner generated by flex*/
+
+/* Scanner skeleton version:
+ * $Header: /cvsroot/gscpv4/src/tools/xmllexer.cc,v 1.1.1.1 2013/12/02 17:44:57 spatsch Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <unistd.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else  /* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif /* __STDC__ */
+#endif /* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ *     if ( condition_holds )
+ *             yyless( 5 );
+ *     else
+ *             do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               *yy_cp = yy_hold_char; \
+               YY_RESTORE_YY_MORE_OFFSET \
+               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* Some routines like yy_flex_realloc() are emitted as static but are
+   not called by all lexers. This generates warnings in some compilers,
+   notably GCC. Arrange to suppress these. */
+#ifdef __GNUC__
+#define YY_MAY_BE_UNUSED __attribute__((unused))
+#else
+#define YY_MAY_BE_UNUSED
+#endif
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       yy_size_t yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+       };
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )) YY_MAY_BE_UNUSED;
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_is_interactive = is_interactive; \
+       }
+
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! yy_current_buffer ) \
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       yy_current_buffer->yy_at_bol = at_bol; \
+       }
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       yytext_ptr = yy_bp; \
+       yytext_ptr -= yy_more_len; \
+       yyleng = (int) (yy_cp - yytext_ptr); \
+       yy_hold_char = *yy_cp; \
+       *yy_cp = '\0'; \
+       yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 11
+#define YY_END_OF_BUFFER 12
+static yyconst short int yy_accept[32] =
+    {   0,
+        0,    0,   12,   10,    6,    5,   10,   10,    1,    1,
+        1,    2,    6,    5,    0,    4,    3,    0,    0,    0,
+        2,    0,    7,    0,    8,    0,    0,    0,    0,    9,
+        0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    2,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    1,    1,    1,    1,    1,    4,    1,
+        1,    1,    1,    1,    5,    1,    6,    7,    7,    7,
+        7,    7,    7,    7,    7,    7,    7,    7,    1,    8,
+        9,    9,   10,    1,   11,   11,   11,   11,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   11,
+        1,    1,    1,    1,   11,    1,   11,   11,   11,   11,
+
+       11,   11,   11,   11,   11,   11,   11,   12,   13,   11,
+       11,   11,   11,   11,   11,   11,   11,   11,   11,   14,
+       11,   11,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[15] =
+    {   0,
+        1,    1,    2,    1,    3,    1,    3,    1,    1,    1,
+        3,    3,    3,    3
+    } ;
+
+static yyconst short int yy_base[38] =
+    {   0,
+        0,    0,   48,   49,   45,    0,   12,   41,   39,   34,
+       49,    0,   41,    0,   14,   49,   49,   39,   38,   26,
+        0,   36,   49,   35,   49,   24,   24,   32,   31,   49,
+       49,   18,   21,   17,   24,   27,   30
+    } ;
+
+static yyconst short int yy_def[38] =
+    {   0,
+       31,    1,   31,   31,   31,   32,   33,   31,   31,   31,
+       31,   34,   31,   32,   33,   31,   31,   35,   36,   31,
+       34,   35,   31,   36,   31,   31,   31,   37,   37,   31,
+        0,   31,   31,   31,   31,   31,   31
+    } ;
+
+static yyconst short int yy_nxt[64] =
+    {   0,
+        4,    5,    6,    7,    8,    9,    4,   10,   11,    4,
+       12,   12,   12,   12,   16,   17,   16,   17,   14,   21,
+       14,   15,   15,   15,   22,   22,   22,   24,   24,   24,
+       29,   29,   29,   30,   30,   28,   27,   25,   23,   26,
+       25,   23,   13,   20,   19,   18,   13,   31,    3,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31
+    } ;
+
+static yyconst short int yy_chk[64] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    7,    7,   15,   15,   32,   34,
+       32,   33,   33,   33,   35,   35,   35,   36,   36,   36,
+       37,   37,   37,   29,   28,   27,   26,   24,   22,   20,
+       19,   18,   13,   10,    9,    8,    5,    3,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+static int yy_more_flag = 0;
+static int yy_more_len = 0;
+#define yymore() (yy_more_flag = 1)
+#define YY_MORE_ADJ yy_more_len
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "xml.l"
+#define INITIAL 0
+/*
+       MUST COMPILE WITH
+               flex -PxmlParser -oxmllexer.cc xml.l
+       (or equivalent).
+*/     
+#line 9 "xml.l"
+/*
+ * AT&T lex can't handle this lexer due to lex bugs.  It works with flex
+ * 2.3.7, pclex 2.0.5, and MKS lex 3.1a.
+ */
+
+ // #include "parse_fta.h"
+ #include <string.h>
+
+
+
+#include "xml.tab.hh"
+
+/*
+       Some includes that flex doesn't include as standard,
+       but which are needed.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+
+//             Prevent flex from defining yywrap as extern "C" 
+
+#define YY_SKIP_YYWRAP
+
+/*             No lex lib, supply the yywrap fcn. that normally resides there
+*/
+
+int xmlParserwrap(){return(1);}
+
+extern int xmlParserdebug;
+
+
+/*
+               These variables are used for error reporting:
+               flex_xml_lineno : the line currently being parsed when the error occurs.
+               flex_xml_ch : the character on the line where the error occurs
+               flex_xml_linebuf : store the line for reporting.
+
+               NOTE : 1) the fixed size flex_xml_linebuf buffer is dangerous.
+                          2) You might get pointed to a place shortly after
+                                 where the syntax error occurs.  It is close enough
+                                 for now.
+*/
+
+int flex_xml_lineno = 1;
+int flex_xml_ch = 0;
+char flex_xml_linebuf[20000];
+
+char *flex_xml_stringinput = NULL;
+int flex_xml_stringinput_ptr = 0;
+FILE *flex_xml_fileinput = NULL;
+int my_xmlParser_yyinput(char *buf, int max_size);
+
+
+
+void xmlParsererror(char *s){
+       int i;
+       fprintf(stderr,"On line %d, char %d: %s (token %s):\n%s\n",
+                               flex_xml_lineno, flex_xml_ch, s, xmlParsertext, flex_xml_linebuf );
+    for(i=0;i<flex_xml_ch;i++){
+               if(flex_xml_linebuf[i] == '\t'){
+                       fprintf(stderr,"\t");
+               }else{
+                       fprintf(stderr," ");
+               }
+       }
+       fprintf(stderr,"^\n");
+       //      fprintf(stderr,"%*s\n",1+flex_xml_ch,"^");
+}
+
+#undef YY_INPUT
+#define YY_INPUT(b, r, ms) (r = my_xmlParser_yyinput(b,ms))
+
+/* MKS needs the next line to increase the NFA table */
+#line 499 "xmllexer.cc"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( yy_current_buffer->yy_is_interactive ) \
+               { \
+               int c = '*', n; \
+               for ( n = 0; n < max_size && \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+                       buf[n] = (char) c; \
+               if ( c == '\n' ) \
+                       buf[n++] = (char) c; \
+               if ( c == EOF && ferror( yyin ) ) \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+               result = n; \
+               } \
+       else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+                 && ferror( yyin ) ) \
+               YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+       YY_USER_ACTION
+
+YY_DECL
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp = NULL, *yy_bp = NULL;
+       register int yy_act;
+
+#line 88 "xml.l"
+
+
+       /* literal keyword tokens */
+
+ /*
+                       The actions associated with each text token are to
+                       keep track of the current location (for syntax error reporting)
+                       and to report any necessary info to the emf.y parse tree builder
+
+                       Its likely that there are a number of omissions, inconsistencies
+                       (some keywords do not need to be in caps), and relics
+                       (keywords such as BETWEEN, INDICATOR, etc., are not used
+                        in emf.y)
+                       This parser is somewhat of a work in progress.
+ */
+
+ /*            Query keywords          */
+
+
+
+
+#line 672 "xmllexer.cc"
+
+       if ( yy_init )
+               {
+               yy_init = 0;
+
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! yy_start )
+                       yy_start = 1;   /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( ! yy_current_buffer )
+                       yy_current_buffer =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+
+               yy_load_buffer_state();
+               }
+
+       while ( 1 )             /* loops until end-of-file is reached */
+               {
+               yy_more_len = 0;
+               if ( yy_more_flag )
+                       {
+                       yy_more_len = yy_c_buf_p - yytext_ptr;
+                       yy_more_flag = 0;
+                       }
+               yy_cp = yy_c_buf_p;
+
+               /* Support of yytext. */
+               *yy_cp = yy_hold_char;
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = yy_start;
+yy_match:
+               do
+                       {
+                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               yy_last_accepting_state = yy_current_state;
+                               yy_last_accepting_cpos = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 32 )
+                                       yy_c = yy_meta[(unsigned int) yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 49 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+               if ( yy_act == 0 )
+                       { /* have to back up */
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       yy_act = yy_accept[yy_current_state];
+                       }
+
+               YY_DO_BEFORE_ACTION;
+
+
+do_action:     /* This label is used only to access EOF actions. */
+
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = yy_hold_char;
+                       yy_cp = yy_last_accepting_cpos;
+                       yy_current_state = yy_last_accepting_state;
+                       goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 109 "xml.l"
+{ flex_xml_ch+=xmlParserleng; return yytext[0]; }
+       YY_BREAK
+/* names */
+case 2:
+YY_RULE_SETUP
+#line 113 "xml.l"
+{ flex_xml_ch+=xmlParserleng; xmlParserlval.strval = strdup(yytext); return NAME; }
+       YY_BREAK
+/* strings */
+case 3:
+YY_RULE_SETUP
+#line 118 "xml.l"
+{
+               
+               int c;
+               
+               xmlParserlval.strval = strdup(xmlParsertext+1); 
+
+               c = yyinput();
+
+               unput(c);       /* just peeking */
+               if(c != '\'') {
+                       flex_xml_ch+=xmlParserleng; 
+                       xmlParserlval.strval[xmlParserleng-2] = '\0';
+                       return STRING_TOKEN;
+               } else
+                       yymore();
+       }
+       YY_BREAK
+case 4:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 135 "xml.l"
+{ flex_xml_ch+=xmlParserleng; xmlParsererror("Unterminated string"); }
+       YY_BREAK
+/*                                                                                                                     */
+/*             Newline : advance the error reporting line number       */
+/*             and grab the next line into flex_xml_linebuf                    */
+/*                                                                                                                     */
+case 5:
+YY_RULE_SETUP
+#line 142 "xml.l"
+{flex_xml_ch=0; flex_xml_lineno++;
+                          strcpy(flex_xml_linebuf,xmlParsertext+1);
+                          yyless(1);
+                          }
+       YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 147 "xml.l"
+{flex_xml_ch+=xmlParserleng; } /* white space */
+       YY_BREAK
+case 7:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 149 "xml.l"
+{flex_xml_ch+=xmlParserleng; };        /* comment */
+       YY_BREAK
+case 8:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 150 "xml.l"
+{flex_xml_ch+=xmlParserleng; };        /* comment */
+       YY_BREAK
+case 9:
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
+yy_c_buf_p = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 151 "xml.l"
+{flex_xml_ch+=xmlParserleng; }; /* comment */
+       YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 153 "xml.l"
+{flex_xml_ch+=xmlParserleng; fprintf(stderr,"Warning: unknown token (ignored)\n");  xmlParsererror(yytext);}
+       YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 155 "xml.l"
+ECHO;
+       YY_BREAK
+#line 852 "xmllexer.cc"
+case YY_STATE_EOF(INITIAL):
+       yyterminate();
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = yy_hold_char;
+               YY_RESTORE_YY_MORE_OFFSET
+
+               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between yy_current_buffer and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       yy_n_chars = yy_current_buffer->yy_n_chars;
+                       yy_current_buffer->yy_input_file = yyin;
+                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state();
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++yy_c_buf_p;
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                               yy_cp = yy_c_buf_p;
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer() )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               yy_did_buffer_switch_on_eof = 0;
+
+                               if ( yywrap() )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               yy_c_buf_p =
+                                       yytext_ptr + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               yy_c_buf_p =
+                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+                               yy_current_state = yy_get_previous_state();
+
+                               yy_cp = yy_c_buf_p;
+                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+       {
+       register char *dest = yy_current_buffer->yy_ch_buf;
+       register char *source = yytext_ptr;
+       register int number_to_move, i;
+       int ret_val;
+
+       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( yy_current_buffer->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a single character, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+       else
+               {
+               int num_to_read =
+                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+                       YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = yy_current_buffer;
+
+                       int yy_c_buf_p_offset =
+                               (int) (yy_c_buf_p - b->yy_ch_buf);
+
+                       if ( b->yy_is_our_buffer )
+                               {
+                               int new_size = b->yy_buf_size * 2;
+
+                               if ( new_size <= 0 )
+                                       b->yy_buf_size += b->yy_buf_size / 8;
+                               else
+                                       b->yy_buf_size *= 2;
+
+                               b->yy_ch_buf = (char *)
+                                       /* Include room in for 2 EOB chars. */
+                                       yy_flex_realloc( (void *) b->yy_ch_buf,
+                                                        b->yy_buf_size + 2 );
+                               }
+                       else
+                               /* Can't grow it, we don't own it. */
+                               b->yy_ch_buf = 0;
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = yy_current_buffer->yy_buf_size -
+                                               number_to_move - 1;
+#endif
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+                       yy_n_chars, num_to_read );
+
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       if ( yy_n_chars == 0 )
+               {
+               if ( number_to_move == YY_MORE_ADJ )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       yy_current_buffer->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       yy_n_chars += number_to_move;
+       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+       return ret_val;
+       }
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+       {
+       register yy_state_type yy_current_state;
+       register char *yy_cp;
+
+       yy_current_state = yy_start;
+
+       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+               {
+               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       yy_last_accepting_state = yy_current_state;
+                       yy_last_accepting_cpos = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 32 )
+                               yy_c = yy_meta[(unsigned int) yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+               }
+
+       return yy_current_state;
+       }
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+       {
+       register int yy_is_jam;
+       register char *yy_cp = yy_c_buf_p;
+
+       register YY_CHAR yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               yy_last_accepting_state = yy_current_state;
+               yy_last_accepting_cpos = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 32 )
+                       yy_c = yy_meta[(unsigned int) yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+       yy_is_jam = (yy_current_state == 31);
+
+       return yy_is_jam ? 0 : yy_current_state;
+       }
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+       {
+       register char *yy_cp = yy_c_buf_p;
+
+       /* undo effects of setting up yytext */
+       *yy_cp = yy_hold_char;
+
+       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               register int number_to_move = yy_n_chars + 2;
+               register char *dest = &yy_current_buffer->yy_ch_buf[
+                                       yy_current_buffer->yy_buf_size + 2];
+               register char *source =
+                               &yy_current_buffer->yy_ch_buf[number_to_move];
+
+               while ( source > yy_current_buffer->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += (int) (dest - source);
+               yy_bp += (int) (dest - source);
+               yy_current_buffer->yy_n_chars =
+                       yy_n_chars = yy_current_buffer->yy_buf_size;
+
+               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       *--yy_cp = (char) c;
+
+
+       yytext_ptr = yy_bp;
+       yy_hold_char = *yy_cp;
+       yy_c_buf_p = yy_cp;
+       }
+#endif /* ifndef YY_NO_UNPUT */
+
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+       {
+       int c;
+
+       *yy_c_buf_p = yy_hold_char;
+
+       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+                       /* This was really a NUL. */
+                       *yy_c_buf_p = '\0';
+
+               else
+                       { /* need more input */
+                       int offset = yy_c_buf_p - yytext_ptr;
+                       ++yy_c_buf_p;
+
+                       switch ( yy_get_next_buffer() )
+                               {
+                               case EOB_ACT_LAST_MATCH:
+                                       /* This happens because yy_g_n_b()
+                                        * sees that we've accumulated a
+                                        * token and flags that we need to
+                                        * try matching the token before
+                                        * proceeding.  But for input(),
+                                        * there's no matching to consider.
+                                        * So convert the EOB_ACT_LAST_MATCH
+                                        * to EOB_ACT_END_OF_FILE.
+                                        */
+
+                                       /* Reset buffer status. */
+                                       yyrestart( yyin );
+
+                                       /* fall through */
+
+                               case EOB_ACT_END_OF_FILE:
+                                       {
+                                       if ( yywrap() )
+                                               return EOF;
+
+                                       if ( ! yy_did_buffer_switch_on_eof )
+                                               YY_NEW_FILE;
+#ifdef __cplusplus
+                                       return yyinput();
+#else
+                                       return input();
+#endif
+                                       }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       yy_c_buf_p = yytext_ptr + offset;
+                                       break;
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
+       *yy_c_buf_p = '\0';     /* preserve yytext */
+       yy_hold_char = *++yy_c_buf_p;
+
+
+       return c;
+       }
+#endif /* YY_NO_INPUT */
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+       {
+       if ( ! yy_current_buffer )
+               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+       yy_init_buffer( yy_current_buffer, input_file );
+       yy_load_buffer_state();
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+       {
+       if ( yy_current_buffer == new_buffer )
+               return;
+
+       if ( yy_current_buffer )
+               {
+               /* Flush out information for old buffer. */
+               *yy_c_buf_p = yy_hold_char;
+               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+               yy_current_buffer->yy_n_chars = yy_n_chars;
+               }
+
+       yy_current_buffer = new_buffer;
+       yy_load_buffer_state();
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       yy_did_buffer_switch_on_eof = 1;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+       {
+       yy_n_chars = yy_current_buffer->yy_n_chars;
+       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+       yyin = yy_current_buffer->yy_input_file;
+       yy_hold_char = *yy_c_buf_p;
+       }
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_is_our_buffer = 1;
+
+       yy_init_buffer( b, file );
+
+       return b;
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+       {
+       if ( ! b )
+               return;
+
+       if ( b == yy_current_buffer )
+               yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+       if ( b->yy_is_our_buffer )
+               yy_flex_free( (void *) b->yy_ch_buf );
+
+       yy_flex_free( (void *) b );
+       }
+
+
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+       {
+       yy_flush_buffer( b );
+
+       b->yy_input_file = file;
+       b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+       b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+       b->yy_is_interactive = 0;
+#else
+       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+       }
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+       {
+       if ( ! b )
+               return;
+
+       b->yy_n_chars = 0;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[0];
+
+       b->yy_at_bol = 1;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       if ( b == yy_current_buffer )
+               yy_load_buffer_state();
+       }
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+       {
+       YY_BUFFER_STATE b;
+
+       if ( size < 2 ||
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||
+            base[size-1] != YY_END_OF_BUFFER_CHAR )
+               /* They forgot to leave room for the EOB's. */
+               return 0;
+
+       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+       b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
+       b->yy_buf_pos = b->yy_ch_buf = base;
+       b->yy_is_our_buffer = 0;
+       b->yy_input_file = 0;
+       b->yy_n_chars = b->yy_buf_size;
+       b->yy_is_interactive = 0;
+       b->yy_at_bol = 1;
+       b->yy_fill_buffer = 0;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       yy_switch_to_buffer( b );
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+       {
+       int len;
+       for ( len = 0; yy_str[len]; ++len )
+               ;
+
+       return yy_scan_bytes( yy_str, len );
+       }
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+       {
+       YY_BUFFER_STATE b;
+       char *buf;
+       yy_size_t n;
+       int i;
+
+       /* Get memory for full buffer, including space for trailing EOB's. */
+       n = len + 2;
+       buf = (char *) yy_flex_alloc( n );
+       if ( ! buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+       for ( i = 0; i < len; ++i )
+               buf[i] = bytes[i];
+
+       buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+       b = yy_scan_buffer( buf, n );
+       if ( ! b )
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+       /* It's okay to grow etc. this buffer, and we should throw it
+        * away when we're done.
+        */
+       b->yy_is_our_buffer = 1;
+
+       return b;
+       }
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+       {
+       if ( yy_start_stack_ptr >= yy_start_stack_depth )
+               {
+               yy_size_t new_size;
+
+               yy_start_stack_depth += YY_START_STACK_INCR;
+               new_size = yy_start_stack_depth * sizeof( int );
+
+               if ( ! yy_start_stack )
+                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+               else
+                       yy_start_stack = (int *) yy_flex_realloc(
+                                       (void *) yy_start_stack, new_size );
+
+               if ( ! yy_start_stack )
+                       YY_FATAL_ERROR(
+                       "out of memory expanding start-condition stack" );
+               }
+
+       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+       BEGIN(new_state);
+       }
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+       {
+       if ( --yy_start_stack_ptr < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN(yy_start_stack[yy_start_stack_ptr]);
+       }
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+       {
+       return yy_start_stack[yy_start_stack_ptr - 1];
+       }
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+       {
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+       }
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+               yytext[yyleng] = yy_hold_char; \
+               yy_c_buf_p = yytext + n; \
+               yy_hold_char = *yy_c_buf_p; \
+               *yy_c_buf_p = '\0'; \
+               yyleng = n; \
+               } \
+       while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+       {
+       register int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+       }
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+       {
+       register int n;
+       for ( n = 0; s[n]; ++n )
+               ;
+
+       return n;
+       }
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+       {
+       return (void *) malloc( size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+       {
+       /* The cast to (char *) in the following accommodates both
+        * implementations that use char* generic pointers, and those
+        * that use void* generic pointers.  It works with the latter
+        * because both ANSI C and C++ allow castless assignment from
+        * any pointer type to void*, and deal with argument conversions
+        * as though doing an assignment.
+        */
+       return (void *) realloc( (char *) ptr, size );
+       }
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+       {
+       free( ptr );
+       }
+
+#if YY_MAIN
+int main()
+       {
+       yylex();
+       return 0;
+       }
+#endif
+#line 155 "xml.l"
+
+
+int my_xmlParser_yyinput(char *buf, int max_size){
+       int c = 0;
+       int inchar = 0;
+       
+       if(flex_xml_stringinput != NULL){
+               while(c<max_size){
+                       if(flex_xml_stringinput[flex_xml_stringinput_ptr] != '\0'){
+                               buf[c++] = flex_xml_stringinput[flex_xml_stringinput_ptr++];
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       if(flex_xml_fileinput != NULL){
+               while(c < max_size){
+                       inchar = getc(flex_xml_fileinput);
+                       if(inchar != EOF){
+                               buf[c++] = inchar;
+                       }else{
+                               break;
+                       }
+               }
+               return(c);
+       }
+       
+       return(0);
+}
+
+void xmlParser_setfileinput(FILE *f){
+       xmlParserrestart(NULL);
+
+       flex_xml_fileinput = f;
+       flex_xml_stringinput = NULL;
+       flex_xml_lineno = 1;
+       flex_xml_ch = 0;
+}
+
+void xmlParser_setstringinput(char *s){
+       xmlParserrestart(NULL);
+
+       flex_xml_fileinput = NULL;
+       flex_xml_stringinput = s;
+       flex_xml_stringinput_ptr = 0;
+       flex_xml_lineno = 1;
+       flex_xml_ch = 0;
+}
+       
+               
+
+
+
diff --git a/src/views/README.md b/src/views/README.md
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tigon.png b/tigon.png
new file mode 100644 (file)
index 0000000..35b403c
Binary files /dev/null and b/tigon.png differ
diff --git a/views/README.md b/views/README.md
new file mode 100644 (file)
index 0000000..1dedb57
--- /dev/null
@@ -0,0 +1 @@
+This directory should contain the binaries for all views.